From 0a7091b19b9dffecca0e09cd8d30a6b12afa7fab Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 12 三月 2026 13:35:21 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/ai/utils/AiUtils.java                      |  274 +-----------------------
 src/main/java/com/zy/ai/mcp/tool/WcsMcpTools.java               |   30 ++
 src/main/java/com/zy/ai/controller/WcsDiagnosisController.java  |    3 
 src/main/java/com/zy/ai/utils/AiPromptUtils.java                |   56 ----
 src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java |   82 +++++++
 src/main/java/com/zy/ai/service/WcsDiagnosisService.java        |  132 ++---------
 src/main/java/com/zy/ai/entity/WcsDiagnosisRequest.java         |   46 ---
 7 files changed, 162 insertions(+), 461 deletions(-)

diff --git a/src/main/java/com/zy/ai/controller/WcsDiagnosisController.java b/src/main/java/com/zy/ai/controller/WcsDiagnosisController.java
index 127c9ed..07169d9 100644
--- a/src/main/java/com/zy/ai/controller/WcsDiagnosisController.java
+++ b/src/main/java/com/zy/ai/controller/WcsDiagnosisController.java
@@ -47,8 +47,7 @@
         SseEmitter emitter = new SseEmitter(0L);
         new Thread(() -> {
             try {
-                WcsDiagnosisRequest request = aiUtils.makeAiRequest(100, null);
-                wcsDiagnosisService.askStream(request, prompt, chatId, reset, emitter);
+                wcsDiagnosisService.askStream(prompt, chatId, reset, emitter);
             } catch (Exception e) {
                 try { emitter.complete(); } catch (Exception ignore) {}
             }
diff --git a/src/main/java/com/zy/ai/entity/WcsDiagnosisRequest.java b/src/main/java/com/zy/ai/entity/WcsDiagnosisRequest.java
index 8cdf8a1..a189c77 100644
--- a/src/main/java/com/zy/ai/entity/WcsDiagnosisRequest.java
+++ b/src/main/java/com/zy/ai/entity/WcsDiagnosisRequest.java
@@ -1,63 +1,33 @@
 package com.zy.ai.entity;
 
-import com.zy.asrs.entity.WrkMast;
-import com.zy.system.entity.Config;
 import lombok.Data;
 
-import java.util.List;
 import java.util.Map;
 
 /**
- * WCS AI 璇婃柇璇锋眰
- * 鏀寔锛�
- * - 浠诲姟淇℃伅
- * - 璁惧瀹炴椂鏁版嵁
- * - 璁惧閰嶇疆淇℃伅
- * - 绯荤粺鏃ュ織
- * - 棰濆涓婁笅鏂�
+ * WCS AI 璇婃柇璇锋眰銆�
+ * 浠呮壙杞借瘖鏂叆鍙d俊鎭紝瀹炴椂鏁版嵁缁熶竴鐢� Agent 閫氳繃 MCP 宸ュ叿鑾峰彇銆�
  */
 @Data
 public class WcsDiagnosisRequest {
 
     /**
-     * 褰撳墠鍏虫敞鐨勮澶囧彿锛堝彲閫夛紝渚嬪鍫嗗灈鏈哄彿=1锛夛紝濡傛灉鏄暣浣撶郴缁熻瘖鏂彲浠ヤ笉濉�
+     * 褰撳墠鍏虫敞鐨勫爢鍨涙満缂栧彿锛堝彲閫夛級銆�
      */
     private Integer craneNo;
 
     /**
-     * 褰撳墠浣犺瀵熷埌鐨勭幇璞�/闂鎻忚堪锛堝彲閫夛級
-     * 渚嬪锛氱郴缁熶笉鎵ц浠诲姟锛屼笉鐭ラ亾鍝釜璁惧娌″湪杩愯
+     * 褰撳墠瑙傚療鍒扮殑鐜拌薄/闂鎻忚堪锛堝彲閫夛級銆�
      */
     private String alarmMessage;
 
     /**
-     * 绯荤粺鏃ュ織锛堟寜鏃堕棿椤哄簭锛�
+     * 寤鸿 Agent 鏌ヨ鏃ュ織鏃朵紭鍏堜娇鐢ㄧ殑琛屾暟涓婇檺锛堝彲閫夛級銆�
      */
-    private List<String> logs;
+    private Integer logLimit;
 
     /**
-     * 浠诲姟淇℃伅鍒楄〃锛堝綋鍓嶅緟鎵ц/鍦ㄦ墽琛�/鎸傝捣浠诲姟锛�
-     */
-    private List<WrkMast> tasks;
-
-    /**
-     * 璁惧褰撳墠瀹炴椂鏁版嵁锛堢姸鎬佷綅銆佽繍琛屾ā寮忋�佸績璺虫椂闂寸瓑锛�
-     */
-    private List<DeviceRealTimeData> deviceRealtimeData;
-
-    /**
-     * 璁惧閰嶇疆淇℃伅
-     */
-    private List<DeviceConfigsData> deviceConfigs;
-
-    /**
-     * 绯荤粺閰嶇疆淇℃伅
-     */
-    private List<Config> systemConfigs;
-
-    /**
-     * 棰濆涓婁笅鏂囷紝渚嬪锛�
-     *  warehouseCode, shift, wcsVersion, plcVersion 绛�
+     * 棰濆涓婁笅鏂囷紝渚嬪 warehouseCode銆乻hift銆亀csVersion銆乸lcVersion 绛夈��
      */
     private Map<String, Object> extraContext;
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java b/src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java
index 5b65c21..2efa2a0 100644
--- a/src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java
+++ b/src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java
@@ -124,26 +124,83 @@
     @Override
     public Object getTasks(JSONObject args) {
         int crnNo = optInt(args, "crnNo", -1);
+        int dualCrnNo = optInt(args, "dualCrnNo", -1);
         int rgvNo = optInt(args, "rgvNo", -1);
-        List<Integer> taskNos = optIntList(args, "taskNos");
+        int sourceStaNo = optInt(args, "sourceStaNo", -1);
+        int staNo = optInt(args, "staNo", -1);
+        List<Integer> wrkNos = optIntList(args, "wrkNos");
+        if (wrkNos.isEmpty()) {
+            wrkNos = optIntList(args, "taskNos");
+        }
+        List<String> wmsWrkNos = optStrList(args, "wmsWrkNos");
+        List<Long> wrkStsList = optLongList(args, "wrkStsList");
+        List<Integer> ioTypeList = optIntList(args, "ioTypeList");
+        String barcode = optStr(args, "barcode");
+        String batch = optStr(args, "batch");
+        String sourceLocNo = optStr(args, "sourceLocNo");
+        String locNo = optStr(args, "locNo");
         int limit = optInt(args, "limit", 200);
 
         QueryWrapper<WrkMast> wrapper = new QueryWrapper<>();
-        if (taskNos != null && taskNos.size() > 0) {
-            wrapper.in("wrk_no", taskNos);
+        if (!wrkNos.isEmpty()) {
+            wrapper.in("wrk_no", wrkNos);
+        }
+
+        if (!wmsWrkNos.isEmpty()) {
+            wrapper.in("wms_wrk_no", wmsWrkNos);
+        }
+
+        if (!wrkStsList.isEmpty()) {
+            wrapper.in("wrk_sts", wrkStsList);
+        }
+
+        if (!ioTypeList.isEmpty()) {
+            wrapper.in("io_type", ioTypeList);
         }
 
         if (crnNo != -1) {
             wrapper.eq("crn_no", crnNo);
         }
 
+        if (dualCrnNo != -1) {
+            wrapper.eq("dual_crn_no", dualCrnNo);
+        }
+
         if (rgvNo != -1) {
             wrapper.eq("rgv_no", rgvNo);
         }
 
+        if (sourceStaNo != -1) {
+            wrapper.eq("source_sta_no", sourceStaNo);
+        }
+
+        if (staNo != -1) {
+            wrapper.eq("sta_no", staNo);
+        }
+
+        if (barcode != null) {
+            wrapper.like("barcode", barcode);
+        }
+
+        if (batch != null) {
+            wrapper.like("batch", batch);
+        }
+
+        if (sourceLocNo != null) {
+            wrapper.like("source_loc_no", sourceLocNo);
+        }
+
+        if (locNo != null) {
+            wrapper.like("loc_no", locNo);
+        }
+
+        int safeLimit = Math.max(1, Math.min(limit, 500));
+        wrapper.orderByDesc("io_time").orderByDesc("appe_time").last("limit " + safeLimit);
+
         List<WrkMast> tasks = wrkMastService.list(wrapper);
         JSONObject data = new JSONObject();
         data.put("tasks", tasks);
+        data.put("count", tasks.size());
         return data;
     }
 
@@ -310,6 +367,25 @@
         return list;
     }
 
+    private String optStr(JSONObject o, String key) {
+        if (o == null || !o.containsKey(key)) return null;
+        String value = o.getString(key);
+        if (value == null || value.trim().isEmpty()) return null;
+        return value.trim();
+    }
+
+    private List<Long> optLongList(JSONObject o, String key) {
+        if (o == null || !o.containsKey(key)) return Collections.emptyList();
+        JSONArray arr = o.getJSONArray(key);
+        if (arr == null) return Collections.emptyList();
+        List<Long> list = new ArrayList<>();
+        for (int i = 0; i < arr.size(); i++) {
+            String s = arr.getString(i);
+            if (s != null && !s.trim().isEmpty()) list.add(Long.parseLong(s.trim()));
+        }
+        return list;
+    }
+
     private List<Integer> optIntList(JSONObject o, String key) {
         if (o == null || !o.containsKey(key)) return Collections.emptyList();
         JSONArray arr = o.getJSONArray(key);
diff --git a/src/main/java/com/zy/ai/mcp/tool/WcsMcpTools.java b/src/main/java/com/zy/ai/mcp/tool/WcsMcpTools.java
index 3949674..35f122d 100644
--- a/src/main/java/com/zy/ai/mcp/tool/WcsMcpTools.java
+++ b/src/main/java/com/zy/ai/mcp/tool/WcsMcpTools.java
@@ -32,16 +32,36 @@
         return wcsDataFacade.getRgvDeviceStatus(json().fluentPut("rgvNos", rgvNos));
     }
 
-    @Tool(name = "task_list", description = "閫氳繃绛涢�夋潯浠舵煡璇换鍔℃暟鎹�")
-    public Object getTasks(
+    @Tool(name = "task_query", description = "鎸変换鍔″彿銆佺姸鎬併�佽澶囥�佹潯鐮併�佸簱浣嶇瓑鏉′欢鏌ヨ浠诲姟鏁版嵁")
+    public Object queryTasks(
+            @ToolParam(description = "鍐呴儴宸ヤ綔鍙峰垪琛� wrkNos", required = false) List<Integer> wrkNos,
+            @ToolParam(description = "WMS浠诲姟鍙峰垪琛� wmsWrkNos", required = false) List<String> wmsWrkNos,
+            @ToolParam(description = "浠诲姟鐘舵�佸垪琛� wrkStsList", required = false) List<Long> wrkStsList,
+            @ToolParam(description = "鍏ュ嚭搴撶被鍨嬪垪琛� ioTypeList", required = false) List<Integer> ioTypeList,
             @ToolParam(description = "鍫嗗灈鏈虹紪鍙�", required = false) Integer crnNo,
+            @ToolParam(description = "鍙屽伐浣嶅爢鍨涙満缂栧彿", required = false) Integer dualCrnNo,
             @ToolParam(description = "RGV缂栧彿", required = false) Integer rgvNo,
-            @ToolParam(description = "浠诲姟鍗曞彿鍒楄〃", required = false) List<Integer> taskNos,
-            @ToolParam(description = "杩斿洖鏉℃暟涓婇檺锛岄粯璁� 200", required = false) Integer limit) {
+            @ToolParam(description = "鏉$爜鍏抽敭瀛�", required = false) String barcode,
+            @ToolParam(description = "鎵规鍙峰叧閿瓧", required = false) String batch,
+            @ToolParam(description = "婧愬簱浣嶅叧閿瓧", required = false) String sourceLocNo,
+            @ToolParam(description = "鐩爣搴撲綅鍏抽敭瀛�", required = false) String locNo,
+            @ToolParam(description = "婧愮珯鍙�", required = false) Integer sourceStaNo,
+            @ToolParam(description = "鐩爣绔欏彿", required = false) Integer staNo,
+            @ToolParam(description = "杩斿洖鏉℃暟涓婇檺锛岄粯璁� 200锛屾渶澶� 500", required = false) Integer limit) {
         return wcsDataFacade.getTasks(json()
+                .fluentPut("wrkNos", wrkNos)
+                .fluentPut("wmsWrkNos", wmsWrkNos)
+                .fluentPut("wrkStsList", wrkStsList)
+                .fluentPut("ioTypeList", ioTypeList)
                 .fluentPut("crnNo", crnNo)
+                .fluentPut("dualCrnNo", dualCrnNo)
                 .fluentPut("rgvNo", rgvNo)
-                .fluentPut("taskNos", taskNos)
+                .fluentPut("barcode", barcode)
+                .fluentPut("batch", batch)
+                .fluentPut("sourceLocNo", sourceLocNo)
+                .fluentPut("locNo", locNo)
+                .fluentPut("sourceStaNo", sourceStaNo)
+                .fluentPut("staNo", staNo)
                 .fluentPut("limit", limit));
     }
 
diff --git a/src/main/java/com/zy/ai/service/WcsDiagnosisService.java b/src/main/java/com/zy/ai/service/WcsDiagnosisService.java
index 83f0380..7c10893 100644
--- a/src/main/java/com/zy/ai/service/WcsDiagnosisService.java
+++ b/src/main/java/com/zy/ai/service/WcsDiagnosisService.java
@@ -35,7 +35,7 @@
     private AiPromptUtils aiPromptUtils;
     @Autowired
     private AiUtils aiUtils;
-    @Autowired(required = false)
+    @Autowired
     private SpringAiMcpToolManager mcpToolManager;
 
     public void diagnoseStream(WcsDiagnosisRequest request, SseEmitter emitter) {
@@ -49,44 +49,10 @@
         mcpUser.setRole("user");
         mcpUser.setContent(aiUtils.buildDiagnosisUserContentMcp(request));
 
-        if (runMcpStreamingDiagnosis(messages, mcpSystem, mcpUser, 0.3, 2048, emitter, null)) {
-            return;
-        }
-
-        messages = new ArrayList<>();
-        ChatCompletionRequest.Message system = new ChatCompletionRequest.Message();
-        system.setRole("system");
-        system.setContent(aiPromptUtils.getAiDiagnosePrompt());
-        messages.add(system);
-
-        ChatCompletionRequest.Message user = new ChatCompletionRequest.Message();
-        user.setRole("user");
-        user.setContent(aiUtils.buildDiagnosisUserContent(request));
-        messages.add(user);
-
-        llmChatService.chatStream(messages, 0.3, 2048, s -> {
-            try {
-                String safe = s == null ? "" : s.replace("\r", "").replace("\n", "\\n");
-                if (!safe.isEmpty()) {
-                    emitter.send(SseEmitter.event().data(safe));
-                }
-            } catch (Exception ignore) {}
-        }, () -> {
-            try {
-                log.info("AI diagnose stream stopped: normal end");
-                emitter.complete();
-            } catch (Exception ignore) {}
-        }, e -> {
-            try {
-                try { emitter.send(SseEmitter.event().data("銆怉I銆戣繍琛屽凡鍋滄锛堝紓甯革級")); } catch (Exception ignore) {}
-                log.error("AI diagnose stream stopped: error", e);
-                emitter.complete();
-            } catch (Exception ignore) {}
-        });
+        runMcpStreamingDiagnosis(messages, mcpSystem, mcpUser, 0.3, 2048, emitter, null);
     }
 
-    public void askStream(WcsDiagnosisRequest request,
-                          String prompt,
+    public void askStream(String prompt,
                           String chatId,
                           boolean reset,
                           SseEmitter emitter) {
@@ -114,11 +80,7 @@
             }
         }
 
-        StringBuilder assistantBuffer = new StringBuilder();
         final String finalChatId = chatId;
-        final String finalHistoryKey = historyKey;
-        final String finalMetaKey = metaKey;
-        final String finalPrompt = prompt;
 
         ChatCompletionRequest.Message mcpSystem = new ChatCompletionRequest.Message();
         mcpSystem.setRole("system");
@@ -128,60 +90,7 @@
         mcpUser.setRole("user");
         mcpUser.setContent("銆愮敤鎴锋彁闂�慭n" + (prompt == null ? "" : prompt));
 
-        if (runMcpStreamingDiagnosis(messages, mcpSystem, mcpUser, 0.3, 2048, emitter, finalChatId)) {
-            return;
-        }
-
-        messages = new ArrayList<>();
-        ChatCompletionRequest.Message system = new ChatCompletionRequest.Message();
-        system.setRole("system");
-        system.setContent(aiPromptUtils.getWcsSensorPrompt());
-        messages.add(system);
-
-        ChatCompletionRequest.Message questionMsg = new ChatCompletionRequest.Message();
-        questionMsg.setRole("user");
-        questionMsg.setContent("銆愮敤鎴锋彁闂�慭n" + (prompt == null ? "" : prompt));
-        messages.add(questionMsg);
-
-        llmChatService.chatStream(messages, 0.3, 2048, s -> {
-            try {
-                String safe = s == null ? "" : s.replace("\r", "").replace("\n", "\\n");
-                if (!safe.isEmpty()) {
-                    emitter.send(SseEmitter.event().data(safe));
-                    assistantBuffer.append(s);
-                }
-            } catch (Exception ignore) {}
-        }, () -> {
-            try {
-                if (finalChatId != null && !finalChatId.isEmpty()) {
-                    ChatCompletionRequest.Message q = new ChatCompletionRequest.Message();
-                    q.setRole("user");
-                    q.setContent(finalPrompt == null ? "" : finalPrompt);
-                    ChatCompletionRequest.Message a = new ChatCompletionRequest.Message();
-                    a.setRole("assistant");
-                    a.setContent(assistantBuffer.toString());
-                    redisUtil.lSet(finalHistoryKey, q);
-                    redisUtil.lSet(finalHistoryKey, a);
-                    redisUtil.expire(finalHistoryKey, CHAT_TTL_SECONDS);
-                    Map<Object, Object> old = redisUtil.hmget(finalMetaKey);
-                    Long createdAt = old != null && old.get("createdAt") != null ?
-                            (old.get("createdAt") instanceof Number ? ((Number) old.get("createdAt")).longValue() : Long.valueOf(String.valueOf(old.get("createdAt"))))
-                            : System.currentTimeMillis();
-                    Map<String, Object> meta = new java.util.HashMap<>();
-                    meta.put("chatId", finalChatId);
-                    meta.put("title", buildTitleFromPrompt(finalPrompt));
-                    meta.put("createdAt", createdAt);
-                    meta.put("updatedAt", System.currentTimeMillis());
-                    redisUtil.hmset(finalMetaKey, meta, CHAT_TTL_SECONDS);
-                }
-                emitter.complete();
-            } catch (Exception ignore) {}
-        }, e -> {
-            try {
-                try { emitter.send(SseEmitter.event().data("銆怉I銆戣繍琛屽凡鍋滄锛堝紓甯革級")); } catch (Exception ignore) {}
-                emitter.complete();
-            } catch (Exception ignore) {}
-        });
+        runMcpStreamingDiagnosis(messages, mcpSystem, mcpUser, 0.3, 2048, emitter, finalChatId);
     }
 
     public List<Map<String, Object>> listChats() {
@@ -249,17 +158,21 @@
         return p.length() > 20 ? p.substring(0, 20) : p;
     }
  
-    private boolean runMcpStreamingDiagnosis(List<ChatCompletionRequest.Message> baseMessages,
-                                             ChatCompletionRequest.Message systemPrompt,
-                                             ChatCompletionRequest.Message userQuestion,
-                                             Double temperature,
-                                             Integer maxTokens,
-                                             SseEmitter emitter,
-                                             String chatId) {
+    private void runMcpStreamingDiagnosis(List<ChatCompletionRequest.Message> baseMessages,
+                                          ChatCompletionRequest.Message systemPrompt,
+                                          ChatCompletionRequest.Message userQuestion,
+                                          Double temperature,
+                                          Integer maxTokens,
+                                          SseEmitter emitter,
+                                          String chatId) {
         try {
-            if (mcpToolManager == null) return false;
+            if (mcpToolManager == null) {
+                throw new IllegalStateException("Spring AI MCP tool manager is unavailable");
+            }
             List<Object> tools = mcpToolManager.buildOpenAiTools();
-            if (tools.isEmpty()) return false;
+            if (tools.isEmpty()) {
+                throw new IllegalStateException("No MCP tools registered");
+            }
 
             baseMessages.add(systemPrompt);
             baseMessages.add(userQuestion);
@@ -275,8 +188,7 @@
                 sse(emitter, "\\n姝e湪鍒嗘瀽锛堢" + (i + 1) + "杞級...\\n");
                 ChatCompletionResponse resp = llmChatService.chatCompletion(messages, temperature, maxTokens, tools);
                 if (resp == null || resp.getChoices() == null || resp.getChoices().isEmpty() || resp.getChoices().get(0).getMessage() == null) {
-                    sse(emitter, "\\n鍒嗘瀽鍑洪敊锛屾鍦ㄥ洖閫�...\\n");
-                    return false;
+                    throw new IllegalStateException("LLM returned empty response");
                 }
 
                 ChatCompletionRequest.Message assistant = resp.getChoices().get(0).getMessage();
@@ -366,16 +278,18 @@
                     }
                 } catch (Exception ignore) {}
             }, e -> {
-                sse(emitter, "\\n\\n銆怉I銆戝垎鏋愬嚭閿欙紝姝e湪鍥為��...\\n\\n");
+                try {
+                    sse(emitter, "\\n\\n銆怉I銆戝垎鏋愬嚭閿欙紝杩愯宸插仠姝紙寮傚父锛塡\n\\n");
+                    log.error("AI MCP diagnose stopped: stream error", e);
+                    emitter.complete();
+                } catch (Exception ignore) {}
             });
-            return true;
         } catch (Exception e) {
             try {
                 sse(emitter, "\\n\\n銆怉I銆戣繍琛屽凡鍋滄锛堝紓甯革級\\n\\n");
                 log.error("AI MCP diagnose stopped: error", e);
                 emitter.complete();
             } catch (Exception ignore) {}
-            return true;
         }
     }
 
