From 928bc386bea03b9d3157e6d66dcb7afc843e9964 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期六, 17 六月 2023 15:55:50 +0800
Subject: [PATCH] 小车从提升机移动出去增强管控

---
 src/main/java/com/zy/core/thread/LiftThread.java            |   10 +
 src/main/java/com/zy/asrs/utils/Utils.java                  |   20 ++
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |  318 ++++++++++++++++++++++++++++----------
 src/main/java/com/zy/core/thread/ShuttleThread.java         |   50 +++++
 src/main/java/com/zy/common/utils/NavigateUtils.java        |   13 +
 src/main/java/com/zy/core/model/protocol/LiftProtocol.java  |   39 ++++
 6 files changed, 356 insertions(+), 94 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 bbca4a3..4ed63d7 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -670,12 +670,40 @@
                         if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 8) {
                             ShuttleThread shuttleThread = null;
                             HashMap<String, Object> searchIdleShuttle = null;
+
+                            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, 1);
+                            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+
                             if (wrkMast.getWrkSts() == 4) {
                                 //瀵绘壘鏈�杩戜笖绌洪棽鐨勫洓鍚戠┛姊溅
                                 searchIdleShuttle = this.searchIdleShuttle(wrkMast);
                                 shuttleThread = (ShuttleThread) searchIdleShuttle.get("result");
-                            }else {
-                                //鐘舵��8锛屽洓鍚戠┛姊溅宸插湪鎻愬崌鏈哄彛锛岀瓑寰呭懡浠よ繘琛屽叆搴撴惉杩愬姩浣�
+                            }else if(wrkMast.getWrkSts() == 8){//鐘舵��8锛岄渶瑕佸悜灏忚溅涓嬪彂鍛戒护浠庢彁鍗囨満绉诲姩鍑哄幓锛岄渶瑕佸垽鏂彁鍗囨満鐘舵槸鍚︾┖闂层�佹彁鍗囨満鏄惁鍒拌揪鐩爣妤煎眰銆佺洰鏍囨ゼ灞傜珯鐐规槸鍚﹀瓨鍦ㄣ�佺洰鏍囨ゼ灞傜珯鐐规槸鍚︾粰鍑烘彁鍗囨満鍒颁綅淇″彿
+                                //鐘舵��8锛岀瓑寰呭懡浠よ繘琛屽叆搴撴惉杩愬姩浣�
+
+                                //鍒ゆ柇鎻愬崌鏈烘槸鍚︾┖闂�
+                                if (!liftProtocol.isIdle()) {
+                                    continue;//鎻愬崌鏈哄繖
+                                }
+
+                                //鍒ゆ柇鎻愬崌鏈烘ゼ灞傛槸鍚﹀埌浣嶏紝鍒ゆ柇绔欑偣鏄惁缁欏嚭鎻愬崌鏈哄埌浣嶄俊鍙�
+                                String locNo = wrkMast.getLocNo();
+                                int lev = Utils.getLev(locNo);//鐩爣浜岀淮鐮佹墍鍦ㄦゼ灞�
+                                int liftLev = liftProtocol.getLev().intValue();//鎻愬崌鏈烘墍鍦ㄦゼ灞�
+                                if (liftLev != lev) {
+                                    continue;//鎻愬崌鏈轰笉鍦ㄧ洰鏍囨ゼ灞傝烦杩�
+                                }
+
+                                Integer staNo = Utils.levToOutInStaNo(lev);
+                                //鑾峰彇鐩爣绔欎俊鎭�
+                                StaProtocol staProtocol1 = devpThread.getStation().get(staNo);
+                                if (staProtocol1 == null) {
+                                    continue;//绔欑偣淇℃伅涓嶅瓨鍦�
+                                }
+                                if (!staProtocol1.isLiftArrival()) {
+                                    continue;//绔欑偣鎻愬崌鏈哄埌浣嶄俊鍙穎alse
+                                }
+
                                 Integer shuttleNo = wrkMast.getShuttleNo();//鍥涘悜绌挎杞﹀彿
                                 shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
                             }
@@ -705,7 +733,7 @@
                             assignCommand.setSourceLocNo(currentLocNo);//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
 
                             String locNo = wrkMast.getLocNo();//褰撳墠宸ヤ綔妗e簱浣嶅彿
-                            Integer currentLev = Utils.getLev(currentLocNo);//灏忚溅褰撳墠灞傞珮
+                            Integer currentLev = wrkMast.getWrkSts() == 4 ? Utils.getLev(currentLocNo) : liftProtocol.getLev();//灏忚溅褰撳墠灞傞珮
 
                             //鎻愬崌鏈哄彛绔欑偣搴撲綅鍙�
                             String liftSiteLocNo = Utils.levToOutInStaLocNo(currentLev);
