From 35c26fb50cc90b85a8cf924f7b47e3ab412cabb5 Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期六, 10 一月 2026 19:41:14 +0800
Subject: [PATCH] 事务粒度调整

---
 src/main/java/com/zy/service/impl/MainServiceImpl.java |  495 +++++++++++++++++++++++++++++++++----------------------
 1 files changed, 297 insertions(+), 198 deletions(-)

diff --git a/src/main/java/com/zy/service/impl/MainServiceImpl.java b/src/main/java/com/zy/service/impl/MainServiceImpl.java
index b136ed2..6beaae6 100644
--- a/src/main/java/com/zy/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -36,6 +36,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
@@ -49,7 +50,6 @@
  */
 @Slf4j
 @Service("mainService")
-@Transactional
 public class MainServiceImpl {
 
     @Autowired
@@ -96,12 +96,16 @@
     @Value("${wms.url}")
     private String wmsUrl;
 
-    public Integer wrkNo = 9997;
+    @Autowired
+    private MainServiceImpl mainService;
+
+    public Integer wrkNo = 10000;
 
     /**
      * 缁勬墭
      * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗o紝宸ヤ綔鐘舵�� 2
      */
+    @Transactional(rollbackFor = Exception.class)
     public synchronized void generateStoreWrkFile() {
         String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
         // 鏍规嵁杈撻�佺嚎plc閬嶅巻
@@ -155,9 +159,10 @@
                     back = true;
                 }
                 // 閫�鍥�
-                if (back && (staProtocol.getWorkNo() == 9999 || staProtocol.getWorkNo() == 9998)  && 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++;
                     News.info("{}鍏ュ簱鍥為��锛歿}锛屼换鍔″彿锛歿}", inSta.getStaNo(), errMsg,wrkNo);
                     staProtocol.setStaNo(inSta.getBackSta().shortValue());
                     devpThread.setPakMk(staProtocol.getSiteId(), false);
@@ -167,11 +172,12 @@
                 }
 
                 // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
-                if (staProtocol.isAutoing()
-                        && staProtocol.isLoading()
-                        && staProtocol.isInEnable()
-                        && !staProtocol.isEmptyMk()
-                        && staProtocol.isPakMk() && staProtocol.getWorkNo() == 9999) {
+                if (staProtocol.isAutoing() //鑷姩
+                        && staProtocol.isLoading() //鏈夌墿
+                        && staProtocol.isInEnable() //鍙叆
+                        && !staProtocol.isEmptyMk() // 闈炵┖鏉�
+                        && staProtocol.isPakMk() //闃叉閲嶅涓嬪彂淇″彿 绔欑偣鏃犵墿 鏃犱换鍔″彿浼氳嚜鍔ㄥ彉鎴恡rue
+                ) {
                     if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) {
                         News.info("{}鏉$爜鎵弿閿欒锛歿}",barcodeThread.getSlave().getId(),barcode);
                         continue;
@@ -217,10 +223,12 @@
                             }
                         } else {
                             staProtocol.setWorkNo(wrkNo);
+                            wrkNo++;
                             staProtocol.setStaNo(inSta.getBackSta().shortValue());
                             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));
                             }
@@ -241,6 +249,7 @@
     /**
      * 鎷f枡銆佸苟鏉裤�佺洏鐐瑰啀鍏ュ簱
      */
