From 0f2eaeeb387850acfede95c5c061b5392dae8688 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 28 六月 2023 16:58:25 +0800
Subject: [PATCH] 寻路算法和避障

---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |  437 ++++++++++++++++++------------------------------------
 1 files changed, 146 insertions(+), 291 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 3e5142c..3cecf33 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -571,7 +571,7 @@
                     //鏁版嵁搴撲腑涔熶笉瀛樺湪鍦板浘鏁版嵁锛屼粠鍦板浘鏂囦欢涓幏鍙�
                     //杞藉叆鍦板浘
                     NavigateMapData mapData = new NavigateMapData(i);
-                    List<List<MapNode>> lists = mapData.getJsonData(-1, null);//鑾峰彇瀹屾暣鍦板浘(鍖呮嫭鍏ュ簱鍑哄簱)
+                    List<List<MapNode>> lists = mapData.getJsonData(-1, null, null);//鑾峰彇瀹屾暣鍦板浘(鍖呮嫭鍏ュ簱鍑哄簱)
 
                     //瀛樺叆鏁版嵁搴�
                     basMap = new BasMap();
@@ -826,12 +826,14 @@
         }
 
         //璁$畻灏忚溅璧风偣鍒颁腑鐐规墍闇�鍛戒护
-        List<NavigateNode> calc = NavigateUtils.calc(startLocNo, locNo, mapType);
+        List<NavigateNode> calc = NavigateUtils.calc(startLocNo, locNo, mapType, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), Utils.getLev(startLocNo)));
         List<ShuttleCommand> commands = new ArrayList<>();
         if (calc == null) {
             return null;
         }
-
+        if (!Utils.checkShuttlePath(calc, shuttleThread.getSlave().getId())) {//妫�娴嬬┛姊溅琛岃蛋璺緞锛屾槸鍚﹀瓨鍦ㄥ叾浠栧皬杞︼紝濡傛湁鍏朵粬灏忚溅鍒欒繘琛岃皟绂�
+            return null;
+        }
         List<NavigateNode> allNode = new ArrayList<>();
         allNode.addAll(calc);
 
@@ -881,10 +883,14 @@
         List<NavigateNode> allNode = new ArrayList<>();
 
         //璁$畻灏忚溅璧风偣鍒颁腑鐐规墍闇�鍛戒护
-        List<NavigateNode> calc = NavigateUtils.calc(startLocNo, middleLocNo, NavigationMapType.NORMAL.id);//灏忚溅鏃犺揣锛岃蛋姝e父搴撲綅閫氶亾
+        List<NavigateNode> calc = NavigateUtils.calc(startLocNo, middleLocNo, NavigationMapType.NORMAL.id, null);//灏忚溅鏃犺揣锛岃蛋姝e父搴撲綅閫氶亾
         List<ShuttleCommand> commands = new ArrayList<>();
 
         if (calc != null) {
+            if (!Utils.checkShuttlePath(calc, shuttleThread.getSlave().getId())) {//妫�娴嬬┛姊溅琛岃蛋璺緞锛屾槸鍚﹀瓨鍦ㄥ叾浠栧皬杞︼紝濡傛湁鍏朵粬灏忚溅鍒欒繘琛岃皟绂�
+                return null;
+            }
+
             allNode.addAll(calc);
             //鑾峰彇鍒嗘璺緞
             ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc);
@@ -915,11 +921,13 @@
         commands.add(shuttleThread.getPalletCommand((short) 1));
 
         //璁$畻灏忚溅涓偣鍒扮粓鐐规墍闇�鍛戒护
-        List<NavigateNode> calc2 = NavigateUtils.calc(middleLocNo, locNo, NavigationMapType.DFX.id);//灏忚溅鏈夎揣锛岃蛋绂佺敤杩嘍FX搴撲綅鐨勫湴鍥鹃�氶亾
+        List<NavigateNode> calc2 = NavigateUtils.calc(middleLocNo, locNo, NavigationMapType.DFX.id, null);//灏忚溅鏈夎揣锛岃蛋绂佺敤杩嘍FX搴撲綅鐨勫湴鍥鹃�氶亾
         if (calc2 == null) {
             return null;
         }
-
+        if (!Utils.checkShuttlePath(calc2, shuttleThread.getSlave().getId())) {//妫�娴嬬┛姊溅琛岃蛋璺緞锛屾槸鍚﹀瓨鍦ㄥ叾浠栧皬杞︼紝濡傛湁鍏朵粬灏忚溅鍒欒繘琛岃皟绂�
+            return null;
+        }
         allNode.addAll(calc2);
 
         //鑾峰彇鍒嗘璺緞
@@ -1006,8 +1014,11 @@
                         //鍒ゆ柇鎻愬崌鏈烘ゼ灞傛槸鍚﹀埌浣嶏紝鍒ゆ柇绔欑偣鏄惁缁欏嚭鎻愬崌鏈哄埌浣嶄俊鍙�
                         String locNo = wrkMast.getSourceLocNo();
                         int lev = Utils.getLev(locNo);//鐩爣浜岀淮鐮佹墍鍦ㄦゼ灞�
-                        int liftLev = liftProtocol.getLev().intValue();//鎻愬崌鏈烘墍鍦ㄦゼ灞�
-                        if (liftLev != lev) {
+                        Short liftLev = liftProtocol.getLev();//鎻愬崌鏈烘墍鍦ㄦゼ灞�
+                        if (liftLev == null) {//鎻愬崌鏈哄彲鑳藉湪杈撻�佺嚎妤煎眰
+                            continue;
+                        }
+                        if (liftLev.intValue() != lev) {
                             continue;//鎻愬崌鏈轰笉鍦ㄧ洰鏍囨ゼ灞傝烦杩�
                         }
 
@@ -1069,25 +1080,32 @@
                         //鍒ゆ柇灏忚溅鍜屽簱浣嶆槸鍚﹀湪鍚屼竴灞�
                         if (Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) {
                             //鍚屼竴灞�(灏嗗皬杞︾Щ鍔ㄥ埌璐х墿浣嶇疆)
+
                             List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, wrkMast.getSourceLocNo(), liftSiteLocNo, assignCommand, shuttleThread);
                             if (commands == null) {
                                 //鏈壘鍒拌矾寰勶紝绛夊緟涓嬩竴娆�
                                 continue;
                             }
+                            //鎵�浣跨敤鐨勮矾寰勮繘琛屼复鏃惰В閿侊紝鐢ㄤ簬鍚庣画璁$畻
+                            NavigateMapData navigateMapData = new NavigateMapData(currentLev);
+                            navigateMapData.writeNavigateNodeToRedisMap(assignCommand.getNodes(), false);//鎵�浣跨敤鐨勮矾寰勮繘琛屼复鏃惰В閿�
 
-                            //鑾峰彇褰撳墠灏忚溅鎵�鍦ㄦゼ灞傜殑绔欑偣淇℃伅
-                            BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo);
-                            Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//绔欑偣浜岀淮鐮�
-
-                            String disLocNo = "2000202" + Utils.getLev(liftSiteLocNo);//閬胯浣嶇疆
-                            LocMast locMast1 = locMastService.queryByLoc(disLocNo);
-                            if (locMast1 == null) {
-                                continue;//鎵句笉鍒板簱浣�
-                            }
-                            short disCode = Short.parseShort(locMast1.getQrCodeValue());
                             //浠诲姟鎵ц瀹屽悗锛屽皬杞﹁繘鍏ョЩ寮�鎻愬崌鏈哄彛绔欑偣浣嶇疆锛屼互鍏嶅潬钀�
-                            ShuttleCommand moveCommand = shuttleThread.getMoveCommand(endStartCode, disCode, 1400, ShuttleRunDirection.BOTTOM.id, endStartCode, 1400, 500);
-                            commands.add(moveCommand);
+                            //鎼滅储涓�鏉℃病鏈夊皬杞︾殑绌哄贩閬擄紝骞惰皟搴﹀皬杞�
+                            int distLev = Utils.getLev(liftSiteLocNo);//閬胯妤煎眰
+                            String startLocNo = "180020" + Utils.getLev(liftSiteLocNo);
+                            ShuttleAssignCommand moveAssignCommand = Utils.searchEmptyGroupToMoveShuttle(distLev, shuttleThread.getSlave().getId(), shuttleThread, startLocNo);
+                            if (moveAssignCommand == null) {//璋冨害灏忚溅鍛戒护涓虹┖
+                                continue;
+                            }
+                            //鎵�浣跨敤鐨勮矾寰勮繘琛屼复鏃惰В閿侊紝鐢ㄤ簬鍚庣画璁$畻
+                            navigateMapData.writeNavigateNodeToRedisMap(moveAssignCommand.getNodes(), false);//鎵�浣跨敤鐨勮矾寰勮繘琛屼复鏃惰В閿�
+                            commands.addAll(moveAssignCommand.getCommands());//灏嗛伩璁╁皬杞︾殑鍛戒护娣诲姞
+                            List<NavigateNode> nodes = assignCommand.getNodes();//灏嗛伩璁╄矾寰勬坊鍔犺繘鑺傜偣璺緞涓�
+                            nodes.addAll(moveAssignCommand.getNodes());//灏嗛伩璁╄矾寰勬坊鍔犺繘鑺傜偣璺緞涓�
+                            assignCommand.setNodes(nodes);
+                            navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹�
+
 
                             //鍒嗛厤鐩爣搴撲綅
                             shuttleProtocol.setLocNo(wrkMast.getSourceLocNo());
@@ -1159,27 +1177,33 @@
                         if (commands == null) {
                             continue;//鏈壘鍒拌矾寰�
                         }
