From 9b8ff50b66361c4b56074b7586b2d5951ecf2091 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 02 四月 2026 15:02:14 +0800
Subject: [PATCH] #优化运行速度

---
 src/main/java/com/zy/core/plugin/FakeProcess.java |  278 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 148 insertions(+), 130 deletions(-)

diff --git a/src/main/java/com/zy/core/plugin/FakeProcess.java b/src/main/java/com/zy/core/plugin/FakeProcess.java
index 4d03f09..962bacd 100644
--- a/src/main/java/com/zy/core/plugin/FakeProcess.java
+++ b/src/main/java/com/zy/core/plugin/FakeProcess.java
@@ -28,7 +28,8 @@
 import com.zy.core.plugin.store.StoreInTaskContext;
 import com.zy.core.plugin.store.StoreInTaskGenerationService;
 import com.zy.core.plugin.store.StoreInTaskPolicy;
-import com.zy.core.task.MainProcessAsyncTaskScheduler;
+import com.zy.core.task.MainProcessLane;
+import com.zy.core.task.MainProcessTaskSubmitter;
 import com.zy.core.thread.CrnThread;
 import com.zy.core.thread.DualCrnThread;
 import com.zy.core.thread.StationThread;
@@ -47,14 +48,8 @@
 @Slf4j
 @Component
 public class FakeProcess implements MainProcessPluginApi, StoreInTaskPolicy {
-    private static final String CRN_TASK_LANE = "fake-crn";
-    private static final String STATION_TASK_LANE = "fake-station";
-    private static final String DUAL_CRN_TASK_LANE = "fake-dual-crn";
-    private static final String GENERATE_STORE_TASK_LANE_PREFIX = "fake-generate-store-";
-    private static final String ASYNC_TASK_LANE_PREFIX = "fake-async-";
     private static final long MAIN_DISPATCH_INTERVAL_MS = 200L;
     private static final long ASYNC_DISPATCH_INTERVAL_MS = 50L;
-    private static final long TASK_SLOW_LOG_THRESHOLD_MS = 1000L;
 
     private static final Map<Integer, Long> stationStayTimeMap = new ConcurrentHashMap<>();
     private static volatile String enableFake = "N";
@@ -91,34 +86,39 @@
     @Autowired
     private StationCommandDispatcher stationCommandDispatcher;
     @Autowired
-    private MainProcessAsyncTaskScheduler mainProcessAsyncTaskScheduler;
+    private MainProcessTaskSubmitter mainProcessTaskSubmitter;
 
     @Override
     public void run() {
         long startTime = System.currentTimeMillis();
         refreshFakeConfig();
 
-        // 浠跨湡鐩稿叧浠诲姟鎸夊悇鑷� lane 涓茶鎻愪氦锛屼簰涓嶉樆濉�
-        submitAsyncTask("checkInStationHasTask", ASYNC_DISPATCH_INTERVAL_MS, this::checkInStationHasTask);
-        submitAsyncTask("generateFakeInTask", ASYNC_DISPATCH_INTERVAL_MS, this::generateFakeInTask);
-        submitAsyncTask("generateFakeOutTask", ASYNC_DISPATCH_INTERVAL_MS, this::generateFakeOutTask);
-        submitAsyncTask("calcAllStationStayTime", ASYNC_DISPATCH_INTERVAL_MS, this::calcAllStationStayTime);
-        submitAsyncTask("checkOutStationStayTimeOut", ASYNC_DISPATCH_INTERVAL_MS, this::checkOutStationStayTimeOut);
-        submitAsyncTask("checkInStationCrnTake", ASYNC_DISPATCH_INTERVAL_MS, this::checkInStationCrnTake);
-        submitStationTask("checkStationRunBlock", ASYNC_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::checkStationRunBlock);
+        // 浠跨湡寮傛浠诲姟
+        submitAsyncTasks(ASYNC_DISPATCH_INTERVAL_MS);
+        // 浠跨湡杈撻�佺嚎鍫靛妫�娴�
+        stationOperateProcessUtils.submitCheckStationRunBlockTasks(MainProcessLane.FAKE_STATION_RUN_BLOCK, ASYNC_DISPATCH_INTERVAL_MS);
 
-        // 璇锋眰鐢熸垚鍏ュ簱浠诲姟锛屾寜绔欑偣鎷嗘垚鐙珛涓茶閫氶亾锛岄伩鍏嶅崟绔欓樆濉炴暣杞壂鎻�
+        // 璇锋眰鐢熸垚鍏ュ簱浠诲姟
         generateStoreWrkFile();
 
-        // 鍫嗗灈鏈恒�佽緭閫佺嚎銆佸弻宸ヤ綅鍫嗗灈鏈轰换鍔″垎鍒繘鍏ュ悇鑷覆琛岄�氶亾閫愪釜鎵ц
-        submitCrnTask("crnIoExecute", MAIN_DISPATCH_INTERVAL_MS, crnOperateUtils::crnIoExecute);
-        submitCrnTask("crnIoExecuteFinish", MAIN_DISPATCH_INTERVAL_MS, this::crnIoExecuteFinish);
-        submitStationTask("stationInExecute", MAIN_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::stationInExecute);
-        submitStationTask("crnStationOutExecute", MAIN_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::crnStationOutExecute);
-        submitStationTask("checkStationOutOrder", MAIN_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::checkStationOutOrder);
-        submitStationTask("watchCircleStation", MAIN_DISPATCH_INTERVAL_MS, stationOperateProcessUtils::watchCircleStation);
-        submitDualCrnTask("dualCrnIoExecute", MAIN_DISPATCH_INTERVAL_MS, dualCrnOperateProcessUtils::dualCrnIoExecute);
-        submitDualCrnTask("dualCrnIoExecuteFinish", MAIN_DISPATCH_INTERVAL_MS, dualCrnOperateProcessUtils::dualCrnIoExecuteFinish);
+        // 鎵ц鍫嗗灈鏈轰换鍔�
+        crnOperateUtils.submitCrnIoTasks(MainProcessLane.FAKE_CRN_IO, MAIN_DISPATCH_INTERVAL_MS);
+        // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
+        submitCrnIoExecuteFinishTasks(MAIN_DISPATCH_INTERVAL_MS);
+        // 鎵ц杈撻�佺珯鐐瑰叆搴撲换鍔�
+        stationOperateProcessUtils.submitStationInTasks(MainProcessLane.FAKE_STATION_IN, MAIN_DISPATCH_INTERVAL_MS);
+        // 妫�娴嬪叆搴撲换鍔℃槸鍚﹀凡缁忓埌杈剧洰鏍囩珯鍙�
+        stationOperateProcessUtils.submitInboundStationArrivalTasks(MAIN_DISPATCH_INTERVAL_MS);
+        // 杈撻�佺嚎鎵ц鍫嗗灈鏈哄嚭搴撳悗鐨勭珯鍙版祦杞�
+        stationOperateProcessUtils.submitCrnStationOutTasks(MainProcessLane.FAKE_STATION_OUT, MAIN_DISPATCH_INTERVAL_MS);
+        // 妫�娴嬪苟澶勭悊鍑哄簱鎺掑簭
+        stationOperateProcessUtils.submitCheckStationOutOrderTasks(MainProcessLane.FAKE_STATION_OUT_ORDER, MAIN_DISPATCH_INTERVAL_MS);
+        // 鐩戞帶杈撻�佺嚎缁曞湀绔欑偣
+        stationOperateProcessUtils.submitWatchCircleStationTasks(MainProcessLane.FAKE_STATION_WATCH_CIRCLE, MAIN_DISPATCH_INTERVAL_MS);
+        // 鎵ц鍙屽伐浣嶅爢鍨涙満浠诲姟
+        dualCrnOperateProcessUtils.submitDualCrnIoTasks(MainProcessLane.FAKE_DUAL_CRN_IO, MAIN_DISPATCH_INTERVAL_MS);
+        // 鍙屽伐浣嶅爢鍨涙満浠诲姟鎵ц瀹屾垚
+        dualCrnOperateProcessUtils.submitDualCrnIoExecuteFinishTasks(MainProcessLane.FAKE_DUAL_CRN_IO_FINISH, MAIN_DISPATCH_INTERVAL_MS);
 
         News.info("[WCS Debug] 涓荤嚎绋婻un鎵ц瀹屾垚,鑰楁椂:{}ms", System.currentTimeMillis() - startTime);
     }
@@ -148,20 +148,40 @@
         }
     }
 
