From 6e02d92c3b9c240fa78a343b67ddf0db12d840e6 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 22 八月 2025 17:00:56 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/task/ShuttleExecuteScheduler.java         |    4 
 src/main/java/com/zy/common/utils/ShuttleOperaUtils.java            |   20 ++
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java         |   90 +++++++++---
 src/main/java/com/zy/core/action/ShuttleAction.java                 |  136 +++---------------
 src/main/java/com/zy/common/utils/NavigateUtils.java                |   23 +++
 src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java |   16 +
 src/main/java/com/zy/core/enums/RedisKeyType.java                   |    7 +
 src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java     |   16 +-
 src/main/webapp/views/shuttleNew.html                               |    2 
 src/main/java/com/zy/core/News.java                                 |   83 +++++++++++
 10 files changed, 242 insertions(+), 155 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java
index 7386072..b9ab5de 100644
--- a/src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java
@@ -187,10 +187,10 @@
             }
 
             //妫�娴嬮殰纰嶇墿杞�
-            boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
+            int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
                 add(shuttleProtocol.getShuttleNo());
             }}, new ArrayList<>());
-            if (checkObstacle) {
+            if (checkObstacle > 0) {
                 News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                 return false;
             }
@@ -378,10 +378,10 @@
             //鍒ゆ柇灏忚溅鏄惁鍒拌揪璐х墿搴撲綅
             if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
                 //妫�娴嬮殰纰嶇墿杞�
-                boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getSourceLocNo(), new ArrayList<Integer>() {{
+                int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getSourceLocNo(), new ArrayList<Integer>() {{
                     add(shuttleProtocol.getShuttleNo());
                 }}, new ArrayList<>());
-                if (checkObstacle) {
+                if (checkObstacle > 0) {
                     News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                     return false;
                 }
@@ -520,10 +520,10 @@
             }
 
             //妫�娴嬮殰纰嶇墿杞�
-            boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
+            int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
                 add(shuttleProtocol.getShuttleNo());
             }}, new ArrayList<>());
-            if (checkObstacle) {
+            if (checkObstacle > 0) {
                 News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                 return false;
             }
@@ -1390,10 +1390,10 @@
             }
 
             //妫�娴嬮殰纰嶇墿杞�
-            boolean checkObstacle = shuttleOperaUtils.checkObstacle(basShuttleCharge.getWaitLocNo(), new ArrayList<Integer>() {{
+            int checkObstacle = shuttleOperaUtils.checkObstacle(basShuttleCharge.getWaitLocNo(), new ArrayList<Integer>() {{
                 add(shuttleProtocol.getShuttleNo());
             }}, new ArrayList<>());
-            if (checkObstacle) {
+            if (checkObstacle > 0) {
                 News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                 return false;
             }
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 6bc7288..9f5533e 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -182,10 +182,10 @@
             }
 
             //妫�娴嬮殰纰嶇墿杞�
-            boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
+            int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
                 add(shuttleProtocol.getShuttleNo());
             }}, new ArrayList<>());
-            if (checkObstacle) {
+            if (checkObstacle > 0) {
                 News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                 return false;
             }
@@ -373,10 +373,10 @@
             //鍒ゆ柇灏忚溅鏄惁鍒拌揪璐х墿搴撲綅
             if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
                 //妫�娴嬮殰纰嶇墿杞�
-                boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getSourceLocNo(), new ArrayList<Integer>() {{
+                int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getSourceLocNo(), new ArrayList<Integer>() {{
                     add(shuttleProtocol.getShuttleNo());
                 }}, new ArrayList<>());
-                if (checkObstacle) {
+                if (checkObstacle > 0) {
                     News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                     return false;
                 }
@@ -515,10 +515,10 @@
             }
 
             //妫�娴嬮殰纰嶇墿杞�
-            boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
+            int checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
                 add(shuttleProtocol.getShuttleNo());
             }}, new ArrayList<>());
-            if (checkObstacle) {
+            if (checkObstacle > 0) {
                 News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                 return false;
             }
@@ -1387,10 +1387,10 @@
             }
 
             //妫�娴嬮殰纰嶇墿杞�
-            boolean checkObstacle = shuttleOperaUtils.checkObstacle(basShuttleCharge.getWaitLocNo(), new ArrayList<Integer>() {{
+            int checkObstacle = shuttleOperaUtils.checkObstacle(basShuttleCharge.getWaitLocNo(), new ArrayList<Integer>() {{
                 add(shuttleProtocol.getShuttleNo());
             }}, new ArrayList<>());
-            if (checkObstacle) {
+            if (checkObstacle > 0) {
                 News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                 return false;
             }
@@ -1489,7 +1489,7 @@
             }
 
             //鎼滅储鏈�杩戜笖鏃犳晠闅滄彁鍗囨満
-            LiftStaProtocol recentLiftStation = liftDispatchUtils.getRecentLiftStation(shuttleProtocol.getShuttleNo(), Utils.getLev(wrkMast.getLocNo()));
+            LiftStaProtocol recentLiftStation = liftDispatchUtils.getRecentLiftStation(shuttleProtocol.getShuttleNo(), Utils.getLev(shuttleProtocol.getCurrentLocNo()));
             if(recentLiftStation == null) {
                 News.info("{}鍙峰皬杞︼紝{}鐩爣搴撲綅锛屾病鏈夊彲鐢ㄧ┖闂茶緭閫佺珯鐐�", shuttleProtocol.getShuttleNo(), wrkMast.getLocNo());
                 return false;
@@ -1499,12 +1499,6 @@
             if(targetLiftSta == null) {
                 return false;
             }
-
-            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//灏忚溅绉诲簱浠诲姟
-            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
-            assignCommand.setAuto(true);//鑷姩妯″紡
 
             //璁$畻杩戠偣浣嶇疆
             String endLocation = navigateUtils.calcEndLocation(shuttleProtocol.getCurrentLocNo(), recentLiftStation.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, 1);
@@ -1523,6 +1517,14 @@
                 wrkMastService.updateById(wrkMast);
                 return true;
             }
+
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//灏忚溅绉诲簱浠诲姟
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�
+            assignCommand.setLocNo(endLocation);
+            assignCommand.setAuto(true);//鑷姩妯″紡
 
             //鑾峰彇灏忚溅鍒拌繎鐐硅璧板懡浠�
             List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), endLocation, NavigationMapType.getMapTypes(NavigationMapType.NORMAL, NavigationMapType.SHUTTLE), assignCommand, shuttleThread);
@@ -1624,8 +1626,9 @@
                 return false;
             }
 
+            Object object = redisUtil.get(RedisKeyType.LIFT_MOVE_TO_SHUTTLE_LIMIT.key + wrkMast.getWrkNo());
             int targetLev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
-            if (liftProtocol.getLev() != targetLev) {
+            if (object == null || liftProtocol.getLev() != targetLev) {
                 //鑾峰彇鎻愬崌鏈哄懡浠�
                 LiftCommand liftCommand = liftThread.getMoveCommand(wrkMast.getWrkNo(), liftProtocol.getLev(), targetLev);
                 ArrayList<LiftCommand> commands = new ArrayList<>();
@@ -1640,17 +1643,22 @@
                 //涓嬪彂浠诲姟
                 liftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
                 News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満鍦▄}灞傦紝鎻愬崌鏈轰笉鍦ㄥ皬杞﹀眰锛岃皟搴︾Щ鍔ㄤ腑", wrkMast.getWrkNo(), liftProtocol.getLev(), wrkMast.getLiftNo());
+                redisUtil.set(RedisKeyType.LIFT_MOVE_TO_SHUTTLE_LIMIT.key + wrkMast.getWrkNo(), "lift_moving", 60 * 3);
                 return false;
             }
+
+            String liftLocNo = liftThread.getCurrentLocNo();
 
             ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
             assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
             assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//灏忚溅绉诲簱浠诲姟
             assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�
+            assignCommand.setLocNo(liftLocNo);
             assignCommand.setAuto(true);//鑷姩妯″紡
 
             //鑾峰彇灏忚溅鍒版彁鍗囨満琛岃蛋鍛戒护
-            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), liftThread.getCurrentLocNo(), NavigationMapType.getNormalWithDevice(), assignCommand, shuttleThread, "inLift");
+            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), liftLocNo, NavigationMapType.getNormalWithDevice(), assignCommand, shuttleThread, "inLift");
             if (commands == null) {
                 News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;//璺緞瑙i攣澶辫触
@@ -1761,25 +1769,57 @@
                 return false;
             }
 