+                        //鎵�浣跨敤鐨勮矾寰勮繘琛屼复鏃惰В閿侊紝鐢ㄤ簬鍚庣画璁$畻
+                        NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(liftSiteLocNo));
+                        navigateMapData.writeNavigateNodeToRedisMap(assignCommand.getNodes(), false);//鎵�浣跨敤鐨勮矾寰勮繘琛屼复鏃惰В閿�
+
+                        //浠诲姟鎵ц瀹屽悗锛屽皬杞﹁繘鍏ョЩ寮�鎻愬崌鏈哄彛绔欑偣浣嶇疆锛屼互鍏嶅潬钀�
+                        //鎼滅储涓�鏉℃病鏈夊皬杞︾殑绌哄贩閬擄紝骞惰皟搴﹀皬杞�
+                        int distLev = Utils.getLev(liftSiteLocNo);//閬胯妤煎眰
+                        String startLocNo = "180020" + Utils.getLev(liftSiteLocNo);
+                        ShuttleAssignCommand moveAssignCommand = Utils.searchEmptyGroupToMoveShuttle(distLev, shuttleThread.getSlave().getId(), shuttleThread, startLocNo);
+                        if (moveAssignCommand == null) {//璋冨害灏忚溅鍛戒护涓虹┖
+                            continue;
+                        }
+                        //鎵�浣跨敤鐨勮矾寰勮繘琛屼复鏃惰В閿侊紝鐢ㄤ簬鍚庣画璁$畻
+                        navigateMapData.writeNavigateNodeToRedisMap(moveAssignCommand.getNodes(), false);//鎵�浣跨敤鐨勮矾寰勮繘琛屼复鏃惰В閿�
+                        commands.addAll(moveAssignCommand.getCommands());//灏嗛伩璁╁皬杞︾殑鍛戒护娣诲姞
+                        List<NavigateNode> nodes = assignCommand.getNodes();//灏嗛伩璁╄矾寰勬坊鍔犺繘鑺傜偣璺緞涓�
+                        nodes.addAll(moveAssignCommand.getNodes());//灏嗛伩璁╄矾寰勬坊鍔犺繘鑺傜偣璺緞涓�
+                        assignCommand.setNodes(nodes);
+                        navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹�
+
+
                         //姝ゆ椂杞﹀湪鎻愬崌鏈哄唴閮紝闇�瑕佸涓嬭揪涓�姝ユ寚浠よ杞︾Щ鍔ㄥ埌鎻愬崌鏈哄彛
                         short startCode = liftProtocol.getBarcode();//鎻愬崌鏈哄唴閮ㄤ簩缁寸爜
                         Short distCode = commands.get(0).getStartCodeNum();//鐩爣浜岀淮鐮�
                         //鑾峰彇绉诲姩鍛戒护
                         ShuttleCommand moveCommand = shuttleThread.getMoveCommand(startCode, distCode, 1400, commands.get(0).getRunDirection(), startCode, 1400, 500);
                         commands.add(0, moveCommand);//灏嗚鎸囦护娣诲姞鍒伴槦澶�
-
-                        //鑾峰彇褰撳墠灏忚溅鎵�鍦ㄦゼ灞傜殑绔欑偣淇℃伅
-                        BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo);
-                        Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//绔欑偣浜岀淮鐮�
-
-                        String disLocNo = "2000202" + Utils.getLev(liftSiteLocNo);//閬胯浣嶇疆
-                        LocMast locMast1 = locMastService.queryByLoc(disLocNo);
-                        if (locMast1 == null) {
-                            continue;//鎵句笉鍒板簱浣�
-                        }
-                        short disCode = Short.parseShort(locMast1.getQrCodeValue());
-                        //浠诲姟鎵ц瀹屽悗锛屽皬杞﹁繘鍏ョЩ寮�鎻愬崌鏈哄彛绔欑偣浣嶇疆锛屼互鍏嶅潬钀�
-                        ShuttleCommand moveCommand2 = shuttleThread.getMoveCommand(endStartCode, disCode, 1400, ShuttleRunDirection.BOTTOM.id, endStartCode, 1400, 500);
-                        commands.add(moveCommand2);
-
 
                         //鍒嗛厤鐩爣搴撲綅
                         shuttleProtocol.setLocNo(wrkMast.getSourceLocNo());
@@ -1216,6 +1240,16 @@
         ArrayList<ShuttleThread> sameLev = new ArrayList<>();//鐩稿悓妤煎眰鐨勭┛姊溅
         ArrayList<ShuttleThread> diffLev = new ArrayList<>();//涓嶅悓妤煎眰鐨勭┛姊溅
 
+        //鍒ゆ柇鍏朵粬绌洪棽绌挎杞︽槸鍚︾浠诲姟鏈�杩�
+        String distLocNo = null;//鐩爣鍦扮偣锛屽叆搴�=銆嬫彁鍗囨満鍙o紝鍑哄簱=銆嬭揣鐗╁簱浣嶅彿
+        if (wrkMast.getIoType() < 101) {
+            //鍏ュ簱
+            distLocNo = Utils.levToOutInStaLocNo(lev);
+        }else {
+            //鍑哄簱
+            distLocNo = locNo;
+        }
+
         for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
             //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
             ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
@@ -1231,6 +1265,14 @@
             if (shuttleLocNo == null) {
                 continue;
             }
+
+            if (shuttleLocNo.equals(distLocNo)) {
+                //杞﹁締褰撳墠浣嶇疆宸茬粡鏄洰鏍囧簱浣嶏紝鏃犻渶璁$畻
+                map.put("sameLay", true);//鍚屽眰
+                map.put("result", shuttleThread);
+                return map;
+            }
+
             int shuttleLocNoLey = Utils.getLev(shuttleLocNo);//搴撲綅鍙峰搴斿眰楂�
             if (lev == shuttleLocNoLey) {
                 //宸ヤ綔妗fゼ灞傜浉鍚岀殑绌挎杞�
@@ -1250,25 +1292,15 @@
                     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, NavigationMapType.NORMAL.id);//鎼滅储绌洪棽绌挎杞︼紝浣跨敤姝e父閫氶亾鍦板浘