diff --git a/src/main/java/com/zy/ai/utils/AiPromptUtils.java b/src/main/java/com/zy/ai/utils/AiPromptUtils.java
index 3f82e66..71b4a3c 100644
--- a/src/main/java/com/zy/ai/utils/AiPromptUtils.java
+++ b/src/main/java/com/zy/ai/utils/AiPromptUtils.java
@@ -9,7 +9,7 @@
     public String getAiDiagnosePromptMcp() {
         String prompt = "浣犳槸涓�鍚嶈祫娣� WCS锛堜粨鍌ㄦ帶鍒剁郴缁燂級涓庤嚜鍔ㄥ寲绔嬪簱涓撳锛岀啛鎮夛細鍫嗗灈鏈恒�佽緭閫佺嚎銆佹彁鍗囨満銆佺┛姊溅绛夎澶囩殑浠诲姟鍒嗛厤鍜岃繍琛岄�昏緫锛屼篃鐔熸倝甯歌鐨勭郴缁熷崱姝汇�佷换鍔′笉鎵ц銆佽澶囩┖闂蹭絾鏃犱换鍔$瓑闂妯″紡銆俓n\n" +
                 "浣犲彲浠ユ寜闇�璋冪敤绯荤粺鎻愪緵鐨勫伐鍏蜂互鑾峰彇瀹炴椂鏁版嵁涓庝笂涓嬫枃锛堝伐鍏疯繑鍥� JSON锛夛細\n" +
-                "- 浠诲姟锛歵ask_list\n" +
+                "- 浠诲姟锛歵ask_query\n" +
                 "- 璁惧瀹炴椂鐘舵�侊細device_get_crn_status / device_get_station_status / device_get_rgv_status\n" +
                 "- 鏃ュ織锛歭og_query\n" +
                 "- 璁惧閰嶇疆锛歝onfig_get_device_config\n" +
@@ -18,13 +18,6 @@
                 "1锛夐伩鍏嶈噯娴嬨�傚淇℃伅涓嶈冻锛屽厛璋冪敤鐩稿簲宸ュ叿鏀堕泦蹇呰鏁版嵁锛涘彲澶氳疆璋冪敤銆俓n" +
                 "2锛夊宸ュ叿杩斿洖鐨� JSON 鍏堣繘琛岀粨鏋勫寲褰掔撼锛屾彁鐐煎叧閿瓧娈碉紝鍐嶅仛鎺ㄧ悊銆俓n" +
                 "3锛変紭鍏堥『搴忥細浠诲姟鈫掕澶囩姸鎬佲啋鏃ュ織鈫掗厤缃紱鎸夐渶璋冩暣銆俓n\n" +
-                "浣犲皢鏀跺埌浠ヤ笅鍑犵被鏁版嵁锛歕n" +
-                "1锛変换鍔′俊鎭紙tasks锛夛細褰撳墠寰呮墽琛�/鍦ㄦ墽琛�/鎸傝捣浠诲姟\n" +
-                "2锛夎澶囧疄鏃舵暟鎹紙deviceRealtimeData锛夛細姣忓彴璁惧褰撳墠鐘舵�併�佹槸鍚﹀湪绾裤�佸綋鍓嶄换鍔″彿绛塡n" +
-                "3锛夎澶囬厤缃俊鎭紙deviceConfigs锛夛細璁惧鏄惁鍚敤銆佹湇鍔″尯鍩熴�佸厑璁哥殑浠诲姟绫诲瀷绛塡n" +
-                "4锛夌郴缁熸棩蹇楋紙logs锛夛細鎸夋椂闂撮『搴忕殑鏃ュ織鏂囨湰\n" +
-                "5锛夐澶栦笂涓嬫枃锛坋xtraContext锛夛細濡備粨搴撲唬鐮併�乄CS 鐗堟湰绛塡n\n" +
-                "6锛夌郴缁熼厤缃俊鎭紙systemConfigs锛夛細绯荤粺鐨勯厤缃弬鏁帮紝鏁版嵁搴撹〃鍚峴ys_config\n\n" +
                 "浣犵殑鐩爣鏄細甯姪鐜板満杩愮淮浜哄憳鍒嗘瀽锛屼负浠�涔堢郴缁熷綋鍓嶄笉鎵ц浠诲姟锛屾垨鑰呬换鍔℃墽琛屾晥鐜囧紓甯革紝鎸囧嚭鍙兘鏄摢浜涜澶囧鑷寸殑闂銆俓n\n" +
                 "璇锋寜浠ヤ笅缁撴瀯杈撳嚭璇婃柇缁撴灉锛堜娇鐢ㄧ畝浣撲腑鏂囷級锛歕n" +
                 "1. 闂姒傝堪锛�1-3 鍙ヨ瘽锛屾鎷綋鍓嶇郴缁熺姸鎬侊級\n" +
@@ -38,16 +31,6 @@
 
     //WCS楂樼骇涓撳Prompt
     public String getWcsSensorPromptMcp() {
-//        String prompt = "浣犳槸涓�鍚嶈祫娣� WCS锛堜粨鍌ㄦ帶鍒剁郴缁燂級涓庤嚜鍔ㄥ寲绔嬪簱涓撳锛岀啛鎮夛細鍫嗗灈鏈恒�佽緭閫佺嚎銆佹彁鍗囨満銆佺┛姊溅绛夎澶囩殑浠诲姟鍒嗛厤鍜岃繍琛岄�昏緫锛屼篃鐔熸倝甯歌鐨勭郴缁熷崱姝汇�佷换鍔′笉鎵ц銆佽澶囩┖闂蹭絾鏃犱换鍔$瓑闂妯″紡銆俓n\n" +
-//                "浣犲彲浠ユ寜闇�璋冪敤绯荤粺鎻愪緵鐨勫伐鍏蜂互鑾峰彇瀹炴椂鏁版嵁涓庝笂涓嬫枃锛堝伐鍏疯繑鍥� JSON锛夛細\n" +
-//                "- 浠诲姟锛歵ask_list\n" +
-//                "- 璁惧瀹炴椂鐘舵�侊細device_get_crn_status / device_get_station_status / device_get_rgv_status\n" +
-//                "- 鏃ュ織锛歭og_query\n" +
-//                "- 璁惧閰嶇疆锛歝onfig_get_device_config\n" +
-//                "- 绯荤粺閰嶇疆锛歝onfig_get_system_config\n\n" +
-//                "璇峰厛鐢ㄥ伐鍏疯幏鍙栧繀瑕佷俊鎭紝鍐嶄互绠�娲併�佹槑纭殑涓枃浣滅瓟锛屽苟鍦ㄩ渶瑕佹椂缁欏嚭鍙墽琛岀殑鎺掓煡寤鸿銆�" +
-//                "濡傞渶瑕侀澶栨暟鎹紝璇峰厛璋冪敤鍚堥�傜殑宸ュ叿鍐嶇户缁洖绛斻��";
-
         String prompt = "浣犳槸涓�鍚嶈祫娣� WCS锛堜粨鍌ㄦ帶鍒剁郴缁燂級涓庤嚜鍔ㄥ寲绔嬪簱涓撳锛孿n" +
                 "绮鹃�氬爢鍨涙満銆佽緭閫佺嚎銆佹彁鍗囨満銆佺┛姊溅銆丷GV銆佸伐浣嶇瓑璁惧鐨刓n" +
                 "浠诲姟鍒嗛厤銆佽繍琛岀姸鎬佹祦杞笌寮傚父澶勭悊銆俓n" +
@@ -60,10 +43,9 @@
                 "   - 鑻ラ棶棰樻秹鍙娾�滃綋鍓嶇姸鎬� / 鏄惁鍗℃ / 鏄惁鏈変换鍔� / 鏄惁寮傚父鈥濓紝\n" +
                 "     浣犲繀椤诲厛璋冪敤宸ュ叿鑾峰彇鏁版嵁锛屽啀杩涜鍒嗘瀽銆俓n" +
                 "\n" +
-                "2. **浼樺厛浣跨敤鑱氬悎寮忎俊鎭紝鍏舵鍐嶄娇鐢ㄥ崟椤规煡璇€��**\n" +
-                "   - 鑻ラ渶瑕佹暣浣撳垽鏂郴缁熺姸鎬侊紝璇蜂紭鍏堣皟鐢細\n" +
-                "     鈫� build_diagnosis_snapshot锛堝鍙敤锛塡n" +
-                "   - 鑻ュ彧闇�瑕佸眬閮ㄨˉ鍏呬俊鎭紝鍐嶈皟鐢ㄥ崟椤瑰伐鍏枫�俓n" +
+                "2. **浼樺厛浣跨敤鏈�灏戜笖鏈�鐩稿叧鐨勫伐鍏疯皟鐢ㄣ��**\n" +
+                "   - 鏁翠綋璇婃柇鏃讹紝鍏堟煡浠诲姟涓庡叧閿澶囩姸鎬併�俓n" +
+                "   - 闇�瑕佽ˉ璇佹嵁鏃讹紝鍐嶆煡鏃ュ織鎴栭厤缃�俓n" +
                 "\n" +
                 "3. **褰撲俊鎭笉瓒充互鍒ゆ柇鏃讹紝涓嶅緱鐚滄祴鍘熷洜銆�**\n" +
                 "   - 蹇呴』鏄庣‘鎸囧嚭鈥滅己灏戝摢浜涙暟鎹�濓紝骞惰皟鐢ㄥ搴斿伐鍏疯幏鍙栥�俓n" +
@@ -73,7 +55,7 @@
                 "==================== 鍙敤宸ュ叿锛堣繑鍥� JSON锛� ====================\n" +
                 "\n" +
                 "銆愪换鍔$浉鍏炽�慭n" +
-                "- task_list               鈥斺�� 鏌ヨ褰撳墠/鍘嗗彶浠诲姟鍙婄姸鎬乗n" +
+                "- task_query              鈥斺�� 鎸変换鍔″彿銆佺姸鎬併�佽澶囥�佹潯鐮併�佸簱浣嶇瓑鏉′欢鏌ヨ浠诲姟\n" +
                 "\n" +
                 "銆愯澶囧疄鏃剁姸鎬併�慭n" +
                 "- device_get_crn_status   鈥斺�� 鍫嗗灈鏈哄疄鏃剁姸鎬乗n" +
@@ -115,32 +97,4 @@
                 "- 鑻ラ渶瑕佽繘涓�姝ユ暟鎹紝璇�**鍏堣皟鐢ㄥ伐鍏凤紝鍐嶇户缁垎鏋�**\n";
         return prompt;
     }
-
-    //AI璇婃柇绯荤粺Prompt
-    public String getAiDiagnosePrompt() {
-        String prompt = "浣犳槸涓�鍚嶈祫娣� WCS锛堜粨鍌ㄦ帶鍒剁郴缁燂級涓庤嚜鍔ㄥ寲绔嬪簱涓撳锛岀啛鎮夛細鍫嗗灈鏈恒�佽緭閫佺嚎銆佹彁鍗囨満銆佺┛姊溅绛夎澶囩殑浠诲姟鍒嗛厤鍜岃繍琛岄�昏緫锛屼篃鐔熸倝甯歌鐨勭郴缁熷崱姝汇�佷换鍔′笉鎵ц銆佽澶囩┖闂蹭絾鏃犱换鍔$瓑闂妯″紡銆俓n\n" +
-                "浣犲皢鏀跺埌浠ヤ笅鍑犵被鏁版嵁锛歕n" +
-                "1锛変换鍔′俊鎭紙tasks锛夛細褰撳墠寰呮墽琛�/鍦ㄦ墽琛�/鎸傝捣浠诲姟\n" +
-                "2锛夎澶囧疄鏃舵暟鎹紙deviceRealtimeData锛夛細姣忓彴璁惧褰撳墠鐘舵�併�佹槸鍚﹀湪绾裤�佸綋鍓嶄换鍔″彿绛塡n" +
-                "3锛夎澶囬厤缃俊鎭紙deviceConfigs锛夛細璁惧鏄惁鍚敤銆佹湇鍔″尯鍩熴�佸厑璁哥殑浠诲姟绫诲瀷绛塡n" +
-                "4锛夌郴缁熸棩蹇楋紙logs锛夛細鎸夋椂闂撮『搴忕殑鏃ュ織鏂囨湰\n" +
-                "5锛夐澶栦笂涓嬫枃锛坋xtraContext锛夛細濡備粨搴撲唬鐮併�乄CS 鐗堟湰绛塡n\n" +
-                "6锛夌郴缁熼厤缃俊鎭紙systemConfigs锛夛細绯荤粺鐨勯厤缃弬鏁帮紝鏁版嵁搴撹〃鍚峴ys_config\n\n" +
-                "浣犵殑鐩爣鏄細甯姪鐜板満杩愮淮浜哄憳鍒嗘瀽锛屼负浠�涔堢郴缁熷綋鍓嶄笉鎵ц浠诲姟锛屾垨鑰呬换鍔℃墽琛屾晥鐜囧紓甯革紝鎸囧嚭鍙兘鏄摢浜涜澶囧鑷寸殑闂銆俓n\n" +
-                "璇锋寜浠ヤ笅缁撴瀯杈撳嚭璇婃柇缁撴灉锛堜娇鐢ㄧ畝浣撲腑鏂囷級锛歕n" +
-                "1. 闂姒傝堪锛�1-3 鍙ヨ瘽锛屾鎷綋鍓嶇郴缁熺姸鎬侊級\n" +
-                "2. 鍙枒璁惧鍒楄〃锛堝垪鍑� 1-N 涓澶囩紪鍙凤紝骞惰鏄庢瘡涓澶囦负浠�涔堝彲鐤戯紝渚嬪锛氶厤缃鐢�/闀挎椂闂寸┖闂�/鐘舵�佸紓甯�/浠诲姟鍒嗛厤涓嶅埌瀹冪瓑锛塡n" +
-                "3. 鍙兘鍘熷洜锛堜粠浠诲姟鍒嗛厤銆佽澶囩姸鎬併�侀厤缃敊璇�佹帴鍙�/閫氫俊寮傚父绛夎搴︼紝鍒楀嚭 3-7 鏉★級\n" +
-                "4. 寤鸿鎺掓煡姝ラ锛堟楠� 1銆�2銆�3...锛屾瘡姝ヨ灏介噺鍏蜂綋銆佸彲鎿嶄綔锛屼緥濡傦細鍦ㄦ煇椤甸潰鏌ョ湅鏌愬瓧娈点�佹鏌ユ煇涓紑鍏炽�佸姣旀煇涓姸鎬佷綅绛夛級\n" +
-                "5. 椋庨櫓璇勪及锛堣鏄庡綋鍓嶉棶棰樺涓氬姟褰卞搷绋嬪害锛氶珮/涓�/浣庯紝浠ュ強鏄惁闇�瑕佺珛鍗充汉宸ュ共棰勶級\n";
-        return prompt;
-    }
-
-    //WCS楂樼骇涓撳Prompt
-    public String getWcsSensorPrompt() {
-        String prompt = "浣犳槸涓�鍚嶈祫娣� WCS锛堜粨鍌ㄦ帶鍒剁郴缁燂級涓庤嚜鍔ㄥ寲绔嬪簱涓撳锛岀啛鎮夛細鍫嗗灈鏈恒�佽緭閫佺嚎銆佹彁鍗囨満銆佺┛姊溅绛夎澶囩殑浠诲姟鍒嗛厤鍜岃繍琛岄�昏緫锛屼篃鐔熸倝甯歌鐨勭郴缁熷崱姝汇�佷换鍔′笉鎵ц銆佽澶囩┖闂蹭絾鏃犱换鍔$瓑闂妯″紡銆俓n\n" +
-                "鍦ㄥ洖绛旂敤鎴烽棶棰樻椂锛岄渶瑕佺粨鍚堜笅闈㈢粰鍑虹殑绯荤粺褰撳墠涓婁笅鏂囦俊鎭紙浠诲姟銆佽澶囧疄鏃剁姸鎬併�佽澶囬厤缃�佺郴缁熸棩蹇椼�佺郴缁熼厤缃瓑锛夛紝浠ョ畝娲併�佹槑纭殑涓枃浣滅瓟锛屽苟鍦ㄩ渶瑕佹椂缁欏嚭鍙墽琛岀殑鎺掓煡寤鸿銆�";
-        return prompt;
-    }
-
 }