@@ -713,15 +741,17 @@
                             if (wrkMast.getWrkSts() == 8 || Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) {
                                 //鍚屼竴灞傜洿鎺ュ彇璐ф棤闇�缁忚繃鎻愬崌鏈�
                                 //鐩存帴璁$畻杞﹀埌鎻愬崌鏈哄彇璐у啀鍒板簱浣嶈矾寰勬寚浠�
-                                List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftSiteLocNo, locNo, assignCommand,shuttleThread);
+                                List<ShuttleCommand> commands = this.shuttleAssignCommand(wrkMast.getWrkSts() == 4 ? currentLocNo : liftSiteLocNo, liftSiteLocNo, locNo, assignCommand, shuttleThread);
                                 if (wrkMast.getWrkSts() == 8) {
-                                    //姝ゆ椂杞﹀湪鎻愬崌鏈哄唴閮紝闇�瑕佸涓嬭揪涓�姝ユ寚浠よ杞︾Щ鍔ㄥ埌鎻愬崌鏈哄彛
-                                    BasDevp basDevp = basDevpService.selectById(109);//鑾峰彇鎻愬崌鏈轰俊鎭�
-                                    short startCode = Short.parseShort(basDevp.getQrCodeValue());//鎻愬崌鏈哄唴閮ㄤ簩缁寸爜
-                                    Short distCode = commands.get(0).getStartCodeNum();//鎻愬崌鏈哄彛浜岀淮鐮�
-                                    Short runDirection = commands.get(0).getRunDirection();//杩愯鏂瑰悜
+                                    //姝ゆ椂杞﹀湪鎻愬崌鏈哄唴閮紝涓嬭揪涓�姝ユ寚浠よ杞︾Щ鍔ㄥ埌鎻愬崌鏈哄彛
+                                    Integer staNo = Utils.levToOutInStaNo(currentLev);//绔欑偣鍙�
+                                    BasDevp basDevp = basDevpService.selectById(staNo);
+
+                                    short startCode = liftProtocol.getBarcode();//鎻愬崌鏈哄唴閮ㄤ簩缁寸爜
+                                    Short distCode = Short.parseShort(basDevp.getQrCodeValue());//鎻愬崌鏈哄彛绔欑偣浜岀淮鐮�
+                                    Short runDirection = ShuttleRunDirection.BOTTOM.id;//杩愯鏂瑰悜
                                     //鑾峰彇鍛戒护
-                                    ShuttleCommand moveCommand = shuttleThread.getMoveCommand(startCode, distCode, 1300, runDirection, (short) 1, 0);
+                                    ShuttleCommand moveCommand = shuttleThread.getMoveCommand(startCode, distCode, 1400, runDirection, startCode, 1400, 1000);
                                     commands.add(0, moveCommand);//灏嗚鎸囦护娣诲姞鍒伴槦澶�
                                 }
                                 assignCommand.setCommands(commands);
@@ -735,6 +765,15 @@
 
                                 //灏忚溅绉诲姩鍒版彁鍗囨満鍙o紝璁$畻璺緞
                                 List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftSiteLocNo, ShuttleTaskModeType.PAK_IN.id, assignCommand, shuttleThread);
+
+                                //鑾峰彇褰撳墠灏忚溅鎵�鍦ㄦゼ灞傜殑绔欑偣淇℃伅
+                                BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo);
+                                Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//绔欑偣浜岀淮鐮�
+
+                                //澧炲姞绉诲姩杩涙彁鍗囨満鍛戒护
+                                ShuttleCommand moveCommand = shuttleThread.getMoveCommand(endStartCode, liftProtocol.getBarcode(), 1400, ShuttleRunDirection.TOP.id, endStartCode, 1400, 1000);
+                                commands.add(moveCommand);
+
                                 //鍒嗛厤鐩爣搴撲綅
                                 shuttleProtocol.setLocNo(liftSiteLocNo);
                                 //鐩爣搴撲綅
@@ -923,11 +962,43 @@
                         || wrkMast.getWrkSts() == 31) {
                     ShuttleThread shuttleThread = null;
                     HashMap<String, Object> searchIdleShuttle = null;
+
+                    LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, 1);
+                    LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+
                     if (wrkMast.getWrkSts() == 21) {
                         //瀵绘壘鏈�杩戜笖绌洪棽鐨勫洓鍚戠┛姊溅
                         searchIdleShuttle = this.searchIdleShuttle(wrkMast);
                         shuttleThread = (ShuttleThread) searchIdleShuttle.get("result");
-                    }else if(wrkMast.getWrkSts() == 31 || wrkMast.getWrkSts() == 25) {
+                    }else if(wrkMast.getWrkSts() == 25) {//鐘舵��25锛岄渶瑕佸悜灏忚溅涓嬪彂鍛戒护浠庢彁鍗囨満绉诲姩鍑哄幓锛岄渶瑕佸垽鏂彁鍗囨満鐘舵槸鍚︾┖闂层�佹彁鍗囨満鏄惁鍒拌揪鐩爣妤煎眰銆佺洰鏍囨ゼ灞傜珯鐐规槸鍚﹀瓨鍦ㄣ�佺洰鏍囨ゼ灞傜珯鐐规槸鍚︾粰鍑烘彁鍗囨満鍒颁綅淇″彿
+
+                        //鍒ゆ柇鎻愬崌鏈烘槸鍚︾┖闂�
+                        if (!liftProtocol.isIdle()) {
+                            continue;//鎻愬崌鏈哄繖
+                        }
+
+                        //鍒ゆ柇鎻愬崌鏈烘ゼ灞傛槸鍚﹀埌浣嶏紝鍒ゆ柇绔欑偣鏄惁缁欏嚭鎻愬崌鏈哄埌浣嶄俊鍙�
+                        String locNo = wrkMast.getSourceLocNo();
+                        int lev = Utils.getLev(locNo);//鐩爣浜岀淮鐮佹墍鍦ㄦゼ灞�
+                        int liftLev = liftProtocol.getLev().intValue();//鎻愬崌鏈烘墍鍦ㄦゼ灞�
+                        if (liftLev != lev) {
+                            continue;//鎻愬崌鏈轰笉鍦ㄧ洰鏍囨ゼ灞傝烦杩�
+                        }
+
+                        Integer staNo = Utils.levToOutInStaNo(lev);
+                        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
+                        //鑾峰彇鐩爣绔欎俊鎭�
+                        StaProtocol staProtocol1 = devpThread.getStation().get(staNo);
+                        if (staProtocol1 == null) {
+                            continue;//绔欑偣淇℃伅涓嶅瓨鍦�
+                        }
+                        if (!staProtocol1.isLiftArrival()) {
+                            continue;//绔欑偣鎻愬崌鏈哄埌浣嶄俊鍙穎alse
+                        }
+
+                        //缁х画瀹屾垚涔嬪墠灏忚溅鏈畬鎴愮殑浠诲姟
+                        shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+                    } else if (wrkMast.getWrkSts() == 31) {
                         //缁х画瀹屾垚涔嬪墠灏忚溅鏈畬鎴愮殑浠诲姟
                         shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
                     }
