From 41aeff86351d1dd94fe2408175f96475f227c1b9 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 02 四月 2026 17:15:27 +0800
Subject: [PATCH] #执行优化

---
 src/main/java/com/zy/core/plugin/FakeProcess.java |  417 ++++++++++++++++++++++++++++++-----------------------------
 1 files changed, 212 insertions(+), 205 deletions(-)

diff --git a/src/main/java/com/zy/core/plugin/FakeProcess.java b/src/main/java/com/zy/core/plugin/FakeProcess.java
index 99a25f7..c28b89f 100644
--- a/src/main/java/com/zy/core/plugin/FakeProcess.java
+++ b/src/main/java/com/zy/core/plugin/FakeProcess.java
@@ -1,21 +1,21 @@
 package com.zy.core.plugin;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.core.common.Cools;
 import com.zy.asrs.domain.param.CreateInTaskParam;
 import com.zy.asrs.domain.param.CreateOutTaskParam;
+import com.zy.asrs.utils.Utils;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.service.*;
 import com.zy.common.entity.FindCrnNoResult;
-import com.zy.common.model.StartupDto;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.News;
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.SlaveConnection;
+import com.zy.core.dispatch.StationCommandDispatcher;
 import com.zy.core.enums.*;
 import com.zy.core.model.StationObjModel;
 import com.zy.core.model.Task;
@@ -28,14 +28,14 @@
 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.properties.SystemProperties;
+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;
 import com.zy.core.utils.CrnOperateProcessUtils;
 import com.zy.core.utils.DualCrnOperateProcessUtils;
 import com.zy.core.utils.StationOperateProcessUtils;
-import com.zy.core.utils.WmsOperateUtils;
 import com.zy.system.entity.Config;
 import com.zy.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
