From a55f2835748bd494ff46ca3e1a2d7d672153cb2f Mon Sep 17 00:00:00 2001
From: Administrator <XS@163.COM>
Date: 星期六, 25 四月 2026 13:50:38 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java |  290 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 203 insertions(+), 87 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
index 3d66a89..277d761 100644
--- a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
@@ -29,6 +29,8 @@
 import com.zy.core.model.param.SendDualCrnCommandParam;
 import com.zy.core.model.protocol.DualCrnProtocol;
 import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.task.MainProcessLane;
+import com.zy.core.task.MainProcessTaskSubmitter;
 import com.zy.core.thread.DualCrnThread;
 import com.zy.core.thread.StationThread;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -60,39 +62,52 @@
     private CommonService commonService;
     @Autowired
     private NotifyUtils notifyUtils;
+    @Autowired
+    private MainProcessTaskSubmitter mainProcessTaskSubmitter;
 
     //鍏ュ嚭搴�  ===>>  鍙屽伐浣嶅爢鍨涙満鍏ュ嚭搴撲綔涓氫笅鍙�
     public synchronized void dualCrnIoExecute() {
         List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
         for (BasDualCrnp basDualCrnp : basDualCrnps) {
-            DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
-            if(dualCrnThread == null){
-                continue;
-            }
-
-            DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
-            if(dualCrnProtocol == null){
-                continue;
-            }
-
-            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
-                    .eq("dual_crn_no", basDualCrnp.getCrnNo())
-                    .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts)
-            );
-            if(wrkMasts.size() >= 2){
-                continue;
-            }
-
-            if(dualCrnProtocol.getMode() != DualCrnModeType.AUTO.id) {
-                continue;
-            }
-
-            if(dualCrnProtocol.getAlarm() != 0) {
-                continue;
-            }
-
-            this.crnExecute(basDualCrnp, dualCrnThread);
+            dualCrnIoExecute(basDualCrnp);
         }
+    }
+
+    public void dualCrnIoExecute(BasDualCrnp basDualCrnp) {
+        if (basDualCrnp == null || basDualCrnp.getCrnNo() == null) {
+            return;
+        }
+        DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
+        if(dualCrnThread == null){
+            return;
+        }
+
+        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
+        if(dualCrnProtocol == null){
+            return;
+        }
+
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                .eq("dual_crn_no", basDualCrnp.getCrnNo())
+                .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts)
+        );
+        if(wrkMasts.size() >= 2){
+            return;
+        }
+
+        if(dualCrnProtocol.getMode() != DualCrnModeType.AUTO.id) {
+            return;
+        }
+
+        if(dualCrnProtocol.getAlarm() != 0) {
+            return;
+        }
+
+        if(dualCrnProtocol.getTaskSend() != 0 || dualCrnProtocol.getTaskSendTwo() != 0) {
+            return;
+        }
+
+        this.crnExecute(basDualCrnp, dualCrnThread);
     }
 
     private synchronized void crnExecute(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
@@ -105,24 +120,47 @@
             return;
         }
 
+        Object clearLock = redisUtil.get(RedisKeyType.CLEAR_DUAL_CRN_TASK_LIMIT.key + basDualCrnp.getCrnNo());
+        if (clearLock != null) {
+            return;
+        }
+
         // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
         if (dualCrnProtocol.getLastIo().equals("O")) {
-            processLoveMove(basDualCrnp, dualCrnThread);
-            processIn(basDualCrnp, dualCrnThread);
-            processOut(basDualCrnp, dualCrnThread);
+            boolean executeResult1 = processLoveMove(basDualCrnp, dualCrnThread);
+            if (executeResult1) {
+                return;
+            }
+            boolean executeResult2 = processIn(basDualCrnp, dualCrnThread);
+            if (executeResult2) {
+                return;
+            }
+            boolean executeResult3 = processOut(basDualCrnp, dualCrnThread);
+            if (executeResult3) {
+                return;
+            }
         }
         // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
         else if (dualCrnProtocol.getLastIo().equals("I")) {
-            processLoveMove(basDualCrnp, dualCrnThread);
-            processOut(basDualCrnp, dualCrnThread);
-            processIn(basDualCrnp, dualCrnThread);
+            boolean executeResult1 = processLoveMove(basDualCrnp, dualCrnThread);
+            if (executeResult1) {
+                return;
+            }
+            boolean executeResult2 = processOut(basDualCrnp, dualCrnThread);
+            if (executeResult2) {
+                return;
+            }
+            boolean executeResult3 = processIn(basDualCrnp, dualCrnThread);
+            if (executeResult3) {
+                return;
+            }
         }
     }
 