+            if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
+                Object object = redisUtil.get(RedisKeyType.SHUTTLE_UPDATE_LOCATION.key + shuttleProtocol.getShuttleNo());
+                if(object != null) {
+                    return false;
+                }
+
+                ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+                assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
+                assignCommand.setTaskMode(ShuttleTaskModeType.UPDATE_LOCATION.id);//鏇存柊鍧愭爣
+                assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+                assignCommand.setAuto(true);//鑷姩妯″紡
+                assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�
+                assignCommand.setLocNo(wrkMast.getLocNo());//鐩爣搴撲綅
+
+                //鏇存柊灏忚溅鍧愭爣
+                ShuttleCommand command = shuttleThread.getUpdateLocationCommand(wrkMast.getWrkNo(), wrkMast.getLocNo());
+                ArrayList<ShuttleCommand> commands = new ArrayList<>();
+                commands.add(command);
+
+                assignCommand.setCommands(commands);
+                //涓嬪彂浠诲姟
+                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+                redisUtil.set(RedisKeyType.SHUTTLE_UPDATE_LOCATION.key + shuttleProtocol.getShuttleNo(), "update", 10);
+                return false;
+            }
+
+            String targetLocNo = navigateUtils.calcFirstLocation(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, 5);
+            if (targetLocNo == null) {//鍑烘彁鍗囨満杩戠偣璁$畻澶辫触
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽嚭鎻愬崌鏈鸿繎鐐硅绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
             ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
             assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.UPDATE_LOCATION.id);//鏇存柊鍧愭爣
+            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//灏忚溅绉诲簱浠诲姟
             assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
             assignCommand.setAuto(true);//鑷姩妯″紡
             assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�
-            assignCommand.setLocNo(wrkMast.getLocNo());//鐩爣搴撲綅
+            assignCommand.setLocNo(targetLocNo);//鐩爣搴撲綅
 
-            //鏇存柊灏忚溅鍧愭爣
-            ShuttleCommand command = shuttleThread.getUpdateLocationCommand(wrkMast.getWrkNo(), wrkMast.getLocNo());
-            ArrayList<ShuttleCommand> commands = new ArrayList<>();
-            commands.add(command);
-
+            //鑾峰彇灏忚溅鍒拌繎鐐瑰懡浠�
+            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), targetLocNo, NavigationMapType.getMapTypes(NavigationMapType.NORMAL), assignCommand, shuttleThread);
+            if (commands == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;//璺緞璁$畻澶辫触
+            }
             assignCommand.setCommands(commands);
 
             wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT.sts);//灏忚溅杩佸嚭鎻愬崌鏈轰腑
             wrkMast.setSystemMsg("");//娓呯┖娑堟伅
             wrkMast.setModiTime(now);
-
             if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
                 shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index d49b64b..14430c1 100644
--- a/src/main/java/com/zy/common/utils/NavigateUtils.java
+++ b/src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -231,6 +231,29 @@
         return findTargetLocation(endPath);
     }
 
+    public String calcFirstLocation(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites, int firstPathNumber) {
+        //璁$畻璺緞
+        List<NavigateNode> navigateNodes = calc(startPoint, endPoint, mapTypes, shuttlePoints, whites);
+        if (navigateNodes == null) {
+            News.error("{} dash {} can't find navigate path!", startPoint, endPoint);
+            return null;
+        }
+
+        //鑾峰彇鍒嗘璺緞
+        List<List<NavigateNode>> partList = this.getSectionPath(navigateNodes);
+        List<NavigateNode> firstList = partList.get(0);
+
+        NavigateNode targetNode = null;
+        if(firstList.size() <= firstPathNumber){
+            targetNode = firstList.get(firstList.size() - 1);
+        }else {
+            targetNode = firstList.get(firstPathNumber);
+        }
+
+        String locNo = NavigatePositionConvert.nodeToLocNo(targetNode);
+        return locNo;
+    }
+
     public String findTargetLocation(List<List<NavigateNode>> partList) {
         List<NavigateNode> nodes = partList.get(partList.size() - 1);
         NavigateNode targetNode = nodes.get(0);
diff --git a/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java b/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
index db9ab33..c7dbe39 100644
--- a/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
+++ b/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
@@ -59,6 +59,8 @@
     }
 
     public synchronized List<ShuttleCommand> getStartToTargetCommands(String startLocNo, String endLocNo, List<NavigationMapType> mapTypes, List<int[]> whites, ShuttleAssignCommand assignCommand, ShuttleThread shuttleThread, String moveType) {
+        long getStartTime = System.currentTimeMillis();
+
         ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
         if (shuttleProtocol == null) {
             return null;
@@ -99,7 +101,7 @@
         //鑾峰彇鍒嗘璺緞
         List<List<NavigateNode>> data = navigateUtils.getSectionPath(nodeList);
         long endTime = System.currentTimeMillis();
-        News.info("getSection path time:{}", (endTime - startTime));
+        News.info("[RCS Debug] getSection path time:{}", (endTime - startTime));
         //灏嗘瘡涓�娈佃矾寰勫垎鎴恈ommand鎸囦护
         for (int i = 0; i < data.size(); i++) {
             List<NavigateNode> nodes = data.get(i);
@@ -141,6 +143,8 @@
             }
         }
         assignCommand.setShuttleMoveCommandsContinuously(shuttleMoveCommandsContinuously);
+
+        News.info("{}浠诲姟锛寋}灏忚溅锛寋} - {} 璺緞鍛戒护鍖呰绠楁垚鍔燂紝鑰楁椂:{}ms", assignCommand.getTaskNo(), shuttleProtocol.getShuttleNo(), startLocNo, endLocNo, System.currentTimeMillis() - startTime);
         return commands;
     }
 