+    @Transactional(rollbackFor = Exception.class)
     public synchronized void stnToCrnStnPick(Integer mark) {
         for (DevpSlave devp : slaveProperties.getDevp()) {
             // 閬嶅巻鎷f枡鍏ュ簱鍙�
@@ -289,6 +298,7 @@
                     if (Cools.isEmpty(staDesc)) {
                         News.error(""+mark+" - 2"+" - 鍏ュ簱璺緞涓嶅瓨鍦紒type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
                         staProtocol.setWorkNo(wrkNo);
+                        wrkNo++;
                         staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue()-(short)1));
                         devpThread.setPakMk(staProtocol.getSiteId(), false);
                         MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -370,118 +380,161 @@
     public synchronized void crnStnToOutStn(Integer mark) {
 
         for (CrnSlave crnSlave : slaveProperties.getCrn()) {
-            // 閬嶅巻鍫嗗灈鏈哄嚭搴撶珯
-            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
-                // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
-                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
-                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
-                if (staProtocol == null) {
-                    continue;
-                } else {
-                    staProtocol = staProtocol.clone();
-                }
-                if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
-                    // 鏌ヨ宸ヤ綔妗�
-                    WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(staProtocol.getSiteId());
-                    if (wrkMast == null) {
-                        continue;
-                    }
-                    // 鍒ゆ柇宸ヤ綔妗f潯浠�
-                    if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) {
-                        continue;
-                    }
-                    // 鍒ゆ柇鍚婅溅鏄惁瀹為檯宸插畬鎴愶紝涓旂數鑴戠姸鎬佸湪move涓紝浠ュ鐢佃剳杩涜鏇存柊宸ヤ綔妗�
-                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo());
-                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
-                    if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
-                        // 绉诲姩涓�
-                        continue;
-                    }
-                    //  鍒ゆ柇鍫嗗灈鏈虹姸鎬佺瓑寰呯‘璁�
-                    if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())
-                            && crnProtocol.statusType == CrnStatusType.WAITING
-                            && crnProtocol.forkPosType == CrnForkPosType.HOME) {
-
-                        // 鍛戒护涓嬪彂鍖�.鏇存柊宸ヤ綔妗g姸鎬佷负14 涓嬪彂绔欑偣淇℃伅--------------------------------------------------------------------------
-                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
-                        wrkMast.setWrkSts(14L);
-                        staProtocol.setWorkNo(wrkMast.getWrkNo());
-
-                        if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) {
-                            continue;
-                        }
-                        wrkMast.setCrnEndTime(new Date());
-                        if (wrkMastMapper.updateById(wrkMast) != 0) {
-                            // 澶嶄綅鍫嗗灈鏈�
-                            News.info("鍑哄簱浠诲姟瀹屾垚涓嬪彂鍫嗗灈鏈哄浣�,浠诲姟鍙凤細{}",wrkMast.getWrkNo());
-                            crnThread.setResetFlag(true);
-                        } else {
-                            News.error(""+mark+" - 1"+" - 鏇存柊宸ヤ綔妗g殑宸ヤ綔鐘舵�佷负14澶辫触锛侊紒锛� [宸ヤ綔鍙�:{}]", wrkMast.getWrkNo());
-                        }
-
-                    }else {
-                        News.errorNoLog(""+mark+" - 6"+" - 鍫嗗灈鏈轰俊鎭笉绗﹀悎鍏ュ簱鏉′欢锛侊紒锛�"
-                                +" 鍫嗗灈鏈虹姸鎬侊細"+crnProtocol.modeType+"==鑷姩AUTO锛�" + CrnModeType.AUTO
-                                +"銆佸爢鍨涙満浠诲姟鍙凤細"+crnProtocol.getTaskNo()+"==宸ヤ綔妗d换鍔″彿锛�" + wrkMast.getWrkNo().shortValue()
-                                +"銆佺姸鎬佹灇涓撅細"+crnProtocol.statusType+"==WAITING锛�10 //浠诲姟瀹屾垚绛夊緟WCS纭)锛�" + CrnStatusType.WAITING
-                                +"銆佽揣鍙変綅缃細"+crnProtocol.forkPosType+"==HOME锛�0  // 璐у弶鍘熶綅锛�" + CrnForkPosType.HOME);
-                    }
-
-                }
+            try {
+                // 姣忓彴鍫嗗灈鏈虹殑鎵�鏈夊嚭搴撶珯澶勭悊鍦ㄥ悓涓�涓簨鍔′腑鎵ц锛屽揩閫熸彁浜ら噴鏀鹃攣
+                processCrnStnToOutStnForCrn(crnSlave, mark);
+            } catch (Exception e) {
+                News.error(""+mark+" - crnStnToOutStn"+" - 澶勭悊鍫嗗灈鏈簕}鏃跺彂鐢熷紓甯�", crnSlave.getId(), e);
+                // 缁х画澶勭悊涓嬩竴鍙板爢鍨涙満锛屼笉涓柇鏁翠釜娴佺▼
             }
         }
     }
 
     /**
-     * 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
+     * 澶勭悊鍗曞彴鍫嗗灈鏈虹殑鎵�鏈夊嚭搴撶珯鎿嶄綔锛堜娇鐢ㄧ嫭绔嬩簨鍔★紝蹇�熸彁浜ら噴鏀鹃攣锛�
+     * 娉ㄦ剰锛氬繀椤绘槸public鏂规硶锛孲pring AOP鎵嶈兘浠g悊浜嬪姟
      */
