From 9b8ff50b66361c4b56074b7586b2d5951ecf2091 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 02 四月 2026 15:02:14 +0800
Subject: [PATCH] #优化运行速度
---
src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java | 230 +++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 149 insertions(+), 81 deletions(-)
diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index 614f005..787f8c0 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -31,6 +31,8 @@
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.task.MainProcessLane;
+import com.zy.core.task.MainProcessTaskSubmitter;
import com.zy.core.thread.CrnThread;
import com.zy.core.thread.StationThread;
import org.springframework.beans.factory.annotation.Autowired;
@@ -69,30 +71,40 @@
private StationOperateProcessUtils stationOperateProcessUtils;
@Autowired
private WrkAnalysisService wrkAnalysisService;
+ @Autowired
+ private MainProcessTaskSubmitter mainProcessTaskSubmitter;
private static final String CRN_OUT_REQUIRE_STATION_OUT_ENABLE_CONFIG = "crnOutRequireStationOutEnable";
public synchronized void crnIoExecute() {
+ Set<Integer> crnMoveBlockedCrnNos = executeCrnMoveTask();
+ List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+ for (BasCrnp basCrnp : basCrnps) {
+ crnIoExecute(basCrnp, crnMoveBlockedCrnNos);
+ }
+ }
+
+ public void crnIoExecute(BasCrnp basCrnp, Set<Integer> crnMoveBlockedCrnNos) {
+ if (basCrnp == null || basCrnp.getCrnNo() == null) {
+ return;
+ }
Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
if (systemConfigMapObj != null) {
HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
if (systemConfigMap.get("crnRunMethod").equals("solver")) {
- plannerExecute();
+ plannerExecute(basCrnp, crnMoveBlockedCrnNos);
}else {
- crnIoExecuteNormal();
+ crnIoExecuteNormal(basCrnp, crnMoveBlockedCrnNos);
}
}
}
//鍏ュ嚭搴� ===>> 鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
- public synchronized void crnIoExecuteNormal() {
- Set<Integer> crnMoveBlockedCrnNos = executeCrnMoveTask();
-
- List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+ private void crnIoExecuteNormal(BasCrnp currentCrn, Set<Integer> crnMoveBlockedCrnNos) {
Map<Integer, BasCrnp> dispatchCrnMap = new HashMap<>();
Map<Integer, CrnThread> dispatchThreadMap = new HashMap<>();
Map<Integer, CrnProtocol> dispatchProtocolMap = new HashMap<>();
- for (BasCrnp basCrnp : basCrnps) {
+ for (BasCrnp basCrnp : java.util.Collections.singletonList(currentCrn)) {
if (basCrnp == null || basCrnp.getCrnNo() == null || crnMoveBlockedCrnNos.contains(basCrnp.getCrnNo())) {
continue;
}
@@ -611,110 +623,120 @@
public synchronized void crnIoExecuteFinish() {
List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
for (BasCrnp basCrnp : basCrnps) {
- CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
- if(crnThread == null){
- continue;
+ crnIoExecuteFinish(basCrnp);
+ }
+ }
+
+ public void crnIoExecuteFinish(BasCrnp basCrnp) {
+ if (basCrnp == null || basCrnp.getCrnNo() == null) {
+ return;
+ }
+ CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
+ if(crnThread == null){
+ return;
+ }
+
+ CrnProtocol crnProtocol = crnThread.getStatus();
+ if(crnProtocol == null){
+ return;
+ }
+
+ if (crnProtocol.getMode() == CrnModeType.AUTO.id
+ && crnProtocol.getTaskNo() > 0
+ && crnProtocol.getStatus() == CrnStatusType.WAITING.id
+ ) {
+ Object lock = redisUtil.get(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo());
+ if(lock != null){
+ return;
}
- CrnProtocol crnProtocol = crnThread.getStatus();
- if(crnProtocol == null){
- continue;
+ WrkMast wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
+ if (wrkMast == null) {
+ News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+ return;
}
- if (crnProtocol.getMode() == CrnModeType.AUTO.id
- && crnProtocol.getTaskNo() > 0
- && crnProtocol.getStatus() == CrnStatusType.WAITING.id
- ) {
- Object lock = redisUtil.get(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo());
- if(lock != null){
- continue;
+ 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);
+ }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;
}
- // 鑾峰彇寰呯‘璁ゅ伐浣滄。
- WrkMast wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
- if (wrkMast == null) {
- News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
- continue;
- }
-
- 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);
- }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;
}
-
- 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);
- }else if(wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts){
- updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
- }else{
- News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
- continue;
}
-
- wrkMast.setWrkSts(updateWrkSts);
- wrkMast.setSystemMsg("");
- 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());
- }
-
- redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock",10);
+ 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);
+ }else if(wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts){
+ updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
+ }else{
+ News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+ return;
}
+
+ wrkMast.setWrkSts(updateWrkSts);
+ wrkMast.setSystemMsg("");
+ 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());
+ }
+
+ redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock",10);
}
}
public synchronized void plannerExecute() {
Set<Integer> crnMoveBlockedCrnNos = executeCrnMoveTask();
-
- int nowSec = (int) (System.currentTimeMillis() / 1000);
List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
for (BasCrnp basCrnp : basCrnps) {
- if (basCrnp == null || basCrnp.getCrnNo() == null || crnMoveBlockedCrnNos.contains(basCrnp.getCrnNo())) {
- continue;
- }
+ plannerExecute(basCrnp, crnMoveBlockedCrnNos);
+ }
+ }
+
+ private void plannerExecute(BasCrnp basCrnp, Set<Integer> crnMoveBlockedCrnNos) {
+ int nowSec = (int) (System.currentTimeMillis() / 1000);
+ if (basCrnp == null || basCrnp.getCrnNo() == null || crnMoveBlockedCrnNos.contains(basCrnp.getCrnNo())) {
+ return;
+ }
String key = RedisKeyType.PLANNER_SCHEDULE.key + "CRN-" + basCrnp.getCrnNo();
List<Object> items = redisUtil.lGet(key, 0, -1);
if (items == null || items.isEmpty()) {
- continue;
+ return;
}
CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
if (crnThread == null) {
- continue;
+ return;
}
CrnProtocol crnProtocol = crnThread.getStatus();
if (crnProtocol == null) {
- continue;
+ return;
}
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, WrkStsType.CRN_MOVE_RUN.sts)
);
if (!running.isEmpty()) {
- continue;
+ return;
}
if (!(crnProtocol.getMode() == CrnModeType.AUTO.id
&& crnProtocol.getTaskNo() == 0
@@ -722,7 +744,7 @@
&& crnProtocol.getLoaded() == 0
&& crnProtocol.getForkPos() == 0
&& crnProtocol.getAlarm() == 0)) {
- continue;
+ return;
}
for (Object v : items) {
@@ -785,7 +807,6 @@
}
}
}
- }
}
private synchronized boolean crnExecuteMovePlanner(BasCrnp basCrnp, CrnThread crnThread, WrkMast wrkMast) {
@@ -950,6 +971,53 @@
return blockedCrnNoSet;
}
+ public Set<Integer> executeCrnMoveTaskAndGetBlockedCrnNos() {
+ return executeCrnMoveTask();
+ }
+
+ public void submitCrnIoTasks(long minIntervalMs) {
+ submitCrnIoTasks(MainProcessLane.CRN_IO, minIntervalMs);
+ }
+
+ public void submitCrnIoTasks(MainProcessLane lane, long minIntervalMs) {
+ Set<Integer> blockedCrnNos = executeCrnMoveTaskAndGetBlockedCrnNos();
+ List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+ for (BasCrnp basCrnp : basCrnps) {
+ Integer crnNo = basCrnp == null ? null : basCrnp.getCrnNo();
+ if (crnNo == null) {
+ continue;
+ }
+ mainProcessTaskSubmitter.submitKeyedSerialTask(
+ lane,
+ crnNo,
+ "crnIoExecute",
+ minIntervalMs,
+ () -> crnIoExecute(basCrnp, blockedCrnNos)
+ );
+ }
+ }
+
+ public void submitCrnIoExecuteFinishTasks(long minIntervalMs) {
+ submitCrnIoExecuteFinishTasks(MainProcessLane.CRN_IO_FINISH, minIntervalMs);
+ }
+
+ public void submitCrnIoExecuteFinishTasks(MainProcessLane lane, long minIntervalMs) {
+ List<BasCrnp> basCrnps = basCrnpService.list(new QueryWrapper<>());
+ for (BasCrnp basCrnp : basCrnps) {
+ Integer crnNo = basCrnp == null ? null : basCrnp.getCrnNo();
+ if (crnNo == null) {
+ continue;
+ }
+ mainProcessTaskSubmitter.submitKeyedSerialTask(
+ lane,
+ crnNo,
+ "crnIoExecuteFinish",
+ minIntervalMs,
+ () -> crnIoExecuteFinish(basCrnp)
+ );
+ }
+ }
+
//妫�娴嬫祬搴撲綅鐘舵��
public synchronized boolean checkShallowLocStatus(String locNo, Integer taskNo) {
String checkDeepLocOutTaskBlockReport = "Y";
--
Gitblit v1.9.1