@@ -168,8 +172,11 @@
         return commands;
     }
 
-    //妫�娴嬮殰纰嶇墿杞�
-    public synchronized boolean checkObstacle(String locNo, List<Integer> whiteShuttles, List<NavigateNode> whiteNodes) {
+    /**
+     * 妫�娴嬮殰纰嶇墿杞�
+     * @return 0:鏃犻殰纰� 1:鏈夐殰纰嶈皟搴︽垚鍔� 2:鏈夐殰纰嶈皟搴﹀け璐�
+     */
+    public synchronized int checkObstacle(String locNo, List<Integer> whiteShuttles, List<NavigateNode> whiteNodes) {
         int innerCircle = 0;
         int outerCircle = 3;
         Config avoidInnerCircleConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "avoidInnerCircle"));
@@ -202,7 +209,7 @@
         List<NavigateNode> innerNodes = getInnerNodes(locNo, innerCircle, whiteShuttlePointList);
         List<Integer> nodesCar = findNodesCar(innerNodes);
         if (nodesCar.isEmpty()) {
-            return false;//鍐呭湀涓棤杞�
+            return 0;//鍐呭湀涓棤杞�
         }
 
         //鑾峰彇澶栧湀鑺傜偣
@@ -239,10 +246,11 @@
             if (targetLocNo == null) {
                 continue;
             }
-            shuttleDispatchUtils.dispatchShuttle(null, targetLocNo, shuttleNo);
+            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(null, targetLocNo, shuttleNo);
+            return dispatched ? 1 : 2;
         }
 
