From 5f5b48f0c12fc7518030f5aa62393c8dfec5662e Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 18 三月 2026 11:09:39 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/ai/mcp/tool/WcsMcpTools.java                          |    6 
 src/main/java/com/zy/ai/service/MainProcessPseudocodeService.java          |    8 
 src/main/java/com/zy/ai/service/impl/MainProcessPseudocodeServiceImpl.java |  302 ++++++++++++++++++++++++++++++
 src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java            |    9 
 src/main/java/com/zy/ai/mcp/service/WcsDataFacade.java                     |    7 
 src/main/java/com/zy/ai/timer/MakeMainProcessPseudocodeScheduler.java      |  223 ----------------------
 src/main/resources/application.yml                                         |    2 
 7 files changed, 332 insertions(+), 225 deletions(-)

diff --git a/src/main/java/com/zy/ai/mcp/service/WcsDataFacade.java b/src/main/java/com/zy/ai/mcp/service/WcsDataFacade.java
index 26d459b..efb669d 100644
--- a/src/main/java/com/zy/ai/mcp/service/WcsDataFacade.java
+++ b/src/main/java/com/zy/ai/mcp/service/WcsDataFacade.java
@@ -18,8 +18,7 @@
 
     Object getSystemConfig(JSONObject args);
 
-    /**
-     * 鈽� 鑱氬悎蹇収锛氭牳蹇冭瘖鏂緭鍏�
-     */
+    Object getSystemPseudocode(JSONObject args);
+
     Object buildDiagnosisSnapshot(JSONObject args);
-}
\ 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 2efa2a0..f7d6777 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
@@ -6,6 +6,7 @@
 import com.zy.ai.entity.DeviceConfigsData;
 import com.zy.ai.log.AiLogAppender;
 import com.zy.ai.mcp.service.WcsDataFacade;
+import com.zy.ai.service.MainProcessPseudocodeService;
 import com.zy.asrs.entity.BasCrnp;
 import com.zy.asrs.entity.BasDevp;
 import com.zy.asrs.entity.BasRgv;
@@ -45,6 +46,8 @@
     private WrkMastService wrkMastService;
     @Autowired
     private ConfigService configService;
+    @Autowired
+    private MainProcessPseudocodeService mainProcessPseudocodeService;
 
     @Override
     public Object getCrnDeviceStatus(JSONObject args) {
@@ -276,6 +279,12 @@
     }
 
     @Override
+    public Object getSystemPseudocode(JSONObject args) {
+        boolean refresh = optBool(args, "refresh", false);
+        return mainProcessPseudocodeService.queryMainProcessPseudocode(refresh);
+    }
+
+    @Override
     public Object buildDiagnosisSnapshot(JSONObject args) {
         String wh = mustStr(args, "warehouseCode");
         List<String> crnDeviceNos = optStrList(args, "crnDeviceNos");
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 35f122d..2f7c72b 100644
--- a/src/main/java/com/zy/ai/mcp/tool/WcsMcpTools.java
+++ b/src/main/java/com/zy/ai/mcp/tool/WcsMcpTools.java
@@ -87,6 +87,12 @@
         return wcsDataFacade.getSystemConfig(json());
     }
 
+    @Tool(name = "system_get_main_process_pseudocode", description = "鏌ヨ褰撳墠WCS绯荤粺涓绘祦绋嬩吉浠g爜")
+    public Object getSystemPseudocode(
+            @ToolParam(description = "鏄惁寮哄埗閲嶆柊鐢熸垚浼唬鐮侊紝榛樿 false", required = false) Boolean refresh) {
+        return wcsDataFacade.getSystemPseudocode(json().fluentPut("refresh", refresh));
+    }
+
     private JSONObject json() {
         return new JSONObject();
     }