-    public synchronized void crnIoExecute(Integer mark) {
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    public void processCrnStnToOutStnForCrn(CrnSlave crnSlave, Integer mark) {
+        // 閬嶅巻鍫嗗灈鏈哄嚭搴撶珯
+        for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
+            processCrnStnToOutStn(crnStn, mark);
+        }
+    }
 
-        for (CrnSlave crn : slaveProperties.getCrn()) {
-            // 鑾峰彇鍫嗗灈鏈轰俊鎭�
-            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
+    /**
+     * 澶勭悊鍗曚釜鍫嗗灈鏈哄嚭搴撶珯鐨勫嚭搴撴搷浣滐紙鏃犱簨鍔★紝浜嬪姟鐢变笂灞傛柟娉曠鐞嗭級
+     */
+    private void processCrnStnToOutStn(CrnSlave.CrnStn crnStn, Integer mark) {
+        // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
+        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
+        StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+        if (staProtocol == null) {
+            return;
+        } else {
+            staProtocol = staProtocol.clone();
+        }
+        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
+            // 鏌ヨ宸ヤ綔妗�
+            WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(staProtocol.getSiteId());
+            if (wrkMast == null) {
+                return;
+            }
+            // 鍒ゆ柇宸ヤ綔妗f潯浠�
+            if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) {
+                return;
+            }
+            // 鍒ゆ柇鍚婅溅鏄惁瀹為檯宸插畬鎴愶紝涓旂數鑴戠姸鎬佸湪move涓紝浠ュ鐢佃剳杩涜鏇存柊宸ヤ綔妗�
+            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo());
             CrnProtocol crnProtocol = crnThread.getCrnProtocol();
-            if (crnProtocol == null) {
-                continue;
+            if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
+                // 绉诲姩涓�
+                return;
             }
-            BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
-            if (basCrnp == null) {
-                News.error(""+mark+" - 1"+" - {}鍙峰爢鍨涙満灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", crn.getId());
-                continue;
-            }
+            //  鍒ゆ柇鍫嗗灈鏈虹姸鎬佺瓑寰呯‘璁�
+            if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())
+                    && crnProtocol.statusType == CrnStatusType.WAITING
+                    && crnProtocol.forkPosType == CrnForkPosType.HOME) {
 
-            // 鍙湁褰撳爢鍨涙満绌洪棽 骞朵笖 鏃犱换鍔℃椂鎵嶇户缁墽琛�
-            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");
-                    }
+                // 鍛戒护涓嬪彂鍖�.鏇存柊宸ヤ綔妗g姸鎬佷负14 涓嬪彂绔欑偣淇℃伅--------------------------------------------------------------------------
+                staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
+                wrkMast.setWrkSts(14L);
+                staProtocol.setWorkNo(wrkMast.getWrkNo());
+
+                if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) {
+                    return;
                 }