-    private void submitCrnTask(String taskName, long minIntervalMs, Runnable task) {
-        submitProcessTask(CRN_TASK_LANE, taskName, minIntervalMs, task);
-    }
-
-    private void submitStationTask(String taskName, long minIntervalMs, Runnable task) {
-        submitProcessTask(STATION_TASK_LANE, taskName, minIntervalMs, task);
-    }
-
-    private void submitDualCrnTask(String taskName, long minIntervalMs, Runnable task) {
-        submitProcessTask(DUAL_CRN_TASK_LANE, taskName, minIntervalMs, task);
+    private void submitAsyncTasks(long minIntervalMs) {
+        submitAsyncTask("checkInStationHasTask", minIntervalMs, this::checkInStationHasTask);
+        submitAsyncTask("generateFakeInTask", minIntervalMs, this::generateFakeInTask);
+        submitAsyncTask("generateFakeOutTask", minIntervalMs, this::generateFakeOutTask);
+        submitAsyncTask("calcAllStationStayTime", minIntervalMs, this::calcAllStationStayTime);
+        submitAsyncTask("checkOutStationStayTimeOut", minIntervalMs, this::checkOutStationStayTimeOut);
+        submitAsyncTask("checkInStationCrnTake", minIntervalMs, this::checkInStationCrnTake);
     }
 
     private void submitAsyncTask(String taskName, long minIntervalMs, Runnable task) {
-        submitProcessTask(ASYNC_TASK_LANE_PREFIX + taskName, taskName, minIntervalMs, task);
+        mainProcessTaskSubmitter.submitKeyedSerialTask(
+                MainProcessLane.FAKE_ASYNC,
+                taskName,
+                taskName,
+                minIntervalMs,
+                task
+        );
+    }
+
+    private void submitCrnIoExecuteFinishTasks(long minIntervalMs) {
+        List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+        for (BasCrnp basCrnp : basCrnps) {
+            Integer crnNo = basCrnp == null ? null : basCrnp.getCrnNo();
+            if (crnNo == null) {
+                continue;
+            }
+            mainProcessTaskSubmitter.submitKeyedSerialTask(
+                    MainProcessLane.FAKE_CRN_IO_FINISH,
+                    crnNo,
+                    "crnIoExecuteFinish",
+                    minIntervalMs,
+                    () -> crnIoExecuteFinish(basCrnp)
+            );
+        }
     }
 
     private void submitGenerateStoreTasks() {
@@ -173,24 +193,16 @@
                 if (stationId == null) {
                     continue;
                 }
-                submitGenerateStoreTask(stationId, MAIN_DISPATCH_INTERVAL_MS,
-                        () -> storeInTaskGenerationService.generate(this, basDevp, stationObjModel));
+                storeInTaskGenerationService.submitGenerateStoreTask(
+                        this,
+                        basDevp,
+                        stationObjModel,
+                        MainProcessLane.FAKE_GENERATE_STORE,
+                        MAIN_DISPATCH_INTERVAL_MS,
+                        () -> storeInTaskGenerationService.generate(this, basDevp, stationObjModel)
+                );
             }
         }
