From 204ce5fe8ddc33320d59d155244dfd3b55ca25a8 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 26 三月 2026 09:59:57 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java | 344 +++++++++++++--------------------------------------------
1 files changed, 80 insertions(+), 264 deletions(-)
diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index be93a48..ec4c22d 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -15,6 +15,7 @@
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;
@@ -63,6 +64,8 @@
private NotifyUtils notifyUtils;
@Autowired
private StationOperateProcessUtils stationOperateProcessUtils;
+ @Autowired
+ private WrkAnalysisService wrkAnalysisService;
private static final String CRN_OUT_REQUIRE_STATION_OUT_ENABLE_CONFIG = "crnOutRequireStationOutEnable";
@@ -127,7 +130,7 @@
List<WrkMast> taskQueue = wrkMastService.list(new QueryWrapper<WrkMast>()
.in("crn_no", new ArrayList<>(dispatchCrnMap.keySet()))
.in("wrk_sts",
- WrkStsType.INBOUND_DEVICE_RUN.sts,
+ WrkStsType.INBOUND_STATION_RUN_COMPLETE.sts,
WrkStsType.NEW_OUTBOUND.sts,
WrkStsType.NEW_LOC_MOVE.sts));
taskQueue.sort(Comparator
@@ -150,7 +153,7 @@
continue;
}
- if (wrkMast.getWrkSts() != null && wrkMast.getWrkSts() == WrkStsType.INBOUND_DEVICE_RUN.sts) {
+ if (wrkMast.getWrkSts() != null && wrkMast.getWrkSts() == WrkStsType.INBOUND_STATION_RUN_COMPLETE.sts) {
boolean result = this.crnExecuteInPlanner(basCrnp, crnThread, wrkMast);
if (result) {
crnProtocol.setLastIo("O");
@@ -216,209 +219,6 @@
&& !Cools.isEmpty(wrkMast.getBatch());
}
- private synchronized boolean crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) {
- CrnProtocol crnProtocol = crnThread.getStatus();
- if(crnProtocol == null){
- return false;
- }
-
- if(!basCrnp.getInEnable().equals("Y")){
- News.info("鍫嗗灈鏈�:{} 鍙叆淇″彿涓嶆弧瓒�", basCrnp.getCrnNo());
- return false;
- }
-
- List<StationObjModel> inStationList = basCrnp.getInStationList$();
- if(inStationList.isEmpty()){
- News.info("鍫嗗灈鏈�:{} 鍏ュ簱绔欑偣鏈缃�", basCrnp.getCrnNo());
- return false;
- }
-
- Integer crnNo = basCrnp.getCrnNo();
-
- for (StationObjModel stationObjModel : inStationList) {
- StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
- if (stationThread == null) {
- continue;
- }
-
- Map<Integer, StationProtocol> stationProtocolMap = stationThread.getStatusMap();
- StationProtocol stationProtocol = stationProtocolMap.get(stationObjModel.getStationId());
- if (stationProtocol == null) {
- continue;
- }
-
- if (!stationProtocol.isAutoing()) {
- continue;
- }
-
- if (!stationProtocol.isLoading()) {
- continue;
- }
-
- if (stationProtocol.getTaskNo() <= 0) {
- continue;
- }
-
- if (!stationProtocol.isInEnable()) {
- News.taskInfo(stationProtocol.getTaskNo(), "鍙栬揣绔欑偣:{} 娌℃湁鍙叆淇″彿", stationObjModel.getStationId());
- continue;
- }
-
- // 鑾峰彇浠诲姟
- WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
- if (null == wrkMast) {
- News.taskInfo(stationProtocol.getTaskNo(), "宸ヤ綔鍙�:{} 浠诲姟淇℃伅涓嶅瓨鍦�", stationProtocol.getTaskNo());
- continue;
- }
-
- if (!wrkMast.getCrnNo().equals(basCrnp.getCrnNo())) {
- continue;
- }
-
- if(wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts){
- continue;
- }
-
- // 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.getById(wrkMast.getLocNo());
- if (locMast == null) {
- News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
- continue;
- }
-
- if (!locMast.getLocSts().equals("S")) {
- News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 鐘舵�佸紓甯�", wrkMast.getLocNo());
- continue;
- }
-
- //妫�娴嬫祬搴撲綅鐘舵��
- boolean checkStatus = checkShallowLocStatus(locMast.getLocNo(), wrkMast.getWrkNo());
- if (!checkStatus) {
- News.taskInfo(wrkMast.getWrkNo(), "鍥犳祬搴撲綅鍫靛鏃犳硶鎵ц");
- continue;
- }
-
- String sourceLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev());
-
- CrnCommand command = crnThread.getPickAndPutCommand(sourceLocNo, wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
-
- wrkMast.setWrkSts(WrkStsType.INBOUND_RUN.sts);
- wrkMast.setCrnNo(crnNo);
- wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
- if (wrkMastService.updateById(wrkMast)) {
- 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 boolean crnExecuteOut(BasCrnp basCrnp, CrnThread crnThread) {
- CrnProtocol crnProtocol = crnThread.getStatus();
- if(crnProtocol == null){
- return false;
- }
-
- if(!basCrnp.getOutEnable().equals("Y")){
- News.info("鍫嗗灈鏈�:{} 鍙嚭淇″彿涓嶆弧瓒�", basCrnp.getCrnNo());
- return false;
- }
-
- List<StationObjModel> outStationList = basCrnp.getOutStationList$();
- if(outStationList.isEmpty()){
- News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
- return false;
- }
-
- if (isOutboundStationTaskLimitReached()) {
- return false;
- }
-
- Integer crnNo = basCrnp.getCrnNo();
-
- 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 (isOutboundTargetStationTaskLimitReached(wrkMast)) {
- continue;
- }
- if (!allowBatchOutboundExecute(wrkMast)) {
- continue;
- }
- for (StationObjModel stationObjModel : outStationList) {
- StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
- if (stationThread == null) {
- continue;
- }
-
- Map<Integer, StationProtocol> stationProtocolMap = stationThread.getStatusMap();
- StationProtocol stationProtocol = stationProtocolMap.get(stationObjModel.getStationId());
- if (stationProtocol == null) {
- continue;
- }
-
- if (!stationProtocol.isAutoing()) {
- continue;
- }
-
- if (stationProtocol.isLoading()) {
- continue;
- }
-
- if (stationProtocol.getTaskNo() != 0) {
- continue;
- }
-
- if (isRequireOutboundStationOutEnable() && !stationProtocol.isOutEnable()) {
- News.taskInfo(wrkMast.getWrkNo(), "鏀捐揣绔欑偣:{} 娌℃湁鍙嚭淇″彿", stationObjModel.getStationId());
- continue;
- }
-
- // 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.getById(wrkMast.getSourceLocNo());
- if (locMast == null) {
- News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
- continue;
- }
-
- if (!locMast.getLocSts().equals("R")) {
- News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 鐘舵�佸紓甯�", wrkMast.getSourceLocNo());
- continue;
- }
-
- //妫�娴嬫祬搴撲綅鐘舵��
- boolean checkStatus = checkShallowLocStatus(locMast.getLocNo(), wrkMast.getWrkNo());
- if (!checkStatus) {
- News.taskInfo(wrkMast.getWrkNo(), "鍥犳祬搴撲綅鍫靛鏃犳硶鎵ц");
- continue;
- }
-
- String targetLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev());
-
- CrnCommand command = crnThread.getPickAndPutCommand(wrkMast.getSourceLocNo(), targetLocNo, wrkMast.getWrkNo(), crnNo);
-
- wrkMast.setWrkSts(WrkStsType.OUTBOUND_RUN.sts);
- wrkMast.setCrnNo(crnNo);
- wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
- if (wrkMastService.updateById(wrkMast)) {
- 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 true;
- }
- }
- }
- return false;
- }
-
private synchronized boolean crnExecuteInPlanner(BasCrnp basCrnp, CrnThread crnThread, WrkMast wrkMast) {
CrnProtocol crnProtocol = crnThread.getStatus();
if (crnProtocol == null) {
@@ -471,7 +271,7 @@
continue;
}
- if (wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts) {
+ if (wrkMast.getWrkSts() != WrkStsType.INBOUND_STATION_RUN_COMPLETE.sts) {
continue;
}
@@ -498,11 +298,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));
@@ -595,11 +398,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));
@@ -647,6 +453,24 @@
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())
@@ -660,6 +484,46 @@
}
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() {
@@ -735,60 +599,6 @@
return defaultValue;
}
- private synchronized boolean crnExecuteLocTransfer(BasCrnp basCrnp, CrnThread crnThread) {
- CrnProtocol crnProtocol = crnThread.getStatus();
- if(crnProtocol == null){
- return false;
- }
-
- Integer crnNo = basCrnp.getCrnNo();
-
- 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.getById(wrkMast.getSourceLocNo());
- if (sourceLocMast == null) {
- News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
- continue;
- }
-
- if(!sourceLocMast.getLocSts().equals("R")){
- News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 鐘舵�佸紓甯革紝涓嶅睘浜庡嚭搴撻绾︾姸鎬�", wrkMast.getSourceLocNo());
- continue;
- }
-
- // 鑾峰彇搴撲綅淇℃伅
- LocMast locMast = locMastService.getById(wrkMast.getLocNo());
- if (locMast == null) {
- News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
- continue;
- }
-
- if (!locMast.getLocSts().equals("S")) {
- News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 鐘舵�佸紓甯革紝涓嶅睘浜庡叆搴撻绾︾姸鎬�", wrkMast.getLocNo());
- continue;
- }
-
- CrnCommand command = crnThread.getPickAndPutCommand(wrkMast.getSourceLocNo(), wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
-
- wrkMast.setWrkSts(WrkStsType.LOC_MOVE_RUN.sts);
- wrkMast.setCrnNo(crnNo);
- wrkMast.setSystemMsg("");
- wrkMast.setIoTime(new Date());
- if (wrkMastService.updateById(wrkMast)) {
- 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 true;
- }
- }
- return false;
- }
-
//鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�
public synchronized void crnIoExecuteFinish() {
List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
@@ -820,6 +630,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);
@@ -851,8 +662,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());
@@ -998,11 +811,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