+                List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, distLocNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(recentShuttle.getSlave().getId(), Utils.getLev(recentLocNo)));//鎼滅储绌洪棽绌挎杞︼紝浣跨敤姝e父閫氶亾鍦板浘
                 //褰撳墠绌挎杞︾嚎绋嬪埌鐩爣鍦扮偣璺濈
-                List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, distLocNo, NavigationMapType.NORMAL.id);//鎼滅储绌洪棽绌挎杞︼紝浣跨敤姝e父閫氶亾鍦板浘
+                List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, distLocNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), Utils.getLev(currentLocNo)));//鎼滅储绌洪棽绌挎杞︼紝浣跨敤姝e父閫氶亾鍦板浘
                 if (recentShuttlePath == null || currentShuttlePath == null) {
                     continue;
                 }
@@ -1298,9 +1330,9 @@
                 int recentLev = Utils.getLev(recentLocNo);
 
                 //褰撳墠鏈�杩戝洓鍚戠┛姊溅鍒板綋鍓嶈溅瀛愭墍鍦ㄦゼ灞傜殑鎻愬崌鏈哄彛璺濈
-                List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, Utils.levToOutInStaLocNo(recentLev), NavigationMapType.NORMAL.id);//鎼滅储绌洪棽绌挎杞︼紝浣跨敤姝e父閫氶亾鍦板浘
+                List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, Utils.levToOutInStaLocNo(recentLev), NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), recentLev));//鎼滅储绌洪棽绌挎杞︼紝浣跨敤姝e父閫氶亾鍦板浘
                 //褰撳墠绌挎杞︾嚎绋嬪埌褰撳墠杞﹀瓙鎵�鍦ㄦゼ灞傜殑鎻愬崌鏈哄彛璺濈
-                List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, Utils.levToOutInStaLocNo(currentLev), NavigationMapType.NORMAL.id);//鎼滅储绌洪棽绌挎杞︼紝浣跨敤姝e父閫氶亾鍦板浘
+                List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, Utils.levToOutInStaLocNo(currentLev), NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), currentLev));//鎼滅储绌洪棽绌挎杞︼紝浣跨敤姝e父閫氶亾鍦板浘
                 if (recentShuttlePath == null || currentShuttlePath == null) {
                     continue;
                 }
@@ -1336,6 +1368,9 @@
                     && shuttleProtocol.getTaskNo() != 0
                     && shuttleProtocol.getBusyStatus() == 0
             ) {
+                //鏍囪澶嶄綅
+                shuttleProtocol.setPakMk(true);
+
                 //灏嗕换鍔℃。鏍囪涓哄畬鎴�
                 WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo().intValue());
                 if (wrkMast != null) {
@@ -1364,8 +1399,6 @@
                         shuttleProtocol.setSourceLocNo(null);
                         //鐩爣搴撲綅娓呴浂
                         shuttleProtocol.setLocNo(null);
-                        //鏍囪澶嶄綅
-                        shuttleProtocol.setPakMk(true);
                         //浠诲姟鎸囦护娓呴浂
                         shuttleProtocol.setAssignCommand(null);
                         News.info("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傚洓鍚戠┛姊溅鍙�={}", shuttleProtocol.getShuttleNo());
@@ -1468,6 +1501,12 @@
                 }
                 if (liftProtocol.getPlatShuttleCheck()) {
                     //鎻愬崌鏈烘鏃舵湁鍥涘悜杞︼紝鍙兘鏈夋湭瀹屾垚鐨勪换鍔★紝绂佹鍒嗛厤鏂颁换鍔�
+                    continue;
+                }
+
+                //鑾峰彇鐩爣绔�
+                StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getStaNo());
+                if (staProtocol.isLoading() || !staProtocol.isInEnable()) {//鐩爣绔欐湁鐗╋紝涓嶅彲鍏ワ紝绂佹鍒嗛厤浠诲姟
                     continue;
                 }
 
