From dc3f9cc91759823ce59486f19b138be4b296a0f1 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 28 四月 2026 09:43:28 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java |  219 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 129 insertions(+), 90 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java b/src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java
index 24bb2dc..7ae1627 100644
--- a/src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java
+++ b/src/main/java/com/zy/core/utils/station/StationRegularDispatchProcessor.java
@@ -4,13 +4,11 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.zy.asrs.domain.enums.NotifyMsgType;
+import com.zy.asrs.entity.BasCrnp;
 import com.zy.asrs.entity.BasDevp;
 import com.zy.asrs.entity.BasStation;
 import com.zy.asrs.entity.WrkMast;
-import com.zy.asrs.service.BasDevpService;
-import com.zy.asrs.service.BasStationService;
-import com.zy.asrs.service.WrkAnalysisService;
-import com.zy.asrs.service.WrkMastService;
+import com.zy.asrs.service.*;
 import com.zy.asrs.utils.NotifyUtils;
 import com.zy.common.entity.FindCrnNoResult;
 import com.zy.common.service.CommonService;
@@ -27,7 +25,6 @@
 import com.zy.core.model.StationObjModel;
 import com.zy.core.model.command.StationCommand;
 import com.zy.core.model.protocol.StationProtocol;
-import com.zy.core.model.protocol.StationTaskBufferItem;
 import com.zy.core.move.StationMoveCoordinator;
 import com.zy.core.thread.StationThread;
 import com.zy.core.utils.station.model.DispatchLimitConfig;