-    }
-
-    private void submitGenerateStoreTask(Integer stationId, long minIntervalMs, Runnable task) {
-        submitProcessTask(GENERATE_STORE_TASK_LANE_PREFIX + stationId, "generateStoreWrkFile", minIntervalMs, task);
-    }
-
-    private void submitProcessTask(String laneName, String taskName, long minIntervalMs, Runnable task) {
-        mainProcessAsyncTaskScheduler.submit(
-                laneName,
-                taskName,
-                minIntervalMs,
-                TASK_SLOW_LOG_THRESHOLD_MS,
-                task
-        );
     }
 
     // 妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞朵豢鐪熺敓鎴愭ā鎷熷叆搴撶珯鐐规暟鎹�
@@ -633,84 +645,90 @@
     public void crnIoExecuteFinish() {
         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 crnProtocol = crnThread.getStatus();
-            if (crnProtocol == null) {
-                continue;
-            }
-
-            if (crnProtocol.getMode() == CrnModeType.AUTO.id
-                    && crnProtocol.getTaskNo() > 0
-                    && crnProtocol.getStatus() == CrnStatusType.WAITING.id) {
-                Object lock = redisUtil.get(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo());
-                if (lock != null) {
-                    continue;
-                }
-
-                // 鑾峰彇寰呯‘璁ゅ伐浣滄。
-                WrkMast wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
-                if (wrkMast == null) {
-                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
-                    continue;
-                }
-
-                Long updateWrkSts = null;
-                if (wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts) {
-                    updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
-                } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts) {
-                    updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
-
-                    // 鐢熸垚浠跨湡绔欑偣鏁版嵁
-                    List<StationObjModel> outStationList = basCrnp.getOutStationList$();
-                    if (outStationList.isEmpty()) {
-                        News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
-                        continue;
-                    }
-
-                    for (StationObjModel stationObjModel : outStationList) {
-                        if (!stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
-                            continue;
-                        }
-
-                        StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp,
-                                stationObjModel.getDeviceNo());
-                        if (stationThread == null) {
-                            continue;
-                        }
-                        // 鐢熸垚浠跨湡绔欑偣鏁版嵁
-                        StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, 9998,
-                                wrkMast.getSourceStaNo(), 0, 0);
-                        stationCommandDispatcher.dispatch(stationObjModel.getDeviceNo(), command, "fake-process", "crn-out-complete-write-info");
-                        redisUtil.set(RedisKeyType.CRN_OUT_TASK_COMPLETE_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(stationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
-                    }
-                } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts) {
-                    updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
-                } else if (wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts) {
-                    updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
-                } else {
-                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
-                    continue;
-                }
-
-                Date now = new Date();
-                wrkMast.setWrkSts(updateWrkSts);
-                wrkMast.setSystemMsg("");
-                wrkMast.setIoTime(now);
-                wrkMast.setModiTime(now);
-                if (wrkMastService.updateById(wrkMast)) {
-                    wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
-                    CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
-                    MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
-                    News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
-                }
-
-                redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock", 10);
-            }
+            crnIoExecuteFinish(basCrnp);
         }
     }
 
