From fffbf0c777f1189c7eed623b15660dbcbe50d2a1 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 02 八月 2023 13:29:03 +0800
Subject: [PATCH] 库位移转

---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |  304 +++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 261 insertions(+), 43 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index 8d4bafe..731db7f 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -851,7 +851,7 @@
                     && shuttleProtocol.getFree() == ShuttleStatusType.IDLE.id
             ) {
                 //灏嗕换鍔℃。鏍囪涓哄畬鎴�
-                WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo().intValue());
+                WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo());
                 if (wrkMast != null) {
                     switch (wrkMast.getWrkSts().intValue()) {
                         case 5://5.灏忚溅鎼繍涓� ==> 9.鍏ュ簱瀹屾垚
@@ -1091,6 +1091,9 @@
                             break;
                         case 24://24.鎻愬崌鏈烘惉杩愪腑 ==> 25.鎻愬崌鏈烘惉杩愬畬鎴�
                             wrkMast.setWrkSts(25L);
+                            if (wrkMast.getIoType() == 11) {//搴撲綅绉昏浆
+                                wrkMast.setWrkSts(4L);//4.鎻愬崌鏈烘惉杩愬畬鎴�
+                            }
                             break;
                         case 104://104.鎻愬崌鏈烘惉杩愪腑 ==> 105.鎻愬崌鏈烘惉杩愬畬鎴�
                             wrkMast.setWrkSts(105L);
@@ -1127,67 +1130,282 @@
         //鏌ヨ搴撲綅绉昏浆宸ヤ綔妗�
         List<WrkMast> wrkMasts1 = wrkMastMapper.selectLocToLocWrkMast();
         for (WrkMast wrkMast : wrkMasts1) {
-            boolean step1 = this.locToLocExecuteStep1(wrkMast);//搴撲綅绉昏浆
-            if (!step1) {
-                continue;
+            if (wrkMast.getSourceLocNo().equals(wrkMast.getLocNo())) {
+                boolean step1 = this.locToLocExecuteStep1(wrkMast);//鍚屾ゼ灞傚簱浣嶇Щ杞�
+                if (!step1) {
+                    continue;
+                }
+            }else {
+                //璺ㄦゼ灞傚簱浣嶇Щ杞�
+                boolean step2 = this.locToLocExecuteStep2(wrkMast);//璋冨害杞﹁締鍙栬揣骞惰繍閫佸埌鍑哄簱鍙�
+                if (!step2) {
+                    continue;
+                }
+
+                boolean step3 = this.locToLocExecuteStep3(wrkMast);//鎻愬崌鏈烘惉杩愯揣鐗�
+                if (!step3) {
+                    continue;
+                }
+
+                boolean step4 = this.locToLocExecuteStep4(wrkMast);//璋冨害杞﹁締鍙栬揣骞惰繍閫佸埌鍑哄簱鍙�
+                if (!step4) {
+                    continue;
+                }
+
             }
 
         }
     }
 
     /**
-     * 搴撲綅绉昏浆
+     * 鍚屾ゼ灞傚簱浣嶇Щ杞�
      * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
      * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
      */
     private boolean locToLocExecuteStep1(WrkMast wrkMast) {
-        if (wrkMast.getShuttleNo() == null) {
-            shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
+        if (wrkMast.getWrkSts() == 21) {//21.鐢熸垚鍑哄簱浠诲姟
+            if (wrkMast.getShuttleNo() == null) {
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
+                return false;
+            }
+
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+            if (!shuttleProtocol.isIdle()) {
+                return false;
+            }
+
+            //鍒ゆ柇灏忚溅鏄惁鍒拌揪婧愬簱浣�
+            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
+                //灏忚溅涓嶅湪婧愬簱浣嶄綅缃�
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
+                return false;
+            }
+
+            //灏忚溅宸叉姷杈炬簮搴撲綅锛岃繘琛屾惉杩愯揣鐗�
+            NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getSourceLocNo(), wrkMast.getLocNo());
+            if (result == null) {//璺緞璁$畻澶辫触
+                return false;
+            }
+
+            //鍒涘缓鍒嗛厤鍛戒护
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
+            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.PAK_IN.id.shortValue());//鍏ュ簱妯″紡
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
+            assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
+            assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
+
+            wrkMast.setWrkSts(5L);//21.鐢熸垚鍑哄簱浠诲姟 => 5.灏忚溅鎼繍涓�
+            wrkMast.setModiTime(new Date());
+            if (wrkMastMapper.updateById(wrkMast) > 0) {
+                //涓嬪彂浠诲姟
+                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+            }
+
             return false;
         }
+        return true;
+    }
 
