From a737168b1cb3c0255401915dbc69c7c2261f5fc8 Mon Sep 17 00:00:00 2001 From: bigtian <7990497@qq.com> Date: Fri, 27 Jun 2025 11:36:43 +0800 Subject: [PATCH] Enhance CRM service with additional query methods and improve parameter descriptions --- .../rzdata/mcp/server/crm/CrmMcpService.java | 91 +++++++++++++++---- 1 file changed, 73 insertions(+), 18 deletions(-) diff --git a/crm-mcp/src/main/java/net/rzdata/mcp/server/crm/CrmMcpService.java b/crm-mcp/src/main/java/net/rzdata/mcp/server/crm/CrmMcpService.java index 8e00d3a..1b5027a 100644 --- a/crm-mcp/src/main/java/net/rzdata/mcp/server/crm/CrmMcpService.java +++ b/crm-mcp/src/main/java/net/rzdata/mcp/server/crm/CrmMcpService.java @@ -1,5 +1,6 @@ package net.rzdata.mcp.server.crm; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; @@ -10,6 +11,8 @@ import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; + @Service public class CrmMcpService { @Autowired @@ -28,10 +31,10 @@ public class CrmMcpService { } - @Tool(description = "根据客户名称或客户编码查询客户负责人") + @Tool(description = "根据客户名称或客户编码查询客户负责人。clientCode和clientName必须二选一。如果都提取不到则输出:请提供需要查询的客户。如果提取到多个值则输出:目前只能查询单个客户数据") public String getClientResponsible( - @ToolParam(description = "客户编码",required = false) String clientCode, - @ToolParam(description = "客户名称",required = false) String clientName + @ToolParam(description = "客户编码,一般类似于'XX.XX.XXXX.XXX'格式,例如:01.01.0023.024。与clientName必须二选一", required = false) String clientCode, + @ToolParam(description = "客户名称,一般类似于'某某课题组'或'某某公司'或'某某实验室'或'某某经营部'或'某某研究院'或'某某研究所'或'某某测试'等组织,例如:张三课题组,广州小懒科技有限公司,金域测试、金域课题组111、玉尘测试A01、睿展小组3号。与clientCode必须二选一", required = false) String clientName ) { Assert.isTrue(StrUtil.isNotEmpty(clientCode) || StrUtil.isNotEmpty(clientName), @@ -44,9 +47,9 @@ public class CrmMcpService { return executeRequest("ai/query/getClientResponsible", requestBody); } - @Tool(description = "根据订单编码(即订单号)查询订单负责人") + @Tool(description = "根据订单编码(即订单号)查询订单负责人。orderCode是必填项,如果提取不到则输出:请告知需要查询的订单号") public String getOrderSaller( - @ToolParam(description = "订单编码") String orderCode + @ToolParam(description = "订单编码(即订单号),值一般是由字母、数字和'-'组成,特征一般类似于'NJ00027202506090001',或'NJ00027202506090001-G'或'NJ00027202506090001-T-1',或'dev-NJ00027202506090001'") String orderCode ) { Assert.isTrue(StrUtil.isNotEmpty(orderCode), "订单编码不能为空"); @@ -56,12 +59,12 @@ public class CrmMcpService { return executeRequest("ai/query/getOrderSaller", requestBody); } - @Tool(description = "根据客户名称或客户编码查询某个时间段内的订单销售额") + @Tool(description = "根据客户名称或客户编码查询某个时间段内的订单销售额。clientCode和clientName必须二选一。如果都提取不到则输出:请提供需要查询的客户。如果提取到多个值则输出:目前只能查询单个客户数据。对于'去年'、'今年'这种时间词,需要结合当前系统时间来判断") public String sumOrderTotalForClientInTime( - @ToolParam(description = "客户编码", required = false) String clientCode, - @ToolParam(description = "客户名称", required = false) String clientName, - @ToolParam(description = "开始时间", required = false) String startTime, - @ToolParam(description = "结束时间", required = false) String endTime + @ToolParam(description = "客户编码,一般类似于'XX.XX.XXXX.XXX'格式,例如:01.01.0023.024。与clientName必须二选一", required = false) String clientCode, + @ToolParam(description = "客户名称,一般类似于'某某课题组'或'某某公司'或'某某实验室'或'某某经营部'或'某某研究院'或'某某研究所'或'某某测试'等组织,例如:张三课题组,广州小懒科技有限公司,金域测试、金域课题组111、玉尘测试A01、睿展小组3号。与clientCode必须二选一", required = false) String clientName, + @ToolParam(description = "开始时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。非必填", required = false) String startTime, + @ToolParam(description = "结束时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。非必填", required = false) String endTime ) { JSONObject requestBody = new JSONObject(); @@ -73,13 +76,13 @@ public class CrmMcpService { return executeRequest("ai/query/sumOrderTotalForClientInTime", requestBody); } - @Tool(description = "根据客户名称或客户编码查询某个时间段内购买的某个产品货号的数量") + @Tool(description = "根据客户名称或客户编码查询某个时间段内购买的某个产品货号的数量。clientCode和clientName必须二选一。如果都提取不到则输出:请提供需要查询的客户。productnum必填,如果提取不到则输出:请提供需要查询的货号。startTime和endTime必填,如果提取不到则输出:请提供需要查询的采购时间范围") public String sumProductNumForClientInTime( - @ToolParam(description = "客户编码", required = false) String clientCode, - @ToolParam(description = "客户名称", required = false) String clientName, - @ToolParam(description = "产品货号", required = false) String productnum, - @ToolParam(description = "开始时间", required = false) String startTime, - @ToolParam(description = "结束时间", required = false) String endTime + @ToolParam(description = "客户编码,一般类似于'XX.XX.XXXX.XXX'格式,例如:01.01.0023.024。与clientName必须二选一", required = false) String clientCode, + @ToolParam(description = "客户名称,一般类似于'某某课题组'或'某某公司'或'某某实验室'或'某某经营部'或'某某研究院'或'某某研究所'等组织,例如:张三课题组,广州小懒科技有限公司。与clientCode必须二选一", required = false) String clientName, + @ToolParam(description = "产品货号,一般类似于'XXXX-XX'格式,例如:C112-01。必填参数", required = false) String productnum, + @ToolParam(description = "采购开始时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。必填参数", required = false) String startTime, + @ToolParam(description = "采购结束时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。必填参数", required = false) String endTime ) { JSONObject requestBody = new JSONObject(); requestBody.put("clientCode", clientCode); @@ -91,9 +94,9 @@ public class CrmMcpService { return executeRequest("ai/query/sumProductNumForClientInTime", requestBody); } - @Tool(description = "根据订单编码(即订单号)查询订单购买的产品明细") + @Tool(description = "根据订单编码(即订单号)查询订单购买的产品明细。orderCode是必填项,如果提取不到则输出:请告知需要查询的订单号") public String detailOrderProduct( - @ToolParam(description = "订单编码") String orderCode + @ToolParam(description = "订单编码(即订单号),值一般是由字母、数字和'-'组成,特征一般类似于'NJ00027202506090001',或'NJ00027202506090001-G'或'NJ00027202506090001-T-1',或'dev-NJ00027202506090001'") String orderCode ) { Assert.isTrue(StrUtil.isNotEmpty(orderCode), "订单编码不能为空"); @@ -103,4 +106,56 @@ public class CrmMcpService { return executeRequest("ai/query/detailOrderProduct", requestBody); } + @Tool(description = "根据客户名称或客户编码查询某个时间段内购买的产品主货号列表") + public String listProductForClientInTime( + @ToolParam(description = "客户编码,一般类似于'XX.XX.XXXX.XXX'格式,例如:01.01.0023.024。与clientName必须二选一", required = false) String clientCode, + @ToolParam(description = "客户名称,一般类似于'某某课题组'或'某某公司'或'某某实验室'或'某某经营部'或'某某研究院'或'某某研究所'或'某某测试'等组织,例如:张三课题组,广州小懒科技有限公司,金域测试、金域课题组111、玉尘测试A01、睿展小组3号。与clientCode必须二选一", required = false) String clientName, + @ToolParam(description = "开始时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。非必填", required = false) String startTime, + @ToolParam(description = "结束时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。非必填", required = false) String endTime + ) { + JSONObject requestBody = new JSONObject(); + requestBody.put("clientCode", clientCode); + requestBody.put("clientName", clientName); + requestBody.put("startTime", startTime); + requestBody.put("endTime", endTime); + + return executeRequest("ai/query/listProductForClientInTime", requestBody); + } + + @Tool(description = "查询客户在某个时间段内的欠款额") + public String getUnpaidAmountForClient( + @ToolParam(description = "客户编码,一般类似于'XX.XX.XXXX.XXX'格式,例如:01.01.0023.024。与clientName必须二选一", required = false) String clientCode, + @ToolParam(description = "客户名称,一般类似于'某某课题组'或'某某公司'或'某某实验室'或'某某经营部'或'某某研究院'或'某某研究所'或'某某测试'等组织,例如:张三课题组,广州小懒科技有限公司,金域测试、金域课题组111、玉尘测试A01、睿展小组3号。与clientCode必须二选一", required = false) String clientName, + @ToolParam(description = "开始时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。非必填", required = false) String startTime, + @ToolParam(description = "结束时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。非必填", required = false) String endTime + ) { + JSONObject requestBody = new JSONObject(); + requestBody.put("clientCode", clientCode); + requestBody.put("clientName", clientName); + requestBody.put("startTime", startTime); + requestBody.put("endTime", endTime); + + return executeRequest("ai/query/getUnpaidAmountForClient", requestBody); + } + + @Tool(description = "根据主货号查询某个时间段内购买过该产品的客户名称列表") + public String listClientsByMainNumInTime( + @ToolParam(description = "主货号,一般类似于'XXXX-XXXX'格式,例如:1234-5678", required = false) String mainNum, + @ToolParam(description = "开始时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。非必填", required = false) String startTime, + @ToolParam(description = "结束时间,一般类似于'yyyy-MM-dd HH:mm:ss'格式,例如:2024-01-01 00:00:00。非必填", required = false) String endTime + ) { + JSONObject requestBody = new JSONObject(); + requestBody.put("mainNum", mainNum); + requestBody.put("startTime", startTime); + requestBody.put("endTime", endTime); + + return executeRequest("ai/query/listClientsByMainNumInTime", requestBody); + } + + @Tool(description = "获取当前时间(涉及到时间的问题时,必须调用此函数)") + public String getCurrentTime() { + return DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"); + } + + }