@@ -995,6 +1066,15 @@
                             //灏忚溅鍒版彁鍗囨満鍙f寚浠�
                             List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftSiteLocNo, ShuttleTaskModeType.PAK_IN.id, assignCommand, shuttleThread);
                             shuttleProtocol.setLocNo(liftSiteLocNo);
+
+                            //鑾峰彇褰撳墠灏忚溅鎵�鍦ㄦゼ灞傜殑绔欑偣淇℃伅
+                            BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo);
+                            Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//绔欑偣浜岀淮鐮�
+
+                            //澧炲姞绉诲姩杩涙彁鍗囨満鍛戒护
+                            ShuttleCommand moveCommand = shuttleThread.getMoveCommand(endStartCode, liftProtocol.getBarcode(), 1400, ShuttleRunDirection.TOP.id, endStartCode, 1400, 1000);
+                            commands.add(moveCommand);
+
                             //鐩爣搴撲綅
                             assignCommand.setLocNo(liftSiteLocNo);
                             assignCommand.setCommands(commands);
@@ -1032,10 +1112,13 @@
      */
     public HashMap<String,Object> searchIdleShuttle(WrkMast wrkMast) {
         HashMap<String, Object> map = new HashMap<>();
-        String locNo = wrkMast.getWrkSts() < 10 ? wrkMast.getLocNo() : wrkMast.getSourceLocNo();//搴撲綅鍙�
+        String locNo = wrkMast.getIoType() < 101 ? wrkMast.getLocNo() : wrkMast.getSourceLocNo();//搴撲綅鍙�
         LocMast locMast = locMastService.queryByLoc(locNo);//鎵惧埌搴撲綅璁板綍
         int lev = Utils.getLev(locNo);//褰撳墠宸ヤ綔妗e簱浣嶅眰楂�
         ShuttleThread recentShuttle = null;//褰撳墠璺濈鏈�杩戠殑鍥涘悜绌挎杞︾嚎绋�
+
+        ArrayList<ShuttleThread> sameLev = new ArrayList<>();//鐩稿悓妤煎眰鐨勭┛姊溅
+        ArrayList<ShuttleThread> diffLev = new ArrayList<>();//涓嶅悓妤煎眰鐨勭┛姊溅
 
         for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
             //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
@@ -1051,58 +1134,131 @@
             String shuttleLocNo = shuttleProtocol.getCurrentLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿
             int shuttleLocNoLey = Utils.getLev(shuttleLocNo);//搴撲綅鍙峰搴斿眰楂�
             if (lev == shuttleLocNoLey) {
-                //褰撳墠鍥涘悜绌挎杞﹀拰宸ヤ綔妗d换鍔″湪鍚屼竴灞傦紝鍒欒皟閰嶈杞﹁締
-                map.put("sameLay", true);//鍚屼竴灞�
-                map.put("result", shuttleThread);
-                return map;
-            }
-
-            //鏇存柊褰撳墠鏈�杩戠殑鍥涘悜绌挎杞�
-            if (recentShuttle == null) {
-                recentShuttle = shuttleThread;
+                //宸ヤ綔妗fゼ灞傜浉鍚岀殑绌挎杞�
+                sameLev.add(shuttleThread);
             }else {
-                ShuttleProtocol recentShuttleProtocol = recentShuttle.getShuttleProtocol();//鐩墠鏈�杩戠┛姊溅
-                String recentShuttleLocNo = recentShuttleProtocol.getCurrentLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿
-                String recentShuttleLocNoLay = recentShuttleLocNo.substring(recentShuttleLocNo.length() - 2, recentShuttleLocNo.length());//搴撲綅鍙峰搴斿眰楂�
-
-                int recentShuttleLocNoLayInt = Integer.parseInt(recentShuttleLocNoLay);
-                int i = Math.abs(lev - recentShuttleLocNoLayInt);//宸ヤ綔妗fゼ灞傚噺鏈�杩戠┛姊溅妤煎眰锛屽彇缁濆鍊�
-                int j = Math.abs(lev - shuttleLocNoLey);//宸ヤ綔妗fゼ灞傚噺褰撳墠绌挎杞︽ゼ灞傦紝鍙栫粷瀵瑰��
-                if (i < j) {
-                    //鏇存柊鏈�杩戠┛姊溅
-                    recentShuttle = shuttleThread;
-                } else if (i == j) {
-                    //妤煎眰鐩稿悓鎯呭喌
-                    //鎵捐窛绂诲嚭搴撶偣鏈�杩戠殑杞�
-
-                    if (!(recentShuttleProtocol.isIdle() && shuttleProtocol.isIdle())) {
-                        //鍙鏈変竴杈嗚溅涓嶆槸绌洪棽鍒欎笉杩涜璋冨害
-                        map.put("sameLay", false);//涓嶅悓灞�
-                        map.put("result", null);
-                        return map;
-                    }
-
-                    //鑾峰彇鎻愬崌鏈�
-                    LiftSlave liftSlave = slaveProperties.getLift().get(0);
-                    //鎻愬崌鏈哄簱浣嶅彿
-                    String recentLiftLocNo = liftSlave.getLiftLocNo(recentShuttleLocNoLayInt);
-                    String shuttleLiftLocNo = liftSlave.getLiftLocNo(shuttleLocNoLey);
-
-                    //褰撳墠鏈�杩戝洓鍚戠┛姊溅鍒版彁鍗囨満璺緞
-                    List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentShuttleLocNo, recentLiftLocNo, ShuttleTaskModeType.PAK_IN.id);
-                    //褰撳墠妤煎眰鍥涘悜绌挎杞﹀埌鎻愬崌鏈鸿矾寰�
-                    List<NavigateNode> shuttlePath = NavigateUtils.calc(shuttleLocNo, shuttleLiftLocNo, ShuttleTaskModeType.PAK_IN.id);
-                    //鍒ゆ柇鍝竴涓矾寰勬渶鐭�
-                    if (shuttlePath.size() < recentShuttlePath.size()) {
-                        //濡傛灉褰撳墠妤煎眰鐨勮溅璺緞鏇村皬锛屽垯鏇存柊鏈�杩戠┛姊溅
-                        recentShuttle = shuttleThread;
-                    }
-                }
+                //宸ヤ綔妗d笉鍚屾ゼ灞傜殑绌挎杞�
+                diffLev.add(shuttleThread);
             }
