DatabaseTools.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package com.sckw.ai.biz.mcp;
  2. import com.sckw.ai.biz.util.R;
  3. import com.sckw.order.api.model.TradeOrderVo;
  4. import com.sckw.report.api.model.TodoCountVo;
  5. import com.sckw.transport.api.model.LogisticsBaseOrderVo;
  6. import com.sckw.transport.api.model.dto.McpLogisticsOrderVo;
  7. import com.sckw.transport.api.model.param.OrderPara;
  8. import jakarta.annotation.Resource;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springaicommunity.mcp.annotation.McpTool;
  11. import org.springaicommunity.mcp.annotation.McpToolParam;
  12. import org.springframework.core.ParameterizedTypeReference;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.web.reactive.function.client.WebClient;
  15. import java.time.Duration;
  16. import java.util.List;
  17. /**
  18. * @author xucaiqin
  19. * @date 2026-03-05 09:19:48
  20. */
  21. @Component
  22. @Slf4j
  23. public class DatabaseTools {
  24. @Resource
  25. private WebClient webClientReport;
  26. @Resource
  27. private WebClient webClientOrder;
  28. @Resource
  29. private WebClient webClientTransport;
  30. @McpTool(name = "todoList", description = "统计当前用户待处理的贸易订单、物流运单、贸易合同、物流合同数据。")
  31. public R<TodoCountVo> todoList(@McpToolParam(description = "用户ID,由上游传入") Long userId) {
  32. try {
  33. TodoCountVo todoCountVo = webClientReport.get().uri("/kwHome/count") // 后端 SSE 路径
  34. .header("Content-Type", "application/json")
  35. .retrieve().bodyToMono(TodoCountVo.class).block(Duration.ofSeconds(15));
  36. return R.ok(todoCountVo);
  37. } catch (Exception e) {
  38. log.error("异常{} ", e.getMessage(), e);
  39. return R.failed("接口异常,请稍后再试");
  40. }
  41. }
  42. @McpTool(name = "tradeOrder", description = "根据时间范围或订单号查询用户的贸易订单")
  43. public R<List<TradeOrderVo>> tradeOrder(
  44. @McpToolParam(description = "用户ID,由上游传入") Long userId,
  45. @McpToolParam(description = "订单开始时间,格式:yyyy-MM-dd HH:mm:ss", required = false) String startTime,
  46. @McpToolParam(description = "订单结束时间,格式:yyyy-MM-dd HH:mm:ss", required = false) String endTime,
  47. @McpToolParam(description = "贸易订单号,当使用具体单号、商品查数据时不使用默认的时间范围", required = false) String orderNo) {
  48. try {
  49. com.sckw.order.api.model.OrderPara tradeOrderPara = new com.sckw.order.api.model.OrderPara();
  50. tradeOrderPara.setStartTime(startTime);
  51. tradeOrderPara.setEndTime(endTime);
  52. tradeOrderPara.setUserId(userId);
  53. tradeOrderPara.setOrderNo(orderNo);
  54. List<TradeOrderVo> mcpLogisticsOrderVos = webClientOrder.post().uri("/tradeOrder/trade")
  55. .bodyValue(tradeOrderPara)
  56. .header("Content-Type", "application/json")
  57. .retrieve().bodyToMono(new ParameterizedTypeReference<List<TradeOrderVo>>() {
  58. }).block(Duration.ofSeconds(15));
  59. return R.ok(mcpLogisticsOrderVos);
  60. } catch (Exception e) {
  61. log.error("异常{} ", e.getMessage(), e);
  62. return R.failed("接口异常,请稍后再试");
  63. }
  64. }
  65. @McpTool(name = "logisticsList", description = "分页查询物流订单")
  66. public R<List<McpLogisticsOrderVo>> logisticsList(
  67. @McpToolParam(description = "用户ID,由上游传入") Long userId,
  68. @McpToolParam(description = "订单开始时间,格式:yyyy-MM-dd HH:mm:ss", required = false) String startTime,
  69. @McpToolParam(description = "订单结束时间,格式:yyyy-MM-dd HH:mm:ss", required = false) String endTime,
  70. @McpToolParam(description = "物流订单编号,当使用具体单号、商品查数据时不使用默认的时间范围", required = false) String logisticsOrderNo,
  71. @McpToolParam(description = "贸易订单号,当使用具体单号、商品查数据时不使用默认的时间范围", required = false) String orderNo) {
  72. OrderPara orderPara = new OrderPara();
  73. orderPara.setStartTime(startTime);
  74. orderPara.setEndTime(endTime);
  75. orderPara.setUserId(userId);
  76. orderPara.setLogisticsOrderNo(logisticsOrderNo);
  77. orderPara.setOrderNo(orderNo);
  78. try {
  79. List<McpLogisticsOrderVo> mcpLogisticsOrderVos = webClientTransport.post().uri("/logisticsOrder/list")
  80. .bodyValue(orderPara)
  81. .header("Content-Type", "application/json")
  82. .retrieve().bodyToMono(new ParameterizedTypeReference<List<McpLogisticsOrderVo>>() {
  83. }).block(Duration.ofSeconds(15));
  84. return R.ok(mcpLogisticsOrderVos);
  85. } catch (Exception e) {
  86. log.error("异常{} ", e.getMessage(), e);
  87. return R.failed("接口异常,请稍后再试");
  88. }
  89. }
  90. @McpTool(name = "logisticsBase", description = "问题涉及 物流订单、订单物流、运输,未明确要求查明细时,优先使用该api")
  91. public R<List<LogisticsBaseOrderVo>> logisticsBase(
  92. @McpToolParam(description = "用户ID,由上游传入") Long userId,
  93. @McpToolParam(description = "订单开始时间,格式:yyyy-MM-dd HH:mm:ss", required = false) String startTime,
  94. @McpToolParam(description = "订单结束时间,格式:yyyy-MM-dd HH:mm:ss", required = false) String endTime
  95. ) {
  96. OrderPara orderPara = new OrderPara();
  97. orderPara.setStartTime(startTime);
  98. orderPara.setEndTime(endTime);
  99. orderPara.setUserId(userId);
  100. try {
  101. List<LogisticsBaseOrderVo> mcpLogisticsOrderVos = webClientTransport.post().uri("/logisticsOrder/base")
  102. .bodyValue(orderPara)
  103. .header("Content-Type", "application/json")
  104. .retrieve().bodyToMono(new ParameterizedTypeReference<List<LogisticsBaseOrderVo>>() {
  105. }).block(Duration.ofSeconds(15));
  106. return R.ok(mcpLogisticsOrderVos);
  107. } catch (Exception e) {
  108. log.error("异常{} ", e.getMessage(), e);
  109. return R.failed("接口异常,请稍后再试");
  110. }
  111. }
  112. }