From b376fc91290633b6ff5c51aba95e8b70d30a992c Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期日, 22 三月 2026 12:49:23 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java |  135 +++++++++++++++++++++++++++++++++++++-------
 1 files changed, 112 insertions(+), 23 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
index 6e9f636..e4ee5c4 100644
--- a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
@@ -3,14 +3,16 @@
 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.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.BasDualCrnp;
 import com.zy.asrs.entity.LocMast;
 import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.service.BasDualCrnpService;
+import com.zy.asrs.service.BasStationService;
 import com.zy.asrs.service.LocMastService;
 import com.zy.asrs.service.WrkMastService;
 import com.zy.asrs.utils.NotifyUtils;
@@ -53,6 +55,8 @@
     @Autowired
     private LocMastService locMastService;
     @Autowired
+    private BasStationService basStationService;
+    @Autowired
     private RedisUtil redisUtil;
     @Autowired
     private WmsOperateUtils wmsOperateUtils;
@@ -60,10 +64,14 @@
     private CommonService commonService;
     @Autowired
     private NotifyUtils notifyUtils;
+    @Autowired
+    private StationOperateProcessUtils stationOperateProcessUtils;
+
+    private static final String CRN_OUT_REQUIRE_STATION_OUT_ENABLE_CONFIG = "crnOutRequireStationOutEnable";
 
     //鍏ュ嚭搴�  ===>>  鍙屽伐浣嶅爢鍨涙満鍏ュ嚭搴撲綔涓氫笅鍙�
     public synchronized void dualCrnIoExecute() {
-        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.list(new QueryWrapper<>());
         for (BasDualCrnp basDualCrnp : basDualCrnps) {
             DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
             if(dualCrnThread == null){
@@ -75,9 +83,9 @@
                 continue;
             }
 
-            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+            List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>()
                     .eq("dual_crn_no", basDualCrnp.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)
             );
             if(wrkMasts.size() >= 2){
                 continue;
@@ -199,18 +207,19 @@
         WrkMast stationOneWrkMast = null;
         WrkMast stationTwoWrkMast = null;
 
-        List<Integer> disableList = basDualCrnp.getDisableStationOneBays$();
+        List<Integer> disableOneList = basDualCrnp.getDisableStationOneBays$();
+        List<Integer> disableTwoList = basDualCrnp.getDisableStationTwoBays$();
 
         for (WrkMast wrkMast : outTaskList) {
             if (stationOneWrkMast == null) {
-                if (!disableList.contains(Utils.getBay(wrkMast.getSourceLocNo()))) {
+                if (!disableOneList.contains(Utils.getBay(wrkMast.getSourceLocNo()))) {
                     stationOneWrkMast = wrkMast;
                     continue;
                 }
             }
 
             if (stationTwoWrkMast == null) {
-                if (!disableList.contains(Utils.getBay(wrkMast.getSourceLocNo()))) {
+                if (!disableTwoList.contains(Utils.getBay(wrkMast.getSourceLocNo()))) {
                     stationTwoWrkMast = wrkMast;
                     continue;
                 }
@@ -335,8 +344,12 @@
             }
         }
 
+        if (taskList.isEmpty()) {
+            return list;
+        }
+
         // 鑾峰彇浠诲姟
-        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>()
                 .eq("dual_crn_no", basDualCrnp.getCrnNo())
                 .in("wrk_no", taskList)
         );
@@ -362,7 +375,7 @@
             return list;
         }
 
-        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>()
                 .eq("dual_crn_no", basDualCrnp.getCrnNo())
                 .eq("wrk_sts", WrkStsType.NEW_OUTBOUND.sts)
         );
@@ -372,7 +385,7 @@
 
     private List<WrkMast> getLocMoveTaskList(BasDualCrnp basDualCrnp) {
         List<WrkMast> list = new ArrayList<>();
-        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+        List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>()
                 .eq("dual_crn_no", basDualCrnp.getCrnNo())
                 .eq("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts)
         );
@@ -404,7 +417,7 @@
         }
 
         // 鑾峰彇搴撲綅淇℃伅
-        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+        LocMast locMast = locMastService.getById(wrkMast.getLocNo());
         if (locMast == null) {
             News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
             return null;
@@ -465,6 +478,10 @@
 
         Integer station = inStationObjModel.getDualCrnExecuteStation();
         if (station == 1) {
+            if (dualCrnProtocol.getTaskNo() > 0) {
+                News.taskInfo(wrkMast.getWrkNo(), "宸ヤ綅1绯荤粺鍐呴儴璁板綍鏈変换鍔�");
+                return null;
+            }
             List<Integer> basList = basDualCrnp.getDisableStationOneBays$();
             if (basList.contains(Utils.getBay(wrkMast.getLocNo()))) {
                 //绂佹鏀捐揣鍒楋紝鐢宠閲嶆柊鍒嗛厤
@@ -472,6 +489,10 @@
                 return null;
             }
         }else {
+            if (dualCrnProtocol.getTaskNoTwo() > 0) {
+                News.taskInfo(wrkMast.getWrkNo(), "宸ヤ綅2绯荤粺鍐呴儴璁板綍鏈変换鍔�");
+                return null;
+            }
             List<Integer> basList = basDualCrnp.getDisableStationTwoBays$();
             if (basList.contains(Utils.getBay(wrkMast.getLocNo()))) {
                 //绂佹鏀捐揣鍒楋紝鐢宠閲嶆柊鍒嗛厤
@@ -522,7 +543,23 @@
             return null;
         }
 
+        if (station == 1) {
+            if (dualCrnProtocol.getTaskNo() > 0) {
+                News.taskInfo(wrkMast.getWrkNo(), "宸ヤ綅1绯荤粺鍐呴儴璁板綍鏈変换鍔�");
+                return null;
+            }
+        }else {
+            if (dualCrnProtocol.getTaskNoTwo() > 0) {
+                News.taskInfo(wrkMast.getWrkNo(), "宸ヤ綅2绯荤粺鍐呴儴璁板綍鏈変换鍔�");
+                return null;
+            }
+        }
+
         Integer crnNo = basDualCrnp.getCrnNo();
+
+        if (isOutboundTargetStationTaskLimitReached(wrkMast)) {
+            return null;
+        }
 
         for (StationObjModel stationObjModel : outStationList) {
             StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
@@ -552,13 +589,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;
@@ -604,6 +641,26 @@
         return null;
     }
 
+    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 synchronized SendDualCrnCommandParam crnExecuteLocMove(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast, int station) {
         DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
         if (dualCrnProtocol == null) {
@@ -613,7 +670,7 @@
         Integer crnNo = basDualCrnp.getCrnNo();
 
         // 鑾峰彇婧愬簱浣嶄俊鎭�
-        LocMast sourceLocMast = locMastService.selectById(wrkMast.getSourceLocNo());
+        LocMast sourceLocMast = locMastService.getById(wrkMast.getSourceLocNo());
         if (sourceLocMast == null) {
             News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
             return null;
@@ -625,7 +682,7 @@
         }
 
         // 鑾峰彇搴撲綅淇℃伅
-        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+        LocMast locMast = locMastService.getById(wrkMast.getLocNo());
         if (locMast == null) {
             News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
             return null;
@@ -668,7 +725,7 @@
 
     //鍙屽伐浣嶅爢鍨涙満浠诲姟鎵ц瀹屾垚
     public synchronized void dualCrnIoExecuteFinish() {
-        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.list(new QueryWrapper<>());
         for (BasDualCrnp basDualCrnp : basDualCrnps) {
             DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
             if(dualCrnThread == null){
@@ -688,12 +745,12 @@
                 continue;
             }
 
-            if(dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getTaskSend() == 0 && dualCrnProtocol.getStatus() == DualCrnStatusType.WAITING.id) {
+            if((dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getDeviceTaskNo() > 0) && dualCrnProtocol.getTaskSend() == 0 && dualCrnProtocol.getStatus().equals(DualCrnStatusType.WAITING.id)) {
                 executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNo(), 1);
                 continue;
             }
 
-            if(dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getTaskSendTwo() == 0 && dualCrnProtocol.getStatusTwo() == DualCrnStatusType.WAITING.id) {
+            if((dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getDeviceTaskNoTwo() > 0) && dualCrnProtocol.getTaskSendTwo() == 0 && dualCrnProtocol.getStatusTwo().equals(DualCrnStatusType.WAITING.id)) {
                 executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNoTwo(), 2);
                 continue;
             }
@@ -759,9 +816,15 @@
                 return;
             }
 
-            DualCrnCommand resetCommand = dualCrnThread.getResetCommand(dualCrnProtocol.getCrnNo(), station);
+            DualCrnCommand resetCommand = dualCrnThread.getResetCommand(taskNo, dualCrnProtocol.getCrnNo(), station);
             boolean offer = MessageQueue.offer(SlaveType.DualCrn, dualCrnProtocol.getCrnNo(), new Task(3, resetCommand));
             if (offer) {
+                if (station == 1) {
+                    redisUtil.set(RedisKeyType.DUAL_CRN_STATION1_FLAG.key + basDualCrnp.getCrnNo(), 0, 60 * 60 * 24);
+                }else {
+                    redisUtil.set(RedisKeyType.DUAL_CRN_STATION2_FLAG.key + basDualCrnp.getCrnNo(), 0, 60 * 60 * 24);
+                }
+
                 wrkMast.setWrkSts(updateWrkSts);
                 wrkMast.setSystemMsg("");
                 wrkMast.setIoTime(new Date());
@@ -771,9 +834,10 @@
                 redisUtil.set(RedisKeyType.DUAL_CRN_IO_EXECUTE_FINISH_LIMIT.key + basDualCrnp.getCrnNo() + "_" + taskNo, "lock", 10);
             }
         }else {
-            DualCrnCommand resetCommand = dualCrnThread.getResetCommand(dualCrnProtocol.getCrnNo(), station);
+            DualCrnCommand resetCommand = dualCrnThread.getResetCommand(taskNo, dualCrnProtocol.getCrnNo(), station);
             MessageQueue.offer(SlaveType.DualCrn, dualCrnProtocol.getCrnNo(), new Task(3, resetCommand));
             News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护瀹屾垚纭鎴愬姛锛屽爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basDualCrnp.getCrnNo(), taskNo);
+            redisUtil.set(RedisKeyType.DUAL_CRN_IO_EXECUTE_FINISH_LIMIT.key + basDualCrnp.getCrnNo() + "_" + taskNo, "lock", 10);
         }
     }
 
@@ -804,8 +868,7 @@
         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")) {
@@ -840,6 +903,32 @@
         return false;
     }
 
+    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 boolean reassignTaskLocNo(WrkMast wrkMast, StationObjModel stationObjModel) {
         StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
         if (stationThread == null) {

--
Gitblit v1.9.1