+    private void crnIoExecuteFinish(BasCrnp basCrnp) {
+        CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
+        if (crnThread == null) {
+            return;
+        }
+
+        CrnProtocol crnProtocol = crnThread.getStatus();
+        if (crnProtocol == null) {
+            return;
+        }
+
+        if (crnProtocol.getMode() != CrnModeType.AUTO.id
+                || crnProtocol.getTaskNo() <= 0
+                || crnProtocol.getStatus() != CrnStatusType.WAITING.id) {
+            return;
+        }
+
+        Object lock = redisUtil.get(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo());
+        if (lock != null) {
+            return;
+        }
+
+        // 鑾峰彇寰呯‘璁ゅ伐浣滄。
+        WrkMast wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
+        if (wrkMast == null) {
+            News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+            return;
+        }
+
+        Long updateWrkSts = null;
+        if (wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts) {
+            updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
+        } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts) {
+            updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
+
+            // 鐢熸垚浠跨湡绔欑偣鏁版嵁
+            List<StationObjModel> outStationList = basCrnp.getOutStationList$();
+            if (outStationList.isEmpty()) {
+                News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
+                return;
+            }
+
+            for (StationObjModel stationObjModel : outStationList) {
+                if (!stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
+                    continue;
+                }
+
+                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp,
+                        stationObjModel.getDeviceNo());
+                if (stationThread == null) {
+                    continue;
+                }
+                // 鐢熸垚浠跨湡绔欑偣鏁版嵁
+                StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, 9998,
+                        wrkMast.getSourceStaNo(), 0, 0);
+                stationCommandDispatcher.dispatch(stationObjModel.getDeviceNo(), command, "fake-process", "crn-out-complete-write-info");
+                redisUtil.set(RedisKeyType.CRN_OUT_TASK_COMPLETE_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(stationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
+            }
+        } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts) {
+            updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
+        } else if (wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts) {
+            updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
+        } else {
+            News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+            return;
+        }
+
+        Date now = new Date();
+        wrkMast.setWrkSts(updateWrkSts);
+        wrkMast.setSystemMsg("");
+        wrkMast.setIoTime(now);
+        wrkMast.setModiTime(now);
+        if (wrkMastService.updateById(wrkMast)) {
+            wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
+            CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
+            MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
+            News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+        }
+
+        redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock", 10);
+    }
+
 }

--
Gitblit v1.9.1