-        return true;//鍐呭湀涓湁杞�
+        return 2;//鍐呭湀涓湁杞�
     }
 
     private HashMap<String, Integer> findCarMap() {
diff --git a/src/main/java/com/zy/core/News.java b/src/main/java/com/zy/core/News.java
index 956d860..0b650b5 100644
--- a/src/main/java/com/zy/core/News.java
+++ b/src/main/java/com/zy/core/News.java
@@ -1,8 +1,13 @@
 package com.zy.core;
 
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.SpringUtils;
 import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.service.WrkMastService;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.enums.RedisKeyType;
+import com.zy.system.entity.Config;
+import com.zy.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
 
 import java.lang.reflect.Array;
@@ -98,16 +103,94 @@
     }
 
     public static void info(String format, Object... arguments) {
+        if (format.contains("[RCS Debug]")) {
+            ConfigService configService = SpringUtils.getBean(ConfigService.class);
+            if(configService != null) {
+                boolean show = true;
+                Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "rcsDebugShowLog"));
+                if(config != null) {
+                    show = config.getValue().equals("true");
+                }
+
+                if (!show) {
+                    return;
+                }
+            }
+        }
+        RedisUtil redisUtil = null;
+        try {
+            redisUtil = SpringUtils.getBean(RedisUtil.class);
+            if(redisUtil != null) {
+                Object object = redisUtil.get(RedisKeyType.LOG_LIMIT.key + format);
+                if (object != null) {
+                    return;
+                }
+                redisUtil.set(RedisKeyType.LOG_LIMIT.key + format, "lock", 3);
+            }
+        }catch (Exception e) {}
+
         log.info(format, arguments);
         offer(NewsLevel.INFO, format, arguments);
     }
 
     public static void warn(String format, Object... arguments) {
+        if (format.contains("[RCS Debug]")) {
+            ConfigService configService = SpringUtils.getBean(ConfigService.class);
+            if(configService != null) {
+                boolean show = true;
+                Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "rcsDebugShowLog"));
+                if(config != null) {
+                    show = config.getValue().equals("true");
+                }
+
+                if (!show) {
+                    return;
+                }
+            }
+        }
+        RedisUtil redisUtil = null;
+        try {
+            redisUtil = SpringUtils.getBean(RedisUtil.class);
+            if(redisUtil != null) {
+                Object object = redisUtil.get(RedisKeyType.LOG_LIMIT.key + format);
+                if (object != null) {
+                    return;
+                }
+                redisUtil.set(RedisKeyType.LOG_LIMIT.key + format, "lock", 3);
+            }
+        }catch (Exception e) {}
+
         log.warn(format, arguments);
         offer(NewsLevel.WARN, format, arguments);
     }
 
     public static void error(String format, Object... arguments) {
+        if (format.contains("[RCS Debug]")) {
+            ConfigService configService = SpringUtils.getBean(ConfigService.class);
+            if(configService != null) {
+                boolean show = true;
+                Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "rcsDebugShowLog"));
+                if(config != null) {
+                    show = config.getValue().equals("true");
+                }
+
+                if (!show) {
+                    return;
+                }
+            }
+        }
+        RedisUtil redisUtil = null;
+        try {
+            redisUtil = SpringUtils.getBean(RedisUtil.class);
+            if(redisUtil != null) {
+                Object object = redisUtil.get(RedisKeyType.LOG_LIMIT.key + format);
+                if (object != null) {
+                    return;
+                }
+                redisUtil.set(RedisKeyType.LOG_LIMIT.key + format, "lock", 3);
+            }
+        }catch (Exception e) {}
+
         log.error(format, arguments);
         offer(NewsLevel.ERROR, format, arguments);
     }
diff --git a/src/main/java/com/zy/core/action/ShuttleAction.java b/src/main/java/com/zy/core/action/ShuttleAction.java
index 55bba24..d709041 100644
--- a/src/main/java/com/zy/core/action/ShuttleAction.java
+++ b/src/main/java/com/zy/core/action/ShuttleAction.java
@@ -119,10 +119,10 @@
             return false;
         }
 
-        News.info("execute check command {},{}", shuttleNo, taskNo);
+        News.info("[RCS Debug] Execute check command {},{}", shuttleNo, taskNo);
         //妫�娴嬪懡浠�
         int checked = checkCommand(redisCommand, shuttleNo);
-        News.info("execute check command complete {},{}", shuttleNo, taskNo);
+        News.info("[RCS Debug] Execute check command complete {},{}", shuttleNo, taskNo);
         if (checked == 0) {
             return false;
         }
@@ -171,24 +171,19 @@
             Object object = redisUtil.get(RedisKeyType.TRAFFIC_CONTROL_LOCK_APPLY.key + shuttleNo);
             if (object == null) {
                 //鐢宠绠″埗
-                News.info("execute apply control {},{}", shuttleNo, taskNo);
+                News.info("[RCS Debug] Execute apply control {},{}", shuttleNo, taskNo);
                 redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_LOCK_APPLY.key + shuttleNo, "lock", 10);
                 applyTrafficControl(commands, nodes, shuttleNo, taskNo);
-                News.info("execute apply control complete {},{}", shuttleNo, taskNo);
+                News.info("[RCS Debug] Execute apply control complete {},{}", shuttleNo, taskNo);
             }
 
-            News.info("execute query control {},{}", shuttleNo, taskNo);
+            News.info("[RCS Debug] Execute query control {},{}", shuttleNo, taskNo);
             //鏌ヨ绠″埗
             boolean apply = queryTrafficControl(shuttleNo, taskNo);
-            News.info("execute query control complete {},{}", shuttleNo, taskNo);
+            News.info("[RCS Debug] Execute query control complete {},{}", shuttleNo, taskNo);
             if(!apply){
                 return false;//鐢宠澶辫触
             }
-//            //妫�娴嬭矾寰勬槸鍚﹀啿绐�
-//            int conflict = searchShuttlePathConflict(nodes, shuttleNo);
-//            if(conflict == 2){
-//                return false;//妫�娴嬪悗鏈夊啿绐�
-//            }
 
             if (checked == 2) {
                 nodes.remove(0);
@@ -203,10 +198,10 @@
             }
         }
 