+//
+//            //鏇存柊褰撳墠鏈�杩戠殑鍥涘悜绌挎杞�
+//            if (recentShuttle == null) {
+//                recentShuttle = shuttleThread;
+//            }else {
+//                ShuttleProtocol recentShuttleProtocol = recentShuttle.getShuttleProtocol();//鐩墠鏈�杩戠┛姊溅
+//                String recentShuttleLocNo = recentShuttleProtocol.getCurrentLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿
+//                String recentShuttleLocNoLay = recentShuttleLocNo.substring(recentShuttleLocNo.length() - 2, recentShuttleLocNo.length());//搴撲綅鍙峰搴斿眰楂�
+//
+//                int recentShuttleLocNoLayInt = Integer.parseInt(recentShuttleLocNoLay);
+//                int i = Math.abs(lev - recentShuttleLocNoLayInt);//宸ヤ綔妗fゼ灞傚噺鏈�杩戠┛姊溅妤煎眰锛屽彇缁濆鍊�
+//                int j = Math.abs(lev - shuttleLocNoLey);//宸ヤ綔妗fゼ灞傚噺褰撳墠绌挎杞︽ゼ灞傦紝鍙栫粷瀵瑰��
+//                if (i < j) {
+//                    //鏇存柊鏈�杩戠┛姊溅
+//                    recentShuttle = shuttleThread;
+//                } else if (i == j) {
+//                    //妤煎眰鐩稿悓鎯呭喌
+//                    //鎵捐窛绂诲嚭搴撶偣鏈�杩戠殑杞�
+//
+//                    if (!(recentShuttleProtocol.isIdle() && shuttleProtocol.isIdle())) {
+//                        //鍙鏈変竴杈嗚溅涓嶆槸绌洪棽鍒欎笉杩涜璋冨害
+//                        map.put("sameLay", false);//涓嶅悓灞�
+//                        map.put("result", null);
+//                        return map;
+//                    }
+//
+//                    //鑾峰彇鎻愬崌鏈�
+//                    LiftSlave liftSlave = slaveProperties.getLift().get(0);
+//                    //鎻愬崌鏈哄簱浣嶅彿
+//                    String recentLiftLocNo = liftSlave.getLiftLocNo(recentShuttleLocNoLayInt);
+//                    String shuttleLiftLocNo = liftSlave.getLiftLocNo(shuttleLocNoLey);
+//
+//                    //褰撳墠鏈�杩戝洓鍚戠┛姊溅鍒版彁鍗囨満璺緞
+//                    List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentShuttleLocNo, recentLiftLocNo, ShuttleTaskModeType.PAK_IN.id);
+//                    //褰撳墠妤煎眰鍥涘悜绌挎杞﹀埌鎻愬崌鏈鸿矾寰�
+//                    List<NavigateNode> shuttlePath = NavigateUtils.calc(shuttleLocNo, shuttleLiftLocNo, ShuttleTaskModeType.PAK_IN.id);
+//                    //鍒ゆ柇鍝竴涓矾寰勬渶鐭�
+//                    if (shuttlePath.size() < recentShuttlePath.size()) {
+//                        //濡傛灉褰撳墠妤煎眰鐨勮溅璺緞鏇村皬锛屽垯鏇存柊鏈�杩戠┛姊溅
+//                        recentShuttle = shuttleThread;
+//                    }
+//                }
+//            }
         }
 