@@ -1694,9 +1733,6 @@
                     && !liftProtocol.getRunning()
             ) {
 
-                //鏍囪澶嶄綅
-                liftProtocol.setPakMk(true);
-
                 DevpThread devpThread = null;
                 Integer devpId = null;
                 for (DevpSlave devp : slaveProperties.getDevp()){
@@ -1708,8 +1744,18 @@
                 //灏嗕换鍔℃。鏍囪涓哄畬鎴�
                 WrkMast wrkMast = wrkMastMapper.selectByWorkNo372428(liftProtocol.getTaskNo().intValue());
                 if (wrkMast != null) {
+                    //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀埌杈句换鍔℃ゼ灞�
+                    String locNo = wrkMast.getIoType() < 101 ? wrkMast.getLocNo() : wrkMast.getSourceLocNo();
+                    int lev = Utils.getLev(locNo);//浠诲姟鐩爣妤煎眰
+
+                    //鏍囪澶嶄綅
+                    liftProtocol.setPakMk(true);
+
                     switch (wrkMast.getWrkSts().intValue()) {
                         case 3://3.鎻愬崌鏈烘惉杩愪腑 ==> 4.鎻愬崌鏈烘惉杩愬畬鎴�
+                            if (liftProtocol.getLev().intValue() != lev) {
+                                continue;//鎻愬崌鏈烘病鏈夊埌杈剧洰鏍�
+                            }
                             //缁欑洰鏍囩珯璁剧疆宸ヤ綔鍙�
                             StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getStaNo());//鐩爣绔�
                             staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
@@ -1721,16 +1767,23 @@
                             wrkMast.setWrkSts(4L);
                             break;
                         case 7://7.鎻愬崌鏈鸿縼绉诲皬杞︿腑 ==> 8.鎻愬崌鏈鸿縼绉诲皬杞﹀畬鎴�
+                            if (liftProtocol.getLev().intValue() != lev) {
+                                continue;//鎻愬崌鏈烘病鏈夊埌杈剧洰鏍�
+                            }
                             wrkMast.setWrkSts(8L);
                             break;
                         case 24://24.鎻愬崌鏈鸿縼绉诲皬杞︿腑 ==> 25.鎻愬崌鏈鸿縼绉诲皬杞﹀畬鎴�
+                            if (liftProtocol.getLev().intValue() != lev) {
+                                continue;//鎻愬崌鏈烘病鏈夊埌杈剧洰鏍�
+                            }
                             wrkMast.setWrkSts(25L);
                             break;
                         case 28://28.鎻愬崌鏈烘惉杩愪腑 ==> 29.鎻愬崌鏈烘惉杩愬畬鎴�
+                            if (liftProtocol.getPositionArrivalFeedback().intValue() != 2) {
+                                continue;//鎻愬崌鏈烘槸鍚﹁揪鍒拌緭閫佺嚎妤煎眰
+                            }
                             wrkMast.setWrkSts(29L);
                             wrkMast.setWrkSts(34L);//34.鍑哄簱瀹屾垚锛屾殏鏃跺厛鐩存帴瀹屾垚鍑哄簱宸ヤ綔妗o紝鍚庣画闇�瑕佹牴鎹緭閫佺嚎缁欏嚭鐨勭姸鎬佹潵纭畾34.鍑哄簱瀹屾垚鐘舵��
-                            //浠诲姟鍙锋竻闆�
-                            liftProtocol.setTaskNo((short) 0);
                             break;
                         default:
                     }
@@ -1740,6 +1793,8 @@
                         liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
                         //浠诲姟鎸囦护娓呴浂
                         liftProtocol.setAssignCommand(null);
+                        //浠诲姟鍙锋竻闆�
+                        liftProtocol.setTaskNo((short) 0);
                         News.info("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬併�傛彁鍗囨満鍙�={}", liftProtocol.getLiftNo());
                     } else {
                         News.error("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傛彁鍗囨満鍙�={}锛屽伐浣滃彿={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo());
@@ -1749,6 +1804,9 @@
                 //鏌ヨ鏄惁鏈夊厖鐢典换鍔�
                 WrkCharge wrkCharge = wrkChargeMapper.selectByWorkNo(liftProtocol.getTaskNo().intValue());
                 if (wrkCharge != null) {
+                    //鏍囪澶嶄綅
+                    liftProtocol.setPakMk(true);
+                    
                     switch (wrkCharge.getWrkSts().intValue()) {
                         case 54://鎻愬崌鏈烘惉杩愪腑
                             wrkCharge.setWrkSts(55L);//鎻愬崌鏈烘惉杩愬畬鎴�
@@ -1775,8 +1833,11 @@
                 if (liftProtocol.getAssignCommand() != null) {
                     //璁剧疆鎻愬崌鏈轰负绌洪棽鐘舵��
                     liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
-                    //浠诲姟鍙锋竻闆�
-                    liftProtocol.setTaskNo((short) 0);
+                    //鍒ゆ柇鏄惁涓哄洓鍚戠┛姊溅璋冨害鎻愬崌鏈猴紝濡傛槸鍒欐棤闇�娓呯悊浠诲姟鍙�
+                    if (!liftProtocol.getSecurityMk()) {
+                        //浠诲姟鍙锋竻闆�
+                        liftProtocol.setTaskNo((short) 0);
+                    }
                     //鏍囪澶嶄綅
                     liftProtocol.setPakMk(true);
                     //浠诲姟鎸囦护娓呴浂
@@ -2470,7 +2531,7 @@
                 continue;
             }
 
-            WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttleProtocol.getShuttleNo().intValue(), WrkChargeType.charge);
+            WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttleProtocol.getShuttleNo().intValue());
             if (wrkCharge != null) {//宸叉湁鍏呯數浠诲姟
                 continue;
             }
@@ -2512,7 +2573,7 @@
      */
     public synchronized void executeShuttleCharge() {
         for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
-            WrkCharge wrkCharge = wrkChargeService.selectWorking(null, WrkChargeType.charge);
+            WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttle.getId());
             if (wrkCharge == null) {
                 continue;
             }
@@ -2720,23 +2781,33 @@
                 //鍒ゆ柇灏忚溅鏄惁鍏呮弧鐢甸噺锛屾弧鐢�1000鎴栫數鍘�54V浠ヤ笂
                 if (shuttleProtocol.getBatteryPower() >= 1000 && shuttleProtocol.getCurrentVoltage() >= 54000) {
                     //鍏呮弧锛屾柇寮�鍏呯數
-                    List<ShuttleCommand> commands = new ArrayList<>();
-                    ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-                    assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());
-                    assignCommand.setTaskMode((short) 0);
-                    assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue());
-                    assignCommand.setCharge(true);
+//                    List<ShuttleCommand> commands = new ArrayList<>();
+//                    ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+//                    assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());
+//                    assignCommand.setTaskMode((short) 0);
+//                    assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue());
+//                    assignCommand.setCharge(true);
+//
+//                    //鍒涘缓鍏呯數鎸囦护
+//                    ShuttleCommand command = shuttleThread.getChargeSwitchCommand((short) 2);//鏂紑鍏呯數
+//                    commands.add(command);
+//
+//                    //鎸囦护闆嗗垎閰�
+//                    assignCommand.setCommands(commands);
+//
+//                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
 
-                    //鍒涘缓鍏呯數鎸囦护
-                    ShuttleCommand command = shuttleThread.getChargeSwitchCommand((short) 2);//鏂紑鍏呯數
-                    commands.add(command);
+                    //灏嗗皬杞︾Щ鍔ㄥ埌绌洪棽鐨勫贩閬�
+                    ShuttleAssignCommand assignCommand = Utils.searchEmptyGroupToMoveShuttle(Utils.getLev(shuttleProtocol.getLocNo()), shuttleProtocol.getShuttleNo().intValue(), shuttleThread, null);
+                    if (assignCommand == null) {
+                        continue;
+                    }
 
-                    //鎸囦护闆嗗垎閰�
-                    assignCommand.setCommands(commands);
-
-                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
-                    //涓嬪彂浠诲姟
-                    MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+                    wrkCharge.setWrkSts(60L);//60.鍏呯數浠诲姟瀹屾垚
+                    if (wrkChargeMapper.updateById(wrkCharge) > 0) {
+                        //涓嬪彂浠诲姟
+                        MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+                    }
                 }
 
                 if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.CHARGING_WAITING.id) {
@@ -2745,222 +2816,6 @@
             }
         }
 