diff --git a/src/main/java/com/zy/ai/utils/AiUtils.java b/src/main/java/com/zy/ai/utils/AiUtils.java
index 367be8c..1d6af95 100644
--- a/src/main/java/com/zy/ai/utils/AiUtils.java
+++ b/src/main/java/com/zy/ai/utils/AiUtils.java
@@ -1,279 +1,47 @@
 package com.zy.ai.utils;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.zy.ai.entity.DeviceConfigsData;
-import com.zy.ai.entity.DeviceRealTimeData;
 import com.zy.ai.entity.WcsDiagnosisRequest;
-import com.zy.ai.log.AiLogAppender;
-import com.zy.asrs.entity.BasCrnp;
-import com.zy.asrs.entity.BasDevp;
-import com.zy.asrs.entity.WrkMast;
-import com.zy.asrs.service.BasCrnpService;
-import com.zy.asrs.service.BasDevpService;
-import com.zy.asrs.service.WrkMastService;
-import com.zy.common.utils.RedisUtil;
-import com.zy.core.cache.SlaveConnection;
-import com.zy.core.enums.SlaveType;
-import com.zy.core.model.StationObjModel;
-import com.zy.core.model.protocol.CrnProtocol;
-import com.zy.core.model.protocol.StationProtocol;
-import com.zy.core.thread.CrnThread;
-import com.zy.core.thread.StationThread;
-import com.zy.system.entity.Config;
-import com.zy.system.service.ConfigService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
 
 @Component
 public class AiUtils {
 
-    @Autowired
-    private WrkMastService wrkMastService;
-    @Autowired
-    private BasCrnpService basCrnpService;
-    @Autowired
-    private BasDevpService basDevpService;
-    @Autowired
-    private ConfigService configService;
-    @Autowired
-    private RedisUtil redisUtil;
-
     public WcsDiagnosisRequest makeAiRequest(int logLimit, String alarmMessage) {
         WcsDiagnosisRequest request = new WcsDiagnosisRequest();
-
         request.setAlarmMessage(alarmMessage);
-
-        List<String> logs = AiLogAppender.getRecentLogs(logLimit);
-        request.setLogs(logs);
-
-        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<>());
-        request.setTasks(wrkMasts);
-
-        List<DeviceRealTimeData> deviceRealTimeDataList = new ArrayList<>();
-        List<DeviceConfigsData> deviceConfigsDataList = new ArrayList<>();
-
-        List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
-        for (BasCrnp basCrnp : basCrnps) {
-            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
-            if (crnThread == null) {
-                continue;
-            }
-
-            CrnProtocol protocol = crnThread.getStatus();
-
-            for (StationObjModel stationObjModel : basCrnp.getInStationList$()) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                Map<Integer, StationProtocol> map = stationThread.getStatusMap();
-                StationProtocol stationProtocol = map.get(stationObjModel.getStationId());
-                if (stationProtocol == null) {
-                    continue;
-                }
-
-                DeviceRealTimeData stationData = new DeviceRealTimeData();
-                stationData.setDeviceNo(stationObjModel.getDeviceNo());
-                stationData.setDeviceType(String.valueOf(SlaveType.Devp));
-                stationData.setDeviceData(stationProtocol);
-                deviceRealTimeDataList.add(stationData);
-            }
-
-            DeviceRealTimeData deviceRealTimeData = new DeviceRealTimeData();
-            deviceRealTimeData.setDeviceNo(basCrnp.getCrnNo());
-            deviceRealTimeData.setDeviceType(String.valueOf(SlaveType.Crn));
-            deviceRealTimeData.setDeviceData(protocol);
-            deviceRealTimeDataList.add(deviceRealTimeData);
-
-            DeviceConfigsData deviceConfigsData = new DeviceConfigsData();
-            deviceConfigsData.setDeviceNo(basCrnp.getCrnNo());
-            deviceConfigsData.setDeviceType(String.valueOf(SlaveType.Crn));
-            deviceConfigsData.setDeviceData(basCrnp);
-            deviceConfigsDataList.add(deviceConfigsData);
-        }
-
-        List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
-        for (BasDevp basDevp : basDevps) {
-            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-            if (stationThread == null) {
-                continue;
-            }
-            Map<Integer, StationProtocol> map = stationThread.getStatusMap();
-
-            for (StationObjModel stationObjModel : basDevp.getInStationList$()) {
-                StationProtocol stationProtocol = map.get(stationObjModel.getStationId());
-                if (stationProtocol == null) {
-                    continue;
-                }
-
-                DeviceRealTimeData stationData = new DeviceRealTimeData();
-                stationData.setDeviceNo(stationObjModel.getDeviceNo());
-                stationData.setDeviceType(String.valueOf(SlaveType.Devp));
-                stationData.setDeviceData(stationProtocol);
-                deviceRealTimeDataList.add(stationData);
-            }
-
-            for (StationObjModel stationObjModel : basDevp.getOutStationList$()) {
-                StationProtocol stationProtocol = map.get(stationObjModel.getStationId());
-                if (stationProtocol == null) {
-                    continue;
-                }
-
-                DeviceRealTimeData stationData = new DeviceRealTimeData();
-                stationData.setDeviceNo(stationObjModel.getDeviceNo());
-                stationData.setDeviceType(String.valueOf(SlaveType.Devp));
-                stationData.setDeviceData(stationProtocol);
-                deviceRealTimeDataList.add(stationData);
-            }
-
-            //鍓旈櫎鍏ㄩ儴杈撻�佺珯鐐逛俊鎭紝浠ュ厤鏁版嵁閲忚繃澶э紝鍚庢湡鐪嬪疄闄呮儏鍐垫槸鍚︽墦寮�
-            basDevp.setStationList(null);
-
-            DeviceConfigsData deviceConfigsData = new DeviceConfigsData();
-            deviceConfigsData.setDeviceNo(basDevp.getDevpNo());
-            deviceConfigsData.setDeviceType(String.valueOf(SlaveType.Devp));
-            deviceConfigsData.setDeviceData(basDevp);
-            deviceConfigsDataList.add(deviceConfigsData);
-        }
-
-        request.setDeviceRealtimeData(deviceRealTimeDataList);
-        request.setDeviceConfigs(deviceConfigsDataList);
-
-        List<Config> systemConfigList = configService.list(new QueryWrapper<Config>().ne("code", "dingdingReportUrl"));
-        request.setSystemConfigs(systemConfigList);
-
+        request.setLogLimit(logLimit);
         return request;