-        map.put("sameLay", false);//涓嶅悓灞�
-        map.put("result", recentShuttle);
+        if (sameLev.size() > 0) {
+            //鍚屼竴妤煎眰鏈夌┖闂茬┛姊溅锛屽垯鍙湪宸ヤ綔妗fゼ灞傚鎵�
+            //瀵绘壘绂讳换鍔℃渶杩戠殑绌挎杞�
+            for (ShuttleThread shuttleThread : sameLev) {
+                if (recentShuttle == null) {//鏈�杩戠┛姊溅涓虹┖锛屽垯榛樿璧嬩簣涓烘渶杩戠┛姊溅
+                    recentShuttle = shuttleThread;
+                }
+
+                //鍒ゆ柇鍏朵粬绌洪棽绌挎杞︽槸鍚︾浠诲姟鏈�杩�
+                String distLocNo = null;//鐩爣鍦扮偣锛屽叆搴�=銆嬫彁鍗囨満鍙o紝鍑哄簱=銆嬭揣鐗╁簱浣嶅彿
+                if (wrkMast.getIoType() < 101) {
+                    //鍏ュ簱
+                    distLocNo = Utils.levToOutInStaLocNo(lev);
+                }else {
+                    //鍑哄簱
+                    distLocNo = locNo;
+                }
+
+                //褰撳墠绌挎杞﹀簱浣嶅彿
+                String currentLocNo = shuttleThread.getShuttleProtocol().getCurrentLocNo();
+                //鐩墠鏈�杩戠┛姊溅搴撲綅鍙�
+                String recentLocNo = recentShuttle.getShuttleProtocol().getCurrentLocNo();
+
+                //褰撳墠鏈�杩戝洓鍚戠┛姊溅鍒扮洰鏍囧湴鐐硅窛绂�
+                List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, distLocNo, ShuttleTaskModeType.PAK_IN.id);
+                //褰撳墠绌挎杞︾嚎绋嬪埌鐩爣鍦扮偣璺濈
+                List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, distLocNo, ShuttleTaskModeType.PAK_IN.id);
+                if (recentShuttlePath == null || currentShuttlePath == null) {
+                    continue;
+                }
+                Integer recentAllDistance = NavigateUtils.getOriginPathAllDistance(recentShuttlePath);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
+                Integer currentAllDistance = NavigateUtils.getOriginPathAllDistance(currentShuttlePath);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
+                if (currentAllDistance < recentAllDistance) {
+                    //濡傛灉褰撳墠妤煎眰鐨勮溅璺緞鏇村皬锛屽垯鏇存柊鏈�杩戠┛姊溅
+                    recentShuttle = shuttleThread;
+                }
+            }
+
+            map.put("sameLay", true);//鍚屽眰
+            map.put("result", recentShuttle);
+        }else {
+            //鍚屼竴妤煎眰锛屾病鏈夌┖闂茬┛姊溅锛屽彧鑳戒粠鍏朵粬妤煎眰璋冨害
+            //瀵绘壘绂讳换鍔℃渶杩戠殑绌挎杞�
+            for (ShuttleThread shuttleThread : diffLev) {
+                if (recentShuttle == null) {//鏈�杩戠┛姊溅涓虹┖锛屽垯榛樿璧嬩簣涓烘渶杩戠┛姊溅
+                    recentShuttle = shuttleThread;
+                }
+
+                //褰撳墠绌挎杞﹀簱浣嶅彿
+                String currentLocNo = shuttleThread.getShuttleProtocol().getCurrentLocNo();
+                int currentLev = Utils.getLev(currentLocNo);
+                //鐩墠鏈�杩戠┛姊溅搴撲綅鍙�
+                String recentLocNo = recentShuttle.getShuttleProtocol().getCurrentLocNo();
+                int recentLev = Utils.getLev(recentLocNo);
+
+                //褰撳墠鏈�杩戝洓鍚戠┛姊溅鍒板綋鍓嶈溅瀛愭墍鍦ㄦゼ灞傜殑鎻愬崌鏈哄彛璺濈
+                List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, Utils.levToOutInStaLocNo(recentLev), ShuttleTaskModeType.PAK_IN.id);
+                //褰撳墠绌挎杞︾嚎绋嬪埌褰撳墠杞﹀瓙鎵�鍦ㄦゼ灞傜殑鎻愬崌鏈哄彛璺濈
+                List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, Utils.levToOutInStaLocNo(currentLev), ShuttleTaskModeType.PAK_IN.id);
+                if (recentShuttlePath == null || currentShuttlePath == null) {
+                    continue;
+                }
+
+                Integer recentAllDistance = NavigateUtils.getOriginPathAllDistance(recentShuttlePath);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
+                Integer currentAllDistance = NavigateUtils.getOriginPathAllDistance(currentShuttlePath);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
+                if (currentAllDistance < recentAllDistance) {
+                    //濡傛灉褰撳墠妤煎眰鐨勮溅璺緞鏇村皬锛屽垯鏇存柊鏈�杩戠┛姊溅
+                    recentShuttle = shuttleThread;
+                }
+            }
+
+            map.put("sameLay", false);//涓嶅悓灞�
+            map.put("result", recentShuttle);
+        }
         return map;
     }
 
@@ -1293,7 +1449,20 @@
                 commands.add(command4);//灏嗗懡浠ゆ坊鍔犺繘list
 
                 wrkMast.setWrkSts(3L);//3.鎻愬崌鏈烘惉杩愪腑
