From 2ea1c479596a2b5417319de0d230d79040491c0a Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期六, 10 一月 2026 19:21:30 +0800
Subject: [PATCH] 修复bug-深库位出库,浅库位有货时卡住并且锁表的情况

---
 src/main/java/com/zy/service/impl/MainServiceImpl.java |  170 ++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 114 insertions(+), 56 deletions(-)

diff --git a/src/main/java/com/zy/service/impl/MainServiceImpl.java b/src/main/java/com/zy/service/impl/MainServiceImpl.java
index d790c99..f80a683 100644
--- a/src/main/java/com/zy/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -50,7 +50,6 @@
  */
 @Slf4j
 @Service("mainService")
-@Transactional
 public class MainServiceImpl {
 
     @Autowired
@@ -106,6 +105,7 @@
      * 缁勬墭
      * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗o紝宸ヤ綔鐘舵�� 2
      */
+    @Transactional(rollbackFor = Exception.class)
     public synchronized void generateStoreWrkFile() {
         String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
         // 鏍规嵁杈撻�佺嚎plc閬嶅巻
@@ -159,7 +159,7 @@
                     back = true;
                 }
                 // 閫�鍥�
-                if (back   && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk()) {
+                if (back   && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk()  && !staProtocol.isEmptyMk()  ) {
                     MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                     staProtocol.setWorkNo(wrkNo);
                     wrkNo++;
@@ -228,6 +228,7 @@
                             devpThread.setPakMk(staProtocol.getSiteId(), false);
                             MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                             String errorMsg = jsonObject.getString("msg");
+                            log.error("鍏ㄧ増鍏ュ簱鍥為��,"+wrkNo+","+errorMsg);
                             if (!Cools.isEmpty(errorMsg)) {
                                 MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                             }
@@ -248,6 +249,7 @@
     /**
      * 鎷f枡銆佸苟鏉裤�佺洏鐐瑰啀鍏ュ簱
      */
+    @Transactional(rollbackFor = Exception.class)
     public synchronized void stnToCrnStnPick(Integer mark) {
         for (DevpSlave devp : slaveProperties.getDevp()) {
             // 閬嶅巻鎷f枡鍏ュ簱鍙�
@@ -442,54 +444,74 @@
 
     /**
      * 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
+     * 娉ㄦ剰锛氫娇鐢� REQUIRES_NEW 璁╂瘡涓爢鍨涙満鐨勫鐞嗗湪鐙珛浜嬪姟涓墽琛岋紝閬垮厤闀挎椂闂存寔鏈夐攣瀵艰嚧姝婚攣
      */
     public synchronized void crnIoExecute(Integer mark) {
-
-        for (CrnSlave crn : slaveProperties.getCrn()) {
-            // 鑾峰彇鍫嗗灈鏈轰俊鎭�
-            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
-            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
-            if (crnProtocol == null) {
-                continue;
-            }
-            BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
-            if (basCrnp == null) {
-                News.error(""+mark+" - 1"+" - {}鍙峰爢鍨涙満灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", crn.getId());
-                continue;
-            }
-
-            // 鍙湁褰撳爢鍨涙満绌洪棽 骞朵笖 鏃犱换鍔℃椂鎵嶇户缁墽琛�
-            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
-                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
-                News.warnNoLog(""+mark+" - 0"+" - 寮�濮嬫墽琛屽爢鍨涙満鍏ュ嚭搴撲綔涓氫笅鍙�");
-                // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
-                if (crnProtocol.getLastIo().equals("I")) {
-                    if (basCrnp.getInEnable().equals("Y")) {
-                        //mark - 1 - ....
-                        this.crnStnToLoc(crn, crnProtocol,mark); //  鍏ュ簱
-                        crnProtocol.setLastIo("O");
-                    } else if (basCrnp.getOutEnable().equals("Y")) {
-                        //mark - 2 - ....
-                        this.locToCrnStn(crn, crnProtocol,mark); //  鍑哄簱
-                        crnProtocol.setLastIo("I");
-                    }
-                }
-                // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
-                else if (crnProtocol.getLastIo().equals("O")) {
-                    if (basCrnp.getOutEnable().equals("Y")) {
-                        this.locToCrnStn(crn, crnProtocol,mark); //  鍑哄簱
-                        crnProtocol.setLastIo("I");
-                    } else if (basCrnp.getInEnable().equals("Y")) {
-                        this.crnStnToLoc(crn, crnProtocol,mark); //  鍏ュ簱
-                        crnProtocol.setLastIo("O");
-                    }
+        try {
+            for (CrnSlave crn : slaveProperties.getCrn()) {
+                try {
+                    // 姣忎釜鍫嗗灈鏈虹殑澶勭悊鍦ㄧ嫭绔嬩簨鍔′腑鎵ц锛屽揩閫熸彁浜ら噴鏀鹃攣
+                    processCrnIo(crn, mark);
+                } catch (Exception e) {
+                    News.error(""+mark+" - crnIoExecute"+" - 澶勭悊鍫嗗灈鏈簕}鏃跺彂鐢熷紓甯�", crn.getId(), e);
+                    // 缁х画澶勭悊涓嬩竴涓爢鍨涙満锛屼笉涓柇鏁翠釜娴佺▼
                 }
             }
-            // 搴撲綅绉昏浆
-            //mark - 3 - ....
-            this.locToLoc(crn, crnProtocol,mark);
+        } catch (Exception e) {
+            News.error(""+mark+" - crnIoExecute"+" - 鎵ц鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂鏃跺彂鐢熷紓甯�", e);
+            }
+    }
 
+    /**
+     * 澶勭悊鍗曚釜鍫嗗灈鏈虹殑鍏ュ嚭搴撲綔涓氾紙浣跨敤鐙珛浜嬪姟锛屽揩閫熸彁浜ら噴鏀鹃攣锛�
+     */
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    public void processCrnIo(CrnSlave crn, Integer mark) {
+        // 鑾峰彇鍫嗗灈鏈轰俊鎭�
+        CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
+        if (crnThread == null) {
+            return;
         }
+        CrnProtocol crnProtocol = crnThread.getCrnProtocol();
+        if (crnProtocol == null) {
+            return;
+        }
+        BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
+        if (basCrnp == null) {
+            News.error(""+mark+" - 1"+" - {}鍙峰爢鍨涙満灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", crn.getId());
+            return;
+        }
+
+        // 鍙湁褰撳爢鍨涙満绌洪棽 骞朵笖 鏃犱换鍔℃椂鎵嶇户缁墽琛�
+        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
+                && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
+            News.warnNoLog(""+mark+" - 0"+" - 寮�濮嬫墽琛屽爢鍨涙満鍏ュ嚭搴撲綔涓氫笅鍙�");
+            // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
+            if (crnProtocol.getLastIo().equals("I")) {
+                if (basCrnp.getInEnable().equals("Y")) {
+                    //mark - 1 - ....
+                    this.crnStnToLoc(crn, crnProtocol,mark); //  鍏ュ簱
+                    crnProtocol.setLastIo("O");
+                } else if (basCrnp.getOutEnable().equals("Y")) {
+                    //mark - 2 - ....
+                    this.locToCrnStn(crn, crnProtocol,mark); //  鍑哄簱
+                    crnProtocol.setLastIo("I");
+                }
+            }
+            // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
+            else if (crnProtocol.getLastIo().equals("O")) {
+                if (basCrnp.getOutEnable().equals("Y")) {
+                    this.locToCrnStn(crn, crnProtocol,mark); //  鍑哄簱
+                    crnProtocol.setLastIo("I");
+                } else if (basCrnp.getInEnable().equals("Y")) {
+                    this.crnStnToLoc(crn, crnProtocol,mark); //  鍏ュ簱
+                    crnProtocol.setLastIo("O");
+                }
+            }
+        }
+        // 搴撲綅绉昏浆
+        //mark - 3 - ....
+        this.locToLoc(crn, crnProtocol,mark);
     }
 
     /**
@@ -576,15 +598,22 @@
 
                 } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                     News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F銆丏  搴撲綅鐘舵��={}",shallowLoc.getLocSts());
+                    // 妫�鏌ユ槸鍚﹀凡瀛樺湪绉诲簱浠诲姟
+                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                     // 姝ゆ爣璁伴伩鍏嶅娆℃墽琛岀Щ搴撲换鍔�
-                    if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
+                    if (Cools.isEmpty(waitWrkMast) && (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk()))) {
                         wrkMast.setUpdMk("Y");
                         wrkMast.setIoPri(14D);
                         wrkMastMapper.updateById(wrkMast);
                         // 鐢熸垚宸ヤ綔妗�,灏嗘祬搴撲綅绉昏浆鍒版柊鐨勫簱浣嶄腑
-                        moveLocForDeepLoc(slave, shallowLoc,mark);
-                        // 鐢熸垚宸ヤ綔妗c�佹敼鍙樻祬搴撲綅鐨勬簮搴�/鐩爣搴� 搴撲綅鐘舵�併�佷笅鍙戝爢鍨涙満鍛戒护锛堢珛椹墽琛�)
-//                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast);
+                        try {
+                            moveLocForDeepLoc(slave, shallowLoc,mark);
+                            News.warnNoLog("{}浠诲姟宸茬敓鎴愭祬搴撲綅绉昏浆浠诲姟锛屾祬搴撲綅鍙�:{}锛岀户缁鐞嗕笅涓�涓换鍔�", wrkMast.getWrkNo(), shallowLocNo);
+                        } catch (Exception e) {
+                            News.error("{}浠诲姟鐢熸垚娴呭簱浣嶇Щ杞换鍔″け璐ワ紝娴呭簱浣嶅彿:{}", wrkMast.getWrkNo(), shallowLocNo, e);
+                        }
+                    } else if (!Cools.isEmpty(waitWrkMast)) {
+                        News.warnNoLog("{}浠诲姟鍏ュ簱绛夊緟涓紝娴呭簱浣嶅凡鏈夌Щ搴撲换鍔★紝娴呭簱浣嶅彿:{}锛岀Щ搴撲换鍔″彿:{}", wrkMast.getWrkNo(), shallowLocNo, waitWrkMast.getWrkNo());
                     }
                     continue;
                 } else if (shallowLoc.getLocSts().equals("Q")) {
@@ -677,9 +706,25 @@
 //                    continue;
                 }
 
-                // 鍒ゆ柇鍫嗗灈鏈哄嚭搴撶珯鐘舵��
-                if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
-                        && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
+                boolean outStationAvailable = true;
+                // 鏄惁妫�鏌ュ爢鍨涙満鍑哄簱绔欑姸鎬侊紙true: 妫�鏌ワ紝false: 涓嶆鏌ワ級
+                if (slaveProperties.isCheckOutStationStatus()) {
+                    // 妫�鏌ュ嚭搴撶珯鐘舵��
+                    outStationAvailable =
+                            //鑷姩
+                            staProtocol.isAutoing()
+                            //!鏈夌墿
+                            && !staProtocol.isLoading()
+                            //鑳藉嚭
+                            && staDetl.getCanouting() != null
+                            && staDetl.getCanouting().equals("Y")
+                            //宸ヤ綔鍙�
+                            && staProtocol.getWorkNo() == 0
+                            //鍙嚭
+                            && staProtocol.isOutEnable();
+                }
+                // 鍑哄簱绔欏彲鐢ㄦ椂缁х画鎵ц
+                if (outStationAvailable) {
                     // 鍫嗗灈鏈烘帶鍒惰繃婊�
                     if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
 //                        continue;
@@ -721,10 +766,19 @@
                                 wrkMast.setUpdMk("Y");
                                 wrkMastMapper.updateById(wrkMast);
                                 // 鐢熸垚宸ヤ綔妗�,灏嗘祬搴撲綅绉昏浆鍒版柊鐨勫簱浣嶄腑
-                                moveLocForDeepLoc(slave, shallowLoc,mark);
+                                try {
+                                    moveLocForDeepLoc(slave, shallowLoc,mark);
+                                    News.warnNoLog("{}浠诲姟宸茬敓鎴愭祬搴撲綅绉昏浆浠诲姟锛屾祬搴撲綅鍙�:{}锛岀户缁鐞嗕笅涓�涓换鍔�", wrkMast.getWrkNo(), shallowLocNo);
+                                    continue; // 宸茬敓鎴愮Щ搴撲换鍔★紝缁х画澶勭悊涓嬩竴涓换鍔�
+                                } catch (Exception e) {
+                                    News.error("{}浠诲姟鐢熸垚娴呭簱浣嶇Щ杞换鍔″け璐ワ紝娴呭簱浣嶅彿:{}", wrkMast.getWrkNo(), shallowLocNo, e);
+                                    continue; // 鐢熸垚澶辫触锛岀户缁鐞嗕笅涓�涓换鍔�
+                                }
+                            } else {
+                                // 宸插瓨鍦ㄧЩ搴撲换鍔★紝绛夊緟绉诲簱瀹屾垚
+                                News.warnNoLog("{}浠诲姟鍑哄簱绛夊緟涓紝娴呭簱浣嶅凡鏈夌Щ搴撲换鍔★紝娴呭簱浣嶅彿:{}锛岀Щ搴撲换鍔″彿:{}", wrkMast.getWrkNo(), shallowLocNo, waitWrkMast.getWrkNo());
+                                continue; // 缁х画澶勭悊涓嬩竴涓换鍔★紝涓嶉樆濉炲綋鍓嶅惊鐜�
                             }
-                            News.error("{}浠诲姟鍑哄簱澶辫触锛屾祬搴撲綅鍫靛锛佹祬搴撲綅鍙�:{}", wrkMast.getWrkNo(), shallowLocNo);
-                            break;
                         } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) {
                             News.warnNoLog(""+mark+" - 2"+" - 10"+" - // Q銆丼  搴撲綅鐘舵��={}",shallowLoc.getLocSts());
                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
@@ -1024,6 +1078,7 @@
     /**
      * 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
      */
+    @Transactional(rollbackFor = Exception.class)
     public synchronized void storeEmptyPlt(Integer mark) {
 
         for (DevpSlave devp : slaveProperties.getDevp()) {
@@ -1092,7 +1147,7 @@
                                 LedCommand ledCommand = new LedCommand();
                                 ledCommand.setWorkNo(dto.getWorkNo());
                                 ledCommand.setIoType(1);
-                                ledCommand.setTitle("鍏ㄦ澘鍏ュ簱");
+                                ledCommand.setTitle("绌烘澘鍏ュ簱");
                                 ledCommand.setLocNo(dto.getLocNo());
                                 ledCommand.setStaNo(dto.getStaNo());
                                 commands.add(ledCommand);
@@ -1105,13 +1160,15 @@
                             staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
                             devpThread.setPakMk(staProtocol.getSiteId(), false);
                             boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+                            String errorMsg = jsonObject.getString("msg");
+                            log.error("绌烘澘鍏ュ簱鍥為��"+wrkNo+","+errorMsg);
                             if (!result) {
                                 News.errorNoLog(""+mark+" - 2"+" - 鏇存柊plc绔欑偣淇℃伅澶辫触");
                                 throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触");
                             }
 
                             if (ledThread != null) {
-                                String errorMsg = jsonObject.getString("msg");
+
                                 if (!Cools.isEmpty(errorMsg)) {
                                     MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg));
                                 }
@@ -1303,6 +1360,7 @@
     /**
      * 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
      */
+    @Transactional(rollbackFor = Exception.class)
     public synchronized void ledExecute() {
         for (LedSlave led : slaveProperties.getLed()) {
             // 鑾峰彇杈撻�佺嚎plc绾跨▼

--
Gitblit v1.9.1