@@ -44,26 +44,18 @@
 
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 
 @Slf4j
 @Component
 public class FakeProcess implements MainProcessPluginApi, StoreInTaskPolicy {
+    private static final long MAIN_DISPATCH_INTERVAL_MS = 200L;
+    private static final long ASYNC_DISPATCH_INTERVAL_MS = 50L;
 
-    private static final long METHOD_TIMEOUT_MS = 15000; // 15绉掕秴鏃�
-    private static final ExecutorService timeoutExecutor = Executors.newCachedThreadPool();
-
-    private static Map<Integer, Long> stationStayTimeMap = new ConcurrentHashMap<>();
+    private static final Map<Integer, Long> stationStayTimeMap = new ConcurrentHashMap<>();
     private static volatile String enableFake = "N";
     private static volatile String fakeRealTaskRequestWms = "N";
     private static volatile String fakeGenerateInTask = "Y";
     private static volatile String fakeGenerateOutTask = "Y";
-
-    private Thread asyncFakeRunThread = null;
 
     @Autowired
     private WrkMastService wrkMastService;
@@ -86,133 +78,139 @@
     @Autowired
     private StationOperateProcessUtils stationOperateProcessUtils;
     @Autowired
-    private WmsOperateUtils wmsOperateUtils;
-    @Autowired
     private WrkAnalysisService wrkAnalysisService;
     @Autowired
     private DualCrnOperateProcessUtils dualCrnOperateProcessUtils;
     @Autowired
     private StoreInTaskGenerationService storeInTaskGenerationService;
-
-    /**
-     * 甯﹁秴鏃朵繚鎶ゆ墽琛屾柟娉�
-     * 
-     * @param taskName 浠诲姟鍚嶇О锛堢敤浜庢棩蹇楋級
-     * @param task     瑕佹墽琛岀殑浠诲姟
-     */
-    private void executeWithTimeout(String taskName, Runnable task) {
-        Future<?> future = timeoutExecutor.submit(task);
-        try {
-            future.get(METHOD_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        } catch (TimeoutException e) {
-            // 浣跨敤 cancel(false) 涓嶅彂閫佷腑鏂俊鍙凤紝閬垮厤 RedisCommandInterruptedException
-            // 浠诲姟浼氬湪鍚庡彴缁х画鎵ц鐩村埌瀹屾垚锛屼絾涓诲惊鐜笉浼氱瓑寰�
-            future.cancel(false);
-            News.error("[WCS Warning] 鏂规硶鎵ц瓒呮椂锛屼富寰幆宸茶烦杩�: {}, 瓒呮椂鏃堕棿: {}ms (浠诲姟浠嶅湪鍚庡彴杩愯)", taskName, METHOD_TIMEOUT_MS);
-        } catch (Exception e) {
-            News.error("[WCS Error] 鏂规硶鎵ц寮傚父: {}, 寮傚父: {}", taskName, e.getMessage());
-        }
-    }
+    @Autowired
+    private StationCommandDispatcher stationCommandDispatcher;
+    @Autowired
+    private MainProcessTaskSubmitter mainProcessTaskSubmitter;
 
     @Override
     public void run() {
         long startTime = System.currentTimeMillis();
-        asyncFakeRun();
+        refreshFakeConfig();
+
+        // 浠跨湡寮傛浠诲姟
+        submitAsyncTasks(ASYNC_DISPATCH_INTERVAL_MS);
+        // 浠跨湡杈撻�佺嚎鍫靛妫�娴�
+        stationOperateProcessUtils.submitCheckStationRunBlockTasks(MainProcessLane.FAKE_STATION_RUN_BLOCK, ASYNC_DISPATCH_INTERVAL_MS);
 
         // 璇锋眰鐢熸垚鍏ュ簱浠诲姟
-        this.generateStoreWrkFile();
+        generateStoreWrkFile();
 
         // 鎵ц鍫嗗灈鏈轰换鍔�
-        crnOperateUtils.crnIoExecute();
-        // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�-鍏峰浠跨湡鑳藉姏
-        this.crnIoExecuteFinish();
+        crnOperateUtils.submitCrnIoTasks(MainProcessLane.FAKE_CRN_IO, MAIN_DISPATCH_INTERVAL_MS);
+        // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
+        submitCrnIoExecuteFinishTasks(MAIN_DISPATCH_INTERVAL_MS);
         // 鎵ц杈撻�佺珯鐐瑰叆搴撲换鍔�
-        stationOperateProcessUtils.stationInExecute();
-        // 鎵ц杈撻�佺珯鐐瑰嚭搴撲换鍔�
-        stationOperateProcessUtils.crnStationOutExecute();
-        // 妫�娴嬪嚭搴撴帓搴�
-        stationOperateProcessUtils.checkStationOutOrder();
-        // 鐩戞帶缁曞湀绔欑偣
-        stationOperateProcessUtils.watchCircleStation();
-
+        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.submitStationOutExecuteFinishTasks(MAIN_DISPATCH_INTERVAL_MS);
+        // 妫�娴嬬珯鍙拌繍琛屽畬鎴愬悗鐨勪换鍔¤浆瀹屾垚
+        stationOperateProcessUtils.submitCheckTaskToCompleteTasks(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.dualCrnIoExecute();
+        dualCrnOperateProcessUtils.submitDualCrnIoTasks(MainProcessLane.FAKE_DUAL_CRN_IO, MAIN_DISPATCH_INTERVAL_MS);
         // 鍙屽伐浣嶅爢鍨涙満浠诲姟鎵ц瀹屾垚
-        dualCrnOperateProcessUtils.dualCrnIoExecuteFinish();
+        dualCrnOperateProcessUtils.submitDualCrnIoExecuteFinishTasks(MainProcessLane.FAKE_DUAL_CRN_IO_FINISH, MAIN_DISPATCH_INTERVAL_MS);
 
         News.info("[WCS Debug] 涓荤嚎绋婻un鎵ц瀹屾垚,鑰楁椂:{}ms", System.currentTimeMillis() - startTime);
     }
 
-    public void asyncFakeRun() {
-        if (asyncFakeRunThread != null) {
-            return;
+    private void refreshFakeConfig() {
+        Config enableFakeConfig = configService.getOne(new QueryWrapper<Config>().eq("code", "enableFake"));
+        if (enableFakeConfig != null) {
+            enableFake = enableFakeConfig.getValue();
         }
 
-        asyncFakeRunThread = new Thread(() -> {
-            while (!Thread.currentThread().isInterrupted()) {
-                try {
-                    Config enableFakeConfig = configService
-                            .getOne(new QueryWrapper<Config>().eq("code", "enableFake"));
-                    if (enableFakeConfig != null) {
-                        enableFake = enableFakeConfig.getValue();
-                    }
+        Config fakeRealTaskRequestWmsConfig = configService
+                .getOne(new QueryWrapper<Config>().eq("code", "fakeRealTaskRequestWms"));
+        if (fakeRealTaskRequestWmsConfig != null) {
+            fakeRealTaskRequestWms = fakeRealTaskRequestWmsConfig.getValue();
+        }
 
-                    Config fakeRealTaskRequestWmsConfig = configService
-                            .getOne(new QueryWrapper<Config>().eq("code", "fakeRealTaskRequestWms"));
-                    if (fakeRealTaskRequestWmsConfig != null) {
-                        fakeRealTaskRequestWms = fakeRealTaskRequestWmsConfig.getValue();
-                    }
+        Config fakeGenerateInTaskConfig = configService
+                .getOne(new QueryWrapper<Config>().eq("code", "fakeGenerateInTask"));
+        if (fakeGenerateInTaskConfig != null) {
+            fakeGenerateInTask = fakeGenerateInTaskConfig.getValue();
+        }
 
-                    Config fakeGenerateInTaskConfig = configService
-                            .getOne(new QueryWrapper<Config>().eq("code", "fakeGenerateInTask"));
-                    if (fakeGenerateInTaskConfig != null) {
-                        fakeGenerateInTask = fakeGenerateInTaskConfig.getValue();
-                    }
+        Config fakeGenerateOutTaskConfig = configService
+                .getOne(new QueryWrapper<Config>().eq("code", "fakeGenerateOutTask"));
+        if (fakeGenerateOutTaskConfig != null) {
+            fakeGenerateOutTask = fakeGenerateOutTaskConfig.getValue();
+        }
+    }
 
-                    Config fakeGenerateOutTaskConfig = configService
-                            .getOne(new QueryWrapper<Config>().eq("code", "fakeGenerateOutTask"));
-                    if (fakeGenerateOutTaskConfig != null) {
-                        fakeGenerateOutTask = fakeGenerateOutTaskConfig.getValue();
-                    }
+    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);
+    }
 
-                    // 绯荤粺杩愯鐘舵�佸垽鏂�
-                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
-                        continue;
-                    }
+    private void submitAsyncTask(String taskName, long minIntervalMs, Runnable task) {
+        mainProcessTaskSubmitter.submitKeyedSerialTask(
+                MainProcessLane.FAKE_ASYNC,
+                taskName,
+                taskName,
+                minIntervalMs,
+                task
+        );
+    }
 
-                    // 妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞朵豢鐪熺敓鎴愭ā鎷熷叆搴撶珯鐐规暟鎹�
-                    checkInStationHasTask();
-                    // 鐢熸垚浠跨湡妯℃嫙鍏ュ簱浠诲姟
-                    generateFakeInTask();
-                    // 鐢熸垚浠跨湡妯℃嫙鍑哄簱浠诲姟
-                    generateFakeOutTask();
-                    // 璁$畻鎵�鏈夌珯鐐瑰仠鐣欐椂闂�
-                    calcAllStationStayTime();
-                    // 妫�娴嬪嚭搴撶珯鐐瑰仠鐣欐槸鍚﹁秴鏃�
-                    checkOutStationStayTimeOut();
-                    // 妫�娴嬪叆搴撶珯鐐瑰爢鍨涙満鏄惁鍙栬蛋璐х墿
-                    checkInStationCrnTake();
-
-                    // 妫�娴嬭緭閫佺珯鐐规槸鍚﹁繍琛屽牭濉�
-                    stationOperateProcessUtils.checkStationRunBlock();
-
-                    // 闂撮殧
-                    Thread.sleep(50);
-                } catch (InterruptedException ie) {
-                    Thread.currentThread().interrupt();
-                    break;
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
+    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;
             }
-        });
-        asyncFakeRunThread.setName("asyncFakeRunProcess");
-        asyncFakeRunThread.setDaemon(true);
-        asyncFakeRunThread.start();
+            mainProcessTaskSubmitter.submitKeyedSerialTask(
+                    MainProcessLane.FAKE_CRN_IO_FINISH,
+                    crnNo,
+                    "crnIoExecuteFinish",
+                    minIntervalMs,
+                    () -> crnIoExecuteFinish(basCrnp)
+            );
+        }
+    }
+
+    private void submitGenerateStoreTasks() {
+        List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
+        for (BasDevp basDevp : basDevps) {
+            List<StationObjModel> barcodeStations = getBarcodeStations(basDevp);
+            for (StationObjModel stationObjModel : barcodeStations) {
+                Integer stationId = stationObjModel == null ? null : stationObjModel.getStationId();
+                if (stationId == null) {
+                    continue;
+                }
+                storeInTaskGenerationService.submitGenerateStoreTask(
+                        this,
+                        basDevp,
+                        stationObjModel,
+                        MainProcessLane.FAKE_GENERATE_STORE,
+                        MAIN_DISPATCH_INTERVAL_MS,
+                        () -> storeInTaskGenerationService.generate(this, basDevp, stationObjModel)
+                );
+            }
+        }
     }
 
     // 妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞朵豢鐪熺敓鎴愭ā鎷熷叆搴撶珯鐐规暟鎹�
-    private synchronized void checkInStationHasTask() {
+    private void checkInStationHasTask() {
         if (!enableFake.equals("Y")) {
             return;
         }
@@ -254,7 +252,10 @@
                     StationCommand command = stationThread.getCommand(StationCommandType.MOVE,
                             commonService.getWorkNo(WrkIoType.FAKE_TASK_NO.id), stationId,
                             entity.getBarcodeStation().getStationId(), 0);
-                    MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
+                    stationCommandDispatcher.dispatch(basDevp.getDevpNo(), command, "fake-process", "fake-enable-in");
+                    if (entity.getBarcodeStation() != null && entity.getBarcodeStation().getStationId() != null) {
+                        Utils.precomputeInTaskEnableRow(entity.getBarcodeStation().getStationId());
+                    }
                     redisUtil.set(RedisKeyType.GENERATE_FAKE_IN_STATION_DATA_LIMIT.key + stationId, "lock", 5);
                 }
             }
@@ -262,7 +263,7 @@
     }
 
     // 鐢熸垚浠跨湡妯℃嫙鍏ュ簱浠诲姟