-            }else if(wrkMast.getWrkSts() == 6 || wrkMast.getWrkSts() == 23) {//6.杩佺Щ灏忚溅鑷虫彁鍗囨満鍙e畬鎴� => 7.鎻愬崌鏈鸿縼绉诲皬杞︿腑 || 23.杩佺Щ灏忚溅鑷虫彁鍗囨満鍙e畬鎴� => 24.鎻愬崌鏈鸿縼绉诲皬杞︿腑
+            } else if (wrkMast.getWrkSts() == 6) {//6.杩佺Щ灏忚溅鑷虫彁鍗囨満鍙e畬鎴� => 7.鎻愬崌鏈鸿縼绉诲皬杞︿腑
+                liftProtocol.setShuttleNo(wrkMast.getShuttleNo().shortValue());//璁剧疆鍥涘悜绌挎杞﹀彿
+
+                //宸ヤ綔妗g洰鏍囧簱浣嶅彿
+                String wrkMastLocNo = wrkMast.getIoType() == 101 ? wrkMast.getSourceLocNo() : wrkMast.getLocNo();
+                //宸ヤ綔妗g洰鏍囧簱浣嶆ゼ灞�
+                int wrkMastLocNoLey = Utils.getLev(wrkMastLocNo);
+
+                //鎻愬崌鏈哄墠寰�鐩爣妤煎眰(宸ヤ綔妗g洰鏍囨ゼ灞�)
+                LiftCommand command1 = liftThread.getLiftUpDownCommand(liftProtocol.getLiftNo(), liftProtocol.getTaskNo(), wrkMastLocNoLey);
+                commands.add(command1);//灏嗗懡浠ゆ坊鍔犺繘list
+
+                wrkMast.setWrkSts(7L);//6.杩佺Щ灏忚溅鑷虫彁鍗囨満鍙e畬鎴� => 7.鎻愬崌鏈鸿縼绉诲皬杞︿腑
+            } else if(wrkMast.getWrkSts() == 23) {//23.杩佺Щ灏忚溅鑷虫彁鍗囨満鍙e畬鎴� => 24.鎻愬崌鏈鸿縼绉诲皬杞︿腑
                 liftProtocol.setShuttleNo(wrkMast.getShuttleNo().shortValue());//璁剧疆鍥涘悜绌挎杞﹀彿
 
                 //鎵惧埌鍥涘悜绌挎杞︾殑绾跨▼
@@ -1345,7 +1514,7 @@
                 LiftCommand command4 = liftThread.getLiftTurnCommand(liftProtocol.getLiftNo(), liftProtocol.getTaskNo(), 1);
                 commands.add(command4);//灏嗗懡浠ゆ坊鍔犺繘list
 
-                wrkMast.setWrkSts(wrkMast.getWrkSts() == 6 ? 7L : 24L);//6.杩佺Щ灏忚溅鑷虫彁鍗囨満鍙e畬鎴� => 7.鎻愬崌鏈鸿縼绉诲皬杞︿腑 || 23.杩佺Щ灏忚溅鑷虫彁鍗囨満鍙e畬鎴� => 24.鎻愬崌鏈鸿縼绉诲皬杞︿腑
+                wrkMast.setWrkSts(24L);//23.杩佺Щ灏忚溅鑷虫彁鍗囨満鍙e畬鎴� => 24.鎻愬崌鏈鸿縼绉诲皬杞︿腑
             } else if (wrkMast.getWrkSts() == 27) {//27.灏忚溅鍑哄簱鎼繍瀹屾垚
                 //宸ヤ綔妗f簮搴撲綅鍙�
                 String wrkMastLocNo = wrkMast.getSourceLocNo();
@@ -1421,31 +1590,6 @@
             if (liftProtocol == null) {
                 continue;
             }
-
-//            //褰撴彁鍗囨満鐘舵�佸浜庡伐浣滀腑锛屼絾鎻愬崌鏈哄疄闄呬负绌洪棽鐘舵�侊紝涓旀椂闀胯秴杩�30绉掞紝鑷姩澶嶄綅
-//            if (liftProtocol.getProtocolStatus() == LiftProtocolStatusType.WORKING.id
-//                    && liftProtocol.getTaskNo() != 0
-//                    && !liftProtocol.getRunning()
-//            ) {
-//                if (liftProtocol.getWrkTime() == null) {
-//                    continue;
-//                }
-//
-//                Date wrkTime = liftProtocol.getWrkTime();
-//                Date now = new Date();
-//                long interval = (now.getTime() - wrkTime.getTime()) / 1000;//璁$畻鏃堕棿宸�
-//                if (interval >= 30) {//瓒呰繃30绉掕嚜鍔ㄥ浣�
-//                    //璁剧疆鎻愬崌鏈轰负绌洪棽鐘舵��
-//                    liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
-//                    //浠诲姟鍙锋竻闆�
-//                    liftProtocol.setTaskNo((short) 0);
-//                    //鏍囪澶嶄綅
-//                    liftProtocol.setPakMk(true);
-//                    //浠诲姟鎸囦护娓呴浂
-//                    liftProtocol.setAssignCommand(null);
-//                    News.info("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傛彁鍗囨満鍙�={}", liftProtocol.getLiftNo());
-//                }
-//            }
 
             //鎻愬崌鏈轰负绛夊緟纭涓旂┖闂�
             if (liftProtocol.getProtocolStatus() == LiftProtocolStatusType.WAITING.id
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index a08c7d4..3ef6d92 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -309,6 +309,26 @@
         return staNo;
     }
 
+    //鎻愬崌鏈轰綅缃弽棣堣浆鎹㈠嚭鍏ュ簱绔欑偣搴撲綅鍙�
+    public static String liftArrivalToOutInStaLocNo(Short liftArrival) {
+        String locNo = null;
+        switch (liftArrival) {
+            case 1:
+                locNo = "1800201";
+                break;
+            case 4:
+                locNo = "1800202";
+                break;
+            case 8:
+                locNo = "1800203";
+                break;
+            case 16:
+                locNo = "1800204";
+                break;
+        }
+        return locNo;
+    }
+
     //妤煎眰杞崲瀵瑰簲鍑哄叆搴撶珯鐐瑰簱浣嶅彿
     public static String levToOutInStaLocNo(Integer lev) {
         String locNo = null;
diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index d96542a..9ac5f03 100644
--- a/src/main/java/com/zy/common/utils/NavigateUtils.java
+++ b/src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -184,6 +184,19 @@
     }
 
     /**
+     * 鏍规嵁鍘熷鑺傜偣缁撴灉锛岃绠楁�昏璧拌窛绂�
+     */
+    public static Integer getOriginPathAllDistance(List<NavigateNode> path) {
+        ArrayList<ArrayList<NavigateNode>> sectionPath = NavigateUtils.getSectionPath(path);
+        Integer allDistance = 0;
+        for (ArrayList<NavigateNode> navigateNodes : sectionPath) {
+            Integer distance = NavigateUtils.getCurrentPathAllDistance(navigateNodes);
+            allDistance += distance;
+        }
+        return allDistance;
+    }
+
+    /**
      * 鑾峰彇褰撳墠璺緞鎬昏璧拌窛绂�
      */
     public static Integer getCurrentPathAllDistance(List<NavigateNode> path) {
diff --git a/src/main/java/com/zy/core/model/protocol/LiftProtocol.java b/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
index 391a366..419beee 100644
--- a/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
@@ -269,8 +269,45 @@
     }
 
     public void setPositionArrivalFeedback(Short position) {
-        this.lev = position;//灞傞珮
+        Short lev = 1;
+        switch (position) {
+            case 1:
+                lev = 1;
+                break;
+            case 4:
+                lev = 2;
+                break;
+            case 8:
+                lev = 3;
+                break;
+            case 16:
+                lev = 4;
+                break;
+        }
+        this.lev = lev;//灞傞珮
         this.positionArrivalFeedback = position;//浣嶇疆鍒拌揪鍙嶉
     }
 
+    public Integer getPositionArrivalFeedback$() {
+        if (this.positionArrivalFeedback == null) {
+            return null;
+        }
+
+        switch (this.positionArrivalFeedback) {
+            case 1:
+                return 1;
+            case 2:
+                return 2;
+            case 4:
+                return 3;
+            case 8:
+                return 4;
+            case 16:
+                return 5;
+        }
+
+        return null;
+    }
+
+
 }