-        News.info("execute send command {},{}", shuttleNo, taskNo);
+        News.info("[RCS Debug] Execute send command {},{}", shuttleNo, taskNo);
         // 涓嬪彂鍛戒护
         CommandResponse response = write(command, shuttleNo);
-        News.info("execute send command complete {},{}", shuttleNo, taskNo);
+        News.info("[RCS Debug] Execute send command complete {},{}", shuttleNo, taskNo);
 
         //淇濆瓨鍛戒护鏃ュ織
         BasShuttleOpt basShuttleOpt = new BasShuttleOpt();
@@ -342,16 +337,24 @@
 
             // 绯荤粺浠诲姟
             if (assignCommand.getAuto()) {
-                if (!assignCommand.getCharge()) {
-                    //瀵逛富绾跨▼鎶涘嚭绛夊緟纭鐘舵�亀aiting
-                    shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
-                } else {
-                    shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
+                if (assignCommand.getTaskMode() == ShuttleTaskModeType.UPDATE_LOCATION.id) {//鏇存柊鍧愭爣鏃犻渶绛夊緟纭
+                    //鐩存帴澶嶄綅绌洪棽鐘舵��
+                    shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+                    //浠诲姟鍙锋竻闆�
+                    shuttleThread.setSyncTaskNo(0);
+                    //鏍囪澶嶄綅
+                    shuttleThread.setPakMk(true);
+                    News.info("鍥涘悜绌挎杞︽洿鏂板潗鏍囦换鍔℃墽琛屽畬鎴愶紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(endCommand));
+                }else {
+                    if (!assignCommand.getCharge()) {
+                        //瀵逛富绾跨▼鎶涘嚭绛夊緟纭鐘舵�亀aiting
+                        shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
+                    } else {
+                        shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
+                    }
+                    News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屼笅鍙戝畬鎴愮瓑寰呮墽琛岀粨鏉燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(endCommand));
                 }
-                News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屼笅鍙戝畬鎴愮瓑寰呮墽琛岀粨鏉燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(endCommand));
-
-                // 鎵嬪姩浠诲姟
-            } else {
+            } else {// 鎵嬪姩浠诲姟
                 //鎵嬪姩妯″紡涓嶆姏鍑虹瓑寰呯姸鎬侊紝鐩存帴澶嶄綅绌洪棽鐘舵��
                 shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
                 //浠诲姟鍙锋竻闆�
@@ -430,9 +433,9 @@
                 return false;
             }
             //涓婃姤浜ょ
-            News.info("execute check command report traffic {},{}", shuttleNo, shuttleProtocol.getTaskNo());
+            News.info("[RCS Debug] Execute check command report traffic {},{}", shuttleNo, shuttleProtocol.getTaskNo());
             trafficControlThread.trafficReport(command.getNodesDeepCopy(), shuttleNo, shuttleProtocol.getTaskNo());
-            News.info("execute check command report traffic complete {},{}", shuttleNo, shuttleProtocol.getTaskNo());
+            News.info("[RCS Debug] Execute check command report traffic complete {},{}", shuttleNo, shuttleProtocol.getTaskNo());
 
             String currentLocNo = shuttleProtocol.getCurrentLocNo();
             if (currentLocNo == null) {
@@ -528,91 +531,6 @@
         redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_CANCEL_LIST.key + shuttleNo + "_" + taskNo, model);
         return true;
     }