-                // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
-                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");
-                    }
+                wrkMast.setCrnEndTime(new Date());
+                if (wrkMastMapper.updateById(wrkMast) != 0) {
+                    // 澶嶄綅鍫嗗灈鏈�
+                    News.info("鍑哄簱浠诲姟瀹屾垚涓嬪彂鍫嗗灈鏈哄浣�,浠诲姟鍙凤細{}",wrkMast.getWrkNo());
+                    crnThread.setResetFlag(true);
+                } else {
+                    News.error(""+mark+" - 1"+" - 鏇存柊宸ヤ綔妗g殑宸ヤ綔鐘舵�佷负14澶辫触锛侊紒锛� [宸ヤ綔鍙�:{}]", wrkMast.getWrkNo());
+                    throw new CoolException("鏇存柊宸ヤ綔妗g殑宸ヤ綔鐘舵�佷负14澶辫触");
                 }
+
+            }else {
+                News.errorNoLog(""+mark+" - 6"+" - 鍫嗗灈鏈轰俊鎭笉绗﹀悎鍏ュ簱鏉′欢锛侊紒锛�"
+                        +" 鍫嗗灈鏈虹姸鎬侊細"+crnProtocol.modeType+"==鑷姩AUTO锛�" + CrnModeType.AUTO
+                        +"銆佸爢鍨涙満浠诲姟鍙凤細"+crnProtocol.getTaskNo()+"==宸ヤ綔妗d换鍔″彿锛�" + wrkMast.getWrkNo().shortValue()
+                        +"銆佺姸鎬佹灇涓撅細"+crnProtocol.statusType+"==WAITING锛�10 //浠诲姟瀹屾垚绛夊緟WCS纭)锛�" + CrnStatusType.WAITING
+                        +"銆佽揣鍙変綅缃細"+crnProtocol.forkPosType+"==HOME锛�0  // 璐у弶鍘熶綅锛�" + CrnForkPosType.HOME);
             }
-            // 搴撲綅绉昏浆
-            //mark - 3 - ....
-            this.locToLoc(crn, crnProtocol,mark);
 
         }
+    }
+
+    /**
+     * 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
+     * 娉ㄦ剰锛氫娇鐢� REQUIRES_NEW 璁╂瘡涓爢鍨涙満鐨勫鐞嗗湪鐙珛浜嬪姟涓墽琛岋紝閬垮厤闀挎椂闂存寔鏈夐攣瀵艰嚧姝婚攣
+     */
+    public synchronized void crnIoExecute(Integer mark) {
+        try {
+            for (CrnSlave crn : slaveProperties.getCrn()) {
+                try {
+                    // 姣忎釜鍫嗗灈鏈虹殑澶勭悊鍦ㄧ嫭绔嬩簨鍔′腑鎵ц锛屽揩閫熸彁浜ら噴鏀鹃攣
+                    processCrnIo(crn, mark);
+                } catch (Exception e) {
+                    News.error(""+mark+" - crnIoExecute"+" - 澶勭悊鍫嗗灈鏈簕}鏃跺彂鐢熷紓甯�", crn.getId(), e);
+                    // 缁х画澶勭悊涓嬩竴涓爢鍨涙満锛屼笉涓柇鏁翠釜娴佺▼
+                }
+            }
+        } 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);
     }
 
     /**
@@ -568,15 +621,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")) {
@@ -669,9 +729,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;
@@ -713,10 +789,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);
@@ -1016,6 +1101,7 @@
     /**
      * 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
      */
