From decd02709b7ef82502b6f574823720b41df4132b Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 24 三月 2026 16:49:42 +0800
Subject: [PATCH] refactor: add station reroute shared types

---
 src/main/java/com/zy/core/utils/StationOperateProcessUtils.java |   65 ++++++++++++++++++++++++++++++++
 1 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
index 94b122b..706c497 100644
--- a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
@@ -1434,6 +1434,9 @@
         }
 
         StationTaskIdleTrack idleTrack = touchStationTaskIdleTrack(stationProtocol.getTaskNo(), stationProtocol.getStationId());
+        if (shouldSkipIdleRecoverForRecentDispatch(stationProtocol.getTaskNo(), stationProtocol.getStationId())) {
+            return;
+        }
         if (idleTrack == null || !idleTrack.isTimeout(STATION_IDLE_RECOVER_SECONDS)) {
             return;
         }
@@ -1519,6 +1522,29 @@
         }
         return Objects.equals(wrkMast.getWrkSts(), WrkStsType.INBOUND_STATION_RUN.sts)
                 || Objects.equals(wrkMast.getWrkSts(), WrkStsType.STATION_RUN.sts);
+    }
+
+    private boolean shouldSkipIdleRecoverForRecentDispatch(Integer taskNo, Integer stationId) {
+        if (stationMoveCoordinator == null || taskNo == null || taskNo <= 0 || stationId == null) {
+            return false;
+        }
+        StationMoveSession session = stationMoveCoordinator.loadSession(taskNo);
+        if (session == null || !session.isActive() || session.getLastIssuedAt() == null) {
+            return false;
+        }
+        if (!Objects.equals(stationId, session.getCurrentStationId())
+                && !Objects.equals(stationId, session.getDispatchStationId())) {
+            return false;
+        }
+        long elapsedMs = System.currentTimeMillis() - session.getLastIssuedAt();
+        long thresholdMs = STATION_IDLE_RECOVER_SECONDS * 1000L;
+        if (elapsedMs >= thresholdMs) {
+            return false;
+        }
+        saveStationTaskIdleTrack(new StationTaskIdleTrack(taskNo, stationId, System.currentTimeMillis()));
+        News.info("杈撻�佺珯鐐逛换鍔″垰瀹屾垚鍛戒护涓嬪彂锛屽凡璺宠繃鍋滅暀閲嶇畻銆傜珯鐐瑰彿={}锛屽伐浣滃彿={}锛岃窛涓婃涓嬪彂={}ms锛宺outeVersion={}",
+                stationId, taskNo, elapsedMs, session.getRouteVersion());
+        return true;
     }
 
     private void resetSegmentMoveCommandsBeforeReroute(Integer taskNo) {
@@ -1914,6 +1940,45 @@
         return pathLenFactor;
     }
 
+    enum RerouteSceneType {
+        RUN_BLOCK_REROUTE,
+        IDLE_RECOVER,
+        OUT_ORDER,
+        WATCH_CIRCLE
+    }
+
+    static final class RerouteDecision {
+        private final boolean skip;
+        private final String skipReason;
+        private final Integer targetStationId;
+
+        private RerouteDecision(boolean skip, String skipReason, Integer targetStationId) {
+            this.skip = skip;
+            this.skipReason = skipReason;
+            this.targetStationId = targetStationId;
+        }
+
+        static RerouteDecision skip(String reason) {
+            return new RerouteDecision(true, reason, null);
+        }
+
+        static RerouteDecision proceed(Integer targetStationId) {
+            return new RerouteDecision(false, null, targetStationId);
+        }
+
+        boolean skip() {
+            return skip;
+        }
+
+        String skipReason() {
+            return skipReason;
+        }
+
+        Integer targetStationId() {
+            return targetStationId;
+        }
+    }
+
     private static class OutOrderDispatchDecision {
         private final Integer targetStationId;
         private final boolean circle;

--
Gitblit v1.9.1