diff --git a/src/main/java/com/zy/core/thread/LiftThread.java b/src/main/java/com/zy/core/thread/LiftThread.java
index d1b2299..c1c4a82 100644
--- a/src/main/java/com/zy/core/thread/LiftThread.java
+++ b/src/main/java/com/zy/core/thread/LiftThread.java
@@ -6,6 +6,7 @@
 import HslCommunication.ModBus.ModbusTcpNet;
 import com.alibaba.fastjson.JSON;
 import com.core.common.DateUtils;
+import com.core.common.RadixTools;
 import com.core.common.SpringUtils;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.BasLift;
@@ -21,7 +22,6 @@
 import com.zy.core.cache.OutputQueue;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.*;
-import com.zy.core.model.DevpSlave;
 import com.zy.core.model.LiftSlave;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.*;
@@ -127,7 +127,7 @@
                 liftProtocol.setLiftLock(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content, 0)));
                 //浣嶇疆鍒拌揪鍙嶉
                 liftProtocol.setPositionArrivalFeedback(modbusTcpNet.getByteTransform().TransInt16(content,2));
-
+                
                 byte by = modbusTcpNet.getByteTransform().TransByte(content, 5);
                 int[] datas = CommonUtils.byteToBits(by);
                 //鍑嗗灏辩华
@@ -400,6 +400,12 @@
             News.info("鎻愬崌鏈哄懡浠や笅鍙戞垚鍔燂紝鎻愬崌鏈哄彿={}锛屼换鍔℃暟鎹�={}", command.getLiftNo(), JSON.toJSON(command));
             liftProtocol.setWrkTime(new Date());//鏇存柊宸ヤ綔鏃堕棿
 