-
-//    /**
-//     * 鎼滅储灏忚溅璺緞鏄惁瀛樺湪鍐茬獊
-//     * 0:鏈娴� 1:妫�娴嬫棤鍐茬獊 2:妫�娴嬫湁鍐茬獊
-//     */
-//    public int searchShuttlePathConflict(List<NavigateNode> nodeList, Integer shuttleNo) {
-//        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
-//        if (shuttleThread == null) {
-//            return 0;
-//        }
-//
-//        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
-//        if (shuttleProtocol == null) {
-//            return 0;
-//        }
-//
-//        int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
-//
-//        TrafficControlThread trafficControlThread = (TrafficControlThread) SlaveConnection.get(SlaveType.TrafficControl, 1);
-//        if (trafficControlThread == null) {
-//            return 2;
-//        }
-//        HashMap<String, List<Integer>> nodeMap = trafficControlThread.getNodesMapByLev(lev);
-//        if (nodeMap == null || nodeMap.isEmpty()) {
-//            return 2;
-//        }
-//
-//        List<String> conflictLocList = new ArrayList<>();
-//        for (NavigateNode node : nodeList) {
-//            String locNo = Utils.getLocNo(node.getX(), node.getY(), lev);
-//            if(!nodeMap.containsKey(locNo)) {
-//                return 2;
-//            }
-//
-//            List<Integer> shuttleNos = nodeMap.get(locNo);
-//            if (shuttleNos.size() > 1) {
-//                //璺緞瀛樺湪澶氳溅锛屽啿绐�
-//                conflictLocList.add(locNo);
-//            }
-//        }
-//
-//        if (conflictLocList.isEmpty()) {
-//            //鏃犲啿绐侊紝瑙i櫎浜ら�氱鍒�
-//            shuttleThread.setTrafficControl(false, null);
-//            return 1;//妫�娴嬪悗鏃犲啿绐�
-//        }
-//
-//        //璺緞瀛樺湪鍐茬獊锛屾娴嬪彲鎵ц杞﹁締鏄惁涓哄綋鍓嶅皬杞�
-//        //涓婃姤灏忚溅鐘舵��-浜ら�氱鍒朵腑
-//        shuttleThread.setTrafficControl(true, nodeList);
-//
-//        HashMap<String, Integer> deviceMap = trafficControlThread.getDeviceMap();
-//        if(deviceMap == null) {
-//            return 2;
-//        }
-//
-//        boolean detected = false;
-////            for (Map.Entry<String, Integer> entry : deviceMap.entrySet()) {
-////                List<String> mainList = JSON.parseArray(entry.getKey(), String.class);
-////                Integer device = entry.getValue();
-////                if(result) {
-////                    //鍒ゆ柇绠″埗杞﹁締鏄惁鍖归厤
-////                    if(shuttleNo.equals(device)) {
-////                        detected = true;
-////                        break;
-////                    }
-////                }
-////            }
-//
-//        for (Map.Entry<String, Integer> entry : deviceMap.entrySet()) {
-//            String key = entry.getKey();
-//            Integer value = entry.getValue();
-//            if(shuttleNo.equals(value)) {
-//                //鍒ゆ柇绠″埗杞﹁締鏄惁鍖归厤
-//                detected = true;
-//                break;
-//            }
-//        }
-//
-//        if (detected) {
-//            return 1;//妫�娴嬪悗鏃犲啿绐侊紝浜ら�氱鍒跺凡鍏佽姝ゅ皬杞﹁繍琛�
-//        }
-//
-//        return 2;//妫�娴嬪悗鏈夊啿绐�
-//    }
 
     //婕旂ず妯″紡
     public synchronized void demo(Integer shuttleNo) {
diff --git a/src/main/java/com/zy/core/enums/RedisKeyType.java b/src/main/java/com/zy/core/enums/RedisKeyType.java
index 9880268..31f830a 100644
--- a/src/main/java/com/zy/core/enums/RedisKeyType.java
+++ b/src/main/java/com/zy/core/enums/RedisKeyType.java
@@ -19,6 +19,11 @@
 
     //灏忚溅閲嶆柊瑙勫垝璺緞棰戠巼
     SHUTTLE_RESTART_CALC_PATH("shuttle_restart_calc_path_"),
+    //灏忚溅鏇存柊妤煎眰鍧愭爣棰戠巼
+    SHUTTLE_UPDATE_LOCATION("shuttle_update_location_"),
+
+    //鎻愬崌鏈虹Щ鍔ㄨ嚦灏忚溅灞傞鐜�
+    LIFT_MOVE_TO_SHUTTLE_LIMIT("lift_move_to_shuttle_LIMIT_"),
 
     //浜ょ淇℃伅
     TRAFFIC_CONTROL_MAP("traffic_control_map"),
@@ -46,6 +51,8 @@
     DEVICE_CONFIG("deviceConfig"),
     //铏氭嫙璁惧閰嶇疆鏂囦欢
     FAKE_DEVICE_CONFIG("fakeDeviceConfig"),
+
+    LOG_LIMIT("log_limit_"),
     ;
 
     public String key;
diff --git a/src/main/java/com/zy/core/task/ShuttleExecuteScheduler.java b/src/main/java/com/zy/core/task/ShuttleExecuteScheduler.java
index 4839cb1..e0d1ffe 100644
--- a/src/main/java/com/zy/core/task/ShuttleExecuteScheduler.java
+++ b/src/main/java/com/zy/core/task/ShuttleExecuteScheduler.java
@@ -70,7 +70,7 @@
                             if (taskNo != 0) {
                                 //瀛樺湪浠诲姟闇�瑕佹墽琛�
                                 long startTime = System.currentTimeMillis();
-                                News.info("execute {},{}", deviceConfig.getDeviceNo(), taskNo);
+                                News.info("[RCS Debug] Execute {},{}", deviceConfig.getDeviceNo(), taskNo);
                                 // 鍦ㄥ惊鐜腑浣跨敤
                                 boolean result = TimeoutExecutor.executeWithTimeout(
                                         () -> shuttleAction.executeWork(deviceConfig.getDeviceNo(), taskNo),
@@ -78,7 +78,7 @@
                                         TimeUnit.SECONDS
                                 );
                                 Thread.sleep(100);
-                                News.info("execute end {},{},{}", deviceConfig.getDeviceNo(), taskNo, System.currentTimeMillis() - startTime);
+                                News.info("[RCS Debug] Execute end {},{},{}", deviceConfig.getDeviceNo(), taskNo, System.currentTimeMillis() - startTime);
                             }
                         }
                     }catch (Exception e){
diff --git a/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java b/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
index 721e5ee..f1655fa 100644
--- a/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
+++ b/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
@@ -174,10 +174,14 @@
                         Long idleTime = pathIdleShuttleMap.get(shuttleProtocol.getShuttleNo());
                         if((System.currentTimeMillis() - idleTime) > 1000 * 10) {
                             //妫�娴嬮殰纰嶇墿杞�
-                            boolean checkObstacle = shuttleOperaUtils.checkObstacle(shuttleProtocol.getCurrentLocNo(), new ArrayList<Integer>() {{
+                            int checkObstacle = shuttleOperaUtils.checkObstacle(shuttleProtocol.getCurrentLocNo(), new ArrayList<Integer>() {{
                                 add(shuttleNo);
                             }}, totalNodeList);
                             pathIdleShuttleMap.remove(shuttleProtocol.getShuttleNo());
+
+                            if (checkObstacle == 2) {
+                                pathShuttleThread.restartCalcPath();
+                            }
                         }
                     }else {
                         pathIdleShuttleMap.put(shuttleProtocol.getShuttleNo(), System.currentTimeMillis());
@@ -198,6 +202,10 @@
                 }
 
                 if(totalLocList.contains(locNo)) {
+                    String first = totalLocList.get(0);
+                    if(first.equals(locNo)) {//filter first node
+                       continue;
+                    }
                     return false;
                 }
             }
@@ -211,7 +219,7 @@
 
         applyRecordsMap.remove(shuttleNo);
         redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_SUCCESS_APPLY.key + shuttleNo + "_" + taskNo, 1, 60 * 60);
-        News.info("receipt traffic {},{}", shuttleNo, taskNo);
+        News.info("[RCS Debug] receipt traffic {},{}", shuttleNo, taskNo);
         return true;
     }
 
