From f3b64d003bc3458af3dd434e6187d3aba23a64aa Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 26 三月 2026 14:35:44 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/move/StationMoveCoordinator.java |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/core/move/StationMoveCoordinator.java b/src/main/java/com/zy/core/move/StationMoveCoordinator.java
index 84eb0c6..2e6c0c3 100644
--- a/src/main/java/com/zy/core/move/StationMoveCoordinator.java
+++ b/src/main/java/com/zy/core/move/StationMoveCoordinator.java
@@ -12,15 +12,19 @@
 import java.security.MessageDigest;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.function.Supplier;
 
 @Component
 public class StationMoveCoordinator {
 
     private static final int SESSION_EXPIRE_SECONDS = 60 * 60 * 24;
+    private final Map<Integer, ReentrantLock> taskDispatchLocks = new ConcurrentHashMap<>();
 
     @Autowired
     private StationMoveSessionRegistry sessionRegistry;
@@ -36,6 +40,10 @@
 
     public boolean isActiveRoute(Integer taskNo, Integer routeVersion) {
         return sessionRegistry != null && sessionRegistry.isActiveRoute(taskNo, routeVersion);
+    }
+
+    public boolean canDispatchRoute(Integer taskNo, Integer routeVersion) {
+        return sessionRegistry != null && sessionRegistry.canDispatchRoute(taskNo, routeVersion);
     }
 
     public void markSegmentIssued(Integer taskNo, Integer routeVersion) {
@@ -76,6 +84,23 @@
         saveSession(session);
     }
 
+    public <T> T withTaskDispatchLock(Integer taskNo, Supplier<T> supplier) {
+        if (supplier == null) {
+            return null;
+        }
+        if (taskNo == null || taskNo <= 0) {
+            return supplier.get();
+        }
+        // 鍚屼竴浠诲姟鐨勫垏璺拰鍒嗘鍙戦�佸繀椤诲叡浜竴鎶婇攣锛岄伩鍏嶆棫 routeVersion 鍦ㄧ嚎绋嬫櫄鍒版椂缁х画鎶婁笂涓�鏉℃鍛戒护鍐欏嚭鍘汇��
+        ReentrantLock lock = taskDispatchLocks.computeIfAbsent(taskNo, key -> new ReentrantLock());
+        lock.lock();
+        try {
+            return supplier.get();
+        } finally {
+            lock.unlock();
+        }
+    }
+
     public boolean shouldSuppressDispatch(Integer taskNo, Integer currentStationId, StationCommand candidateCommand) {
         if (taskNo == null || taskNo <= 0 || currentStationId == null || candidateCommand == null) {
             return false;

--
Gitblit v1.9.1