+    @Transactional(rollbackFor = Exception.class)
     public synchronized void storeEmptyPlt(Integer mark) {
 
         for (DevpSlave devp : slaveProperties.getDevp()) {
@@ -1040,13 +1126,13 @@
                 }
 
                 // 绔欑偣鏉′欢鍒ゆ柇
-                if (staProtocol.isAutoing()
-                        && staProtocol.isLoading()
-                        && staProtocol.isInEnable()
-                        && staProtocol.isEmptyMk()
-                        && staProtocol.isPakMk()
-                        && staProtocol.getWorkNo() == 9998 // 9997 鍥為�� 9998 绌� 9999 婊�
-                        ) {
+                if (staProtocol.isAutoing()  //鑷姩
+                        && staProtocol.isLoading() //鏈夌墿
+                        && staProtocol.isInEnable() //鍙叆
+                        && staProtocol.isEmptyMk()// 绌烘澘
+                        && staProtocol.isPakMk() //闃叉閲嶅涓嬪彂淇″彿 绔欑偣鏃犵墿 鏃犱换鍔″彿浼氳嚜鍔ㄥ彉鎴恡rue
+
+                ) {
                     News.warnNoLog(""+mark+" - 0"+" - 寮�濮嬫墽琛岋細绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�");
 
                     try {
@@ -1068,7 +1154,7 @@
 
                             // 鏇存柊绔欑偣淇℃伅 涓� 涓嬪彂plc鍛戒护
                             staProtocol.setWorkNo(dto.getWorkNo());
-                            staProtocol.setStaNo(staProtocol.getSiteId().shortValue());
+                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                             devpThread.setPakMk(staProtocol.getSiteId(), false);
                             boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                             log.error("杈撻�佺嚎涓嬪彂6锛�"+dto.getWorkNo()+","+staProtocol.getSiteId());
@@ -1084,7 +1170,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);
@@ -1093,16 +1179,19 @@
                             }
                         } else {
                             staProtocol.setWorkNo(wrkNo);
+                            wrkNo++;
                             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));
                                 }
@@ -1294,6 +1383,7 @@
     /**
      * 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
      */