diff --git a/src/main/java/com/zy/ai/service/MainProcessPseudocodeService.java b/src/main/java/com/zy/ai/service/MainProcessPseudocodeService.java
new file mode 100644
index 0000000..8436715
--- /dev/null
+++ b/src/main/java/com/zy/ai/service/MainProcessPseudocodeService.java
@@ -0,0 +1,8 @@
+package com.zy.ai.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+public interface MainProcessPseudocodeService {
+
+    JSONObject queryMainProcessPseudocode(boolean refresh);
+}
diff --git a/src/main/java/com/zy/ai/service/impl/MainProcessPseudocodeServiceImpl.java b/src/main/java/com/zy/ai/service/impl/MainProcessPseudocodeServiceImpl.java
new file mode 100644
index 0000000..c78a3fd
--- /dev/null
+++ b/src/main/java/com/zy/ai/service/impl/MainProcessPseudocodeServiceImpl.java
@@ -0,0 +1,302 @@
+package com.zy.ai.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zy.ai.entity.ChatCompletionRequest;
+import com.zy.ai.service.LlmChatService;
+import com.zy.ai.service.MainProcessPseudocodeService;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.News;
+import com.zy.core.enums.RedisKeyType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service("mainProcessPseudocodeService")
+public class MainProcessPseudocodeServiceImpl implements MainProcessPseudocodeService {
+
+    private static final long SUCCESS_CACHE_SECONDS = 60 * 60 * 24;
+    private static final long FAILURE_CACHE_SECONDS = 60 * 10;
+    private static final String FAILURE_TEXT = "AI鐢熸垚浼唬鐮佸け璐�";
+    private static final String PSEUDOCODE_SYSTEM_PROMPT = """
+            浣犵幇鍦ㄦ槸涓�鍚嶉珮绾� Java 鏋舵瀯甯堝吋浼唬鐮佽浆鎹笓瀹讹紝涓撻棬璐熻矗鎶婂鏉傜殑 Java 浠g爜杞崲鎴愮粨鏋勬竻鏅般�侀�傚悎澶фā鍨嬮槄璇讳笌鎺ㄧ悊鐨勪吉浠g爜銆�
+
+            璇蜂弗鏍奸伒瀹堜互涓嬭姹傚伐浣滐細
+
+            鏍稿績鐩爣
+
+            杈撳叆鏄竴娈垫垨澶氭 Java 浠g爜銆�
+
+            杈撳嚭鏄竴娈典汉绫诲彲璇汇�侀�昏緫娓呮櫚銆佸敖閲忚瑷�涓珛鐨勪吉浠g爜銆�
+
+            杩欎唤浼唬鐮佸皢琚敤浣滃悗缁ぇ妯″瀷鎻愰棶鐨勨�滃弬鑰冩弿杩扳�濓紝鎵�浠ヨ锛�
+
+            淇濈暀鍏抽敭涓氬姟閫昏緫鍜屽垽鏂潯浠讹紱
+
+            寮卞寲璇█缁嗚妭锛堝鍏蜂綋搴撱�佹敞瑙c�佹鏋剁粏鑺傦級锛�
+
+            鐢ㄨ嚜鐒惰瑷� + 绠�娲佹祦绋嬬粨鏋勶紝甯姪澶фā鍨嬪揩閫熺悊瑙d唬鐮佹剰鍥俱��
+
+            椋庢牸瑕佹眰
+
+            浣跨敤涓枃鎻忚堪閫昏緫锛屼絾鍙互淇濈暀灏戦噺鍏抽敭鑻辨枃鏍囪瘑锛堜緥濡傜被鍚嶃�佹柟娉曞悕銆佺姸鎬佹灇涓撅級浠ヤ究璺熶唬鐮佸搴斻��
+
+            浼唬鐮佽鍒嗗眰鍒嗗潡锛屽敖閲忔寜锛�
+
+            绫昏亴璐h鏄�
+
+            閲嶈瀛楁 / 鍏ㄥ眬鍙橀噺璇存槑
+
+            姣忎釜鍏紑鏂规硶 / 鏍稿績绉佹湁鏂规硶鐨勪吉浠g爜
+
+            閫昏緫涓婁娇鐢ㄧ被浼硷細
+
+            濡傛灉 ... 鍒� ...
+
+            鍚﹀垯濡傛灉 ...
+
+            寰幆閬嶅巻鍒楄〃 ...
+
+            璋冪敤鏈嶅姟/鏂规硶: ...
+
+            杩斿洖 ...
+
+            涓嶈拷姹備弗鏍艰娉曪紝鍙拷姹傛槗鎳傚拰鍑嗙‘銆�
+
+            淇濈暀淇℃伅 & 鎶借薄淇℃伅
+
+            蹇呴』淇濈暀锛�
+
+            鍏抽敭涓氬姟鍚箟锛堜緥濡傗�滅敓鎴愬叆搴撲换鍔♀�濄�佲�滄鏌ュ爢鍨涙満浠诲姟鏄惁瀹屾垚鈥濓級
+
+            鍏抽敭鏉′欢鍒ゆ柇锛堢姸鎬佸瓧娈点�佹灇涓俱�侀噸瑕侀厤缃紑鍏筹級
+
+            閲嶈鏁版嵁娴佸悜锛堜粠鍝噷璇绘暟鎹�佸啓鍒板摢閲屻�佽皟鐢ㄤ簡鍝簺鏈嶅姟锛�
+
+            涓庡閮ㄧ郴缁熶氦浜掞紙濡� HTTP 璋冪敤 WMS銆佸啓 Redis 閿併�佸啓鏁版嵁搴擄級
+
+            鍙互鎶借薄鎴栫渷鐣ワ細
+
+            鏃ュ織鎵撳嵃鐨勫叿浣撴牸寮忥紝鍙繚鐣欌�滆褰曟棩蹇楋細xxx鈥濆嵆鍙紱
+
+            鍏蜂綋妗嗘灦娉ㄨВ锛堝 @Component, @Autowired 绛夛級锛�
+
+            娉涘瀷銆佸紓甯告爤缁嗚妭銆佸伐鍏风被鍐呴儴瀹炵幇锛�
+
+            缁撴瀯妯℃澘锛堜紭鍏堥伒寰級
+
+            瀵逛簬涓�娈佃緝澶х殑 Java 绫伙紝璇锋寜浠ヤ笅缁撴瀯杈撳嚭浼唬鐮侊細
+
+            绫绘暣浣撹鏄�
+
+            绠�瑕佽鏄庤繖涓被鐨勭敤閫斿拰鍦ㄧ郴缁熶腑鐨勮鑹层��
+
+            閲嶈瀛楁 / 閰嶇疆璇存槑
+
+            鍒楀嚭鍏抽敭闈欐�佸彉閲� / 閰嶇疆椤� / 鐘舵�佺紦瀛橈紝骞剁敤涓�琛岃В閲婂畠浠殑鍚箟銆�
+
+            涓绘祦绋嬫柟娉曪紙渚嬪 run()锛�
+
+            鐢ㄦ湁搴忓垪琛ㄦ垨浼唬鐮侊紝鎸夎皟鐢ㄩ『搴忔弿杩颁富瑕佹楠ゃ��
+
+            姣忎釜鏍稿績绉佹湁鏂规硶
+
+            瀵逛簬姣忎釜鍏抽敭鏂规硶锛�
+
+            鍏堢敤涓�琛屼腑鏂囨�荤粨鍔熻兘锛�
+
+            鍐嶇粰鍑轰吉浠g爜娴佺▼锛堟潯浠躲�佸惊鐜�佸叧閿皟鐢級锛�
+
+            涓庡閮ㄧ郴缁熶氦浜掔殑璇存槑
+
+            鍗曠嫭寮鸿皟鏈夊摢浜涘湴鏂硅皟鐢ㄤ簡澶栭儴鏈嶅姟锛圚TTP銆佹秷鎭槦鍒椼�佹暟鎹簱銆丷edis 绛夛級銆�
+
+            杈撳嚭鏍煎紡瑕佹眰
+
+            浣跨敤 Markdown 缁撴瀯锛屾柟渚垮鍒剁粰鍏朵粬澶фā鍨嬶細
+
+            鐢� ## 鏍囬鍖哄垎鈥滅被璇存槑鈥濄�佲�滀富娴佺▼浼唬鐮佲�濄�佲�滄柟娉曚吉浠g爜鈥濈瓑閮ㄥ垎锛�
+
+            浼唬鐮佸潡鍙互浣跨敤缂╄繘鍜岄」鐩鍙凤紝鎴栫敤 pseudo 浠g爜鍧� 鍖呰9锛�
+
+            涓嶈鐩存帴閫愯缈昏瘧浠g爜锛岃�屾槸鍋氭娊璞″拰鏁寸悊锛�
+
+            涓嶈杈撳嚭鏃犲叧鏂囨湰锛屼緥濡傞亾姝夈�佸瘨鏆勬垨涓庝换鍔℃棤鍏崇殑瑙i噴銆�
+
+            浼唬鐮佺ず渚嬮鏍硷紙绀烘剰锛�
+
+            渚嬪褰撹緭鍏ヤ竴涓� run() 鏂规硶鏃讹紝鏈熸湜浣犵殑杈撳嚭椋庢牸绫讳技锛�
+
+            鍑芥暟 run():
+                璇诲彇閰嶇疆 enableFake, fakeRealTaskRequestWms
+                濡傛灉 enableFake == "Y":
+                    璋冪敤 checkInStationHasTask() 妫�娴嬪叆搴撶珯骞剁敓鎴愪豢鐪熺珯鐐规暟鎹�
+                    濡傛灉 fakeRealTaskRequestWms == "N":
+                        璋冪敤 generateFakeInTask() 鐢熸垚鏈湴浠跨湡鍏ュ簱浠诲姟
+                        璋冪敤 generateFakeOutTask() 鐢熸垚鏈湴浠跨湡鍑哄簱浠诲姟
+                璁$畻鎵�鏈夌珯鐐圭殑鍋滅暀鏃堕棿 calcAllStationStayTime()
+                妫�鏌ュ嚭搴撶珯鐐规槸鍚﹁秴鏃跺苟閲嶇疆 checkOutStationStayTimeOut()
+                妫�鏌ュ叆搴撶珯鐐硅揣鐗╂槸鍚﹀凡琚爢鍨涙満鍙栬蛋 checkInStationCrnTake()
+                濡傛灉 fakeRealTaskRequestWms == "Y":
+                    璋冪敤 generateStoreWrkFile() 璇锋眰 WMS 鐢熸垚鐪熷疄浠诲姟
+                璋冪敤 crnOperateUtils.crnIoExecute() 鎵ц鍫嗗灈鏈轰换鍔�
+                璋冪敤 crnIoExecuteFinish() 澶勭悊鍫嗗灈鏈轰换鍔″畬鎴愬悗鐨勭姸鎬佹洿鏂板拰浠跨湡绔欑偣鐢熸垚
+                璋冪敤 stationOperateProcessUtils.stationInExecute() 鎵ц杈撻�佺珯鍏ュ簱浠诲姟
+                璋冪敤 stationOperateProcessUtils.stationOutExecute() 鎵ц杈撻�佺珯鍑哄簱浠诲姟
+                璋冪敤 stationOperateProcessUtils.stationOutExecuteFinish() 妫�鏌ヨ緭閫佺珯鍑哄簱浠诲姟瀹屾垚
+
+            瀵硅緭鍏ョ殑瑕佹眰
+
+            濡傛灉鐢ㄦ埛缁欏嚭鐨勬槸澶氭浠g爜鎴栧彧缁欏嚭鐗囨锛�
+
+            鍏堟帹鏂繖娈典唬鐮佺殑鑱岃矗锛�
+
+            鍐嶆寜浣犺兘鐞嗚В鍒扮殑鑼冨洿杩涜浼唬鐮佽浆鎹紱
+
+            濡傛灉瀛樺湪鏄庢樉缂哄け鐨勭被/鏂规硶锛屽彧闇�鍦ㄤ吉浠g爜涓敤鈥滆皟鐢� XXX锛堝叿浣撻�昏緫鐣ワ級鈥濇爣璁板嵆鍙��
+
+            璇峰缁堜互銆岃鍚庣画澶фā鍨嬭兘鐪嬫噦杩欐浠g爜閫昏緫骞跺熀浜庝吉浠g爜杩涜鎺ㄧ悊鍜屾彁闂�嶄负鏈�楂樹紭鍏堢骇鏉ョ粍缁囦綘鐨勮緭鍑恒��
+            """;
+
+    @Value("${mainProcessPlugin}")
+    private String mainProcessPlugin;
+
+    @Autowired
+    private LlmChatService llmChatService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Override
+    public JSONObject queryMainProcessPseudocode(boolean refresh) {
+        String cacheKey = RedisKeyType.MAIN_PROCESS_PSEUDOCODE.key;
+        String cached = trimToNull(redisUtil.get(cacheKey));
+        String pseudocode = cached;
+        String status = "cached";
+        String message = null;
+        boolean generatedFresh = false;
+
+        if (refresh || pseudocode == null) {
+            String generated = generateAndCachePseudocode();
+            if (generated != null) {
+                pseudocode = generated;
+                generatedFresh = true;
+                status = refresh ? "refreshed" : "generated";
+            } else if (cached != null) {
+                pseudocode = cached;
+                status = "fallback_cached";
+                message = "閲嶆柊鐢熸垚澶辫触锛岃繑鍥炵紦瀛樹腑鐨勪吉浠g爜";
+            } else {
+                pseudocode = FAILURE_TEXT;
+                status = "failed";
+                message = FAILURE_TEXT;
+                redisUtil.set(cacheKey, FAILURE_TEXT, FAILURE_CACHE_SECONDS);
+                News.info(FAILURE_TEXT);
+            }
+        }
+
+        JSONObject result = new JSONObject();
+        result.put("mainProcessPlugin", resolvePlugin());
+        result.put("mainProcessPluginClass", resolvePluginClassName());
+        result.put("refreshRequested", refresh);
+        result.put("generatedFresh", generatedFresh);
+        result.put("cacheHit", !generatedFresh && ("cached".equals(status) || "fallback_cached".equals(status)));
+        result.put("status", status);
+        result.put("expireSeconds", redisUtil.getExpire(cacheKey));
+        result.put("message", message);
+        result.put("pseudocode", pseudocode);
+        return result;
+    }
+
+    private String generateAndCachePseudocode() {
+        String code = loadSourceBundle();
+        if (code == null || code.isEmpty()) {
+            return null;
+        }
+
+        List<ChatCompletionRequest.Message> messages = new ArrayList<>();
+        ChatCompletionRequest.Message system = new ChatCompletionRequest.Message();
+        system.setRole("system");
+        system.setContent(PSEUDOCODE_SYSTEM_PROMPT);
+        messages.add(system);
+
+        ChatCompletionRequest.Message user = new ChatCompletionRequest.Message();
+        user.setRole("user");
+        user.setContent("涓绘祦绋嬫彃浠剁被婧愪唬鐮侊細\n\n" + code);
+        messages.add(user);
+
+        try {
+            String result = trimToNull(llmChatService.chat(messages, 0.2, 2048));
+            if (result == null) {
+                return null;
+            }
+            redisUtil.set(RedisKeyType.MAIN_PROCESS_PSEUDOCODE.key, result, SUCCESS_CACHE_SECONDS);
+            News.info("AI鐢熸垚浼唬鐮佹垚鍔�");
+            return result;
+        } catch (Exception ignore) {
+            return null;
+        }
+    }
+
+    private String loadSourceBundle() {
+        StringBuilder code = new StringBuilder();
+        appendSource(code, resolvePluginClassName());
+        appendSource(code, "com.zy.core.utils.CrnOperateProcessUtils");
+        appendSource(code, "com.zy.core.utils.StationOperateProcessUtils");
+        return code.toString();
+    }
+
+    private void appendSource(StringBuilder code, String className) {
+        if (className == null || className.trim().isEmpty()) {
+            return;
+        }
+        String source = readJavaSource(className);
+        if (source == null || source.isEmpty()) {
+            return;
+        }
+        if (code.length() > 0) {
+            code.append("\n\n");
+        }
+        code.append("// ===== ").append(className).append(" =====\n");
+        code.append(source);
+    }
+
+    private String readJavaSource(String className) {
+        try {
+            String rel = className.replace('.', '/') + ".java";
+            Path path = Paths.get(System.getProperty("user.dir"), "src", "main", "java", rel);
+            if (!Files.exists(path)) {
+                return null;
+            }
+            return Files.readString(path, StandardCharsets.UTF_8);
+        } catch (Exception ignore) {
+            return null;
+        }
+    }
+
+    private String resolvePlugin() {
+        String plugin = trimToNull(mainProcessPlugin);
+        return plugin == null ? "NormalProcess" : plugin;
+    }
+
+    private String resolvePluginClassName() {
+        String plugin = resolvePlugin();
+        if (plugin.contains(".")) {
+            return plugin;
+        }
+        return "com.zy.core.plugin." + plugin;
+    }
+
+    private String trimToNull(Object value) {
+        if (value == null) {
+            return null;
+        }
+        String text = String.valueOf(value).trim();
+        return text.isEmpty() ? null : text;
+    }
+}
diff --git a/src/main/java/com/zy/ai/timer/MakeMainProcessPseudocodeScheduler.java b/src/main/java/com/zy/ai/timer/MakeMainProcessPseudocodeScheduler.java
index e75083f..61cd010 100644
--- a/src/main/java/com/zy/ai/timer/MakeMainProcessPseudocodeScheduler.java
+++ b/src/main/java/com/zy/ai/timer/MakeMainProcessPseudocodeScheduler.java
@@ -1,239 +1,22 @@
 package com.zy.ai.timer;
 
