From 3adcbff31fdece77269744c8741f237e7a57348e Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期日, 22 三月 2026 17:17:58 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java | 447 +++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 376 insertions(+), 71 deletions(-)
diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index ebf1408..eb997b1 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -3,15 +3,19 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
-import com.baomidou.mybatisplus.mapper.EntityWrapper;
+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;
+import com.zy.asrs.entity.BasStation;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.BasCrnpService;
+import com.zy.asrs.service.BasStationService;
import com.zy.asrs.service.LocMastService;
+import com.zy.asrs.service.WrkAnalysisService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.utils.NotifyUtils;
import com.zy.asrs.utils.Utils;
@@ -32,6 +36,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import java.util.ArrayList;
+import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -47,6 +53,8 @@
@Autowired
private LocMastService locMastService;
@Autowired
+ private BasStationService basStationService;
+ @Autowired
private RedisUtil redisUtil;
@Autowired
private WmsOperateUtils wmsOperateUtils;
@@ -54,6 +62,12 @@
private CommonService commonService;
@Autowired
private NotifyUtils notifyUtils;
+ @Autowired
+ private StationOperateProcessUtils stationOperateProcessUtils;
+ @Autowired
+ private WrkAnalysisService wrkAnalysisService;
+
+ private static final String CRN_OUT_REQUIRE_STATION_OUT_ENABLE_CONFIG = "crnOutRequireStationOutEnable";
public synchronized void crnIoExecute() {
Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
@@ -69,24 +83,25 @@
//鍏ュ嚭搴� ===>> 鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
public synchronized void crnIoExecuteNormal() {
- List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
+ List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+ Map<Integer, BasCrnp> dispatchCrnMap = new HashMap<>();
+ Map<Integer, CrnThread> dispatchThreadMap = new HashMap<>();
+ Map<Integer, CrnProtocol> dispatchProtocolMap = new HashMap<>();
for (BasCrnp basCrnp : basCrnps) {
CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
- if(crnThread == null){
+ if (crnThread == null) {
continue;
}
CrnProtocol crnProtocol = crnThread.getStatus();
- if(crnProtocol == null){
+ if (crnProtocol == null) {
continue;
}
- List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+ long runningCount = wrkMastService.count(new QueryWrapper<WrkMast>()
.eq("crn_no", basCrnp.getCrnNo())
- .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts)
- .orderBy("batch_seq", false)
- );
- if(!wrkMasts.isEmpty()){
+ .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts, WrkStsType.LOC_MOVE_RUN.sts));
+ if (runningCount > 0) {
continue;
}
@@ -102,47 +117,106 @@
if (clearLock != null) {
continue;
}
+ dispatchCrnMap.put(basCrnp.getCrnNo(), basCrnp);
+ dispatchThreadMap.put(basCrnp.getCrnNo(), crnThread);
+ dispatchProtocolMap.put(basCrnp.getCrnNo(), crnProtocol);
+ }
+ }
- // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
- if (crnProtocol.getLastIo().equals("I")) {
- if (basCrnp.getInEnable().equals("Y")) {
- boolean result = this.crnExecuteIn(basCrnp, crnThread);// 鍏ュ簱
- crnProtocol.setLastIo("O");
- if (result) {
- break;
- }
- } else if (basCrnp.getOutEnable().equals("Y")) {
- boolean result = this.crnExecuteOut(basCrnp, crnThread);// 鍑哄簱
- crnProtocol.setLastIo("I");
- if (result) {
- break;
- }
- }
- }
- // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
- else if (crnProtocol.getLastIo().equals("O")) {
- if (basCrnp.getOutEnable().equals("Y")) {
- boolean result = this.crnExecuteOut(basCrnp, crnThread);// 鍑哄簱
- crnProtocol.setLastIo("I");
- if (result) {
- break;
- }
- } else if (basCrnp.getInEnable().equals("Y")) {
- boolean result = this.crnExecuteIn(basCrnp, crnThread);// 鍏ュ簱
- crnProtocol.setLastIo("O");
- if (result) {
- break;
- }
- }
- }
+ if (dispatchCrnMap.isEmpty()) {
+ return;
+ }
- //搴撲綅绉昏浆
- boolean transfer = this.crnExecuteLocTransfer(basCrnp, crnThread);
+ List<WrkMast> taskQueue = wrkMastService.list(new QueryWrapper<WrkMast>()
+ .in("crn_no", new ArrayList<>(dispatchCrnMap.keySet()))
+ .in("wrk_sts",
+ WrkStsType.INBOUND_STATION_RUN_COMPLETE.sts,
+ WrkStsType.NEW_OUTBOUND.sts,
+ WrkStsType.NEW_LOC_MOVE.sts));
+ taskQueue.sort(Comparator
+ .comparingInt(this::resolveBatchOutboundRank)
+ .thenComparingInt(this::resolveBatchSeqOrder)
+ .thenComparingDouble(this::resolveTaskIoPri)
+ .thenComparingLong(this::resolveTaskQueueTime)
+ .thenComparingInt(this::resolveTaskQueueNo));
+
+ for (WrkMast wrkMast : taskQueue) {
+ if (wrkMast == null || wrkMast.getCrnNo() == null) {
+ continue;
+ }
+
+ Integer crnNo = wrkMast.getCrnNo();
+ BasCrnp basCrnp = dispatchCrnMap.get(crnNo);
+ CrnThread crnThread = dispatchThreadMap.get(crnNo);
+ CrnProtocol crnProtocol = dispatchProtocolMap.get(crnNo);
+ if (basCrnp == null || crnThread == null || crnProtocol == null) {
+ continue;
+ }
+
+ if (wrkMast.getWrkSts() != null && wrkMast.getWrkSts() == WrkStsType.INBOUND_STATION_RUN_COMPLETE.sts) {
+ boolean result = this.crnExecuteInPlanner(basCrnp, crnThread, wrkMast);
+ if (result) {
+ crnProtocol.setLastIo("O");
+ return;
+ }
+ continue;
+ }
+
+ if (wrkMast.getWrkSts() != null && wrkMast.getWrkSts() == WrkStsType.NEW_OUTBOUND.sts) {
+ boolean result = this.crnExecuteOutPlanner(basCrnp, crnThread, wrkMast);
+ if (result) {
+ crnProtocol.setLastIo("I");
+ return;
+ }
+ continue;
+ }
+
+ if (wrkMast.getWrkSts() != null && wrkMast.getWrkSts() == WrkStsType.NEW_LOC_MOVE.sts) {
+ boolean transfer = this.crnExecuteMovePlanner(basCrnp, crnThread, wrkMast);
if (transfer) {
- break;
+ return;
}
}
}
+ }
+
+ private int resolveBatchOutboundRank(WrkMast wrkMast) {
+ return isBatchOutboundTask(wrkMast) ? 0 : 1;
+ }
+
+ private int resolveBatchSeqOrder(WrkMast wrkMast) {
+ if (!isBatchOutboundTask(wrkMast) || wrkMast.getBatchSeq() == null) {
+ return Integer.MAX_VALUE;
+ }
+ return wrkMast.getBatchSeq();
+ }
+
+ private double resolveTaskIoPri(WrkMast wrkMast) {
+ if (wrkMast == null || wrkMast.getIoPri() == null) {
+ return Double.MAX_VALUE;
+ }
+ return wrkMast.getIoPri();
+ }
+
+ private long resolveTaskQueueTime(WrkMast wrkMast) {
+ if (wrkMast == null) {
+ return Long.MAX_VALUE;
+ }
+ Date queueTime = wrkMast.getAppeTime() != null ? wrkMast.getAppeTime() : wrkMast.getIoTime();
+ return queueTime == null ? Long.MAX_VALUE : queueTime.getTime();
+ }
+
+ private int resolveTaskQueueNo(WrkMast wrkMast) {
+ if (wrkMast == null || wrkMast.getWrkNo() == null) {
+ return Integer.MAX_VALUE;
+ }
+ return wrkMast.getWrkNo();
+ }
+
+ private boolean isBatchOutboundTask(WrkMast wrkMast) {
+ return wrkMast != null
+ && Integer.valueOf(WrkIoType.OUT.id).equals(wrkMast.getIoType())
+ && !Cools.isEmpty(wrkMast.getBatch());
}
private synchronized boolean crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) {
@@ -200,12 +274,16 @@
continue;
}
- if(wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts){
+ if (!wrkMast.getCrnNo().equals(basCrnp.getCrnNo())) {
+ continue;
+ }
+
+ if(wrkMast.getWrkSts() != WrkStsType.INBOUND_STATION_RUN_COMPLETE.sts){
continue;
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
continue;
@@ -227,11 +305,14 @@
CrnCommand command = crnThread.getPickAndPutCommand(sourceLocNo, wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
+ Date now = new Date();
wrkMast.setWrkSts(WrkStsType.INBOUND_RUN.sts);
wrkMast.setCrnNo(crnNo);
wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markCraneStart(wrkMast, now);
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));
@@ -258,15 +339,25 @@
return false;
}
+ if (isOutboundStationTaskLimitReached()) {
+ 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("batch_seq", false)
+ .orderBy(true, true, "batch_seq")
);
for (WrkMast wrkMast : wrkMasts) {
+ if (isOutboundTargetStationTaskLimitReached(wrkMast)) {
+ continue;
+ }
+ if (!allowBatchOutboundExecute(wrkMast)) {
+ continue;
+ }
for (StationObjModel stationObjModel : outStationList) {
StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
if (stationThread == null) {
@@ -291,13 +382,13 @@
continue;
}
- if (!stationProtocol.isOutEnable()) {
- News.info("鏀捐揣绔欑偣:{} 娌℃湁鍙嚭淇″彿", stationObjModel.getStationId());
+ if (isRequireOutboundStationOutEnable() && !stationProtocol.isOutEnable()) {
+ News.taskInfo(wrkMast.getWrkNo(), "鏀捐揣绔欑偣:{} 娌℃湁鍙嚭淇″彿", stationObjModel.getStationId());
continue;
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getSourceLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
continue;
@@ -319,11 +410,14 @@
CrnCommand command = crnThread.getPickAndPutCommand(wrkMast.getSourceLocNo(), targetLocNo, wrkMast.getWrkNo(), crnNo);
+ Date now = new Date();
wrkMast.setWrkSts(WrkStsType.OUTBOUND_RUN.sts);
wrkMast.setCrnNo(crnNo);
wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markCraneStart(wrkMast, now);
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));
@@ -386,12 +480,12 @@
continue;
}
- if (wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts) {
+ if (wrkMast.getWrkSts() != WrkStsType.INBOUND_STATION_RUN_COMPLETE.sts) {
continue;
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
continue;
@@ -413,11 +507,14 @@
CrnCommand command = crnThread.getPickAndPutCommand(sourceLocNo, wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
+ Date now = new Date();
wrkMast.setWrkSts(WrkStsType.INBOUND_RUN.sts);
wrkMast.setCrnNo(crnNo);
wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markCraneStart(wrkMast, now);
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));
@@ -444,7 +541,19 @@
return false;
}
+ if (isOutboundStationTaskLimitReached()) {
+ return false;
+ }
+
Integer crnNo = basCrnp.getCrnNo();
+
+ if (isOutboundTargetStationTaskLimitReached(wrkMast)) {
+ return false;
+ }
+
+ if (!allowBatchOutboundExecute(wrkMast)) {
+ return false;
+ }
for (StationObjModel stationObjModel : outStationList) {
StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
@@ -470,13 +579,13 @@
continue;
}
- if (!stationProtocol.isOutEnable()) {
- News.info("鏀捐揣绔欑偣:{} 娌℃湁鍙嚭淇″彿", stationObjModel.getStationId());
+ if (isRequireOutboundStationOutEnable() && !stationProtocol.isOutEnable()) {
+ News.taskInfo(wrkMast.getWrkNo(), "鏀捐揣绔欑偣:{} 娌℃湁鍙嚭淇″彿", stationObjModel.getStationId());
continue;
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getSourceLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
continue;
@@ -498,11 +607,14 @@
CrnCommand command = crnThread.getPickAndPutCommand(wrkMast.getSourceLocNo(), targetLocNo, wrkMast.getWrkNo(), crnNo);
+ Date now = new Date();
wrkMast.setWrkSts(WrkStsType.OUTBOUND_RUN.sts);
wrkMast.setCrnNo(crnNo);
wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markCraneStart(wrkMast, now);
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));
@@ -510,6 +622,190 @@
}
}
return false;
+ }
+
+ 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;
+ }
+
+ List<WrkMast> unfinishedBatchWrkMasts = listUnfinishedBatchWrkMasts(wrkMast.getBatch());
+ if (hasMissingBatchSeq(unfinishedBatchWrkMasts)) {
+ News.taskInfo(wrkMast.getWrkNo(), "鎵规:{} 瀛樺湪鏈厤缃壒娆″簭鍙风殑鏈畬鎴愪换鍔★紝鏆備笉鍏佽鍫嗗灈鏈哄嚭搴�", wrkMast.getBatch());
+ return false;
+ }
+
+ if (!isWithinBatchExecuteWindow(wrkMast, unfinishedBatchWrkMasts, batchRunningLimit)) {
+ Integer windowStartSeq = unfinishedBatchWrkMasts.get(0).getBatchSeq();
+ Integer windowEndSeq = unfinishedBatchWrkMasts.get(Math.min(batchRunningLimit, unfinishedBatchWrkMasts.size()) - 1).getBatchSeq();
+ News.taskInfo(wrkMast.getWrkNo(),
+ "鎵规:{} 褰撳墠涓ユ牸鎵ц绐楀彛搴忓彿涓篬{}-{}]锛屽綋鍓嶅簭鍙�={}锛屾殏涓嶅厑璁稿爢鍨涙満鍑哄簱",
+ wrkMast.getBatch(),
+ windowStartSeq,
+ windowEndSeq,
+ wrkMast.getBatchSeq());
+ return false;
+ }
+
+ 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 List<WrkMast> listUnfinishedBatchWrkMasts(String batch) {
+ if (Cools.isEmpty(batch)) {
+ return new ArrayList<>();
+ }
+ return wrkMastService.list(new QueryWrapper<WrkMast>()
+ .eq("io_type", WrkIoType.OUT.id)
+ .eq("batch", batch)
+ .notIn("wrk_sts",
+ WrkStsType.COMPLETE_OUTBOUND.sts,
+ WrkStsType.SETTLE_OUTBOUND.sts)
+ .orderByAsc("batch_seq")
+ .orderByAsc("wrk_no"));
+ }
+
+ private boolean hasMissingBatchSeq(List<WrkMast> wrkMasts) {
+ if (wrkMasts == null || wrkMasts.isEmpty()) {
+ return false;
+ }
+ for (WrkMast item : wrkMasts) {
+ if (item == null || Cools.isEmpty(item.getBatchSeq())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isWithinBatchExecuteWindow(WrkMast wrkMast, List<WrkMast> unfinishedBatchWrkMasts, int batchRunningLimit) {
+ if (wrkMast == null || unfinishedBatchWrkMasts == null || unfinishedBatchWrkMasts.isEmpty()) {
+ return true;
+ }
+ int windowSize = Math.min(batchRunningLimit, unfinishedBatchWrkMasts.size());
+ for (int i = 0; i < windowSize; i++) {
+ WrkMast current = unfinishedBatchWrkMasts.get(i);
+ if (current != null && wrkMast.getWrkNo().equals(current.getWrkNo())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isOutboundStationTaskLimitReached() {
+ int stationMaxTaskCount = getSystemConfigInt("stationMaxTaskCountLimit", 30);
+ if (stationMaxTaskCount <= 0) {
+ return false;
+ }
+
+ int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
+ if (currentStationTaskCount >= stationMaxTaskCount) {
+ News.warn("杈撻�佺珯鐐逛换鍔℃暟閲忚揪鍒颁笂闄愶紝宸插仠姝换鍔′笅鍙戙�傚綋鍓嶄换鍔℃暟={}锛屼笂闄�={}", currentStationTaskCount, stationMaxTaskCount);
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isOutboundTargetStationTaskLimitReached(WrkMast wrkMast) {
+ if (wrkMast == null || wrkMast.getStaNo() == null) {
+ return false;
+ }
+ BasStation basStation = basStationService.getById(wrkMast.getStaNo());
+ if (basStation == null || basStation.getOutTaskLimit() == null || basStation.getOutTaskLimit() < 0) {
+ return false;
+ }
+ int currentStationTaskCount = stationOperateProcessUtils.getCurrentOutboundTaskCountByTargetStation(wrkMast.getStaNo());
+ if (currentStationTaskCount >= basStation.getOutTaskLimit()) {
+ News.taskInfo(wrkMast.getWrkNo(),
+ "鐩爣鍑哄簱绔�:{} 宸茶揪鍑哄簱浠诲姟涓婇檺锛屽綋鍓�={}锛屼笂闄�={}",
+ wrkMast.getStaNo(),
+ currentStationTaskCount,
+ basStation.getOutTaskLimit());
+ return true;
+ }
+ return false;
+ }
+
+ 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 boolean isRequireOutboundStationOutEnable() {
+ return getSystemConfigBoolean(CRN_OUT_REQUIRE_STATION_OUT_ENABLE_CONFIG, true);
+ }
+
+ private boolean getSystemConfigBoolean(String code, boolean defaultValue) {
+ Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
+ if (!(systemConfigMapObj instanceof Map)) {
+ return defaultValue;
+ }
+ try {
+ Object value = ((Map<?, ?>) systemConfigMapObj).get(code);
+ if (value == null) {
+ return defaultValue;
+ }
+ String text = String.valueOf(value).trim();
+ if ("Y".equalsIgnoreCase(text) || "true".equalsIgnoreCase(text) || "1".equals(text)) {
+ return true;
+ }
+ if ("N".equalsIgnoreCase(text) || "false".equalsIgnoreCase(text) || "0".equals(text)) {
+ return false;
+ }
+ } catch (Exception ignore) {
+ }
+ return defaultValue;
}
private synchronized boolean crnExecuteLocTransfer(BasCrnp basCrnp, CrnThread crnThread) {
@@ -520,14 +816,14 @@
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;
@@ -539,7 +835,7 @@
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
continue;
@@ -552,11 +848,14 @@
CrnCommand command = crnThread.getPickAndPutCommand(wrkMast.getSourceLocNo(), wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
+ Date now = new Date();
wrkMast.setWrkSts(WrkStsType.LOC_MOVE_RUN.sts);
wrkMast.setCrnNo(crnNo);
wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markCraneStart(wrkMast, now);
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));
@@ -568,7 +867,7 @@
//鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
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){
@@ -597,6 +896,7 @@
}
Long updateWrkSts = null;
+ Date now = new Date();
if(wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts){
updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_COMPLETE, null);
@@ -628,8 +928,10 @@
wrkMast.setWrkSts(updateWrkSts);
wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
@@ -642,7 +944,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);
@@ -658,7 +960,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)
);
@@ -750,7 +1052,7 @@
}
// 鑾峰彇婧愬簱浣嶄俊鎭�
- LocMast sourceLocMast = locMastService.selectById(wrkMast.getSourceLocNo());
+ LocMast sourceLocMast = locMastService.getById(wrkMast.getSourceLocNo());
if (sourceLocMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
return false;
@@ -762,7 +1064,7 @@
}
// 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+ LocMast locMast = locMastService.getById(wrkMast.getLocNo());
if (locMast == null) {
News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
return false;
@@ -775,11 +1077,14 @@
CrnCommand command = crnThread.getPickAndPutCommand(wrkMast.getSourceLocNo(), wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
+ Date now = new Date();
wrkMast.setWrkSts(WrkStsType.LOC_MOVE_RUN.sts);
wrkMast.setCrnNo(crnNo);
wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
+ wrkMast.setIoTime(now);
+ wrkMast.setModiTime(now);
if (wrkMastService.updateById(wrkMast)) {
+ wrkAnalysisService.markCraneStart(wrkMast, now);
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));
--
Gitblit v1.9.1