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