From 30b0f1f97665f07145e3580dab577fae75ee0fa7 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 27 四月 2026 10:23:23 +0800
Subject: [PATCH] fix: persist station flow capacity audit fields

---
 src/main/java/com/zy/core/plugin/FakeProcess.java |  977 ++++++++++++++-------------------------------------------
 1 files changed, 246 insertions(+), 731 deletions(-)

diff --git a/src/main/java/com/zy/core/plugin/FakeProcess.java b/src/main/java/com/zy/core/plugin/FakeProcess.java
index d03023b..e9c1996 100644
--- a/src/main/java/com/zy/core/plugin/FakeProcess.java
+++ b/src/main/java/com/zy/core/plugin/FakeProcess.java
@@ -1,38 +1,34 @@
 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.mapper.EntityWrapper;
-import com.core.common.Cools;
-import com.zy.asrs.domain.param.CreateInTaskParam;
-import com.zy.asrs.domain.param.CreateOutTaskParam;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.StationCommandDispatchResult;
+import com.zy.core.dispatch.StationCommandDispatcher;
 import com.zy.core.enums.*;
 import com.zy.core.model.StationObjModel;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.CrnCommand;
 import com.zy.core.model.command.StationCommand;
 import com.zy.core.model.protocol.CrnProtocol;
-import com.zy.core.model.protocol.DualCrnProtocol;
-import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.network.fake.FakeConfigKeys;
+import com.zy.core.network.fake.FakeConfigSupport;
 import com.zy.core.plugin.api.MainProcessPluginApi;
