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