From 18c48be67ec6b0b02e954203d0b2bd3f41b1fd0b Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期四, 09 四月 2026 19:53:05 +0800
Subject: [PATCH] 1.wcs重新分配库位需要均分到其他堆垛机

---
 src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 src/main/java/com/zy/common/web/WcsController.java           |    2 +-
 2 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
index 6f6c65f..dacbf9f 100644
--- a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
+++ b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -23,12 +23,15 @@
 import com.zy.common.model.StartupDto;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.HttpHandler;
+import com.zy.common.utils.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -48,6 +51,8 @@
 
     /** 涓夋柟鎺ュ彛缁熻锛氭湰绯荤粺璋冪敤 WCS 鐨� namespace 绾﹀畾 */
     private static final String NS_WMS_TO_WCS = "鏈郴缁熻姹俉CS";
+    private static final String REASSIGN_CRN_LOCK_KEY_PREFIX = "wcs:reassign:inbound:crn:";
+    private static final long REASSIGN_CRN_LOCK_SECONDS = 180L;
 
     @Autowired
     private LocMastService locMastService;
@@ -96,6 +101,8 @@
     private ApiLogService apiLogService;
     @Autowired
     private RowLastnoService rowLastnoService;
+    @Autowired
+    private RedisUtil redisUtil;
 
 
     /**
@@ -663,6 +670,7 @@
         updateReassignTargetLoc(targetLoc, wrkMast, currentLoc, now);
         updateReassignWorkMast(wrkMast, startupDto, now);
         releaseOldReservedLocIfNeeded(currentLoc, targetLoc.getLocNo(), now);
+        lockReassignedCrnAfterCommit(preferredArea, targetLoc.getCrnNo(), wrkMast.getWrkNo());
 
         Map<String, Object> result = new LinkedHashMap<>();
         result.put("locNo", Utils.WMSLocToWCSLoc(targetLoc.getLocNo()));
@@ -779,12 +787,21 @@
         }
         List<Integer> candidateCrnNos = new ArrayList<>();
         for (int crnNo = currentCrnNo - 1; crnNo >= startCrnNo; crnNo--) {
-            candidateCrnNos.add(crnNo);
+            addUnlockedReassignCandidate(candidateCrnNos, area, crnNo);
         }
         for (int crnNo = endCrnNo; crnNo > currentCrnNo; crnNo--) {
-            candidateCrnNos.add(crnNo);
+            addUnlockedReassignCandidate(candidateCrnNos, area, crnNo);
         }
         return candidateCrnNos;
+    }
+
+    private void addUnlockedReassignCandidate(List<Integer> candidateCrnNos, Integer area, int crnNo) {
+        if (isReassignCrnLocked(area, crnNo)) {
+            log.info("skip locked reassign crane. area={}, crnNo={}, ttl={}s",
+                    area, crnNo, redisUtil.getExpire(buildReassignCrnLockKey(area, crnNo)));
+            return;
+        }
+        candidateCrnNos.add(crnNo);
     }
 
     private int resolveAreaStartCrnNo(RowLastno areaRowLastno) {
@@ -871,6 +888,43 @@
         }
     }
 
+    private boolean isReassignCrnLocked(Integer area, Integer crnNo) {
+        if (area == null || crnNo == null) {
+            return false;
+        }
+        return redisUtil.hasKey(buildReassignCrnLockKey(area, crnNo));
+    }
+
+    private String buildReassignCrnLockKey(Integer area, Integer crnNo) {
+        return REASSIGN_CRN_LOCK_KEY_PREFIX + area + ":" + crnNo;
+    }
+
+    private void lockReassignedCrnAfterCommit(Integer area, Integer crnNo, Integer wrkNo) {
+        if (area == null || crnNo == null) {
+            return;
+        }
+        Runnable action = () -> {
+            String key = buildReassignCrnLockKey(area, crnNo);
+            boolean locked = redisUtil.set(key, String.valueOf(wrkNo), REASSIGN_CRN_LOCK_SECONDS);
+            if (!locked) {
+                log.warn("failed to lock reassigned crane in redis. area={}, crnNo={}, wrkNo={}", area, crnNo, wrkNo);
+                return;
+            }
+            log.info("locked reassigned crane in redis. area={}, crnNo={}, wrkNo={}, ttl={}s",
+                    area, crnNo, wrkNo, REASSIGN_CRN_LOCK_SECONDS);
+        };
+        if (TransactionSynchronizationManager.isActualTransactionActive()) {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
+                @Override
+                public void afterCommit() {
+                    action.run();
+                }
+            });
+            return;
+        }
+        action.run();
+    }
+
     /**
      * 鎸変换鍔$被鍨嬮�夋嫨 WCS 鎺ュ彛鍦板潃銆�
      * in -> 鍏ュ簱鎺ュ彛
diff --git a/src/main/java/com/zy/common/web/WcsController.java b/src/main/java/com/zy/common/web/WcsController.java
index 4f54aed..c7aef46 100644
--- a/src/main/java/com/zy/common/web/WcsController.java
+++ b/src/main/java/com/zy/common/web/WcsController.java
@@ -100,7 +100,7 @@
 //        }
             waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
             if (Cools.isEmpty(waitPakins)) {
-                return R.error("璇峰厛娣诲姞鍏ュ簱閫氱煡妗�");
+                return R.error("璇峰厛鏀惰揣鍚庡啀鍏ュ簱");
 //            WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
 //            if (wrkMast != null && wrkMast.getIoType() == 103) {
 //                return R.parse(CodeRes.PICK_600);

--
Gitblit v1.9.1