-import com.zy.core.properties.SystemProperties;
+import com.zy.core.plugin.station.FakeStationMonitor;
+import com.zy.core.plugin.station.FakeTaskGenerator;
+import com.zy.core.plugin.store.StoreInTaskContext;
+import com.zy.core.plugin.store.StoreInTaskPolicy;
+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;
@@ -40,42 +36,116 @@
 import org.springframework.stereotype.Component;
 
 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 {
+public class FakeProcess implements MainProcessPluginApi, StoreInTaskPolicy {
+    private long getMainDispatchIntervalMs() {
+        return FakeConfigSupport.getLong(FakeConfigKeys.FAKE_STATION_IDLE_LOOP_DELAY_MS, 200L);
+    }
 
-    private static final long METHOD_TIMEOUT_MS = 15000; // 15绉掕秴鏃�
-    private static final ExecutorService timeoutExecutor = Executors.newCachedThreadPool();
+    private long getAsyncDispatchIntervalMs() {
+        return Math.max(50L, FakeConfigSupport.getLong(FakeConfigKeys.FAKE_STATION_INITIALIZE_DELAY_MS, 50L));
+    }
 
-    private static Map<Integer, Long> stationStayTimeMap = new ConcurrentHashMap<>();
+    private long getOutStationStayTimeoutMs() {
+        return FakeConfigSupport.getLong(FakeConfigKeys.FAKE_OUT_STATION_STAY_TIMEOUT_MS, 3000L);
+    }
+
     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;
+    private static final Map<Integer, Long> OUT_STATION_STAY_MARKER = new HashMap<Integer, Long>();
 
-    @Autowired
-    private WrkMastService wrkMastService;
-    @Autowired
-    private BasDevpService basDevpService;
+    private final Object outStationStayLock = new Object();
+
+    private boolean shouldDispatchOutStationWriteInfo(Integer wrkNo) {
+        long now = System.currentTimeMillis();
+        long timeoutMs = getOutStationStayTimeoutMs();
+        synchronized (outStationStayLock) {
+            Long lastTime = OUT_STATION_STAY_MARKER.get(wrkNo);
+            if (lastTime == null || now - lastTime >= timeoutMs) {
+                OUT_STATION_STAY_MARKER.put(wrkNo, now);
+                return true;
+            }
+            return false;
+        }
+    }
+
+    private void clearOutStationStayMarker(Integer wrkNo) {
+        synchronized (outStationStayLock) {
+            OUT_STATION_STAY_MARKER.remove(wrkNo);
+        }
+    }
+
+    private void dispatchOutStationWriteInfoIfReady(WrkMast wrkMast, BasCrnp basCrnp) {
+        Integer wrkNo = wrkMast == null ? null : wrkMast.getWrkNo();
+        if (wrkNo == null) {
+            News.error("浠跨湡鍑哄簱绔欑偣鍐欏叆璺宠繃锛學CS浠诲姟鍙蜂负绌恒�俿ourceStaNo={}锛宑rnNo={}",
+                    wrkMast == null ? null : wrkMast.getSourceStaNo(),
+                    basCrnp == null ? null : basCrnp.getCrnNo());
+            return;
+        }
+        if (!shouldDispatchOutStationWriteInfo(wrkNo)) {
+            News.error("浠跨湡鍑哄簱绔欑偣鍐欏叆璺宠繃锛屽懡涓妭娴侀檺鍒躲�倃rkNo={}锛宻ourceStaNo={}锛宑rnNo={}",
+                    wrkNo,
+                    wrkMast == null ? null : wrkMast.getSourceStaNo(),
+                    basCrnp == null ? null : basCrnp.getCrnNo());
+            return;
+        }
+        String taskNo = String.valueOf(wrkNo);
+        List<StationObjModel> outStationList = basCrnp.getOutStationList$();
+        if (outStationList.isEmpty()) {
+            News.error("浠跨湡鍑哄簱绔欑偣鍐欏叆澶辫触锛屽爢鍨涙満鏈厤缃嚭搴撶珯鐐广�俢rnNo={}锛寃rkNo={}锛宼askNo={}",
+                    basCrnp.getCrnNo(), wrkMast == null ? null : wrkMast.getWrkNo(), taskNo);
+            return;
+        }
+        boolean matched = false;
+        for (StationObjModel stationObjModel : outStationList) {
+            if (!stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
+                continue;
+            }
+            matched = true;
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
+            if (stationThread == null) {
+                News.error("浠跨湡鍑哄簱绔欑偣鍐欏叆澶辫触锛岀珯鐐圭嚎绋嬩笉瀛樺湪銆倀askNo={}锛寃rkNo={}锛宻tationId={}锛宒eviceNo={}",
+                        taskNo, wrkMast.getWrkNo(), stationObjModel.getStationId(), stationObjModel.getDeviceNo());
+                continue;
+            }
+            StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, 9998,
+                    wrkMast.getSourceStaNo(), 0, 0);
+            StationCommandDispatchResult dispatchResult = stationCommandDispatcher.dispatch(
+                    stationObjModel.getDeviceNo(), command, "fake-process", "crn-out-complete-write-info");
+            News.info("浠跨湡鍑哄簱绔欑偣鍐欏叆鍛戒护鍒嗗彂缁撴灉銆倀askNo={}锛寃rkNo={}锛宑rnNo={}锛宻tationId={}锛宒eviceNo={}锛宎ccepted={}锛宺eason={}锛宷ueueDepth={}",
+                    taskNo,
+                    wrkMast.getWrkNo(),
+                    basCrnp.getCrnNo(),
+                    stationObjModel.getStationId(),
+                    stationObjModel.getDeviceNo(),
+                    dispatchResult != null && dispatchResult.isAccepted(),
+                    dispatchResult == null ? null : dispatchResult.getReason(),
+                    dispatchResult == null ? null : dispatchResult.getQueueDepth());
+        }
+        if (!matched) {
+            News.error("浠跨湡鍑哄簱绔欑偣鍐欏叆澶辫触锛屾湭鍖归厤鍒皊ourceStaNo瀵瑰簲鍑哄簱绔欑偣銆倀askNo={}锛寃rkNo={}锛宻ourceStaNo={}锛宑rnNo={}",
+                    taskNo,
+                    wrkMast == null ? null : wrkMast.getWrkNo(),
+                    wrkMast == null ? null : wrkMast.getSourceStaNo(),
+                    basCrnp == null ? null : basCrnp.getCrnNo());
+        }
+    }
+
     @Autowired
     private ConfigService configService;
     @Autowired
-    private LocMastService locMastService;
+    private WrkMastService wrkMastService;
     @Autowired
-    private CommonService commonService;
+    private WrkAnalysisService wrkAnalysisService;
     @Autowired
     private BasCrnpService basCrnpService;
-    @Autowired
-    private BasDualCrnpService basDualCrnpService;
     @Autowired
     private RedisUtil redisUtil;
     @Autowired
@@ -83,743 +153,188 @@
     @Autowired
     private StationOperateProcessUtils stationOperateProcessUtils;
     @Autowired
-    private WmsOperateUtils wmsOperateUtils;
-    @Autowired
     private DualCrnOperateProcessUtils dualCrnOperateProcessUtils;
-
-    /**
-     * 甯﹁秴鏃朵繚鎶ゆ墽琛屾柟娉�
-     * 
-     * @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;
+    @Autowired
+    private FakeStationMonitor fakeStationMonitor;
+    @Autowired
+    private FakeTaskGenerator fakeTaskGenerator;
 
     @Override
     public void run() {
         long startTime = System.currentTimeMillis();
-        asyncFakeRun();
+        refreshFakeConfig();
+        syncConfigToComponents();
+
+        long asyncDispatchIntervalMs = getAsyncDispatchIntervalMs();
+        long mainDispatchIntervalMs = getMainDispatchIntervalMs();
+        // 浠跨湡寮傛浠诲姟
+        fakeStationMonitor.submitMonitorTasks(asyncDispatchIntervalMs);
+        // 浠跨湡杈撻�佺嚎鍫靛妫�娴�
+        stationOperateProcessUtils.submitCheckStationRunBlockTasks(MainProcessLane.FAKE_STATION_RUN_BLOCK, asyncDispatchIntervalMs);
 
         // 璇锋眰鐢熸垚鍏ュ簱浠诲姟
-        this.generateStoreWrkFile();
+        fakeTaskGenerator.submitGenerateTasks();
 
         // 鎵ц鍫嗗灈鏈轰换鍔�
-        crnOperateUtils.crnIoExecute();
-        // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�-鍏峰浠跨湡鑳藉姏
-        this.crnIoExecuteFinish();
+        crnOperateUtils.submitCrnIoTasks(MainProcessLane.FAKE_CRN_IO, mainDispatchIntervalMs);
+        // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
+        submitCrnIoExecuteFinishTasks(mainDispatchIntervalMs);
         // 鎵ц杈撻�佺珯鐐瑰叆搴撲换鍔�
-        stationOperateProcessUtils.stationInExecute();
-        // 鎵ц杈撻�佺珯鐐瑰嚭搴撲换鍔�
-        stationOperateProcessUtils.crnStationOutExecute();
-        // 妫�娴嬭緭閫佺珯鐐瑰嚭搴撲换鍔℃墽琛屽畬鎴�
-        stationOperateProcessUtils.stationOutExecuteFinish();
-        // 妫�娴嬩换鍔¤浆瀹屾垚
-        stationOperateProcessUtils.checkTaskToComplete();
-        // 妫�娴嬪嚭搴撴帓搴�
-        stationOperateProcessUtils.checkStationOutOrder();
-        // 鐩戞帶缁曞湀绔欑偣
-        stationOperateProcessUtils.watchCircleStation();
-
+        stationOperateProcessUtils.submitStationInTasks(MainProcessLane.FAKE_STATION_IN, mainDispatchIntervalMs);
+        // 妫�娴嬪叆搴撲换鍔℃槸鍚﹀凡缁忓埌杈剧洰鏍囩珯鍙�
+        stationOperateProcessUtils.submitInboundStationArrivalTasks(mainDispatchIntervalMs);
+        // 杈撻�佺嚎鎵ц鍫嗗灈鏈哄嚭搴撳悗鐨勭珯鍙版祦杞�
+        stationOperateProcessUtils.submitCrnStationOutTasks(MainProcessLane.FAKE_STATION_OUT, mainDispatchIntervalMs);
+        // 妫�娴嬪嚭搴撲换鍔℃槸鍚﹀凡缁忓埌杈剧洰鏍囩珯鍙�
+        stationOperateProcessUtils.submitStationOutExecuteFinishTasks(mainDispatchIntervalMs);
+        // 妫�娴嬬珯鍙拌繍琛屽畬鎴愬悗鐨勪换鍔¤浆瀹屾垚
+        stationOperateProcessUtils.submitCheckTaskToCompleteTasks(mainDispatchIntervalMs);
+        // 妫�娴嬪苟澶勭悊鍑哄簱鎺掑簭
+        stationOperateProcessUtils.submitCheckStationOutOrderTasks(MainProcessLane.FAKE_STATION_OUT_ORDER, mainDispatchIntervalMs);
         // 鎵ц鍙屽伐浣嶅爢鍨涙満浠诲姟
-        dualCrnOperateProcessUtils.dualCrnIoExecute();
+        dualCrnOperateProcessUtils.submitDualCrnIoTasks(MainProcessLane.FAKE_DUAL_CRN_IO, mainDispatchIntervalMs);
         // 鍙屽伐浣嶅爢鍨涙満浠诲姟鎵ц瀹屾垚
-        dualCrnOperateProcessUtils.dualCrnIoExecuteFinish();
+        dualCrnOperateProcessUtils.submitDualCrnIoExecuteFinishTasks(MainProcessLane.FAKE_DUAL_CRN_IO_FINISH, mainDispatchIntervalMs);
 
         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
-                            .selectOne(new EntityWrapper<Config>().eq("code", "enableFake"));
-                    if (enableFakeConfig != null) {
-                        enableFake = enableFakeConfig.getValue();
-                    }
-
-                    Config fakeRealTaskRequestWmsConfig = configService
-                            .selectOne(new EntityWrapper<Config>().eq("code", "fakeRealTaskRequestWms"));
-                    if (fakeRealTaskRequestWmsConfig != null) {
-                        fakeRealTaskRequestWms = fakeRealTaskRequestWmsConfig.getValue();
-                    }
-
-                    Config fakeGenerateInTaskConfig = configService
-                            .selectOne(new EntityWrapper<Config>().eq("code", "fakeGenerateInTask"));
-                    if (fakeGenerateInTaskConfig != null) {
-                        fakeGenerateInTask = fakeGenerateInTaskConfig.getValue();
-                    }
-
-                    Config fakeGenerateOutTaskConfig = configService
-                            .selectOne(new EntityWrapper<Config>().eq("code", "fakeGenerateOutTask"));
-                    if (fakeGenerateOutTaskConfig != null) {
-                        fakeGenerateOutTask = fakeGenerateOutTaskConfig.getValue();
-                    }
-
-                    // 绯荤粺杩愯鐘舵�佸垽鏂�
-                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
-                        continue;
-                    }
-
-                    // 妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞朵豢鐪熺敓鎴愭ā鎷熷叆搴撶珯鐐规暟鎹�
-                    checkInStationHasTask();
-                    // 鐢熸垚浠跨湡妯℃嫙鍏ュ簱浠诲姟
-                    generateFakeInTask();
-                    // 鐢熸垚浠跨湡妯℃嫙鍑哄簱浠诲姟
-                    generateFakeOutTask();
-                    // 璁$畻鎵�鏈夌珯鐐瑰仠鐣欐椂闂�
-                    calcAllStationStayTime();
-                    // 妫�娴嬪嚭搴撶珯鐐瑰仠鐣欐槸鍚﹁秴鏃�
-                    checkOutStationStayTimeOut();
-                    // 妫�娴嬪叆搴撶珯鐐瑰爢鍨涙満鏄惁鍙栬蛋璐х墿
-                    checkInStationCrnTake();
-
-                    // 妫�娴嬭緭閫佺珯鐐规槸鍚﹁繍琛屽牭濉�
-                    stationOperateProcessUtils.checkStationRunBlock();
-
-                    // 闂撮殧
-                    Thread.sleep(50);
-                } catch (InterruptedException ie) {
-                    Thread.currentThread().interrupt();
-                    break;
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        });
-        asyncFakeRunThread.setName("asyncFakeRunProcess");
-        asyncFakeRunThread.setDaemon(true);
-        asyncFakeRunThread.start();
-    }
-
-    // 妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞朵豢鐪熺敓鎴愭ā鎷熷叆搴撶珯鐐规暟鎹�
-    private synchronized void checkInStationHasTask() {
-        if (!enableFake.equals("Y")) {
-            return;
+        Config fakeRealTaskRequestWmsConfig = configService
+                .getOne(new QueryWrapper<Config>().eq("code", "fakeRealTaskRequestWms"));
+        if (fakeRealTaskRequestWmsConfig != null) {
+            fakeRealTaskRequestWms = fakeRealTaskRequestWmsConfig.getValue();
         }
 
-        if (!fakeGenerateInTask.equals("Y")) {
-            return;
+        Config fakeGenerateInTaskConfig = configService
+                .getOne(new QueryWrapper<Config>().eq("code", "fakeGenerateInTask"));
+        if (fakeGenerateInTaskConfig != null) {
+            fakeGenerateInTask = fakeGenerateInTaskConfig.getValue();
         }
 
-        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
-        for (BasDevp basDevp : basDevps) {
-            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-            if (stationThread == null) {
-                continue;
-            }
-
-            Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
-
-            List<StationObjModel> list = basDevp.getInStationList$();
-            for (StationObjModel entity : list) {
-                Integer stationId = entity.getStationId();
-                if (!stationMap.containsKey(stationId)) {
-                    continue;
-                }
-
-                StationProtocol stationProtocol = stationMap.get(stationId);
-                if (stationProtocol == null) {
-                    continue;
-                }
-
-                Object lock = redisUtil.get(RedisKeyType.GENERATE_FAKE_IN_STATION_DATA_LIMIT.key + stationId);
-                if (lock != null) {
-                    continue;
-                }
-
-                // 婊¤冻鑷姩銆佹棤鐗┿�佸伐浣滃彿0锛岀敓鎴愬叆搴撴暟鎹�
-                if (stationProtocol.isAutoing()
-                        && !stationProtocol.isLoading()
-                        && stationProtocol.getTaskNo() == 0) {
-                    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));
-                    redisUtil.set(RedisKeyType.GENERATE_FAKE_IN_STATION_DATA_LIMIT.key + stationId, "lock", 5);
-                }
-            }
+        Config fakeGenerateOutTaskConfig = configService
+                .getOne(new QueryWrapper<Config>().eq("code", "fakeGenerateOutTask"));
+        if (fakeGenerateOutTaskConfig != null) {
+            fakeGenerateOutTask = fakeGenerateOutTaskConfig.getValue();
         }
     }
 
-    // 鐢熸垚浠跨湡妯℃嫙鍏ュ簱浠诲姟
-    private synchronized void generateFakeInTask() {
-        if (!enableFake.equals("Y")) {
-            return;
-        }
-
-        if (fakeRealTaskRequestWms.equals("Y")) {
-            return;
-        }
-
-        if (!fakeGenerateInTask.equals("Y")) {
-            return;
-        }
-
-        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
-        for (BasDevp basDevp : basDevps) {
-            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-            if (stationThread == null) {
-                continue;
-            }
-
-            Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
-
-            List<StationObjModel> list = basDevp.getBarcodeStationList$();
-            for (StationObjModel model : list) {
-                Integer stationId = model.getStationId();
-                if (!stationMap.containsKey(stationId)) {
-                    continue;
-                }
-
-                StationProtocol stationProtocol = stationMap.get(stationId);
-                if (stationProtocol == null) {
-                    continue;
-                }
-
-                Object object = redisUtil.get(RedisKeyType.GENERATE_FAKE_IN_TASK_LIMIT.key + stationId);
-                if (object != null) {
-                    continue;
-                }
-
-                // 婊¤冻鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙凤紝鐢熸垚鍏ュ簱鏁版嵁
-                if (stationProtocol.isAutoing()
-                        && stationProtocol.isLoading()
-                        && stationProtocol.getTaskNo() > 0) {
-                    if (Cools.isEmpty(stationProtocol.getBarcode())) {
-                        continue;
-                    }
-
-                    // 妫�娴嬩换鍔℃槸鍚︾敓鎴�
-                    List<WrkMast> wrkMasts = wrkMastService
-                            .selectList(new EntityWrapper<WrkMast>().eq("barcode", stationProtocol.getBarcode()));
-                    if (!wrkMasts.isEmpty()) {
-                        continue;
-                    }
-
-                    List<LocMast> locMastList = locMastService
-                            .selectList(new EntityWrapper<LocMast>().eq("loc_sts", String.valueOf(LocStsType.O)));
-                    if (locMastList.isEmpty()) {
-                        continue;
-                    }
-
-                    int nextInt = new Random().nextInt(locMastList.size());
-                    LocMast locMast = locMastList.get(nextInt);
-
-                    FindCrnNoResult findCrnNoResult = commonService.findCrnNoByLocNo(locMast.getLocNo());
-                    if (findCrnNoResult == null) {
-                        continue;
-                    }
-
-                    Integer targetStationId = commonService.findInStationId(findCrnNoResult, stationId);
-                    if (targetStationId == null) {
-                        continue;
-                    }
-
-                    CreateInTaskParam taskParam = new CreateInTaskParam();
-                    taskParam.setTaskNo(String.valueOf(commonService.getWorkNo(WrkIoType.IN.id)));
-                    taskParam.setSourceStaNo(stationId);
-                    taskParam.setStaNo(targetStationId);
-                    taskParam.setLocNo(locMast.getLocNo());
-                    taskParam.setBarcode(stationProtocol.getBarcode());
-                    WrkMast wrkMast = commonService.createInTask(taskParam);
-
-                    StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(),
-                            stationId, stationId, 0);
-                    if (command == null) {
-                        News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
-                        continue;
-                    }
-                    MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
-                    redisUtil.set(RedisKeyType.GENERATE_FAKE_IN_TASK_LIMIT.key + stationId, "lock", 5);
-                }
-            }
-        }
+    private void syncConfigToComponents() {
+        fakeStationMonitor.setEnableFake(enableFake);
+        fakeStationMonitor.setFakeGenerateInTask(fakeGenerateInTask);
+        fakeTaskGenerator.setFakeRealTaskRequestWms(fakeRealTaskRequestWms);
+        fakeTaskGenerator.setFakeGenerateInTask(fakeGenerateInTask);
+        fakeTaskGenerator.setFakeGenerateOutTask(fakeGenerateOutTask);
     }
 
-    // 鐢熸垚浠跨湡妯℃嫙鍑哄簱浠诲姟
-    private synchronized void generateFakeOutTask() {
-        try {
-            if (!enableFake.equals("Y")) {
-                return;
-            }
-
-            if (fakeRealTaskRequestWms.equals("Y")) {
-                return;
-            }
-
-            if (!fakeGenerateOutTask.equals("Y")) {
-                return;
-            }
-
-            List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
-
-                List<StationObjModel> list = basDevp.getOutStationList$();
-                for (StationObjModel entity : list) {
-                    Integer stationId = entity.getStationId();
-                    if (!stationMap.containsKey(stationId)) {
-                        continue;
-                    }
-
-                    StationProtocol stationProtocol = stationMap.get(stationId);
-                    if (stationProtocol == null) {
-                        continue;
-                    }
-
-                    Object object = redisUtil.get(RedisKeyType.GENERATE_FAKE_OUT_TASK_LIMIT.key + stationId);
-                    if (object != null) {
-                        return;
-                    }
-
-                    // 婊¤冻鑷姩銆佹棤鐗┿�佸伐浣滃彿0锛岀敓鎴愬嚭搴撴暟鎹�
-                    if (stationProtocol.isAutoing()
-                            && !stationProtocol.isLoading()
-                            && stationProtocol.getTaskNo() == 0) {
-                        List<LocMast> locMastList = locMastService
-                                .selectList(new EntityWrapper<LocMast>().eq("loc_sts", String.valueOf(LocStsType.F)));
-                        if (locMastList.isEmpty()) {
-                            continue;
-                        }
-
-                        LocMast locMast = locMastList.get(0);
-
-                        CreateOutTaskParam taskParam = new CreateOutTaskParam();
-                        taskParam.setTaskNo(String.valueOf(commonService.getWorkNo(WrkIoType.OUT.id)));
-                        taskParam.setStaNo(stationId);
-                        taskParam.setLocNo(locMast.getLocNo());
-                        boolean result = commonService.createOutTask(taskParam);
-                        redisUtil.set(RedisKeyType.GENERATE_FAKE_OUT_TASK_LIMIT.key + stationId, "lock", 10);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 璇锋眰鐢熸垚鍏ュ簱浠诲姟
-     * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
-     */
-    public synchronized void generateStoreWrkFile() {
-        try {
-            if (fakeRealTaskRequestWms.equals("N")) {
-                return;
-            }
-
-            Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
-            if (systemConfigMapObj == null) {
-                return;
-            }
-            HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
-
-            int conveyorStationTaskLimit = 30;
-            String conveyorStationTaskLimitStr = systemConfigMap.get("conveyorStationTaskLimit");
-            if (conveyorStationTaskLimitStr != null) {
-                conveyorStationTaskLimit = Integer.parseInt(conveyorStationTaskLimitStr);
-            }
-            int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
-            if (currentStationTaskCount > conveyorStationTaskLimit) {
-                News.error("杈撻�佺珯鐐逛换鍔″凡杈惧埌涓婇檺锛屼笂闄愬�硷細{}锛岀珯鐐逛换鍔℃暟锛歿}", conveyorStationTaskLimit, currentStationTaskCount);
-                return;
-            }
-
-            List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
-
-                List<StationObjModel> list = basDevp.getBarcodeStationList$();
-                for (StationObjModel entity : list) {
-                    Integer stationId = entity.getStationId();
-                    if (!stationMap.containsKey(stationId)) {
-                        continue;
-                    }
-
-                    StationProtocol stationProtocol = stationMap.get(stationId);
-                    if (stationProtocol == null) {
-                        continue;
-                    }
-
-                    // 婊¤冻鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙凤紝鐢熸垚鍏ュ簱鏁版嵁
-                    if (stationProtocol.isAutoing()
-                            && stationProtocol.isLoading()
-                            && stationProtocol.getTaskNo() > 0) {
-                        if (Cools.isEmpty(stationProtocol.getBarcode())) {
-                            continue;
-                        }
-
-                        // 妫�娴嬩换鍔℃槸鍚︾敓鎴�
-                        List<WrkMast> wrkMasts = wrkMastService
-                                .selectList(new EntityWrapper<WrkMast>()
-                                        .eq("barcode", stationProtocol.getBarcode()));
-                        if (!wrkMasts.isEmpty()) {
-                            continue;
-                        }
-
-                        Object lock = redisUtil.get(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId);
-                        if (lock != null) {
-                            continue;
-                        }
-                        redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 3);
-
-                        String barcode = stationProtocol.getBarcode();
-                        Integer stationIdVal = stationProtocol.getStationId();
-
-                        // 1. 棣栧厛鏌ヨ鏄惁鏈夊凡瀹屾垚鐨勫紓姝ュ搷搴�
-                        String response = wmsOperateUtils.queryAsyncInTaskResponse(barcode, stationIdVal);
-
-                        if (!Cools.isEmpty(response)) {
-                            // 2. 鏈夊搷搴旂粨鏋滐紝澶勭悊鍝嶅簲
-                            if (response.equals("FAILED") || response.startsWith("ERROR:")) {
-                                // 璇锋眰澶辫触锛岄噸鏂板彂璧峰紓姝ヨ姹�
-                                News.error("WMS鍏ュ簱璇锋眰澶辫触锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                                continue;
-                            }
-
-                            // 瑙f瀽鍝嶅簲
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            if (jsonObject.getInteger("code").equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-
-                                CreateInTaskParam taskParam = new CreateInTaskParam();
-                                taskParam.setTaskNo(dto.getTaskNo());
-                                taskParam.setLocNo(dto.getLocNo());
-                                taskParam.setTaskPri(dto.getTaskPri());
-                                taskParam.setBarcode(barcode);
-                                WrkMast wrkMast = commonService.createInTask(taskParam);
-
-                                StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO,
-                                        wrkMast.getWrkNo(), stationId, stationId, 0);
-                                if (command == null) {
-                                    News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
-                                    continue;
-                                }
-                                MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
-
-                                stationProtocol.setSystemWarning("");
-                            } else {
-                                // 鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹�
-                                News.error("WMS鍏ュ簱鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                            }
-                        } else {
-                            // 3. 娌℃湁鍝嶅簲缁撴灉锛屾鏌ユ槸鍚︽湁璇锋眰姝e湪杩涜涓�
-                            if (!wmsOperateUtils.isAsyncRequestInProgress(barcode, stationIdVal)) {
-                                // 娌℃湁璇锋眰杩涜涓紝鍙戣捣鏂扮殑寮傛璇锋眰
-                                News.info("鍙戣捣寮傛WMS鍏ュ簱璇锋眰锛宐arcode={}锛宻tationId={}", barcode, stationIdVal);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS鏃犺繑鍥�");
-                            }
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    // 璁$畻鎵�鏈夌珯鐐瑰仠鐣欐椂闂�
-    public synchronized void calcAllStationStayTime() {
-        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
-        for (BasDevp basDevp : basDevps) {
-            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-            if (stationThread == null) {
-                continue;
-            }
-
-            List<StationProtocol> list = stationThread.getStatus();
-            for (StationProtocol stationProtocol : list) {
-                if (stationProtocol.getTaskNo() > 0
-                        && !stationStayTimeMap.containsKey(stationProtocol.getStationId())) {
-                    stationStayTimeMap.put(stationProtocol.getStationId(), System.currentTimeMillis());
-                }
-
-                if (stationProtocol.getTaskNo() <= 0
-                        && stationStayTimeMap.containsKey(stationProtocol.getStationId())) {
-                    stationStayTimeMap.remove(stationProtocol.getStationId());
-                }
-            }
-        }
-    }
-
-    // 妫�娴嬪嚭搴撶珯鐐瑰仠鐣欐槸鍚﹁秴鏃�
-    public synchronized void checkOutStationStayTimeOut() {
-        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
-        for (BasDevp basDevp : basDevps) {
-            List<StationObjModel> outStationList = basDevp.getOutStationList$();
-            if (outStationList.isEmpty()) {
-                News.info("杈撻�佺嚎:{} 鍑哄簱绔欑偣鏈缃�", basDevp.getDevpNo());
-                continue;
-            }
-
-            for (StationObjModel stationObjModel : outStationList) {
-                Object lock = redisUtil
-                        .get(RedisKeyType.CHECK_OUT_STATION_STAY_TIME_OUT_LIMIT.key + stationObjModel.getStationId());
-                if (lock != null) {
-                    continue;
-                }
-
-                Long stayTime = stationStayTimeMap.get(stationObjModel.getStationId());
-                if (stayTime == null) {
-                    continue;
-                }
-
-                if (System.currentTimeMillis() - stayTime > 1000 * 60) {
-                    StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp,
-                            stationObjModel.getDeviceNo());
-                    if (stationThread == null) {
-                        continue;
-                    }
-
-                    StationCommand command = stationThread.getCommand(StationCommandType.RESET, 0,
-                            stationObjModel.getStationId(), 0, 0);
-                    if (command == null) {
-                        continue;
-                    }
-
-                    MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
-                    redisUtil.set(
-                            RedisKeyType.CHECK_OUT_STATION_STAY_TIME_OUT_LIMIT.key + stationObjModel.getStationId(),
-                            "lock", 10);
-                    News.info("杈撻�佺珯鐐瑰嚭搴撻噸缃懡浠や笅鍙戞垚鍔燂紝绔欑偣鍙�={}锛屽懡浠ゆ暟鎹�={}", stationObjModel.getStationId(),
-                            JSON.toJSONString(command));
-                }
-            }
-        }
-    }
-
-    // 妫�娴嬪叆搴撶珯鐐瑰爢鍨涙満鏄惁鍙栬蛋璐х墿
-    public synchronized void checkInStationCrnTake() {
-        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
+    private void submitCrnIoExecuteFinishTasks(long minIntervalMs) {
+        List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
         for (BasCrnp basCrnp : basCrnps) {
-            List<StationObjModel> inStationList = basCrnp.getInStationList$();
-            if (inStationList.isEmpty()) {
-                News.info("鍫嗗灈鏈�:{} 鍏ュ簱绔欑偣鏈缃�", basCrnp.getCrnNo());
+            Integer crnNo = basCrnp == null ? null : basCrnp.getCrnNo();
+            if (crnNo == null) {
                 continue;
             }
-            checkInStationListCrnTake(inStationList);
-        }
-
-        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
-        for (BasDualCrnp basDualCrnp : basDualCrnps) {
-            List<StationObjModel> inStationList = basDualCrnp.getInStationList$();
-            if (inStationList.isEmpty()) {
-                News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍏ュ簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
-                continue;
-            }
-            checkInStationListCrnTake(inStationList);
+            mainProcessTaskSubmitter.submitKeyedSerialTask(
+                    MainProcessLane.FAKE_CRN_IO_FINISH,
+                    crnNo,
+                    "crnIoExecuteFinish",
+                    minIntervalMs,
+                    () -> crnIoExecuteFinish(basCrnp)
+            );
         }
     }
 
-    private synchronized void checkInStationListCrnTake(List<StationObjModel> inStationList) {
-        for (StationObjModel stationObjModel : inStationList) {
-            Object lock = redisUtil
-                    .get(RedisKeyType.CHECK_IN_STATION_STAY_TIME_OUT_LIMIT.key + stationObjModel.getStationId());
-            if (lock != null) {
-                continue;
-            }
+    @Override
+    public boolean isEnabled() {
+        return fakeTaskGenerator.isEnabled();
+    }
 
-            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp,
-                    stationObjModel.getDeviceNo());
-            if (stationThread == null) {
-                continue;
-            }
+    @Override
+    public void onRequestPermitGranted(StoreInTaskContext context) {
+        fakeTaskGenerator.onRequestPermitGranted(context);
+    }
 
-            Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap();
-            StationProtocol stationProtocol = statusMap.get(stationObjModel.getStationId());
-            if (stationProtocol == null) {
-                continue;
-            }
-
-            if (stationProtocol.getTaskNo() > 0) {
-                StationCommand command = stationThread.getCommand(StationCommandType.RESET, 0,
-                        stationObjModel.getStationId(), 0, 0);
-                if (command == null) {
-                    continue;
-                }
-
-                WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
-                if (wrkMast == null) {
-                    MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
-                    redisUtil.set(
-                            RedisKeyType.CHECK_IN_STATION_STAY_TIME_OUT_LIMIT.key + stationObjModel.getStationId(),
-                            "lock", 10);
-                    News.info("杈撻�佺珯鐐归噸缃懡浠や笅鍙戞垚鍔�(task_over)锛岀珯鐐瑰彿={}锛屽懡浠ゆ暟鎹�={}", stationObjModel.getStationId(),
-                            JSON.toJSONString(command));
-                } else {
-                    if (wrkMast.getWrkSts() != WrkStsType.NEW_INBOUND.sts
-                            && wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts) {
-                        Integer crnNo = wrkMast.getCrnNo();
-                        if (crnNo != null) {
-                            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo);
-                            if (crnThread == null) {
-                                continue;
-                            }
-                            CrnProtocol crnProtocol = crnThread.getStatus();
-                            if (!crnProtocol.getStatusType().equals(CrnStatusType.PUT_MOVING)
-                                    && !crnProtocol.getStatusType().equals(CrnStatusType.PUTTING)) {
-                                continue;
-                            }
-
-                            MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
-                            redisUtil.set(RedisKeyType.CHECK_IN_STATION_STAY_TIME_OUT_LIMIT.key
-                                    + stationObjModel.getStationId(), "lock", 10);
-                            News.info("杈撻�佺珯鐐归噸缃懡浠や笅鍙戞垚鍔�(crn_fetch)锛岀珯鐐瑰彿={}锛屽懡浠ゆ暟鎹�={}", stationObjModel.getStationId(),
-                                    JSON.toJSONString(command));
-                        } else {
-                            Integer dualCrnNo = wrkMast.getDualCrnNo();
-                            DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn,
-                                    dualCrnNo);
-                            if (dualCrnThread == null) {
-                                continue;
-                            }
-                            DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
-
-                            boolean reset = false;
-                            if (dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getLoaded() == 1) {
-                                reset = true;
-                            }
-
-                            if (dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getLoadedTwo() == 1) {
-                                reset = true;
-                            }
-
-                            if (!reset) {
-                                continue;
-                            }
-
-                            MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
-                            redisUtil.set(RedisKeyType.CHECK_IN_STATION_STAY_TIME_OUT_LIMIT.key
-                                    + stationObjModel.getStationId(), "lock", 10);
-                            News.info("杈撻�佺珯鐐归噸缃懡浠や笅鍙戞垚鍔�(crn_fetch)锛岀珯鐐瑰彿={}锛屽懡浠ゆ暟鎹�={}", stationObjModel.getStationId(),
-                                    JSON.toJSONString(command));
-                        }
-                    }
-                }
-            }
-        }
+    @Override
+    public void afterTaskCreated(StoreInTaskContext context, WrkMast wrkMast) {
+        fakeTaskGenerator.afterTaskCreated(context, wrkMast);
     }
 
     // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
-    public synchronized void crnIoExecuteFinish() {
-        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
+    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 {
-                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
-                    continue;
-                }
-
-                wrkMast.setWrkSts(updateWrkSts);
-                wrkMast.setSystemMsg("");
-                wrkMast.setIoTime(new Date());
-                if (wrkMastService.updateById(wrkMast)) {
-                    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;
+
+            dispatchOutStationWriteInfoIfReady(wrkMast, basCrnp);
+        } 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)) {
+            clearOutStationStayMarker(wrkMast.getWrkNo());
+            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