@@ -43,6 +40,8 @@
 
 @Component
 public class StationRegularDispatchProcessor {
+
+    private static final long STATION_IN_SLOW_LOG_THRESHOLD_MS = 500L;
 
     @Autowired
     private BasDevpService basDevpService;
@@ -64,20 +63,8 @@
     private StationCommandDispatcher stationCommandDispatcher;
     @Autowired
     private StationDispatchLoadSupport stationDispatchLoadSupport;
-
-    public void stationInExecute() {
-        try {
-            List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                List<StationObjModel> stationList = basDevp.getBarcodeStationList$();
-                for (StationObjModel entity : stationList) {
-                    stationInExecute(basDevp, entity);
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
+    @Autowired
+    private BasCrnpService basCrnpService;
 
     public void stationOutExecuteFinish(StationObjModel stationObjModel) {
         try {
@@ -106,17 +93,6 @@
             }
 
             completeOutboundStationRun(stationObjModel, stationThread, wrkMast, matchedByRecentArrival);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void checkTaskToComplete() {
-        try {
-            List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.STATION_RUN_COMPLETE.sts));
-            for (WrkMast wrkMast : wrkMasts) {
-                checkTaskToComplete(wrkMast);
-            }
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -290,67 +266,130 @@
         ) {
             return;
         }
-
-        WrkMast wrkMast = wrkMastService.getOne(new QueryWrapper<WrkMast>().eq("barcode", stationProtocol.getBarcode()));
-        if (wrkMast == null || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.NEW_INBOUND.sts)) {
-            return;
-        }
-
-        String locNo = wrkMast.getLocNo();
-        FindCrnNoResult findCrnNoResult = commonService.findCrnNoByLocNo(locNo);
-        if (findCrnNoResult == null) {
-            News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鏈尮閰嶅埌鍫嗗灈鏈�", wrkMast.getWrkNo());
-            return;
-        }
-
-        Integer targetStationId = commonService.findInStationId(findCrnNoResult, stationId);
-        if (targetStationId == null) {
-            News.taskInfo(wrkMast.getWrkNo(), "{}绔欑偣,鎼滅储鍏ュ簱绔欑偣澶辫触", stationId);
-            return;
-        }
-
-        DispatchLimitConfig limitConfig = stationDispatchLoadSupport.getDispatchLimitConfig(stationProtocol.getStationId(), targetStationId);
-        int currentStationTaskCount = stationDispatchLoadSupport.countCurrentStationTask();
-        LoadGuardState loadGuardState = stationDispatchLoadSupport.buildLoadGuardState(limitConfig);
-        LoopHitResult loopHitResult = stationDispatchLoadSupport.findPathLoopHit(
-                limitConfig,
-                stationProtocol.getStationId(),
-                targetStationId,
-                loadGuardState
-        );
-        if (stationDispatchLoadSupport.isDispatchBlocked(limitConfig, currentStationTaskCount, loadGuardState, loopHitResult.isThroughLoop())) {
-            return;
-        }
-
-        StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(), stationId, targetStationId, 0);
-        if (command == null) {
-            News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", wrkMast.getWrkNo());
-            return;
-        }
-
-        Date now = new Date();
-        wrkMast.setWrkSts(WrkStsType.INBOUND_STATION_RUN.sts);
-        wrkMast.setSourceStaNo(stationProtocol.getStationId());
-        wrkMast.setStaNo(targetStationId);
-        wrkMast.setSystemMsg("");
-        wrkMast.setIoTime(now);
-        wrkMast.setModiTime(now);
-        if (wrkMastService.updateById(wrkMast)) {
-            wrkAnalysisService.markInboundStationStart(wrkMast, now);
-            boolean offered = offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "stationInExecute");
-            if (offered && stationMoveCoordinator != null) {
-                stationMoveCoordinator.recordDispatch(
-                        wrkMast.getWrkNo(),
-                        stationProtocol.getStationId(),
-                        "stationInExecute",
-                        command,
-                        false
-                );
+        long totalStartNs = System.nanoTime();
+        Map<String, Long> stepCostMap = new java.util.LinkedHashMap<>();
+        WrkMast wrkMast = null;
+        Integer targetStationId = null;
+        String targetSource = "unknown";
+        String locNo = null;
+        try {
+            long stepStartNs = System.nanoTime();
+            wrkMast = wrkMastService.getOne(new QueryWrapper<WrkMast>().eq("barcode", stationProtocol.getBarcode()));
+            stepCostMap.put("loadWrkByBarcode", elapsedMillis(stepStartNs));
+            if (wrkMast == null || !Objects.equals(wrkMast.getWrkSts(), WrkStsType.NEW_INBOUND.sts)) {
+                return;
             }
-            News.info("杈撻�佺珯鐐瑰叆搴撳懡浠や笅鍙戞垚鍔燂紝绔欑偣鍙�={}锛屽伐浣滃彿={}锛屽懡浠ゆ暟鎹�={}", stationId, wrkMast.getWrkNo(), JSON.toJSONString(command));
-            redisUtil.set(RedisKeyType.STATION_IN_EXECUTE_LIMIT.key + stationId, "lock", 5);
-            loadGuardState.reserveLoopTask(loopHitResult.getLoopNo());
-            stationDispatchLoadSupport.saveLoopLoadReserve(wrkMast.getWrkNo(), loopHitResult);
+
+            Integer crnNo = wrkMast.getCrnNo();
+            BasCrnp basCrnp = basCrnpService.getOne(new QueryWrapper<BasCrnp>().eq("crn_no", crnNo));
+            if (basCrnp == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鏈壘鍒板爢鍨涙満鏁版嵁", wrkMast.getWrkNo());
+                return;
+            }
+
+            int maxInTask = 3;
+            if (basCrnp.getMaxInTask() != null) {
+                maxInTask = basCrnp.getMaxInTask();
+            }
+
+            stepStartNs = System.nanoTime();
+            long count = wrkMastService.count(new QueryWrapper<WrkMast>().eq("crn_no", crnNo).eq("wrk_sts", WrkStsType.INBOUND_STATION_RUN.sts));
+            stepCostMap.put("countCrnInboundRunTask", elapsedMillis(stepStartNs));
+            if(count >=  maxInTask) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鍫嗗灈鏈哄埌杈句换鍔′笂闄愶紝绋嶅悗鎵ц", wrkMast.getWrkNo());
+                stationProtocol.setSystemWarning(wrkMast.getWrkNo() + "宸ヤ綔," + crnNo + "鍙峰爢鍨涙満鍒拌揪浠诲姟涓婇檺锛岀◢鍚庢墽琛�");
+                return;
+            }
+
+            locNo = wrkMast.getLocNo();
+            stepStartNs = System.nanoTime();
+            FindCrnNoResult findCrnNoResult = commonService.findCrnNoByLocNo(locNo);
+            stepCostMap.put("resolveCrnByLocNo", elapsedMillis(stepStartNs));
+            if (findCrnNoResult == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鏈尮閰嶅埌鍫嗗灈鏈�", wrkMast.getWrkNo());
+                return;
+            }
+
+            stepStartNs = System.nanoTime();
+            CommonService.InStationResolveResult resolveResult = commonService.resolveInStationId(findCrnNoResult, stationId);
+            stepCostMap.put("resolveInboundTargetStation", elapsedMillis(stepStartNs));
+            targetStationId = resolveResult == null ? null : resolveResult.getTargetStationId();
+            targetSource = resolveResult == null ? "unknown" : (resolveResult.isCacheHit() ? "cache" : "search");
+            if (targetStationId == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}绔欑偣,鎼滅储鍏ュ簱绔欑偣澶辫触", stationId);
+                return;
+            }
+
+            stepStartNs = System.nanoTime();
+            DispatchLimitConfig limitConfig = stationDispatchLoadSupport.getDispatchLimitConfig(stationProtocol.getStationId(), targetStationId);
+            int currentStationTaskCount = stationDispatchLoadSupport.countCurrentStationTask();
+            LoadGuardState loadGuardState = stationDispatchLoadSupport.buildLoadGuardState(limitConfig);
+            stepCostMap.put("buildLoopGuardState", elapsedMillis(stepStartNs));
+
+            stepStartNs = System.nanoTime();
+            StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(), stationId, targetStationId, 0);
+            stepCostMap.put("buildMoveCommand", elapsedMillis(stepStartNs));
+            if (command == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", wrkMast.getWrkNo());
+                return;
+            }
+
+            stepStartNs = System.nanoTime();
+            LoopHitResult loopHitResult = stationDispatchLoadSupport.findPathLoopHitByNavigatePath(command.getNavigatePath(), loadGuardState);
+            stepCostMap.put("evaluateLoopPath", elapsedMillis(stepStartNs));
+            if (stationDispatchLoadSupport.isDispatchBlocked(limitConfig, currentStationTaskCount, loadGuardState, loopHitResult.isThroughLoop())) {
+                return;
+            }
+
+            stepStartNs = System.nanoTime();
+            Date now = new Date();
+            wrkMast.setWrkSts(WrkStsType.INBOUND_STATION_RUN.sts);
+            wrkMast.setSourceStaNo(stationProtocol.getStationId());
+            wrkMast.setStaNo(targetStationId);
+            wrkMast.setSystemMsg("");
+            wrkMast.setIoTime(now);
+            wrkMast.setModiTime(now);
+            if (wrkMastService.updateById(wrkMast)) {
+                wrkAnalysisService.markInboundStationStart(wrkMast, now);
+                // 鍏堣褰� session 鍐嶅叆闃熷懡浠わ紝閬垮厤娑堣垂绾跨▼鍦� session 鍐欏叆 Redis 鍓嶅彇鍒板懡浠ゅ鑷磋矾鐢辨牎楠屽け璐ャ��
+                if (stationMoveCoordinator != null) {
+                    stationMoveCoordinator.recordDispatch(
+                            wrkMast.getWrkNo(),
+                            stationProtocol.getStationId(),
+                            "stationInExecute",
+                            command,
+                            false
+                    );
+                }
+                boolean offered = offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "stationInExecute");
+                if (offered) {
+                    News.info("杈撻�佺珯鐐瑰叆搴撳懡浠や笅鍙戞垚鍔燂紝绔欑偣鍙�={}锛屽伐浣滃彿={}锛屽懡浠ゆ暟鎹�={}", stationId, wrkMast.getWrkNo(), JSON.toJSONString(command));
+                } else {
+                    News.warn("杈撻�佺珯鐐瑰叆搴撳懡浠ゅ叆闃熻鎷掔粷(鍙兘閲嶅)锛岀珯鐐瑰彿={}锛屽伐浣滃彿={}", stationId, wrkMast.getWrkNo());
+                }
+                redisUtil.set(RedisKeyType.STATION_IN_EXECUTE_LIMIT.key + stationId, "lock", 5);
+                loadGuardState.reserveLoopTask(loopHitResult.getLoopNo());
+                stationDispatchLoadSupport.saveLoopLoadReserve(wrkMast.getWrkNo(), loopHitResult);
+            }
+            stepCostMap.put("updateWrkAndDispatch", elapsedMillis(stepStartNs));
+        } finally {
+            long totalCostMs = elapsedMillis(totalStartNs);
+            if (totalCostMs >= STATION_IN_SLOW_LOG_THRESHOLD_MS) {
+                News.warn("stationInExecute鑰楁椂杈冮暱锛宻tationId={}锛宐arcode={}锛寃rkNo={}锛宭ocNo={}锛宼argetStaNo={}锛宼argetSource={}锛宻tepCosts={}锛宼otalCost={}ms",
+                        stationId,
+                        stationProtocol.getBarcode(),
+                        wrkMast == null ? null : wrkMast.getWrkNo(),
+                        locNo,
+                        targetStationId,
+                        targetSource,
+                        JSON.toJSONString(stepCostMap),
+                        totalCostMs);
+            }
         }
     }
+
+    private long elapsedMillis(long startNs) {
+        long elapsedNs = System.nanoTime() - startNs;
+        return elapsedNs <= 0L ? 0L : elapsedNs / 1_000_000L;
+    }
 }

--
Gitblit v1.9.1