From 3a88fe2fe5762b51e2023fe42015bb90354f0a63 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 01 四月 2026 09:12:24 +0800
Subject: [PATCH] #仿真优化

---
 src/main/java/com/zy/core/plugin/FakeProcess.java |  241 ++++++++++++++++++++++--------------------------
 1 files changed, 111 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 99a25f7..b889676 100644
--- a/src/main/java/com/zy/core/plugin/FakeProcess.java
+++ b/src/main/java/com/zy/core/plugin/FakeProcess.java
@@ -1,7 +1,6 @@
 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;
@@ -10,12 +9,12 @@
 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 +27,13 @@
 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.MainProcessAsyncTaskScheduler;
 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 +42,24 @@
 
 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 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 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 +82,118 @@
     @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 MainProcessAsyncTaskScheduler mainProcessAsyncTaskScheduler;
 
     @Override
     public void run() {
         long startTime = System.currentTimeMillis();
-        asyncFakeRun();
+        refreshFakeConfig();
 
-        // 璇锋眰鐢熸垚鍏ュ簱浠诲姟
-        this.generateStoreWrkFile();
+        // 浠跨湡鐩稿叧浠诲姟鎸夊悇鑷� 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);
 
-        // 鎵ц鍫嗗灈鏈轰换鍔�
-        crnOperateUtils.crnIoExecute();
-        // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�-鍏峰浠跨湡鑳藉姏
-        this.crnIoExecuteFinish();
-        // 鎵ц杈撻�佺珯鐐瑰叆搴撲换鍔�
-        stationOperateProcessUtils.stationInExecute();
-        // 鎵ц杈撻�佺珯鐐瑰嚭搴撲换鍔�
-        stationOperateProcessUtils.crnStationOutExecute();
-        // 妫�娴嬪嚭搴撴帓搴�
-        stationOperateProcessUtils.checkStationOutOrder();
-        // 鐩戞帶缁曞湀绔欑偣
-        stationOperateProcessUtils.watchCircleStation();
+        // 璇锋眰鐢熸垚鍏ュ簱浠诲姟锛屾寜绔欑偣鎷嗘垚鐙珛涓茶閫氶亾锛岄伩鍏嶅崟绔欓樆濉炴暣杞壂鎻�
+        generateStoreWrkFile();
 
-        // 鎵ц鍙屽伐浣嶅爢鍨涙満浠诲姟
-        dualCrnOperateProcessUtils.dualCrnIoExecute();
-        // 鍙屽伐浣嶅爢鍨涙満浠诲姟鎵ц瀹屾垚
-        dualCrnOperateProcessUtils.dualCrnIoExecuteFinish();
+        // 鍫嗗灈鏈恒�佽緭閫佺嚎銆佸弻宸ヤ綅鍫嗗灈鏈轰换鍔″垎鍒繘鍏ュ悇鑷覆琛岄�氶亾閫愪釜鎵ц
+        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);
 
         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 submitCrnTask(String taskName, long minIntervalMs, Runnable task) {
+        submitProcessTask(CRN_TASK_LANE, taskName, minIntervalMs, task);
+    }
 
-                    // 绯荤粺杩愯鐘舵�佸垽鏂�
-                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
-                        continue;
-                    }
+    private void submitStationTask(String taskName, long minIntervalMs, Runnable task) {
+        submitProcessTask(STATION_TASK_LANE, taskName, minIntervalMs, task);
+    }
 
-                    // 妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞朵豢鐪熺敓鎴愭ā鎷熷叆搴撶珯鐐规暟鎹�
-                    checkInStationHasTask();
-                    // 鐢熸垚浠跨湡妯℃嫙鍏ュ簱浠诲姟
-                    generateFakeInTask();
-                    // 鐢熸垚浠跨湡妯℃嫙鍑哄簱浠诲姟
-                    generateFakeOutTask();
-                    // 璁$畻鎵�鏈夌珯鐐瑰仠鐣欐椂闂�
-                    calcAllStationStayTime();
-                    // 妫�娴嬪嚭搴撶珯鐐瑰仠鐣欐槸鍚﹁秴鏃�
-                    checkOutStationStayTimeOut();
-                    // 妫�娴嬪叆搴撶珯鐐瑰爢鍨涙満鏄惁鍙栬蛋璐х墿
-                    checkInStationCrnTake();
+    private void submitDualCrnTask(String taskName, long minIntervalMs, Runnable task) {
+        submitProcessTask(DUAL_CRN_TASK_LANE, taskName, minIntervalMs, task);
+    }
 
-                    // 妫�娴嬭緭閫佺珯鐐规槸鍚﹁繍琛屽牭濉�
-                    stationOperateProcessUtils.checkStationRunBlock();
+    private void submitAsyncTask(String taskName, long minIntervalMs, Runnable task) {
+        submitProcessTask(ASYNC_TASK_LANE_PREFIX + taskName, taskName, minIntervalMs, task);
+    }
 
-                    // 闂撮殧
-                    Thread.sleep(50);
-                } catch (InterruptedException ie) {
-                    Thread.currentThread().interrupt();
-                    break;
-                } catch (Exception e) {
-                    e.printStackTrace();
+    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;
                 }
+                submitGenerateStoreTask(stationId, MAIN_DISPATCH_INTERVAL_MS,
+                        () -> storeInTaskGenerationService.generate(this, basDevp, stationObjModel));
             }
-        });
-        asyncFakeRunThread.setName("asyncFakeRunProcess");
-        asyncFakeRunThread.setDaemon(true);
-        asyncFakeRunThread.start();
+        }
+    }
+
+    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
+        );
     }
 
     // 妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞朵豢鐪熺敓鎴愭ā鎷熷叆搴撶珯鐐规暟鎹�
-    private synchronized void checkInStationHasTask() {
+    private void checkInStationHasTask() {
         if (!enableFake.equals("Y")) {
             return;
         }
@@ -254,7 +235,7 @@
                     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");
                     redisUtil.set(RedisKeyType.GENERATE_FAKE_IN_STATION_DATA_LIMIT.key + stationId, "lock", 5);
                 }
             }
@@ -262,7 +243,7 @@
     }
 
     // 鐢熸垚浠跨湡妯℃嫙鍏ュ簱浠诲姟
-    private synchronized void generateFakeInTask() {
+    private void generateFakeInTask() {
         if (!enableFake.equals("Y")) {
             return;
         }
@@ -349,7 +330,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 +338,7 @@
     }
 
     // 鐢熸垚浠跨湡妯℃嫙鍑哄簱浠诲姟
-    private synchronized void generateFakeOutTask() {
+    private void generateFakeOutTask() {
         try {
             if (!enableFake.equals("Y")) {
                 return;
@@ -419,7 +400,7 @@
                 }
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("generateFakeOutTask execute error", e);
         }
     }
 
@@ -427,8 +408,8 @@
      * 璇锋眰鐢熸垚鍏ュ簱浠诲姟
      * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
      */
-    public synchronized void generateStoreWrkFile() {
-        storeInTaskGenerationService.generate(this);
+    public void generateStoreWrkFile() {
+        submitGenerateStoreTasks();
     }
 
     @Override
@@ -459,11 +440,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 +468,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 +502,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 +514,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 +536,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 +565,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 +586,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 +613,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,7 +626,7 @@
     }
 
     // 鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
-    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());
@@ -699,7 +680,7 @@
                         // 鐢熸垚浠跨湡绔欑偣鏁版嵁
                         StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, 9998,
                                 wrkMast.getSourceStaNo(), 0, 0);
-                        MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
+                        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) {

--
Gitblit v1.9.1