+    @Transactional(rollbackFor = Exception.class)
     public synchronized void ledExecute() {
         for (LedSlave led : slaveProperties.getLed()) {
             // 鑾峰彇杈撻�佺嚎plc绾跨▼
@@ -1448,10 +1538,14 @@
      * 鍥犲弻娣卞簱浣嶉樆濉烇紝瀵规祬搴撲綅杩涜绉昏浆锛堢珛鍗虫墽琛岀増)
      * tip锛氬悓姝�
      */
-    private synchronized void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc,Integer mark) {
+    /**
+     * 鍥犲弻娣卞簱浣嶉樆濉烇紝瀵规祬搴撲綅杩涜绉昏浆锛堢珛鍗虫墽琛岀増)
+     * tip锛氬悓姝�
+     */
+    private synchronized void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc, Integer mark) {
 
         try {
-            News.warnNoLog(""+mark+"moveLocForDeepLoc"+" - 0"+" - 寮�濮嬫墽琛�:鍥犲弻娣卞簱浣嶉樆濉烇紝瀵规祬搴撲綅杩涜绉昏浆锛堢珛鍗虫墽琛岀増)");
+            News.warnNoLog("" + mark + "moveLocForDeepLoc" + " - 0" + " - 寮�濮嬫墽琛�:鍥犲弻娣卞簱浣嶉樆濉烇紝瀵规祬搴撲綅杩涜绉昏浆锛堢珛鍗虫墽琛岀増)");
             List<Integer> rows = locMastService.queryDistinctRow(crn.getId());
             LocMast loc = null;
             for (Integer row : rows) {
@@ -1493,81 +1587,86 @@
             }
 
             if (null == loc) {
-                News.error(""+mark+"moveLocForDeepLoc"+" - 1"+" - 鍙屾繁搴撲綅 --- 娴呭簱浣嶉樆濉炲紓甯革紒 寰呯Щ杞祬搴撲綅锛�" + shallowLoc.getLocNo());
+                News.error("" + mark + "moveLocForDeepLoc" + " - 1" + " - 鍙屾繁搴撲綅 --- 娴呭簱浣嶉樆濉炲紓甯革紒 寰呯Щ杞祬搴撲綅锛�" + shallowLoc.getLocNo());
 //                throw new CoolException("鍙屾繁搴撲綅 --- 娴呭簱浣嶉樆濉炲紓甯革紒 寰呯Щ杞祬搴撲綅锛�" + shallowLoc.getLocNo());
-            } else {
+            }else {
+                mainService.createMoveWrkMast(crn, shallowLoc, loc);
+            }
 
-                // 鑾峰彇宸ヤ綔鍙�
-                int workNo = commonService.getWorkNo(0);
-                // 淇濆瓨宸ヤ綔妗�
-                WrkMast wrkMast = new WrkMast();
-                wrkMast.setWrkNo(workNo);
-                wrkMast.setIoTime(new Date());
-                wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
-                wrkMast.setIoType(11); // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
-                wrkMast.setIoPri(13D);
-                wrkMast.setCrnNo(crn.getId());
-                wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 婧愬簱浣�
-                wrkMast.setLocNo(loc.getLocNo()); // 鐩爣搴撲綅
-                wrkMast.setFullPlt(shallowLoc.getFullPlt()); // 婊℃澘
-                wrkMast.setPicking("N"); // 鎷f枡
-                wrkMast.setExitMk("N"); // 閫�鍑�
-                wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 绌烘澘
-                wrkMast.setBarcode(shallowLoc.getBarcode()); // 鎵樼洏鐮�
-                wrkMast.setLinkMis("N");
-                wrkMast.setAppeTime(new Date());
-                wrkMast.setModiTime(new Date());
-                int res = wrkMastMapper.insert(wrkMast);
-                if (res == 0) {
-                    News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 2" + " - 淇濆瓨宸ヤ綔妗eけ璐�");
-                    throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
-                }
-                // 宸ヤ綔妗f槑缁嗕繚瀛�
-                if (shallowLoc.getLocSts().equals("F")) {
-                    List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo()));
-                    for (LocDetl locDetl : locDetls) {
-                        WrkDetl wrkDetl = new WrkDetl();
-                        wrkDetl.setWrkNo(workNo);
-                        wrkDetl.setIoTime(new Date());
-                        wrkDetl.setAnfme(locDetl.getAnfme());
-                        VersionUtils.setWrkDetl(wrkDetl, locDetl); // 鐗堟湰鎺у埗
-                        wrkDetl.setAppeTime(new Date());
-                        wrkDetl.setModiTime(new Date());
-                        if (!wrkDetlService.insert(wrkDetl)) {
-                            News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 3" + " - 淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
-                            throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
-                        }
-                    }
-                }
-                // 淇敼婧愬簱浣嶇姸鎬�
-                if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) {
-                    shallowLoc.setLocSts("R"); // R.鍑哄簱棰勭害
-                    shallowLoc.setModiTime(new Date());
-                    if (!locMastService.updateById(shallowLoc)) {
-                        News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 4" + " - 鏇存柊婧愬簱浣嶇姸鎬佸け璐�");
-                        throw new CoolException("鏇存柊婧愬簱浣嶇姸鎬佸け璐�");
-                    }
-                } else {
-                    News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 5" + " - 婧愬簱浣嶅嚭搴撳け璐�");
-                    throw new CoolException("婧愬簱浣嶅嚭搴撳け璐�");
-                }
-                // 淇敼鐩爣搴撲綅鐘舵��
-                if (loc.getLocSts().equals("O")) {
-                    loc.setLocSts("S"); // S.鍏ュ簱棰勭害
-                    loc.setModiTime(new Date());
-                    if (!locMastService.updateById(loc)) {
-                        News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 6" + " - 鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
-                        throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
-                    }
-                } else {
-                    News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 7" + " - 绉昏浆澶辫触");
-                    throw new CoolException("绉昏浆澶辫触");
+
+        } catch (Exception e) {
+            News.error("" + mark + "moveLocForDeepLoc" + " - 8" + " - 鍙屾繁搴撲綅闃诲锛屽娴呭簱浣嶈繘琛岀Щ杞け璐�", e);
+
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public synchronized void createMoveWrkMast(CrnSlave crn, LocMast shallowLoc, LocMast loc) {
+        // 鑾峰彇宸ヤ綔鍙�
+        int workNo = commonService.getWorkNo(0);
+        // 淇濆瓨宸ヤ綔妗�
+        WrkMast wrkMast = new WrkMast();
+        wrkMast.setWrkNo(workNo);
+        wrkMast.setIoTime(new Date());
+        wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+        wrkMast.setIoType(11); // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
+        wrkMast.setIoPri(13D);
+        wrkMast.setCrnNo(crn.getId());
+        wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 婧愬簱浣�
+        wrkMast.setLocNo(loc.getLocNo()); // 鐩爣搴撲綅
+        wrkMast.setFullPlt(shallowLoc.getLocSts().equals("F") ? "Y" : "N"); // 婊℃澘锛歒
+        wrkMast.setPicking("N"); // 鎷f枡
+        wrkMast.setExitMk("N"); // 閫�鍑�
+        wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 绌烘澘
+        wrkMast.setBarcode(shallowLoc.getBarcode()); // 鎵樼洏鐮�
+        wrkMast.setLinkMis("N");
+        wrkMast.setAppeTime(new Date());
+        wrkMast.setModiTime(new Date());
+        int res = wrkMastMapper.insert(wrkMast);
+        if (res == 0) {
+            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 2" + " - 淇濆瓨宸ヤ綔妗eけ璐�");
+            throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+        }
+        // 宸ヤ綔妗f槑缁嗕繚瀛�
+        if (shallowLoc.getLocSts().equals("F")) {
+            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo()));
+            for (LocDetl locDetl : locDetls) {
+                WrkDetl wrkDetl = new WrkDetl();
+                wrkDetl.setWrkNo(workNo);
+                wrkDetl.setIoTime(new Date());
+                wrkDetl.setAnfme(locDetl.getAnfme());
+                VersionUtils.setWrkDetl(wrkDetl, locDetl); // 鐗堟湰鎺у埗
+                wrkDetl.setAppeTime(new Date());
+                wrkDetl.setModiTime(new Date());
+                if (!wrkDetlService.insert(wrkDetl)) {
+                    News.errorNoLog(""  + "moveLocForDeepLoc" + " - 3" + " - 淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                    throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
                 }
             }
-        } catch (Exception e) {
-            News.error(""+mark+"moveLocForDeepLoc"+" - 8"+" - 鍙屾繁搴撲綅闃诲锛屽娴呭簱浣嶈繘琛岀Щ杞け璐�", e);
-            e.printStackTrace();
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+        // 淇敼婧愬簱浣嶇姸鎬�
+        if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) {
+            shallowLoc.setLocSts("R"); // R.鍑哄簱棰勭害
+            shallowLoc.setModiTime(new Date());
+            if (!locMastService.updateById(shallowLoc)) {
+                News.errorNoLog(""  + "moveLocForDeepLoc" + " - 4" + " - 鏇存柊婧愬簱浣嶇姸鎬佸け璐�");
+                throw new CoolException("鏇存柊婧愬簱浣嶇姸鎬佸け璐�");
+            }
+        } else {
+            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 5" + " - 婧愬簱浣嶅嚭搴撳け璐�");
+            throw new CoolException("婧愬簱浣嶅嚭搴撳け璐�");
+        }
+        // 淇敼鐩爣搴撲綅鐘舵��
+        if (loc.getLocSts().equals("O")) {
+            loc.setLocSts("S"); // S.鍏ュ簱棰勭害
+            loc.setModiTime(new Date());
+            if (!locMastService.updateById(loc)) {
+                News.errorNoLog(""  + "moveLocForDeepLoc" + " - 6" + " - 鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
+                throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
+            }
+        } else {
+            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 7" + " - 绉昏浆澶辫触");
+            throw new CoolException("绉昏浆澶辫触");
         }
     }
 

--
Gitblit v1.9.1