-    private void processIn(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
+    private boolean processIn(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
         List<WrkMast> inTaskList = getInTaskList(basDualCrnp);
         if (inTaskList.isEmpty()) {
-            return;
+            return false;
         }
 
         WrkMast stationOneWrkMast = inTaskList.get(0);
@@ -158,30 +196,33 @@
             MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, list));
             News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂鎴愬姛锛屽爢鍨涙満鍙�={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(list));
             dualCrnProtocol.setLastIo("I");
+            return true;
         }
+        return false;
     }
 
-    private void processOut(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
+    private boolean processOut(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
         List<WrkMast> outTaskList = getOutTaskList(basDualCrnp);
         if (outTaskList.isEmpty()) {
-            return;
+            return false;
         }
 
         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;
                 }
@@ -214,13 +255,15 @@
             MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, list));
             News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂鎴愬姛锛屽爢鍨涙満鍙�={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(list));
             dualCrnProtocol.setLastIo("O");
+            return true;
         }
+        return false;
     }
 
-    private void processLoveMove(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
+    private boolean processLoveMove(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
         List<WrkMast> locMoveTaskList = getLocMoveTaskList(basDualCrnp);
         if (locMoveTaskList.isEmpty()) {
-            return;
+            return false;
         }
 
         WrkMast stationOneWrkMast = null;
@@ -270,7 +313,9 @@
             MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, list));
             News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂鎴愬姛锛屽爢鍨涙満鍙�={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(list));
             dualCrnProtocol.setLastIo("O");
+            return true;
         }
+        return false;
     }
 
     private List<WrkMast> getInTaskList(BasDualCrnp basDualCrnp) {
@@ -432,6 +477,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()))) {
                 //绂佹鏀捐揣鍒楋紝鐢宠閲嶆柊鍒嗛厤
@@ -439,6 +488,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()))) {
                 //绂佹鏀捐揣鍒楋紝鐢宠閲嶆柊鍒嗛厤
@@ -487,6 +540,18 @@
         if (outStationList.isEmpty()) {
             News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍑哄簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
             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();
@@ -637,31 +702,91 @@
     public synchronized void dualCrnIoExecuteFinish() {
         List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
         for (BasDualCrnp basDualCrnp : basDualCrnps) {
-            DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
-            if(dualCrnThread == null){
+            dualCrnIoExecuteFinish(basDualCrnp);
+        }
+    }
+
+    public void dualCrnIoExecuteFinish(BasDualCrnp basDualCrnp) {
+        if (basDualCrnp == null || basDualCrnp.getCrnNo() == null) {
+            return;
+        }
+        DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
+        if(dualCrnThread == null){
+            return;
+        }
+
+        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
+        if(dualCrnProtocol == null){
+            return;
+        }
+
+        if(dualCrnProtocol.getMode() != DualCrnModeType.AUTO.id) {
+            return;
+        }
+
+        if(dualCrnProtocol.getAlarm() != 0) {
+            return;
+        }
+
+        if((dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getDeviceTaskNo() > 0) && dualCrnProtocol.getTaskSend() == 0 && dualCrnProtocol.getStatus().equals(DualCrnStatusType.WAITING.id)) {
+            executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNo(), 1);
+            return;
+        }
+
+        if((dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getDeviceTaskNoTwo() > 0) && dualCrnProtocol.getTaskSendTwo() == 0 && dualCrnProtocol.getStatusTwo().equals(DualCrnStatusType.WAITING.id)) {
+            executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNoTwo(), 2);
+        }
+    }
+
+    public void submitDualCrnIoTasks(long minIntervalMs) {
+        submitDualCrnIoTasks(MainProcessLane.DUAL_CRN_IO, minIntervalMs);
+    }
+
+    public void submitDualCrnIoTasks(MainProcessLane lane, long minIntervalMs) {
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
+        for (final BasDualCrnp basDualCrnp : basDualCrnps) {
+            Integer crnNo = basDualCrnp == null ? null : basDualCrnp.getCrnNo();
+            if (crnNo == null) {
                 continue;
             }
+            mainProcessTaskSubmitter.submitKeyedSerialTask(
+                    lane,
+                    crnNo,
+                    "dualCrnIoExecute",
+                    minIntervalMs,
+                    new Runnable() {
+                        @Override
+                        public void run() {
+                            dualCrnIoExecute(basDualCrnp);
+                        }
+                    }
+            );
+        }
+    }
 
-            DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
-            if(dualCrnProtocol == null){
+    public void submitDualCrnIoExecuteFinishTasks(long minIntervalMs) {
+        submitDualCrnIoExecuteFinishTasks(MainProcessLane.DUAL_CRN_IO_FINISH, minIntervalMs);
+    }
+
+    public void submitDualCrnIoExecuteFinishTasks(MainProcessLane lane, long minIntervalMs) {
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
+        for (final BasDualCrnp basDualCrnp : basDualCrnps) {
+            Integer crnNo = basDualCrnp == null ? null : basDualCrnp.getCrnNo();
+            if (crnNo == null) {
                 continue;
             }
-
-            if(dualCrnProtocol.getMode() != DualCrnModeType.AUTO.id) {
-                continue;
-            }
-
-            if(dualCrnProtocol.getAlarm() != 0) {
-                continue;
-            }
-
-            if(dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getStatus() == DualCrnStatusType.WAITING.id) {
-                executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNo(), 1);
-            }
-
-            if(dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getStatusTwo() == DualCrnStatusType.WAITING.id) {
-                executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNoTwo(), 2);
-            }
+            mainProcessTaskSubmitter.submitKeyedSerialTask(
+                    lane,
+                    crnNo,
+                    "dualCrnIoExecuteFinish",
+                    minIntervalMs,
+                    new Runnable() {
+                        @Override
+                        public void run() {
+                            dualCrnIoExecuteFinish(basDualCrnp);
+                        }
+                    }
+            );
         }
     }
 