-    }
-
-    /**
-     * 杞鍏呯數妗╂槸鍚︽湁绌洪棽灏忚溅
-     */
-    @Deprecated
-    public synchronized void queryChargeLocOfComplete() {
-        // 涓庡厖鐢典换鍔′笉鍚屾杩涜
-        if (null != wrkChargeService.selectWorking(null, WrkChargeType.charge)) { return; }
-        if (null != wrkChargeService.selectWorking(null, WrkChargeType.reset)) { return; }
-        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
-        // 妫�绱㈠厖鐢垫々
-        for (SteChargeType value : SteChargeType.values()) {
-            Integer steNo = basSteService.hasCarOfLocNo(value.locNo);
-            if (steNo != null) {
-                SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo);
-                SteProtocol steProtocol = steThread.getSteProtocol();
-                BasSte basSte = basSteService.selectById(steNo);
-                if (Cools.isEmpty(steProtocol, basSte)) {
-                    continue;
-                }
-                if (steProtocol.getCharge() < 99) {
-                    continue;
-                }
-                if (steProtocol.getMode() == 0) {
-                    continue;
-                }
-                if (!steProtocol.getStatusType().equals(SteStatusType.IDLE)) {
-                    continue;
-                }
-//                // 1鍙峰厖鐢垫々
-//                if (value.equals(SteChargeType.FIRST) && devpThread.charge0) {
-//                    continue;
-//                }
-//                // 2鍙峰厖鐢垫々
-//                if (value.equals(SteChargeType.SECOND) && devpThread.charge1) {
-//                    continue;
-//                }
-//                // 3鍙峰厖鐢垫々
-//                if (value.equals(SteChargeType.THIRD) && devpThread.charge2) {
-//                    continue;
-//                }
-//                // 灏忚溅鏄惁澶勪簬鍏呯數鐘舵��
-//                if (steProtocol.getChargeStatus() == 1) {
-//                    continue;
-//                }
-                // case 1 : 鑷姩鍏呯數寮�   棣堢數      脳
-                // case 2 : 鑷姩鍏呯數寮�   婊$數      鉁�
-                // case 3 : 鑷姩鍏呯數鍏�   棣堢數      鉁�
-                // case 4 : 鑷姩鍏呯數鍏�   婊$數      鉁�
-                if (basSte.getAutoCharge().equals("Y")
-                        && steProtocol.getCharge() < Float.parseFloat(basSte.getChargeLine())) {
-                    continue;
-                }
-
-                WrkCharge wrkCharge = wrkChargeService.selectWorking(steNo, WrkChargeType.reset);
-
-                if (wrkCharge == null) {
-                    // 寮�濮嬬┛姊溅澶嶄綅浠诲姟
-                    wrkCharge = new WrkCharge();
-                    wrkCharge.setSteNo(steNo);
-                    wrkCharge.setWrkNo(commonService.getChargeWorkNo(6));
-                    wrkCharge.setWrkSts(41L);   // 41.灏忚溅鍑嗗澶嶄綅
-                    wrkCharge.setCrnNo(2);  // 鍥哄畾2鍙峰爢鍨涙満
-                    wrkCharge.setIoPri((double) 10);
-                    wrkCharge.setSourceLocNo(value.locNo);
-                    wrkCharge.setLocNo(basSte.getIdleLoc());
-                    wrkCharge.setMemo("reset");
-                    wrkCharge.setAppeTime(new Date());
-                    if (!wrkChargeService.insert(wrkCharge)) {
-                        News.error("淇濆瓨{}鍙风┛姊溅澶嶄綅浠诲姟澶辫触!!!", steNo);
-                    } else {
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * 灏忚溅浠庡厖鐢垫々 鑷� 寰呮満搴撲綅
-     */
-    @Deprecated
-    public synchronized void steFromChargeToIdleLoc() {
-        WrkCharge wrkCharge = wrkChargeService.selectWorking(null, WrkChargeType.reset);
-        if (wrkCharge == null) { return; }
-        SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkCharge.getSteNo());
-        SteProtocol steProtocol = steThread.getSteProtocol();
-        BasSte basSte = basSteService.selectById(wrkCharge.getSteNo());
-        if (Cools.isEmpty(steProtocol, basSte)) {
-            return;
-        }
-        // 鎼繍鑷冲浐瀹氶�氶亾
-        if (wrkCharge.getWrkSts() == 41L) {
-            // 鎼皬杞﹁嚦灏忚溅璧板悜閫氶亾
-            List<String> channel = slaveProperties.getChannel();
-            for (String channelLocNo : channel) {
-                Integer otherSte = existOtherSte(channelLocNo, wrkCharge.getSteNo());
-                if (null != otherSte) {
-                    News.warn("{}鍙峰皬杞︾Щ鍏}搴撲綅缁勫け璐ワ紝鍘熷洜锛氬瓨鍦▄}鍙风┛姊溅锛�", wrkCharge.getSteNo(), channelLocNo, otherSte);
-                } else {
-                    // 鍥哄畾鍫嗗灈鏈�
-                    int crnNo = 1;
-                    if (null != wrkMastMapper.selectWorkingByCrn(crnNo)) {
-                        return;
-                    }
-
-                    LocMast channelLoc = locMastService.selectById(channelLocNo);
-
-                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo);
-                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
-                    if (crnProtocol == null) { continue; }
-                    // 鍙湁褰撳爢鍨涙満绌洪棽 骞朵笖 鏃犱换鍔℃椂鎵嶇户缁墽琛�
-                    if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
-                        // 鍫嗗灈鏈哄懡浠や笅鍙戝尯 --------------------------------------------------------------------------
-                        CrnCommand crnCommand = new CrnCommand();
-                        crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
-                        crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 宸ヤ綔鍙�
-                        crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
-                        crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 浠诲姟妯″紡:  搴撲綅绉昏浆
-                        crnCommand.setSourcePosX(steProtocol.getRow());     // 婧愬簱浣嶆帓
-                        crnCommand.setSourcePosY(steProtocol.getBay());     // 婧愬簱浣嶅垪
-                        crnCommand.setSourcePosZ(steProtocol.getLev());     // 婧愬簱浣嶅眰
-                        crnCommand.setDestinationPosX(Utils.getGroupRow(channelLoc.getLocNo(), false).shortValue());     // 鐩爣搴撲綅鎺�
-                        crnCommand.setDestinationPosY(channelLoc.getBay1().shortValue());     // 鐩爣搴撲綅鍒�
-                        crnCommand.setDestinationPosZ(channelLoc.getLev1().shortValue());     // 鐩爣搴撲綅灞�
-                        if (!MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, crnCommand))) {
-                            News.error("鍫嗗灈鏈哄懡浠や笅鍙戝け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand));
-                        } else {
-                            // 淇敼绌挎杞﹁繍琛屼腑鎺掑垪灞�
-                            steThread.modifyPos(Utils.getGroupRow(channelLoc.getLocNo(), false), channelLoc.getBay1(), channelLoc.getLev1());
-                            // 淇敼宸ヤ綔妗g姸鎬� 41.灏忚溅鍑嗗澶嶄綅 => 42.鍚婅溅鎼繍
-                            Date now = new Date();
-                            wrkCharge.setWrkSts(42L);
-                            wrkCharge.setCrnStrTime(now);
-                            wrkCharge.setModiTime(now);
-                            if (!wrkChargeService.updateById(wrkCharge)) {
-                                News.error("淇敼澶嶄綅浠诲姟鐘舵�� 41.灏忚溅鍑嗗澶嶄綅 => 42.鍚婅溅鎼繍 澶辫触锛侊紒锛屽伐浣滃彿={}", wrkCharge.getWrkNo());
-                            }
-                        }
-                        break;
-                    }
-
-                }
-            }
-        } else if (wrkCharge.getWrkSts() == 43L) {
-            // 灏忚溅琛岄┒閫氶亾
-            if (steProtocol.statusType.equals(SteStatusType.IDLE) && steProtocol.getPakMk().equals("N")) {
-                // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
-                SteCommand steCommand = new SteCommand();
-                steCommand.setSteNo(wrkCharge.getSteNo()); // 绌挎杞︾紪鍙�
-                steCommand.setTaskNo(wrkCharge.getWrkNo()); // 宸ヤ綔鍙�
-                steCommand.setTaskMode(SteTaskModeType.BACK_ORIGIN);  // 鍘诲乏绔�
-
-                steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());
-                steCommand.setBay(steProtocol.getBay());
-                steCommand.setLev(steProtocol.getLev());
-                if (!MessageQueue.offer(SlaveType.Ste, wrkCharge.getSteNo(), new Task(2, steCommand))) {
-                    News.error("绌挎杞﹀懡浠や笅鍙戝け璐ワ紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", wrkCharge.getSteNo(), JSON.toJSON(steCommand));
-                } else {
-                    // 淇敼宸ヤ綔妗g姸鎬� 43.灏忚溅鍒拌揪 ===> 44.灏忚溅璧拌
-                    wrkCharge.setWrkSts(44L);
-                    Date now = new Date();
-                    wrkCharge.setCrnEndTime(now);
-                    wrkCharge.setModiTime(now);
-                    if (!wrkChargeService.updateById(wrkCharge)) {
-                        News.error("淇敼澶嶄綅浠诲姟鐘舵�� 43.灏忚溅鍒拌揪 ===> 44.灏忚溅璧拌 澶辫触锛侊紒锛屽伐浣滃彿={}", wrkCharge.getWrkNo());
-                    }
-                }
-            }
-        } else if (wrkCharge.getWrkSts() == 45L) {
-            if (null != wrkMastMapper.selectWorkingByCrn(wrkCharge.getCrnNo())) {
-                return;
-            }
-
-            LocMast idleLoc = locMastService.selectById(basSte.getIdleLoc());
-
-            Integer otherSte = existOtherSte(idleLoc.getLocNo(), wrkCharge.getSteNo());
-            if (null != otherSte) {
-                News.warn("{}鍙峰皬杞︾Щ鍏}搴撲綅缁勫け璐ワ紝鍘熷洜锛氬瓨鍦▄}鍙风┛姊溅锛�", wrkCharge.getSteNo(), idleLoc.getLocNo(), otherSte);
-            } else {
-                CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkCharge.getCrnNo());
-                CrnProtocol crnProtocol = crnThread.getCrnProtocol();
-                if (crnProtocol == null) { return; }
-                // 鍙湁褰撳爢鍨涙満绌洪棽 骞朵笖 鏃犱换鍔℃椂鎵嶇户缁墽琛�
-                if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
-                    // 鍫嗗灈鏈哄懡浠や笅鍙戝尯 --------------------------------------------------------------------------
-                    CrnCommand crnCommand = new CrnCommand();
-                    crnCommand.setCrnNo(wrkCharge.getCrnNo()); // 鍫嗗灈鏈虹紪鍙�
-                    crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 宸ヤ綔鍙�
-                    crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
-                    crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 浠诲姟妯″紡:  搴撲綅绉昏浆
-                    crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 婧愬簱浣嶆帓
-                    crnCommand.setSourcePosY(steProtocol.getBay());     // 婧愬簱浣嶅垪
-                    crnCommand.setSourcePosZ(steProtocol.getLev());     // 婧愬簱浣嶅眰
-                    crnCommand.setDestinationPosX(Utils.getGroupRow(idleLoc.getLocNo(), true).shortValue());     // 鐩爣搴撲綅鎺�
-                    crnCommand.setDestinationPosY(idleLoc.getBay1().shortValue());     // 鐩爣搴撲綅鍒�
-                    crnCommand.setDestinationPosZ(idleLoc.getLev1().shortValue());     // 鐩爣搴撲綅灞�
-                    if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) {
-                        News.error("鍫嗗灈鏈哄懡浠や笅鍙戝け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand));
-                    } else {
-                        // 淇敼绌挎杞﹁繍琛屼腑鎺掑垪灞�
-                        steThread.modifyPos(Utils.getGroupRow(idleLoc.getLocNo(), true), idleLoc.getBay1(), idleLoc.getLev1());
-                        // 淇敼宸ヤ綔妗g姸鎬� 45.灏忚溅寰呮惉 => 46.鏀捐嚦寰呮満浣�
-                        Date now = new Date();
-                        wrkCharge.setWrkSts(46L);
-                        wrkCharge.setCrnStrTime(now);
-                        wrkCharge.setModiTime(now);
-                        if (!wrkChargeService.updateById(wrkCharge)) {
-                            News.error("淇敼宸ヤ綔妗g姸鎬� 45.灏忚溅寰呮惉 => 46.鏀捐嚦寰呮満浣� 澶辫触锛侊紒锛屽伐浣滃彿={}", wrkCharge.getWrkNo());
-                        }
-                    }
-                }
-
-            }
-        }
     }
 
     public List<String> crn2DemoLocs = new ArrayList<String>(); public String crn2LastLoc = "";

--
Gitblit v1.9.1