-    }
-
-    public String buildDiagnosisUserContent(WcsDiagnosisRequest request) {
-        StringBuilder sb = new StringBuilder();
-
-        if (request.getAlarmMessage() != null && !request.getAlarmMessage().isEmpty()) {
-            sb.append("銆愰棶棰樻弿杩般�慭n");
-            sb.append(request.getAlarmMessage()).append("\n\n");
-        }
-
-        sb.append("銆愯澶囦俊鎭�慭n");
-        sb.append("鍏虫敞璁惧锛堝鏋滄湁鎸囧畾锛�: ")
-                .append(request.getCraneNo() != null ? request.getCraneNo() : "鏈寚瀹氾紝闇�鏁翠綋鍒嗘瀽")
-                .append("\n\n");
-
-        Object pseudo = redisUtil.get(com.zy.core.enums.RedisKeyType.MAIN_PROCESS_PSEUDOCODE.key);
-        if (pseudo != null) {
-            sb.append("銆愪富娴佺▼浼唬鐮� mainProcessPseudo銆慭n");
-            sb.append(String.valueOf(pseudo)).append("\n\n");
-        }
-
-        if (request.getExtraContext() != null && !request.getExtraContext().isEmpty()) {
-            sb.append("銆愰澶栦笂涓嬫枃 extraContext銆慭n");
-            sb.append(JSON.toJSONString(request.getExtraContext(), true)).append("\n\n");
-        }
-
-        if (request.getTasks() != null && !request.getTasks().isEmpty()) {
-            sb.append("銆愪换鍔′俊鎭� tasks銆慭n");
-            sb.append("涓嬮潰鏄綋鍓嶇浉鍏充换鍔″垪琛ㄧ殑 JSON 鏁版嵁锛歕n");
-            sb.append(JSON.toJSONString(request.getTasks(), true)).append("\n\n");
-        } else {
-            sb.append("銆愪换鍔′俊鎭� tasks銆慭n");
-            sb.append("褰撳墠鏈彁渚涗换鍔′俊鎭�俓n\n");
-        }
-
-        if (request.getDeviceRealtimeData() != null && !request.getDeviceRealtimeData().isEmpty()) {
-            sb.append("銆愯澶囧疄鏃舵暟鎹� deviceRealtimeData銆慭n");
-            sb.append("涓嬮潰鏄悇璁惧褰撳墠瀹炴椂鐘舵�佺殑 JSON 鏁版嵁锛歕n");
-            sb.append(JSON.toJSONString(request.getDeviceRealtimeData(), true)).append("\n\n");
-        } else {
-            sb.append("銆愯澶囧疄鏃舵暟鎹� deviceRealtimeData銆慭n");
-            sb.append("褰撳墠鏈彁渚涜澶囧疄鏃舵暟鎹�俓n\n");
-        }
-
-        if (request.getDeviceConfigs() != null && !request.getDeviceConfigs().isEmpty()) {
-            sb.append("銆愯澶囬厤缃俊鎭� deviceConfigs銆慭n");
-            sb.append("涓嬮潰鏄悇璁惧閰嶇疆鐨� JSON 鏁版嵁锛歕n");
-            sb.append(JSON.toJSONString(request.getDeviceConfigs(), true)).append("\n\n");
-        } else {
-            sb.append("銆愯澶囬厤缃俊鎭� deviceConfigs銆慭n");
-            sb.append("褰撳墠鏈彁渚涜澶囬厤缃俊鎭�俓n\n");
-        }
-
-        if (request.getLogs() != null && !request.getLogs().isEmpty()) {
-            sb.append("銆愮郴缁熸棩蹇� logs锛堟寜鏃堕棿椤哄簭锛夈�慭n");
-            for (String logLine : request.getLogs()) {
-                sb.append(logLine).append("\n");
-            }
-        } else {
-            sb.append("銆愮郴缁熸棩蹇� logs锛堟寜鏃堕棿椤哄簭锛夈�慭n");
-            sb.append("褰撳墠鏈彁渚涙棩蹇椾俊鎭�俓n");
-        }
-
-        if (request.getSystemConfigs() != null && !request.getSystemConfigs().isEmpty()) {
-            sb.append("銆愮郴缁熼厤缃� sys_config銆慭n");
-            sb.append("涓嬮潰鏄悇绯荤粺閰嶇疆鐨� JSON 鏁版嵁锛歕n");
-            sb.append(JSON.toJSONString(request.getSystemConfigs(), true)).append("\n\n");
-        }
-
-        sb.append("\n璇锋牴鎹互涓婃墍鏈変俊鎭紝缁撳悎浣犵殑缁忛獙杩涜鍒嗘瀽璇婃柇銆�");
-
-        return sb.toString();
-    }
-
-    public String buildAskUserContent(WcsDiagnosisRequest request) {
-        StringBuilder sb = new StringBuilder();
-
-        if (request.getExtraContext() != null && !request.getExtraContext().isEmpty()) {
-            sb.append("銆愰澶栦笂涓嬫枃 extraContext銆慭n");
-            sb.append(JSON.toJSONString(request.getExtraContext(), true)).append("\n\n");
-        }
-
-        if (request.getTasks() != null && !request.getTasks().isEmpty()) {
-            sb.append("銆愪换鍔′俊鎭� tasks銆慭n");
-            sb.append("涓嬮潰鏄綋鍓嶇浉鍏充换鍔″垪琛ㄧ殑 JSON 鏁版嵁锛歕n");
-            sb.append(JSON.toJSONString(request.getTasks(), true)).append("\n\n");
-        }
-
-        if (request.getDeviceRealtimeData() != null && !request.getDeviceRealtimeData().isEmpty()) {
-            sb.append("銆愯澶囧疄鏃舵暟鎹� deviceRealtimeData銆慭n");
-            sb.append("涓嬮潰鏄悇璁惧褰撳墠瀹炴椂鐘舵�佺殑 JSON 鏁版嵁锛歕n");
-            sb.append(JSON.toJSONString(request.getDeviceRealtimeData(), true)).append("\n\n");
-        }
-
-        if (request.getDeviceConfigs() != null && !request.getDeviceConfigs().isEmpty()) {
-            sb.append("銆愯澶囬厤缃俊鎭� deviceConfigs銆慭n");
-            sb.append("涓嬮潰鏄悇璁惧閰嶇疆鐨� JSON 鏁版嵁锛歕n");
-            sb.append(JSON.toJSONString(request.getDeviceConfigs(), true)).append("\n\n");
-        }
-
-        if (request.getLogs() != null && !request.getLogs().isEmpty()) {
-            sb.append("銆愮郴缁熸棩蹇� logs锛堟寜鏃堕棿椤哄簭锛夈�慭n");
-            for (String logLine : request.getLogs()) {
-                sb.append(logLine).append("\n");
-            }
-        }
-
-        if (request.getSystemConfigs() != null && !request.getSystemConfigs().isEmpty()) {
-            sb.append("銆愮郴缁熼厤缃� sys_config銆慭n");
-            sb.append("涓嬮潰鏄悇绯荤粺閰嶇疆鐨� JSON 鏁版嵁锛歕n");
-            sb.append(JSON.toJSONString(request.getSystemConfigs(), true)).append("\n\n");
-        }
-
-        return sb.toString();
     }
 
     public String buildDiagnosisUserContentMcp(WcsDiagnosisRequest request) {
         StringBuilder sb = new StringBuilder();
 
+        if (request == null) {
+            return "";
+        }
+
         if (request.getAlarmMessage() != null && !request.getAlarmMessage().isEmpty()) {
             sb.append("銆愰棶棰樻弿杩般�慭n");
             sb.append(request.getAlarmMessage()).append("\n\n");
         }
 
+        if (request.getCraneNo() != null) {
+            sb.append("銆愯瘖鏂寖鍥淬�慭n");
+            sb.append("褰撳墠閲嶇偣鍏虫敞鍫嗗灈鏈猴細").append(request.getCraneNo()).append("\n\n");
+        }
+
+        if (request.getLogLimit() != null && request.getLogLimit() > 0) {
+            sb.append("銆愭煡璇㈠缓璁�慭n");
+            sb.append("濡傞渶鏃ュ織锛岃浼樺厛鏌ヨ鏈�杩� ").append(request.getLogLimit()).append(" 琛屻�俓n\n");
+        }
+
+        if (request.getExtraContext() != null && !request.getExtraContext().isEmpty()) {
+            sb.append("銆愰澶栦笂涓嬫枃 extraContext銆慭n");
+            sb.append(JSON.toJSONString(request.getExtraContext(), true)).append("\n\n");
+        }
+
+        sb.append("璇峰厛閫氳繃 MCP 宸ュ叿鑾峰彇浠诲姟銆佽澶囥�佹棩蹇楀拰閰嶇疆绛夊疄鏃舵暟鎹紝鍐嶅熀浜庝簨瀹炲垎鏋愩�俓n");
         return sb.toString();
     }
-
 }

--
Gitblit v1.9.1