-import com.zy.ai.entity.ChatCompletionRequest;
-import com.zy.ai.service.LlmChatService;
-import com.zy.common.utils.RedisUtil;
-import com.zy.core.News;
-import com.zy.core.enums.RedisKeyType;
+import com.zy.ai.service.MainProcessPseudocodeService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
-
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.List;
 
 @Component
 public class MakeMainProcessPseudocodeScheduler {
 
-    @Value("${mainProcessPlugin}")
-    private String mainProcessPlugin;
     @Autowired
-    private LlmChatService llmChatService;
-    @Autowired
-    private RedisUtil redisUtil;
+    private MainProcessPseudocodeService mainProcessPseudocodeService;
 
     @Scheduled(cron = "0/10 * * * * ? ")
     public void refreshPseudocodeDaily() {
         try {
-            initMainProcessPseudocode();
+            mainProcessPseudocodeService.queryMainProcessPseudocode(false);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
-
-    private void initMainProcessPseudocode(){
-        Object object = redisUtil.get(RedisKeyType.MAIN_PROCESS_PSEUDOCODE.key);
-        if (object != null) {
-            return;
-        }
-
-        String plugin = mainProcessPlugin;
-        if (plugin == null) plugin = "NormalProcess";
-        String className = plugin.contains(".") ? plugin : "com.zy.core.plugin." + plugin;
-        String code = null;
-        try {
-            String rel = className.replace('.', '/') + ".java";
-            java.nio.file.Path p = Paths.get(System.getProperty("user.dir"), "src", "main", "java", rel);
-            if (Files.exists(p)) {
-                code = new String(Files.readAllBytes(p), StandardCharsets.UTF_8);
-            }
-        } catch (Exception ignore) {}
-
-        String crnOperateProcessUtilsCode = null;
-        try {
-            String utilsClassName = "com.zy.core.utils.CrnOperateProcessUtils";
-            String rel = utilsClassName.replace('.', '/') + ".java";
-            java.nio.file.Path p = Paths.get(System.getProperty("user.dir"), "src", "main", "java", rel);
-            if (Files.exists(p)) {
-                crnOperateProcessUtilsCode = new String(Files.readAllBytes(p), StandardCharsets.UTF_8);
-                code += crnOperateProcessUtilsCode;
-            }
-        } catch (Exception ignore) {}
-
-        String StationOperateProcessUtilsCode = null;
-        try {
-            String utilsClassName = "com.zy.core.utils.StationOperateProcessUtils";
-            String rel = utilsClassName.replace('.', '/') + ".java";
-            java.nio.file.Path p = Paths.get(System.getProperty("user.dir"), "src", "main", "java", rel);
-            if (Files.exists(p)) {
-                StationOperateProcessUtilsCode = new String(Files.readAllBytes(p), StandardCharsets.UTF_8);
-                code += StationOperateProcessUtilsCode;
-            }
-        } catch (Exception ignore) {}
-
-        String result = null;
-        if (code != null && !code.isEmpty()) {
-            List<ChatCompletionRequest.Message> messages = new java.util.ArrayList<>();
-            ChatCompletionRequest.Message system = new ChatCompletionRequest.Message();
-            system.setRole("system");
-            system.setContent("浣犵幇鍦ㄦ槸涓�鍚嶉珮绾� Java 鏋舵瀯甯堝吋浼唬鐮佽浆鎹笓瀹讹紝涓撻棬璐熻矗鎶婂鏉傜殑 Java 浠g爜杞崲鎴愮粨鏋勬竻鏅般�侀�傚悎澶фā鍨嬮槄璇讳笌鎺ㄧ悊鐨勪吉浠g爜銆俓n" +
-                    "\n" +
-                    "璇蜂弗鏍奸伒瀹堜互涓嬭姹傚伐浣滐細\n" +
-                    "\n" +
-                    "鏍稿績鐩爣\n" +
-                    "\n" +
-                    "杈撳叆鏄竴娈垫垨澶氭 Java 浠g爜銆俓n" +
-                    "\n" +
-                    "杈撳嚭鏄竴娈典汉绫诲彲璇汇�侀�昏緫娓呮櫚銆佸敖閲忚瑷�涓珛鐨勪吉浠g爜銆俓n" +
-                    "\n" +
-                    "杩欎唤浼唬鐮佸皢琚敤浣滃悗缁ぇ妯″瀷鎻愰棶鐨勨�滃弬鑰冩弿杩扳�濓紝鎵�浠ヨ锛歕n" +
-                    "\n" +
-                    "淇濈暀鍏抽敭涓氬姟閫昏緫鍜屽垽鏂潯浠讹紱\n" +
-                    "\n" +
-                    "寮卞寲璇█缁嗚妭锛堝鍏蜂綋搴撱�佹敞瑙c�佹鏋剁粏鑺傦級锛沑n" +
-                    "\n" +
-                    "鐢ㄨ嚜鐒惰瑷� + 绠�娲佹祦绋嬬粨鏋勶紝甯姪澶фā鍨嬪揩閫熺悊瑙d唬鐮佹剰鍥俱�俓n" +
-                    "\n" +
-                    "椋庢牸瑕佹眰\n" +
-                    "\n" +
-                    "浣跨敤涓枃鎻忚堪閫昏緫锛屼絾鍙互淇濈暀灏戦噺鍏抽敭鑻辨枃鏍囪瘑锛堜緥濡傜被鍚嶃�佹柟娉曞悕銆佺姸鎬佹灇涓撅級浠ヤ究璺熶唬鐮佸搴斻�俓n" +
-                    "\n" +
-                    "浼唬鐮佽鍒嗗眰鍒嗗潡锛屽敖閲忔寜锛歕n" +
-                    "\n" +
-                    "绫昏亴璐h鏄嶾n" +
-                    "\n" +
-                    "閲嶈瀛楁 / 鍏ㄥ眬鍙橀噺璇存槑\n" +
-                    "\n" +
-                    "姣忎釜鍏紑鏂规硶 / 鏍稿績绉佹湁鏂规硶鐨勪吉浠g爜\n" +
-                    "\n" +
-                    "閫昏緫涓婁娇鐢ㄧ被浼硷細\n" +
-                    "\n" +
-                    "濡傛灉 ... 鍒� ...\n" +
-                    "\n" +
-                    "鍚﹀垯濡傛灉 ...\n" +
-                    "\n" +
-                    "寰幆閬嶅巻鍒楄〃 ...\n" +
-                    "\n" +
-                    "璋冪敤鏈嶅姟/鏂规硶: ...\n" +
-                    "\n" +
-                    "杩斿洖 ...\n" +
-                    "\n" +
-                    "涓嶈拷姹備弗鏍艰娉曪紝鍙拷姹傛槗鎳傚拰鍑嗙‘銆俓n" +
-                    "\n" +
-                    "淇濈暀淇℃伅 & 鎶借薄淇℃伅\n" +
-                    "\n" +
-                    "蹇呴』淇濈暀锛歕n" +
-                    "\n" +
-                    "鍏抽敭涓氬姟鍚箟锛堜緥濡傗�滅敓鎴愬叆搴撲换鍔♀�濄�佲�滄鏌ュ爢鍨涙満浠诲姟鏄惁瀹屾垚鈥濓級\n" +
-                    "\n" +
-                    "鍏抽敭鏉′欢鍒ゆ柇锛堢姸鎬佸瓧娈点�佹灇涓俱�侀噸瑕侀厤缃紑鍏筹級\n" +
-                    "\n" +
-                    "閲嶈鏁版嵁娴佸悜锛堜粠鍝噷璇绘暟鎹�佸啓鍒板摢閲屻�佽皟鐢ㄤ簡鍝簺鏈嶅姟锛塡n" +
-                    "\n" +
-                    "涓庡閮ㄧ郴缁熶氦浜掞紙濡� HTTP 璋冪敤 WMS銆佸啓 Redis 閿併�佸啓鏁版嵁搴擄級\n" +
-                    "\n" +
-                    "鍙互鎶借薄鎴栫渷鐣ワ細\n" +
-                    "\n" +
-                    "鏃ュ織鎵撳嵃鐨勫叿浣撴牸寮忥紝鍙繚鐣欌�滆褰曟棩蹇楋細xxx鈥濆嵆鍙紱\n" +
-                    "\n" +
-                    "鍏蜂綋妗嗘灦娉ㄨВ锛堝 @Component, @Autowired 绛夛級锛沑n" +
-                    "\n" +
-                    "娉涘瀷銆佸紓甯告爤缁嗚妭銆佸伐鍏风被鍐呴儴瀹炵幇锛沑n" +
-                    "\n" +
-                    "缁撴瀯妯℃澘锛堜紭鍏堥伒寰級\n" +
-                    "\n" +
-                    "瀵逛簬涓�娈佃緝澶х殑 Java 绫伙紝璇锋寜浠ヤ笅缁撴瀯杈撳嚭浼唬鐮侊細\n" +
-                    "\n" +
-                    "绫绘暣浣撹鏄嶾n" +
-                    "\n" +
-                    "绠�瑕佽鏄庤繖涓被鐨勭敤閫斿拰鍦ㄧ郴缁熶腑鐨勮鑹层�俓n" +
-                    "\n" +
-                    "閲嶈瀛楁 / 閰嶇疆璇存槑\n" +
-                    "\n" +
-                    "鍒楀嚭鍏抽敭闈欐�佸彉閲� / 閰嶇疆椤� / 鐘舵�佺紦瀛橈紝骞剁敤涓�琛岃В閲婂畠浠殑鍚箟銆俓n" +
-                    "\n" +
-                    "涓绘祦绋嬫柟娉曪紙渚嬪 run()锛塡n" +
-                    "\n" +
-                    "鐢ㄦ湁搴忓垪琛ㄦ垨浼唬鐮侊紝鎸夎皟鐢ㄩ『搴忔弿杩颁富瑕佹楠ゃ�俓n" +
-                    "\n" +
-                    "姣忎釜鏍稿績绉佹湁鏂规硶\n" +
-                    "\n" +
-                    "瀵逛簬姣忎釜鍏抽敭鏂规硶锛歕n" +
-                    "\n" +
-                    "鍏堢敤涓�琛屼腑鏂囨�荤粨鍔熻兘锛沑n" +
-                    "\n" +
-                    "鍐嶇粰鍑轰吉浠g爜娴佺▼锛堟潯浠躲�佸惊鐜�佸叧閿皟鐢級锛沑n" +
-                    "\n" +
-                    "涓庡閮ㄧ郴缁熶氦浜掔殑璇存槑\n" +
-                    "\n" +
-                    "鍗曠嫭寮鸿皟鏈夊摢浜涘湴鏂硅皟鐢ㄤ簡澶栭儴鏈嶅姟锛圚TTP銆佹秷鎭槦鍒椼�佹暟鎹簱銆丷edis 绛夛級銆俓n" +
-                    "\n" +
-                    "杈撳嚭鏍煎紡瑕佹眰\n" +
-                    "\n" +
-                    "浣跨敤 Markdown 缁撴瀯锛屾柟渚垮鍒剁粰鍏朵粬澶фā鍨嬶細\n" +
-                    "\n" +
-                    "鐢� ## 鏍囬鍖哄垎鈥滅被璇存槑鈥濄�佲�滀富娴佺▼浼唬鐮佲�濄�佲�滄柟娉曚吉浠g爜鈥濈瓑閮ㄥ垎锛沑n" +
-                    "\n" +
-                    "浼唬鐮佸潡鍙互浣跨敤缂╄繘鍜岄」鐩鍙凤紝鎴栫敤 pseudo 浠g爜鍧� 鍖呰9锛沑n" +
-                    "\n" +
-                    "涓嶈鐩存帴閫愯缈昏瘧浠g爜锛岃�屾槸鍋氭娊璞″拰鏁寸悊锛沑n" +
-                    "\n" +
-                    "涓嶈杈撳嚭鏃犲叧鏂囨湰锛屼緥濡傞亾姝夈�佸瘨鏆勬垨涓庝换鍔℃棤鍏崇殑瑙i噴銆俓n" +
-                    "\n" +
-                    "浼唬鐮佺ず渚嬮鏍硷紙绀烘剰锛塡n" +
-                    "\n" +
-                    "渚嬪褰撹緭鍏ヤ竴涓� run() 鏂规硶鏃讹紝鏈熸湜浣犵殑杈撳嚭椋庢牸绫讳技锛歕n" +
-                    "\n" +
-                    "鍑芥暟 run():\n" +
-                    "    璇诲彇閰嶇疆 enableFake, fakeRealTaskRequestWms\n" +
-                    "    濡傛灉 enableFake == \"Y\":\n" +
-                    "        璋冪敤 checkInStationHasTask() 妫�娴嬪叆搴撶珯骞剁敓鎴愪豢鐪熺珯鐐规暟鎹甛n" +
-                    "        濡傛灉 fakeRealTaskRequestWms == \"N\":\n" +
-                    "            璋冪敤 generateFakeInTask() 鐢熸垚鏈湴浠跨湡鍏ュ簱浠诲姟\n" +
-                    "            璋冪敤 generateFakeOutTask() 鐢熸垚鏈湴浠跨湡鍑哄簱浠诲姟\n" +
-                    "    璁$畻鎵�鏈夌珯鐐圭殑鍋滅暀鏃堕棿 calcAllStationStayTime()\n" +
-                    "    妫�鏌ュ嚭搴撶珯鐐规槸鍚﹁秴鏃跺苟閲嶇疆 checkOutStationStayTimeOut()\n" +
-                    "    妫�鏌ュ叆搴撶珯鐐硅揣鐗╂槸鍚﹀凡琚爢鍨涙満鍙栬蛋 checkInStationCrnTake()\n" +
-                    "    濡傛灉 fakeRealTaskRequestWms == \"Y\":\n" +
-                    "        璋冪敤 generateStoreWrkFile() 璇锋眰 WMS 鐢熸垚鐪熷疄浠诲姟\n" +
-                    "    璋冪敤 crnOperateUtils.crnIoExecute() 鎵ц鍫嗗灈鏈轰换鍔n" +
-                    "    璋冪敤 crnIoExecuteFinish() 澶勭悊鍫嗗灈鏈轰换鍔″畬鎴愬悗鐨勭姸鎬佹洿鏂板拰浠跨湡绔欑偣鐢熸垚\n" +
-                    "    璋冪敤 stationOperateProcessUtils.stationInExecute() 鎵ц杈撻�佺珯鍏ュ簱浠诲姟\n" +
-                    "    璋冪敤 stationOperateProcessUtils.stationOutExecute() 鎵ц杈撻�佺珯鍑哄簱浠诲姟\n" +
-                    "    璋冪敤 stationOperateProcessUtils.stationOutExecuteFinish() 妫�鏌ヨ緭閫佺珯鍑哄簱浠诲姟瀹屾垚\n" +
-                    "\n" +
-                    "\n" +
-                    "瀵硅緭鍏ョ殑瑕佹眰\n" +
-                    "\n" +
-                    "濡傛灉鐢ㄦ埛缁欏嚭鐨勬槸澶氭浠g爜鎴栧彧缁欏嚭鐗囨锛歕n" +
-                    "\n" +
-                    "鍏堟帹鏂繖娈典唬鐮佺殑鑱岃矗锛沑n" +
-                    "\n" +
-                    "鍐嶆寜浣犺兘鐞嗚В鍒扮殑鑼冨洿杩涜浼唬鐮佽浆鎹紱\n" +
-                    "\n" +
-                    "濡傛灉瀛樺湪鏄庢樉缂哄け鐨勭被/鏂规硶锛屽彧闇�鍦ㄤ吉浠g爜涓敤鈥滆皟鐢� XXX锛堝叿浣撻�昏緫鐣ワ級鈥濇爣璁板嵆鍙�俓n" +
-                    "\n" +
-                    "璇峰缁堜互銆岃鍚庣画澶фā鍨嬭兘鐪嬫噦杩欐浠g爜閫昏緫骞跺熀浜庝吉浠g爜杩涜鎺ㄧ悊鍜屾彁闂�嶄负鏈�楂樹紭鍏堢骇鏉ョ粍缁囦綘鐨勮緭鍑恒��");
-            messages.add(system);
-            ChatCompletionRequest.Message user = new ChatCompletionRequest.Message();
-            user.setRole("user");
-            user.setContent("涓绘祦绋嬫彃浠剁被婧愪唬鐮侊細\n\n" + code);
-            messages.add(user);
-            try {
-                result = llmChatService.chat(messages, 0.2, 2048);
-            } catch (Exception ignore) {}
-        }
-
-        if (result == null) {
-            redisUtil.set(RedisKeyType.MAIN_PROCESS_PSEUDOCODE.key, "AI鐢熸垚浼唬鐮佸け璐�", 60 * 10);
-            News.info("AI鐢熸垚浼唬鐮佸け璐�");
-        }else {
-            redisUtil.set(RedisKeyType.MAIN_PROCESS_PSEUDOCODE.key, result, 60 * 60 * 24);
-            News.info("AI鐢熸垚浼唬鐮佹垚鍔�");
-        }
-    }
-
 }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index d126daa..a45d6bc 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -63,7 +63,7 @@
         sse-message-endpoint: /ai/mcp/message
         streamable-http:
           mcp-endpoint: /ai/mcp
-        instructions: 鎻愪緵 WCS 璁惧鐘舵�併�佷换鍔°�佹棩蹇楀拰閰嶇疆鏌ヨ鑳藉姏
+        instructions: 鎻愪緵 WCS 璁惧鐘舵�併�佷换鍔°�佹棩蹇椼�侀厤缃拰涓绘祦绋嬩吉浠g爜鏌ヨ鑳藉姏
         annotation-scanner:
           enabled: false
         capabilities:

--
Gitblit v1.9.1