@@ -335,7 +343,7 @@
     public synchronized boolean operateTrafficControl(OperateTrafficControlParam param) {
         long startTime = System.currentTimeMillis();
         String operaType = param.getOperaType();
-        News.info("Operate Traffic Control is Start " + operaType);
+        News.info("[RCS Debug] Operate Traffic Control is Start " + operaType);
 
         boolean result = false;
         if (operaType.equals("add")) {
@@ -354,7 +362,7 @@
                         new ArrayList<>(model.getTotalNodeList())
                 ))
                 .collect(Collectors.toList());
-        News.info("Operate Traffic Control is end " + (System.currentTimeMillis() - startTime) + "ms");
+        News.info("[RCS Debug] Operate Traffic Control is end " + (System.currentTimeMillis() - startTime) + "ms");
         return result;
     }
 
diff --git a/src/main/webapp/views/shuttleNew.html b/src/main/webapp/views/shuttleNew.html
index db1afad..1314abe 100644
--- a/src/main/webapp/views/shuttleNew.html
+++ b/src/main/webapp/views/shuttleNew.html
@@ -571,7 +571,7 @@
                     requestParam.shuttleTaskMode = 17;
                 }else if (type == 'writeTaskNo') {
                     requestParam.workNo = this.controlData.taskNo;
-                    requestParam.pakMk = null;
+                    requestParam.pakMk = "Y";
 
                     $.ajax({
                         url: baseUrl + "/shuttle/detl/update",

--
Gitblit v1.9.1