-        //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-        NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
-        if (shuttleThread == null) {
+    /**
+     * 璺ㄦゼ灞傚簱浣嶇Щ杞�-璋冨害杞﹁締鍙栬揣骞惰繍閫佸埌鍑哄簱鍙�
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    private boolean locToLocExecuteStep2(WrkMast wrkMast) {
+        if (wrkMast.getWrkSts() == 21) {//21.鐢熸垚鍑哄簱浠诲姟
+            if (wrkMast.getShuttleNo() == null) {
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
+                return false;
+            }
+
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+            if (!shuttleProtocol.isIdle()) {
+                return false;
+            }
+
+            //鍒ゆ柇灏忚溅鏄惁鍒拌揪婧愬簱浣�
+            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
+                //灏忚溅涓嶅湪婧愬簱浣嶄綅缃�
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
+                return false;
+            }
+
+            //鑾峰彇绌挎杞︽渶杩戜笖绌洪棽鐨勬彁鍗囨満杈撻�佺珯鐐�
+            BasDevp liftSta = shuttleDispatchUtils.getRecentLiftSta(shuttleThread.getSlave().getId());
+            if (liftSta == null) {
+                return false;//娌℃湁鍙敤涓旂┖闂茬殑杈撻�佺珯鐐�
+            }
+
+            //灏忚溅宸叉姷杈炬簮搴撲綅锛屽皢璐х墿鎼繍鍒拌緭閫佺珯鐐�
+            NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getSourceLocNo(), liftSta.getLocNo());
+            if (result == null) {//璺緞璁$畻澶辫触
+                return false;
+            }
+
+            //鍒涘缓鍒嗛厤鍛戒护
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
+            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.SHUTTLE_LOC_TO_LOC.id.shortValue());//搴撲綅绉昏浆妯″紡
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
+            assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
+            assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
+
+            wrkMast.setWrkSts(22L);//21.鐢熸垚鍑哄簱浠诲姟 => 22.灏忚溅鎼繍涓�
+            wrkMast.setLiftNo(liftSta.getLiftNo());//璁剧疆鎻愬崌鏈哄彿
+            wrkMast.setModiTime(new Date());
+            if (wrkMastMapper.updateById(wrkMast) > 0) {
+                //涓嬪彂浠诲姟
+                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+            }
+
             return false;
         }
-        NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-        if (shuttleProtocol == null) {
+        return true;
+    }
+
+    /**
+     * 璺ㄦゼ灞傚簱浣嶇Щ杞�-鎻愬崌鏈烘惉杩愯揣鐗�
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    private boolean locToLocExecuteStep3(WrkMast wrkMast) {
+        Date now = new Date();
+        if (wrkMast.getWrkSts() == 23) {//23.灏忚溅鎼繍瀹屾垚
+            //鑾峰彇鎻愬崌鏈虹嚎绋�
+            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, wrkMast.getLiftNo());
+            if (liftThread == null) {
+                return false;
+            }
+            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+            if (liftProtocol == null) {
+                return false;
+            }
+
+            if (!liftProtocol.isIdle()) {
+                return false;
+            }
+
+            //鎼滅储鏄惁鏈夊叾浠栦换鍔″崰鐢ㄤ簡鎻愬崌鏈猴紝濡傛灉鍗犵敤鎻愬崌鏈虹殑浠诲姟鍜屽綋鍓嶄换鍔$浉鍚岋紝鍒欒繍琛屾墽琛�
+            WrkMast wrkMast1 = wrkMastMapper.selectLiftWrkMast(liftProtocol.getLiftNo().intValue());
+            if (wrkMast1 != null && wrkMast1.getWrkNo().intValue() != wrkMast.getWrkNo().intValue()) {
+                return false;
+            }
+
+            //鑾峰彇婧愮珯瀵瑰簲鐨勮緭閫佺珯鐐�
+            BasDevp sourceBasDevp = basDevpService.selectByLevAndLiftNo(Utils.getLev(wrkMast.getSourceLocNo()), liftProtocol.getLiftNo().intValue());
+            //鑾峰彇鐩爣绔欏搴旂殑杈撻�佺珯鐐�
+            BasDevp targetBasDevp = basDevpService.selectByLevAndLiftNo(Utils.getLev(wrkMast.getLocNo()), liftProtocol.getLiftNo().intValue());
+            if (sourceBasDevp == null || targetBasDevp == null) {
+                return false;//缂哄皯绔欑偣淇℃伅
+            }
+
+            //鑾峰彇鎻愬崌鏈哄懡浠�
+            NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftProtocol.getLiftNo().intValue(), NyLiftTaskModelType.MOVE_TRAY.id, sourceBasDevp.getDevNo(), targetBasDevp.getDevNo(), wrkMast.getWrkNo());
+
+            ArrayList<NyLiftCommand> commands = new ArrayList<>();
+            commands.add(liftCommand);
+
+            //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
+            LiftAssignCommand assignCommand = new LiftAssignCommand();
+            assignCommand.setCommands(commands);
+            assignCommand.setLiftNo(liftProtocol.getLiftNo());
+            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
+            assignCommand.setTaskMode(NyLiftTaskModelType.MOVE_TRAY.id.shortValue());
+
+            wrkMast.setWrkSts(24L);//23.灏忚溅鎼繍瀹屾垚 ==> 24.鎻愬崌鏈烘惉杩愪腑
+            wrkMast.setLiftNo(liftThread.getSlave().getId());//浠诲姟妗g粦瀹氭彁鍗囨満鍙�
+            wrkMast.setShuttleNo(null);//娓呯┖灏忚溅鍙凤紝绛夎揣鐗╂惉杩愬畬鎴愬悗锛屽埌鐩爣妤煎眰閲嶆柊鎼滅储灏忚溅
+            wrkMast.setModiTime(now);
+            if (wrkMastMapper.updateById(wrkMast) > 0) {
+                //涓嬪彂浠诲姟
+                MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand));
+            }
             return false;
         }
-        if (!shuttleProtocol.isIdle()) {
+        return true;
+    }
+
+    /**
+     * 璺ㄦゼ灞傚簱浣嶇Щ杞�-璋冨害杞﹁締鍙栬揣骞惰繍閫佸埌鐩爣鏋悗
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    private boolean locToLocExecuteStep4(WrkMast wrkMast) {
+        if (wrkMast.getWrkSts() == 4) {//4.鎻愬崌鏈烘惉杩愬畬鎴�
+            //鑾峰彇鐩爣绔欏搴旂殑杈撻�佺珯鐐�
+            BasDevp targetBasDevp = basDevpService.selectByLevAndLiftNo(Utils.getLev(wrkMast.getLocNo()), wrkMast.getLiftNo());
+            if (targetBasDevp == null) {
+                return false;//缂哄皯绔欑偣淇℃伅
+            }
+
+            if (wrkMast.getShuttleNo() == null) {
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), targetBasDevp.getLocNo());//璋冨害灏忚溅鍒扮洰鏍囪緭閫佺珯鐐硅繘琛屽彇璐�
+                return false;
+            }
+
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+            if (!shuttleProtocol.isIdle()) {
+                return false;
+            }
+
+            //鍒ゆ柇灏忚溅鏄惁鍒拌揪鐩爣杈撻�佺珯鐐�
+            if (!shuttleProtocol.getCurrentLocNo().equals(targetBasDevp.getLocNo())) {
+                //灏忚溅涓嶅湪鐩爣杈撻�佺珯鐐�
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), targetBasDevp.getLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒扮洰鏍囪緭閫佺珯鐐硅繘琛屽彇璐�
+                return false;
+            }
+
+            //灏忚溅宸叉姷杈剧洰鏍囪緭閫佺珯鐐癸紝灏嗚揣鐗╂惉杩愬埌鐩爣搴撲綅
+            NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), targetBasDevp.getLocNo(), wrkMast.getLocNo());
+            if (result == null) {//璺緞璁$畻澶辫触
+                return false;
+            }
+
+            //鍒涘缓鍒嗛厤鍛戒护
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
+            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.SHUTTLE_LOC_TO_LOC.id.shortValue());//搴撲綅绉昏浆妯″紡
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
+            assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
+            assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
+
+            wrkMast.setWrkSts(5L);//4.鎻愬崌鏈烘惉杩愬畬鎴� => 5.灏忚溅鎼繍涓�
+            wrkMast.setModiTime(new Date());
+            if (wrkMastMapper.updateById(wrkMast) > 0) {
+                //涓嬪彂浠诲姟
+                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+            }
+
             return false;
         }
-
-        //鍒ゆ柇灏忚溅鏄惁鍒拌揪婧愬簱浣�
-        if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
-            //灏忚溅涓嶅湪婧愬簱浣嶄綅缃�
-            shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
-            return false;
-        }
-
-        //灏忚溅宸叉姷杈炬簮搴撲綅锛岃繘琛屾惉杩愯揣鐗�
-        NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getSourceLocNo(), wrkMast.getLocNo());
-        if (result == null) {//璺緞璁$畻澶辫触
-            return false;
-        }
-
-        //鍒涘缓鍒嗛厤鍛戒护
-        ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-        assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-        assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-        assignCommand.setTaskMode(ShuttleTaskModeType.PAK_IN.id.shortValue());//鍏ュ簱妯″紡
-        assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-        assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
-        assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
-
-        wrkMast.setWrkSts(5L);//1.鐢熸垚鍏ュ簱浠诲姟 => 5.灏忚溅鎼繍涓�
-        wrkMast.setModiTime(new Date());
-        if (wrkMastMapper.updateById(wrkMast) > 0) {
-            //涓嬪彂浠诲姟
-            MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-        }
-
         return true;
     }
 

--
Gitblit v1.9.1