-    private synchronized void generateFakeInTask() {
+    private void generateFakeInTask() {
         if (!enableFake.equals("Y")) {
             return;
         }
@@ -349,7 +350,7 @@
                         News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
                         continue;
                     }
-                    MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
+                    stationCommandDispatcher.dispatch(basDevp.getDevpNo(), command, "fake-process", "fake-in-task");
                     redisUtil.set(RedisKeyType.GENERATE_FAKE_IN_TASK_LIMIT.key + stationId, "lock", 5);
                 }
             }
@@ -357,7 +358,7 @@
     }
 
     // 鐢熸垚浠跨湡妯℃嫙鍑哄簱浠诲姟
-    private synchronized void generateFakeOutTask() {
+    private void generateFakeOutTask() {
         try {
             if (!enableFake.equals("Y")) {
                 return;
@@ -419,7 +420,7 @@
                 }
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("generateFakeOutTask execute error", e);
         }
     }
 
@@ -427,8 +428,8 @@
      * 璇锋眰鐢熸垚鍏ュ簱浠诲姟
      * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
      */
-    public synchronized void generateStoreWrkFile() {
-        storeInTaskGenerationService.generate(this);
+    public void generateStoreWrkFile() {
+        submitGenerateStoreTasks();
     }
 
     @Override
@@ -459,11 +460,11 @@
             News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
             return;
         }
-        MessageQueue.offer(SlaveType.Devp, context.getBasDevp().getDevpNo(), new Task(2, command));
+        stationCommandDispatcher.dispatch(context.getBasDevp().getDevpNo(), command, "fake-process", "write-info");
     }
 
     // 璁$畻鎵�鏈夌珯鐐瑰仠鐣欐椂闂�
-    public synchronized void calcAllStationStayTime() {
+    public void calcAllStationStayTime() {
         List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
         for (BasDevp basDevp : basDevps) {
             StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
@@ -487,7 +488,7 @@
     }
 
     // 妫�娴嬪嚭搴撶珯鐐瑰仠鐣欐槸鍚﹁秴鏃�
-    public synchronized void checkOutStationStayTimeOut() {
+    public void checkOutStationStayTimeOut() {
         List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
         for (BasDevp basDevp : basDevps) {
             List<StationObjModel> outStationList = basDevp.getOutStationList$();
@@ -521,7 +522,7 @@
                         continue;
                     }
 
-                    MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
+                    stationCommandDispatcher.dispatch(stationObjModel.getDeviceNo(), command, "fake-process", "out-station-reset");
                     redisUtil.set(
                             RedisKeyType.CHECK_OUT_STATION_STAY_TIME_OUT_LIMIT.key + stationObjModel.getStationId(),
                             "lock", 10);
@@ -533,7 +534,7 @@
     }
 
     // 妫�娴嬪叆搴撶珯鐐瑰爢鍨涙満鏄惁鍙栬蛋璐х墿
-    public synchronized void checkInStationCrnTake() {
+    public void checkInStationCrnTake() {
         List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
         for (BasCrnp basCrnp : basCrnps) {
             List<StationObjModel> inStationList = basCrnp.getInStationList$();
@@ -555,7 +556,7 @@
         }
     }
 
-    private synchronized void checkInStationListCrnTake(List<StationObjModel> inStationList) {
+    private void checkInStationListCrnTake(List<StationObjModel> inStationList) {
         for (StationObjModel stationObjModel : inStationList) {
             Object lock = redisUtil
                     .get(RedisKeyType.CHECK_IN_STATION_STAY_TIME_OUT_LIMIT.key + stationObjModel.getStationId());
@@ -584,7 +585,7 @@
 
                 WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
                 if (wrkMast == null) {
-                    MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
+                    stationCommandDispatcher.dispatch(stationObjModel.getDeviceNo(), command, "fake-process", "in-station-reset-task-over");
                     redisUtil.set(
                             RedisKeyType.CHECK_IN_STATION_STAY_TIME_OUT_LIMIT.key + stationObjModel.getStationId(),
                             "lock", 10);
@@ -605,7 +606,7 @@
                                 continue;
                             }
 
-                            MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
+                            stationCommandDispatcher.dispatch(stationObjModel.getDeviceNo(), command, "fake-process", "in-station-reset-crn-fetch");
                             redisUtil.set(RedisKeyType.CHECK_IN_STATION_STAY_TIME_OUT_LIMIT.key
                                     + stationObjModel.getStationId(), "lock", 10);
                             News.info("杈撻�佺珯鐐归噸缃懡浠や笅鍙戞垚鍔�(crn_fetch)锛岀珯鐐瑰彿={}锛屽懡浠ゆ暟鎹�={}", stationObjModel.getStationId(),
@@ -632,7 +633,7 @@
                                 continue;
                             }
 
-                            MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
+                            stationCommandDispatcher.dispatch(stationObjModel.getDeviceNo(), command, "fake-process", "in-station-reset-dual-crn-fetch");
                             redisUtil.set(RedisKeyType.CHECK_IN_STATION_STAY_TIME_OUT_LIMIT.key
                                     + stationObjModel.getStationId(), "lock", 10);
                             News.info("杈撻�佺珯鐐归噸缃懡浠や笅鍙戞垚鍔�(crn_fetch)锛岀珯鐐瑰彿={}锛屽懡浠ゆ暟鎹�={}", stationObjModel.getStationId(),
@@ -645,87 +646,93 @@
     }
 
     // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
-    public synchronized void crnIoExecuteFinish() {
+    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);
-                        MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
-                        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