From 7e391c99b4d13f915b06fd9838c563e17181636b Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 20 三月 2026 19:08:08 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java | 212 +++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 174 insertions(+), 38 deletions(-)
diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index 52ff58a..4c25c66 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -2,7 +2,9 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.NotifyMsgType;
import com.zy.asrs.domain.param.CreateLocMoveTaskParam;
@@ -53,6 +55,8 @@
private CommonService commonService;
@Autowired
private NotifyUtils notifyUtils;
+ @Autowired
+ private StationOperateProcessUtils stationOperateProcessUtils;
public synchronized void crnIoExecute() {
Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
@@ -68,7 +72,7 @@
//鍏ュ嚭搴� ===>> 鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
public synchronized void crnIoExecuteNormal() {
- List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
+ List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
for (BasCrnp basCrnp : basCrnps) {
CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
if(crnThread == null){
@@ -80,9 +84,10 @@
continue;
}
- List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+ List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>()
.eq("crn_no", basCrnp.getCrnNo())
- .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts)
+ .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts, WrkStsType.LOC_MOVE_RUN.sts)
+ .orderBy(true, false, "batch_seq")
);
if(!wrkMasts.isEmpty()){
continue;
@@ -96,48 +101,68 @@
&& crnProtocol.getForkPos() == 0
&& crnProtocol.getAlarm() == 0
) {
+ Object clearLock = redisUtil.get(RedisKeyType.CLEAR_CRN_TASK_LIMIT.key + basCrnp.getCrnNo());
+ if (clearLock != null) {
+ continue;
+ }
+
// 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
if (crnProtocol.getLastIo().equals("I")) {
if (basCrnp.getInEnable().equals("Y")) {
- this.crnExecuteIn(basCrnp, crnThread); // 鍏ュ簱
+ boolean result = this.crnExecuteIn(basCrnp, crnThread);// 鍏ュ簱
crnProtocol.setLastIo("O");
+ if (result) {
+ break;
+ }
} else if (basCrnp.getOutEnable().equals("Y")) {
- this.crnExecuteOut(basCrnp, crnThread); // 鍑哄簱
+ boolean result = this.crnExecuteOut(basCrnp, crnThread);// 鍑哄簱
crnProtocol.setLastIo("I");
+ if (result) {
+ break;
+ }
}
}
// 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
else if (crnProtocol.getLastIo().equals("O")) {
if (basCrnp.getOutEnable().equals("Y")) {
- this.crnExecuteOut(basCrnp, crnThread); // 鍑哄簱
+ boolean result = this.crnExecuteOut(basCrnp, crnThread);// 鍑哄簱
crnProtocol.setLastIo("I");
+ if (result) {
+ break;
+ }
} else if (basCrnp.getInEnable().equals("Y")) {
- this.crnExecuteIn(basCrnp, crnThread); // 鍏ュ簱
+ boolean result = this.crnExecuteIn(basCrnp, crnThread);// 鍏ュ簱
crnProtocol.setLastIo("O");
+ if (result) {
+ break;
+ }
}
}
//搴撲綅绉昏浆
- this.crnExecuteLocTransfer(basCrnp, crnThread);
+ boolean transfer = this.crnExecuteLocTransfer(basCrnp, crnThread);
+ if (transfer) {
+ break;
+ }
}
}
}
- private synchronized void crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) {
+ private synchronized boolean crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) {
CrnProtocol crnProtocol = crnThread.getStatus();
if(crnProtocol == null){
- return;
+ return false;
}
if(!basCrnp.getInEnable().equals("Y")){
News.info("鍫嗗灈鏈�:{} 鍙叆淇″彿涓嶆弧瓒�", basCrnp.getCrnNo());
- return;
+ return false;
}
List<StationObjModel> inStationList = basCrnp.getInStationList$();
if(inStationList.isEmpty()){
News.info("鍫嗗灈鏈�:{} 鍏ュ簱绔欑偣鏈缃�", basCrnp.getCrnNo());
- return;
+ return false;
}
Integer crnNo = basCrnp.getCrnNo();
@@ -178,12 +203,16 @@
continue;
}
+ if (!wrkMast.getCrnNo().equals(basCrnp.getCrnNo())) {
+ continue;
+ }
+
if(wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts){
continue;
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
continue;
@@ -213,35 +242,56 @@
MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_RUN, null);
News.info("鍫嗗灈鏈哄懡浠や笅鍙戞垚鍔燂紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(command));
+ return true;
}
}
+ return false;
}
- private synchronized void crnExecuteOut(BasCrnp basCrnp, CrnThread crnThread) {
+ private synchronized boolean crnExecuteOut(BasCrnp basCrnp, CrnThread crnThread) {
CrnProtocol crnProtocol = crnThread.getStatus();
if(crnProtocol == null){
- return;
+ return false;
}
if(!basCrnp.getOutEnable().equals("Y")){
News.info("鍫嗗灈鏈�:{} 鍙嚭淇″彿涓嶆弧瓒�", basCrnp.getCrnNo());
- return;
+ return false;
}
List<StationObjModel> outStationList = basCrnp.getOutStationList$();
if(outStationList.isEmpty()){
News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
- return;
+ return false;
+ }
+
+ int stationMaxTaskCount = 30;
+ Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
+ if (systemConfigMapObj != null) {
+ try {
+ HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+ stationMaxTaskCount = Integer.parseInt(systemConfigMap.getOrDefault("stationMaxTaskCountLimit", "30"));
+ } catch (Exception ignore) {}
+ }
+
+ int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
+ if (stationMaxTaskCount > 0 && currentStationTaskCount >= stationMaxTaskCount) {
+ News.warn("杈撻�佺珯鐐逛换鍔℃暟閲忚揪鍒颁笂闄愶紝宸插仠姝换鍔′笅鍙戙�傚綋鍓嶄换鍔℃暟={}锛屼笂闄�={}", currentStationTaskCount, stationMaxTaskCount);
+ return false;
}
Integer crnNo = basCrnp.getCrnNo();
- List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+ List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>()
.eq("crn_no", crnNo)
.eq("wrk_sts", WrkStsType.NEW_OUTBOUND.sts)
+ .orderBy(true, true, "batch_seq")
);
for (WrkMast wrkMast : wrkMasts) {
+ if (!allowBatchOutboundExecute(wrkMast)) {
+ continue;
+ }
for (StationObjModel stationObjModel : outStationList) {
StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
if (stationThread == null) {
@@ -272,7 +322,7 @@
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getSourceLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
continue;
@@ -302,10 +352,11 @@
MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_RUN, null);
News.info("鍫嗗灈鏈哄懡浠や笅鍙戞垚鍔燂紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(command));
- return;
+ return true;
}
}
}
+ return false;
}
private synchronized boolean crnExecuteInPlanner(BasCrnp basCrnp, CrnThread crnThread, WrkMast wrkMast) {
@@ -365,7 +416,7 @@
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
continue;
@@ -420,6 +471,10 @@
Integer crnNo = basCrnp.getCrnNo();
+ if (!allowBatchOutboundExecute(wrkMast)) {
+ return false;
+ }
+
for (StationObjModel stationObjModel : outStationList) {
StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
if (stationThread == null) {
@@ -450,7 +505,7 @@
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getSourceLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
continue;
@@ -486,22 +541,88 @@
return false;
}
- private synchronized void crnExecuteLocTransfer(BasCrnp basCrnp, CrnThread crnThread) {
+ private boolean allowBatchOutboundExecute(WrkMast wrkMast) {
+ if (wrkMast == null || Cools.isEmpty(wrkMast.getBatch())) {
+ return true;
+ }
+
+ if (Cools.isEmpty(wrkMast.getBatchSeq())) {
+ News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 缂哄皯鎵规搴忓彿锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱", wrkMast.getBatch());
+ return false;
+ }
+
+ WrkMast firstBatchWrkMast = wrkMastService.getOne(new QueryWrapper<WrkMast>()
+ .eq("io_type", WrkIoType.OUT.id)
+ .eq("batch", wrkMast.getBatch())
+ .orderByAsc("batch_seq")
+ .orderByAsc("wrk_no")
+ .last("limit 1"));
+ if (firstBatchWrkMast == null) {
+ return true;
+ }
+
+ if (Cools.isEmpty(firstBatchWrkMast.getBatchSeq())) {
+ News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 瀛樺湪鏈厤缃壒娆″簭鍙风殑浠诲姟锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱", wrkMast.getBatch());
+ return false;
+ }
+
+ boolean currentIsFirstBatchTask = wrkMast.getWrkNo().equals(firstBatchWrkMast.getWrkNo());
+ boolean firstBatchTaskExecuted = firstBatchWrkMast.getWrkSts() != null
+ && !firstBatchWrkMast.getWrkSts().equals(WrkStsType.NEW_OUTBOUND.sts);
+ if (!currentIsFirstBatchTask && !firstBatchTaskExecuted) {
+ News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 棣栦釜搴忓彿浠诲姟:{} 灏氭湭鎵ц锛屽綋鍓嶄换鍔℃殏涓嶅厑璁稿嚭搴�", wrkMast.getBatch(), firstBatchWrkMast.getWrkNo());
+ return false;
+ }
+
+ int batchRunningLimit = getSystemConfigInt("crnOutBatchRunningLimit", 5);
+ if (batchRunningLimit <= 0) {
+ return true;
+ }
+
+ long batchRunningCount = wrkMastService.count(new QueryWrapper<WrkMast>()
+ .eq("io_type", WrkIoType.OUT.id)
+ .eq("batch", wrkMast.getBatch())
+ .notIn("wrk_sts",
+ WrkStsType.NEW_OUTBOUND.sts,
+ WrkStsType.COMPLETE_OUTBOUND.sts,
+ WrkStsType.SETTLE_OUTBOUND.sts));
+ if (batchRunningCount >= batchRunningLimit) {
+ News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 鎵ц涓换鍔℃暟杈惧埌涓婇檺锛屽綋鍓�={}锛屼笂闄�={}", wrkMast.getBatch(), batchRunningCount, batchRunningLimit);
+ return false;
+ }
+
+ return true;
+ }
+
+ private int getSystemConfigInt(String code, int defaultValue) {
+ Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
+ if (systemConfigMapObj == null) {
+ return defaultValue;
+ }
+ try {
+ HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+ return Integer.parseInt(systemConfigMap.getOrDefault(code, String.valueOf(defaultValue)));
+ } catch (Exception ignore) {
+ return defaultValue;
+ }
+ }
+
+ private synchronized boolean crnExecuteLocTransfer(BasCrnp basCrnp, CrnThread crnThread) {
CrnProtocol crnProtocol = crnThread.getStatus();
if(crnProtocol == null){
- return;
+ return false;
}
Integer crnNo = basCrnp.getCrnNo();
- List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+ List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>()
.eq("crn_no", crnNo)
.eq("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts)
);
for (WrkMast wrkMast : wrkMasts) {
// 鑾峰彇婧愬簱浣嶄俊鎭�
- LocMast sourceLocMast = locMastService.selectById(wrkMast.getSourceLocNo());
+ LocMast sourceLocMast = locMastService.getById(wrkMast.getSourceLocNo());
if (sourceLocMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
continue;
@@ -513,7 +634,7 @@
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
continue;
@@ -534,14 +655,15 @@
MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_RUN, null);
News.info("鍫嗗灈鏈哄懡浠や笅鍙戞垚鍔燂紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(command));
- return;
+ return true;
}
}
+ return false;
}
//鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
public synchronized void crnIoExecuteFinish() {
- List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
+ List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
for (BasCrnp basCrnp : basCrnps) {
CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
if(crnThread == null){
@@ -576,6 +698,21 @@
}else if(wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts){
updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_COMPLETE, null);
+
+ List<StationObjModel> outStationList = basCrnp.getOutStationList$();
+ if(outStationList.isEmpty()){
+ News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
+ return;
+ }
+
+ StationObjModel outStationObjModel = null;
+ for (StationObjModel stationObjModel : outStationList) {
+ if (stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
+ outStationObjModel = stationObjModel;
+ break;
+ }
+ }
+ redisUtil.set(RedisKeyType.CRN_OUT_TASK_COMPLETE_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(outStationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
}else if(wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts){
updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_COMPLETE, null);
@@ -588,7 +725,7 @@
wrkMast.setSystemMsg("");
wrkMast.setIoTime(new Date());
if (wrkMastService.updateById(wrkMast)) {
- CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getCrnNo());
+ CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
}
@@ -600,7 +737,7 @@
public synchronized void plannerExecute() {
int nowSec = (int) (System.currentTimeMillis() / 1000);
- List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
+ List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
for (BasCrnp basCrnp : basCrnps) {
String key = RedisKeyType.PLANNER_SCHEDULE.key + "CRN-" + basCrnp.getCrnNo();
List<Object> items = redisUtil.lGet(key, 0, -1);
@@ -616,7 +753,7 @@
if (crnProtocol == null) {
continue;
}
- List<WrkMast> running = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+ List<WrkMast> running = wrkMastService.list(new QueryWrapper<WrkMast>()
.eq("crn_no", basCrnp.getCrnNo())
.in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts, WrkStsType.LOC_MOVE_RUN.sts)
);
@@ -708,7 +845,7 @@
}
// 鑾峰彇婧愬簱浣嶄俊鎭�
- LocMast sourceLocMast = locMastService.selectById(wrkMast.getSourceLocNo());
+ LocMast sourceLocMast = locMastService.getById(wrkMast.getSourceLocNo());
if (sourceLocMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
return false;
@@ -720,7 +857,7 @@
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
return false;
@@ -763,18 +900,17 @@
if (lock != null) {
return false;
}
- redisUtil.set(RedisKeyType.CHECK_SHALLOW_LOC_STATUS_LIMIT.key + taskNo, "lock", 5);
Integer shallowRow = Utils.getShallowRowByDeepRow(Utils.getRow(locNo));
if (shallowRow == null) {
return true;
}
+ redisUtil.set(RedisKeyType.CHECK_SHALLOW_LOC_STATUS_LIMIT.key + taskNo, "lock", 5);
String shallowLocNo = Utils.getLocNo(shallowRow, Utils.getBay(locNo), Utils.getLev(locNo));
LocMast shallowLocMast = locMastService.queryByLoc(shallowLocNo);
if (shallowLocMast == null) {
- News.taskInfo(taskNo, "娴呭簱浣�:{} 鏁版嵁涓嶅瓨鍦�", shallowLocNo);
- return false;
+ return true;
}
if (shallowLocMast.getLocSts().equals("O")) {
--
Gitblit v1.9.1