From 3ab88d048c8842a957e1a4966386bf8306dad484 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期四, 09 四月 2026 20:45:11 +0800
Subject: [PATCH] 1.wms获取wcs设备堆垛机列和层

---
 src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 58 insertions(+), 2 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..c35e848 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) {
@@ -869,6 +886,43 @@
         if (!locMastService.updateById(currentLoc)) {
             throw new CoolException("閲婃斁鍘熺洰鏍囧簱浣嶅け璐�");
         }
+    }
+
+    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();
     }
 
     /**
@@ -1141,6 +1195,8 @@
             // crn_sts 鏈湴琛ㄥ瓨鐨勬槸鈥滃爢鍨涙満妯″紡(鎵嬪姩/鑷姩/鐢佃剳)鈥濓紝鍥犳蹇呴』鍐� mode锛屼笉鑳藉啓 status銆�
             basCrnp.setCrnSts(defaultZero(crnProtocol.getMode()));
             basCrnp.setWrkNo(defaultZero(crnProtocol.getTaskNo()));
+            basCrnp.setBay(crnProtocol.getBay());
+            basCrnp.setLevel(crnProtocol.getLevel());
             basCrnp.setCrnErr(crnProtocol.getAlarm() == null ? 0L : Long.valueOf(crnProtocol.getAlarm()));
             basCrnp.setModiUser(WCS_SYNC_USER);
             basCrnp.setModiTime(now);

--
Gitblit v1.9.1