From 1ef1063281497f32fcfa4f14b07d99399c0bb765 Mon Sep 17 00:00:00 2001
From: jinglun-cloud <jinglun2019@foxmail.com>
Date: 星期四, 07 五月 2026 15:04:17 +0800
Subject: [PATCH] refactor(设备运动): 重构条码设备运动逻辑,提取运动常量并优化代码结构

---
 src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java |  119 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 82 insertions(+), 37 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index c161253..c10c64a 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -37,15 +37,7 @@
 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.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 
 @Component
 public class CrnOperateProcessUtils {
@@ -163,7 +155,7 @@
             if (wrkMast.getWrkSts() != null && wrkMast.getWrkSts() == WrkStsType.INBOUND_STATION_RUN_COMPLETE.sts) {
                 boolean result = this.crnExecuteInPlanner(currentCrn, crnThread, wrkMast);
                 if (result) {
-                    crnProtocol.setLastIo("O");
+                    crnProtocol.setLastIo("I");
                     return;
                 }
                 continue;
@@ -172,7 +164,7 @@
             if (wrkMast.getWrkSts() != null && wrkMast.getWrkSts() == WrkStsType.NEW_OUTBOUND.sts) {
                 boolean result = this.crnExecuteOutPlanner(currentCrn, crnThread, wrkMast);
                 if (result) {
-                    crnProtocol.setLastIo("I");
+                    crnProtocol.setLastIo("O");
                     return;
                 }
                 continue;
@@ -388,6 +380,12 @@
         }
 
         if (!allowBatchOutboundExecute(wrkMast, true)) {
+            return false;
+        }
+
+        //妫�鏌ユ槸鍚︿负鍑哄簱妯″紡
+        if(!checkOutTargetStationIoMode(wrkMast)) {
+            News.taskInfo(wrkMast.getWrkNo(), "鍫嗗灈鏈�:{} 浠诲姟:{}绂佹鎵ц锛屽嚭搴撶珯:{} 涓嶅浜庡嚭搴撴ā寮�", basCrnp.getCrnNo(), wrkMast.getWrkNo(), wrkMast.getStaNo());
             return false;
         }
 
@@ -622,6 +620,36 @@
         return false;
     }
 
+    //妫�鏌ユ槸鍚︿负鍑哄簱妯″紡
+    private boolean checkOutTargetStationIoMode(WrkMast wrkMast) {
+        if (wrkMast == null || wrkMast.getStaNo() == null) {
+            return false;
+        }
+        BasStation basStation = basStationService.getById(wrkMast.getStaNo());
+        if (basStation == null) {
+            return false;
+        }
+
+        StationThread targetStationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basStation.getDeviceNo());
+        if (targetStationThread == null) {
+            return false;
+        }
+
+        StationProtocol targetStationProtocol = targetStationThread.getStatusMap().get(wrkMast.getStaNo());
+        if (targetStationProtocol == null) {
+            return false;
+        }
+
+        if (targetStationProtocol.getIoMode() == null) {
+            return false;
+        }
+
+        if (targetStationProtocol.getIoMode() == 2) {
+            return true;//鍑哄簱妯″紡
+        }
+        return false;
+    }
+
     private int getSystemConfigInt(String code, int defaultValue) {
         Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
         if (systemConfigMapObj == null) {
@@ -690,36 +718,53 @@
                 return;
             }
 
-            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);
-            }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());
+            String ownerLockKey = RedisKeyType.CRN_IO_EXECUTE_FINISH_OWNER_LOCK.key + wrkMast.getWrkNo();
+            String ownerLockToken = UUID.randomUUID().toString();
+            if (!redisUtil.trySetStringIfAbsent(ownerLockKey, ownerLockToken, 10)) {
                 return;
             }
+            try {
+                wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
+                if (wrkMast == null) {
+                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", 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());
+                Long currentWrkSts = wrkMast.getWrkSts();
+                Long updateWrkSts = null;
+                Date now = new Date();
+                if(currentWrkSts == 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(currentWrkSts == 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);
+                }else if(currentWrkSts == 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(currentWrkSts == WrkStsType.CRN_MOVE_RUN.sts){
+                    updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
+                }else{
+                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                    return;
+                }
+
+                if (wrkMastService.updateWrkStsByWrkNoAndCurrentWrkSts(wrkMast.getWrkNo(), updateWrkSts, currentWrkSts) > 0) {
+                    wrkMast.setWrkSts(updateWrkSts);
+                    wrkMast.setSystemMsg("");
+                    wrkMast.setIoTime(now);
+                    wrkMast.setModiTime(now);
+                    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);
+                } else {
+                    News.info("鍫嗗灈鏈哄畬鎴愮‘璁よ烦杩囷紝浠诲姟鐘舵�佸凡鍙樺寲銆傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                }
+            } finally {
+                redisUtil.compareAndDelete(ownerLockKey, ownerLockToken);
             }
-
-            redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock",10);
         }
     }
 

--
Gitblit v1.9.1