+            try {
+                Thread.sleep(1000);//鍛戒护涓嬪彂瀹屾垚鍚庝紤鐪�1s
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+
             //鍒ゆ柇鏁版嵁鏄惁鎵ц瀹屾垚
             if (commandStep < size - 1) {
                 //鏇存柊redis鏁版嵁
diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java
index 25a2ef2..77dfe69 100644
--- a/src/main/java/com/zy/core/thread/ShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -525,8 +525,8 @@
                     //濡傛灉绌挎杞﹀湪鎻愬崌鏈哄唴锛岀Щ鍔ㄦ椂闇�瑕佸厛涓嬪彂鍑烘彁鍗囨満鍛戒护
                     if (liftProtocol.getBarcode().intValue() == shuttleProtocol.getCurrentCode().intValue()) {
                         //绌挎杞﹀嚭鎻愬崌鏈�
-                        Short liftLev = liftProtocol.getPositionArrivalFeedback();//鎻愬崌鏈轰綅缃�
-                        String liftSiteLocNo = Utils.levToOutInStaLocNo(liftLev.intValue());
+                        Short liftArrival = liftProtocol.getPositionArrivalFeedback();//鎻愬崌鏈轰綅缃弽棣�
+                        String liftSiteLocNo = Utils.liftArrivalToOutInStaLocNo(liftArrival);
                         LocMast locMast1 = locMastService.selectById(liftSiteLocNo);
                         ShuttleCommand moveCommand = getMoveCommand(liftProtocol.getBarcode(), Short.parseShort(locMast1.getQrCodeValue()), 1400, ShuttleRunDirection.BOTTOM.id, liftProtocol.getBarcode(), 1400, runSpeed);
                         commands.add(moveCommand);
@@ -745,6 +745,42 @@
 
         LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, 1);
         LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+        
+
+        //鍒ゆ柇灏忚溅褰撳墠浜岀淮鐮佹槸鍚︿负鎻愬崌鏈轰簩缁寸爜
+        if (shuttleProtocol.getCurrentCode().intValue() == liftProtocol.getBarcode().intValue()) {
+            //灏忚溅褰撳墠鍛戒护璧峰浣嶇疆灏辨槸鎻愬崌鏈轰簩缁寸爜锛岃鏄庡皬杞﹂渶瑕佸悜鎻愬崌鏈哄绉诲姩锛屽垯闇�瑕佸垽鏂姸鎬佹槸鍚︽弧瓒�
+            if (command.getStartCodeNum().intValue() == liftProtocol.getBarcode().intValue()){
+                //鎻愬崌鏈烘槸鍚︾┖闂诧紝鎻愬崌鏈烘槸鍚﹀埌杈剧洰鏍囨ゼ灞傦紝鐩爣妤煎眰鏄惁缁欏嚭鎻愬崌鏈哄埌浣嶄俊鍙蜂綅
+                if (!liftProtocol.isIdle()) {
+                    return false;//鎻愬崌鏈哄繖锛岀姝笅鍙戝懡浠�
+                }
+
+                Short distCodeNum = command.getDistCodeNum();//鐩爣浜岀淮鐮�
+                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
+                BasDevp basDevp = basDevpService.queryByQrCode(distCodeNum.intValue());//鐩爣绔欑偣
+                if (basDevp == null) {
+                    return false;//鎵句笉鍒扮洰鏍囩珯锛岀姝笅鍙戝懡浠�
+                }
+
+                int lev = Utils.getLev(basDevp.getLocNo());//鐩爣浜岀淮鐮佹墍鍦ㄦゼ灞�
+                int liftLev = liftProtocol.getLev().intValue();//鎻愬崌鏈烘墍鍦ㄦゼ灞�
+                if (liftLev != lev) {
+                    return false;//鎻愬崌鏈轰笉鍦ㄧ洰鏍囨ゼ灞傦紝绂佹涓嬪彂鍛戒护
+                }
+
+                //鑾峰彇鐩爣绔欎俊鎭�
+                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
+                StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo());
+                if (staProtocol == null) {
+                    return false;//绔欑偣淇℃伅涓嶅瓨鍦紝绂佹涓嬪彂鍛戒护
+                }
+                if (!staProtocol.isLiftArrival()) {
+                    return false;//绔欑偣鎻愬崌鏈哄埌浣嶄俊鍙穎alse锛岀姝笅鍙戝懡浠�
+                }
+            }
+        }
+
 
         //涓嬪彂鍛戒护
         if (!write(command)) {
@@ -752,6 +788,12 @@
             return false;
         } else {
             News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙戞垚鍔燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
+
+            try {
+                Thread.sleep(1000);//鍛戒护涓嬪彂瀹屽悗浼戠湢1s
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
 
             //鍒ゆ柇鏁版嵁鏄惁鎵ц瀹屾垚
             if (commandStep < size - 1) {
@@ -906,7 +948,7 @@
         String shuttleLocNo = shuttleProtocol.getCurrentLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿
         Integer shuttleLocNoLev = shuttleLocNo == null ? 0 : Utils.getLev(shuttleLocNo);//搴撲綅鍙峰搴斿眰楂�
 
-        //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀湪鐩爣妤煎眰
+        //鍒ゆ柇绌挎杞﹀拰鎻愬崌鏈烘槸鍚﹀湪鐩爣妤煎眰
         if (shuttleLocNoLev >= 2) {
             shuttleLocNoLev++;
         }
@@ -916,7 +958,7 @@
             SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
             StaProtocol staProtocol = siemensDevpThread.getStation().get(siteNo);
             if (staProtocol.isLiftArrival()
-                && liftProtocol.getPositionArrivalFeedback().intValue() == shuttleLocNoLev) {
+                && liftProtocol.getPositionArrivalFeedback$() == shuttleLocNoLev) {
                 //杈撻�佺嚎鍙嶉鎻愬崌鏈哄埌浣嶄笖鎻愬崌鏈烘ゼ灞傚弽棣堜负鍚屼竴灞傦紝鐩存帴鏀捐
                 return true;
             }

--
Gitblit v1.9.1