@@ -678,28 +803,13 @@
             return;
         }
 
-        Object commandListObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + basDualCrnp.getCrnNo());
-        if (commandListObj == null) {
-            News.error("鍙屽伐浣嶅爢鍨涙満澶勪簬绛夊緟纭涓斾换鍔″畬鎴愮姸鎬侊紝浣嗘湭鎵惧埌鍛戒护銆傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basDualCrnp.getCrnNo(), taskNo);
-            return;
-        }
-        List<SendDualCrnCommandParam> dualCrnCommandParamList = JSON.parseArray(commandListObj.toString(), SendDualCrnCommandParam.class);
-        SendDualCrnCommandParam taskCommand = null;
-        for (SendDualCrnCommandParam sendDualCrnCommandParam : dualCrnCommandParamList) {
-            DualCrnCommand dualCrnCommand = sendDualCrnCommandParam.getCommands().get(0);
-            if(dualCrnCommand.getTaskNo() == taskNo){
-                taskCommand = sendDualCrnCommandParam;
-                break;
-            }
-        }
-        if (taskCommand == null) {
-            News.error("鍙屽伐浣嶅爢鍨涙満澶勪簬绛夊緟纭涓斾换鍔″畬鎴愮姸鎬侊紝浣嗘湭鎵惧埌鍛戒护銆傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basDualCrnp.getCrnNo(), taskNo);
-            return;
+        int idx = 10;
+        Object idxObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_IDX.key + wrkMast.getWrkNo());
+        if(idxObj != null) {
+            idx = (Integer) idxObj;
         }
 
-        Integer idx = taskCommand.getCommandIdx();
-        List<DualCrnCommand> commandList = taskCommand.getCommands();
-        if (idx >= commandList.size()) {
+        if (idx >= 2) {
             Long updateWrkSts = null;
             if (wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts) {
                 updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
@@ -739,21 +849,28 @@
                 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());
                 if (wrkMastService.updateById(wrkMast)) {
                     News.info("鍙屽伐浣嶅爢鍨涙満浠诲姟鐘舵�佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basDualCrnp.getCrnNo(), taskNo);
                 }
-                redisUtil.set(RedisKeyType.DUAL_CRN_IO_EXECUTE_FINISH_LIMIT.key + basDualCrnp.getCrnNo() + "_" + taskNo, "lock", 10);
+                redisUtil.set(RedisKeyType.DUAL_CRN_IO_EXECUTE_FINISH_LIMIT.key + basDualCrnp.getCrnNo() + "_" + taskNo, "lock", 3);
             }
         }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", 3);
         }
     }
 
@@ -784,8 +901,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")) {

--
Gitblit v1.9.1