From 51877df13075ad10ef51107f15bcd21f1661febe Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期二, 17 三月 2026 09:48:01 +0800
Subject: [PATCH] #AI

---
 rsf-server/src/main/java/com/vincent/rsf/server/ai/service/provider/AiWarehouseSummaryService.java |   91 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 68 insertions(+), 23 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/AiWarehouseSummaryService.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/provider/AiWarehouseSummaryService.java
similarity index 81%
rename from rsf-server/src/main/java/com/vincent/rsf/server/ai/service/AiWarehouseSummaryService.java
rename to rsf-server/src/main/java/com/vincent/rsf/server/ai/service/provider/AiWarehouseSummaryService.java
index 202fed3..7bad7c1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/AiWarehouseSummaryService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/provider/AiWarehouseSummaryService.java
@@ -1,6 +1,7 @@
-package com.vincent.rsf.server.ai.service;
+package com.vincent.rsf.server.ai.service.provider;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.vincent.rsf.server.ai.model.AiDiagnosticToolResult;
 import com.vincent.rsf.server.ai.model.AiPromptContext;
 import com.vincent.rsf.server.manager.entity.Loc;
 import com.vincent.rsf.server.manager.entity.LocItem;
@@ -13,7 +14,10 @@
 import java.util.*;
 
 @Service
-public class AiWarehouseSummaryService implements AiPromptContextProvider {
+public class AiWarehouseSummaryService implements AiDiagnosticDataProvider {
+
+    private static final String TOOL_CODE = "warehouse_summary";
+    private static final String TOOL_NAME = "搴撳瓨鎽樿";
 
     private static final Map<String, String> LOC_STATUS_LABELS = new LinkedHashMap<>();
 
@@ -31,16 +35,54 @@
     @Resource
     private LocItemMapper locItemMapper;
 
+    /**
+     * 杩斿洖搴撳瓨绫诲唴閮ㄥ伐鍏风殑榛樿椤哄簭銆�
+     */
     @Override
-    public boolean supports(AiPromptContext context) {
-        return context != null && shouldSummarize(context.getQuestion());
+    public int getOrder() {
+        return 10;
     }
 
+    /**
+     * 杩斿洖搴撳瓨宸ュ叿缂栫爜銆�
+     */
     @Override
-    public String buildContext(AiPromptContext context) {
-        if (!supports(context)) {
-            return "";
-        }
+    public String getToolCode() {
+        return TOOL_CODE;
+    }
+
+    /**
+     * 杩斿洖搴撳瓨宸ュ叿灞曠ず鍚嶃��
+     */
+    @Override
+    public String getToolName() {
+        return TOOL_NAME;
+    }
+
+    /**
+     * 杩斿洖搴撳瓨宸ュ叿榛樿璇存槑銆�
+     */
+    @Override
+    public String getDefaultToolPrompt() {
+        return "缁撳悎搴撳瓨鎽樿鍒ゆ柇搴撲綅鐘舵�併�佸簱瀛樼粨鏋勪笌閲嶇偣鐗╂枡鍒嗗竷銆�";
+    }
+
+    /**
+     * 姹囨�诲簱浣嶄笌搴撳瓨鏄庣粏锛岀敓鎴愬簱瀛樻憳瑕佸伐鍏风粨鏋溿��
+     */
+    @Override
+    public AiDiagnosticToolResult buildDiagnosticData(AiPromptContext context) {
+        return new AiDiagnosticToolResult()
+                .setToolCode(getToolCode())
+                .setToolName(getToolName())
+                .setSeverity("INFO")
+                .setSummaryText(buildWarehouseSummary(context));
+    }
+
+    /**
+     * 鍩轰簬 man_loc 鍜� man_loc_item 鐢熸垚搴撳瓨姒傝銆佸簱浣嶇姸鎬佸垎甯冨拰 TOP 缁熻銆�
+     */
+    private String buildWarehouseSummary(AiPromptContext context) {
 
         List<Loc> activeLocs = locMapper.selectList(new LambdaQueryWrapper<Loc>()
                 .select(Loc::getUseStatus)
@@ -134,21 +176,9 @@
         return summary.toString();
     }
 
-    private boolean shouldSummarize(String question) {
-        if (question == null || question.trim().isEmpty()) {
-            return false;
-        }
-        String normalized = question.toLowerCase(Locale.ROOT);
-        return normalized.contains("loc")
-                || normalized.contains("搴撲綅")
-                || normalized.contains("璐т綅")
-                || normalized.contains("搴撳尯")
-                || normalized.contains("搴撳瓨")
-                || normalized.contains("鐗╂枡")
-                || normalized.contains("宸烽亾")
-                || normalized.contains("鍌ㄤ綅");
-    }
-
+    /**
+     * 灏嗗簱浣嶇姸鎬佽鏁版牸寮忓寲涓哄彲璇绘枃鏈��
+     */
     private String formatLocStatuses(Map<String, Long> counters) {
         if (counters == null || counters.isEmpty()) {
             return "鏆傛棤鏁版嵁";
@@ -160,6 +190,9 @@
         return String.join("锛�", parts);
     }
 
+    /**
+     * 鏍煎紡鍖栧簱瀛樻渶澶氱殑搴撲綅鍒楄〃銆�
+     */
     private String formatTopLocs(List<Map.Entry<String, LocAggregate>> rows) {
         List<String> parts = new ArrayList<>();
         for (Map.Entry<String, LocAggregate> row : rows) {
@@ -170,6 +203,9 @@
         return String.join("锛�", parts);
     }
 
+    /**
+     * 鏍煎紡鍖栧簱瀛樻渶澶氱殑鐗╂枡鍒楄〃銆�
+     */
     private String formatTopMaterials(List<MaterialAggregate> rows) {
         List<String> parts = new ArrayList<>();
         for (MaterialAggregate row : rows) {
@@ -183,11 +219,17 @@
         return String.join("锛�", parts);
     }
 
+    /**
+     * 缁熶竴鏍煎紡鍖栨暟閲忓�笺��
+     */
     private String formatDecimal(Object value) {
         BigDecimal decimal = toDecimal(value);
         return decimal.stripTrailingZeros().toPlainString();
     }
 
+    /**
+     * 灏嗕笉鍚岀被鍨嬬殑鏁伴噺瀛楁缁熶竴杞崲涓� BigDecimal銆�
+     */
     private BigDecimal toDecimal(Object value) {
         if (value == null) {
             return BigDecimal.ZERO;
@@ -213,3 +255,6 @@
         private final Set<String> locCodes = new HashSet<>();
     }
 }
+
+
+

--
Gitblit v1.9.1