From 6694bb8752aced4b818f2976442d66ae3a52e9e8 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 25 七月 2025 13:25:11 +0800
Subject: [PATCH] #
---
 src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java    |    3 
 src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java   |    4 
 src/main/java/com/zy/core/thread/impl/NyShuttleThread.java          |   91 +++++++++
 src/main/java/com/zy/asrs/utils/Utils.java                          |   30 ++
 src/main/java/com/zy/common/utils/ShuttleOperaUtils.java            |   62 ------
 src/main/java/com/zy/asrs/controller/ShuttleController.java         |    2 
 src/main/java/com/zy/core/thread/ShuttleThread.java                 |    2 
 src/main/java/com/zy/core/action/ShuttleAction.java                 |   36 ---
 src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java |  252 +++++++++++++++---------
 src/main/java/com/zy/core/enums/RedisKeyType.java                   |    6 
 src/main/java/com/zy/core/thread/TrafficControlThread.java          |    2 
 src/main/java/com/zy/common/utils/NavigateMapData.java              |   79 -------
 12 files changed, 297 insertions(+), 272 deletions(-)
diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java
index 0f41a90..94c48cd 100644
--- a/src/main/java/com/zy/asrs/controller/ShuttleController.java
+++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -348,7 +348,7 @@
         } else if (shuttleTaskModeType == ShuttleTaskModeType.RESET) {
             //澶嶄綅
             TrafficControlThread trafficControlThread = (TrafficControlThread) SlaveConnection.get(SlaveType.TrafficControl, 1);
-            trafficControlThread.cancelTrafficControl(shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo());
+            trafficControlThread.forceCancelTrafficControl(shuttleProtocol.getShuttleNo());
 
             shuttleThread.setSyncTaskNo(0);//宸ヤ綔鍙锋竻绌�
             shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);//浠诲姟鐘舵��-绌洪棽
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index 9be9d30..e874172 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -84,7 +84,7 @@
         return null;
     }
 
-    //鑾峰彇闄ょ櫧鍚嶅崟澶栫殑鎸囧畾妤煎眰鍏ㄩ儴绌挎杞y鍧愭爣鐐�
+    //鑾峰彇绌挎杞y鍧愭爣鐐�
     public static int[] getShuttlePoint(Integer shuttleNo) {
         //鑾峰彇绌挎杞︽墍鍦ㄨ妭鐐逛綅缃�
         ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
@@ -147,6 +147,34 @@
         return list;
     }
 
+    public static ShuttleThread searchShuttle(String locNo) {
+        DeviceConfigService deviceConfigService = SpringUtils.getBean(DeviceConfigService.class);
+        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
+                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
+        for (DeviceConfig device : shuttleList) {
+            //鑾峰彇绌挎杞︽墍鍦ㄨ妭鐐逛綅缃�
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
+            if (shuttleThread == null) {
+                continue;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+
+            String currentLocNo = shuttleProtocol.getCurrentLocNo();
+            if (currentLocNo == null) {
+                continue;
+            }
+
+            if (currentLocNo.equals(locNo)) {
+                return shuttleThread;
+            }
+        }
+
+        return null;
+    }
+
     //妫�娴嬫ゼ灞傛槸鍚︽湁鍙敤绌挎杞�
     public static boolean checkLevHasShuttle(Integer lev) {
         DeviceConfigService deviceConfigService = SpringUtils.getBean(DeviceConfigService.class);
diff --git a/src/main/java/com/zy/common/utils/NavigateMapData.java b/src/main/java/com/zy/common/utils/NavigateMapData.java
index 8deec59..a91bc4c 100644
--- a/src/main/java/com/zy/common/utils/NavigateMapData.java
+++ b/src/main/java/com/zy/common/utils/NavigateMapData.java
@@ -202,10 +202,10 @@
                 lists = loadPathLock(lists, lev);
             }
 
-            if(mapType.equals(NavigationMapType.TRAFFIC_CONTROL)) {
-                //鍔犺浇浜ら�氱鍒�
-                lists = loadTrafficControl(lists, lev);
-            }
+//            if(mapType.equals(NavigationMapType.TRAFFIC_CONTROL)) {
+//                //鍔犺浇浜ら�氱鍒�
+//                lists = loadTrafficControl(lists, lev);
+//            }
         }
 
         //鍔犺浇鐧藉悕鍗曡妭鐐�
@@ -444,77 +444,6 @@
                     lists.set(row, list);
                 }
             }
-
-//            HashMap<String, Integer> deviceMap = trafficControlThread.getDeviceMap();
-//            if(deviceMap == null) {
-//                throw new CoolException("get traffic control device map error");
-//            }
-//
-//            for (Map.Entry<String, Integer> entry : deviceMap.entrySet()) {
-//                String key = entry.getKey();
-//                Integer shuttleNo = entry.getValue();
-//                if (shuttleNo <= 0) {
-//                    continue;
-//                }
-//
-//                Object object = redisUtil.get(RedisKeyType.SHUTTLE_FLAG.key + shuttleNo);
-//                if (object == null) {
-//                    continue;
-//                }
-//
-//                int taskNo = Integer.parseInt(String.valueOf(object));
-//
-//                Object obj = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + taskNo);
-//                if (obj == null) {
-//                    continue;
-//                }
-//
-//                ShuttleRedisCommand redisCommand = null;
-//                try {
-//                    redisCommand = objectMapper.readValue(String.valueOf(obj), ShuttleRedisCommand.class);
-//                } catch (IOException e) {
-//                    throw new RuntimeException(e);
-//                }
-//
-//                if (redisCommand == null) {
-//                    continue;
-//                }
-//
-//                ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
-//                List<ShuttleCommand> commands = assignCommand.getCommands();
-//
-//                List<NavigateNode> controlLocList = new ArrayList<>();
-//                for (ShuttleCommand command : commands) {
-//                    if (command.getComplete()) {
-//                        continue;
-//                    }
-//
-//                    if (command.getMode() == ShuttleCommandModeType.MOVE.id) {
-//                        List<NavigateNode> nodes = command.getNodes();
-//                        for (NavigateNode node : nodes) {
-//                            if(!controlLocList.contains(node)) {
-//                                controlLocList.add(node);
-//                            }
-//                        }
-//                    }
-//                }
-//
-//                for (NavigateNode node : controlLocList) {
-//                    int row = node.getX();
-//                    int bay = node.getY();
-//
-//                    List<MapNode> list = lists.get(row);
-//                    MapNode mapNode = list.get(bay);
-//
-//                    //鑺傜偣璁剧疆鎴怐isable
-//                    mapNode.setValue(MapNodeType.DISABLE.id);
-//
-//                    //鏇存柊list
-//                    list.set(bay, mapNode);
-//                    lists.set(row, list);
-//                }
-//
-//            }
         } catch (Exception e) {
             e.printStackTrace();
         }
diff --git a/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java b/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
index 33739d4..6108c6f 100644
--- a/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
+++ b/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
@@ -115,6 +115,7 @@
         }
 
         assignCommand.setNodes(allNode);//褰撳墠浠诲姟鎵�鍗犵敤鐨勮妭鐐筶ist
+        assignCommand.setMapTypes(mapTypes);
 
         //灏忚溅绉诲姩杩炵画涓嬪彂鎸囦护
         boolean shuttleMoveCommandsContinuously = false;
@@ -125,67 +126,6 @@
             }
         }
         assignCommand.setShuttleMoveCommandsContinuously(shuttleMoveCommandsContinuously);
-        return commands;
-    }
-
-    public synchronized List<ShuttleCommand> shuttleInOutLiftCommand(String startLocNo, String endLocNo, List<NavigationMapType> mapTypes, ShuttleAssignCommand assignCommand, ShuttleThread shuttleThread) {
-        NavigateNode startNode = NavigatePositionConvert.locNoToNode(startLocNo);
-        NavigateNode endNode = NavigatePositionConvert.locNoToNode(endLocNo);
-        List<NavigateNode> unlockPath = new ArrayList<>();
-        unlockPath.add(startNode);
-        unlockPath.add(endNode);
-
-        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
-        if (shuttleProtocol == null) {
-            return null;
-        }
-
-        Integer shuttleNo = shuttleProtocol.getShuttleNo();
-        //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹�/瑙i攣
-        boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(endLocNo), shuttleProtocol.getShuttleNo(), unlockPath, false);//鎵�浣跨敤鐨勮矾寰勮繘琛岃В閿�
-        if (!lockResult) {
-            News.error("{} dash {} can't find unlock path!", startLocNo, endLocNo);
-            shuttleThread.offerSystemMsg("{} dash {} can't find unlock path!", startLocNo, endLocNo);
-            return null;//瑙i攣澶辫触
-        }
-
-        //鑾峰彇灏忚溅绉诲姩閫熷害
-        Integer runSpeed = Optional.ofNullable(basShuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", shuttleNo)).getRunSpeed()).orElse(1000);
-        List<NavigateNode> nodeList = navigateUtils.calc(startLocNo, endLocNo, mapTypes, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startLocNo)), null);
-        if (nodeList == null) {
-            News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo);
-            shuttleThread.offerSystemMsg("{} dash {} can't find navigate path!", startLocNo, endLocNo);
-            return null;
-        }
-
-        List<NavigateNode> allNode = new ArrayList<>();
-        for (NavigateNode node : nodeList) {
-            allNode.add(node.clone());
-        }
-
-        List<ShuttleCommand> commands = new ArrayList<>();
-        //鑾峰彇鍒嗘璺緞
-        List<List<NavigateNode>> data = navigateUtils.getSectionPath(nodeList);
-        //灏嗘瘡涓�娈佃矾寰勫垎鎴恈ommand鎸囦护
-        for (List<NavigateNode> nodes : data) {
-            //寮�濮嬭矾寰�
-            NavigateNode startPath = nodes.get(0);
-
-            //鐩爣璺緞
-            NavigateNode endPath = nodes.get(nodes.size() - 1);
-            Integer allDistance = navigateUtils.getCurrentPathAllDistance(nodes);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
-            //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
-            String startCodeNum = NavigatePositionConvert.xyToPosition(startPath.getX(), startPath.getY(), startPath.getZ());
-            //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
-            String distCodeNum = NavigatePositionConvert.xyToPosition(endPath.getX(), endPath.getY(), endPath.getZ());
-            //鑾峰彇绉诲姩鍛戒护
-            ShuttleCommand command = shuttleThread.getMoveCommand(assignCommand.getDeviceTaskNo(), startCodeNum, distCodeNum, allDistance, ShuttleRunDirection.get(startPath.getDirection()).id.intValue(), runSpeed, nodes);
-            command.setNodes(nodes);//灏嗚璧拌妭鐐规坊鍔犲埌姣忎竴姝ュ懡浠や腑
-            commands.add(command);
-        }
-
-        assignCommand.setNodes(allNode);//褰撳墠浠诲姟鎵�鍗犵敤鐨勮妭鐐筶ist
-
         return commands;
     }
 
diff --git a/src/main/java/com/zy/core/action/ShuttleAction.java b/src/main/java/com/zy/core/action/ShuttleAction.java
index 393d2cb..a47484b 100644
--- a/src/main/java/com/zy/core/action/ShuttleAction.java
+++ b/src/main/java/com/zy/core/action/ShuttleAction.java
@@ -16,14 +16,12 @@
 import com.zy.common.model.NavigateNode;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.NavigateMapUtils;
-import com.zy.common.utils.NavigatePositionConvert;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.News;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.dispatcher.ShuttleDispatchUtils;
 import com.zy.core.enums.*;
 import com.zy.core.model.CommandResponse;
-import com.zy.core.model.TrafficControlDataModel;
 import com.zy.core.model.command.ShuttleAssignCommand;
 import com.zy.core.model.command.ShuttleCommand;
 import com.zy.core.model.command.ShuttleRedisCommand;
@@ -420,25 +418,8 @@
             if (trafficControlThread == null) {
                 return false;
             }
-
-            TrafficControlDataModel trafficControlDataModel = trafficControlThread.queryTrafficControl(shuttleNo);
-            if (trafficControlDataModel != null) {
-                //鏈夌鍒朵俊鎭紝杩涜妫�娴�
-                if (!trafficControlDataModel.getTaskNo().equals(shuttleProtocol.getTaskNo())) {
-                    return false;//浠诲姟涓嶄竴鑷�
-                }
-
-                //妫�娴嬫槸鍚﹀埌缁堢偣
-                List<NavigateNode> totalNodeList = trafficControlDataModel.getTotalNodeList();
-                NavigateNode trafficTargetNode = totalNodeList.get(totalNodeList.size() - 1);
-                String trafficTargetLoc = Utils.getLocNo(trafficTargetNode.getX(), trafficTargetNode.getY(), trafficTargetNode.getZ());
-
-                //鍒ゆ柇灏忚溅鏄惁鍒扮粓鐐�
-                if(shuttleProtocol.getCurrentLocNo().equals(trafficTargetLoc)) {
-                    //涓婃姤浜ょ
-                    trafficControlThread.trafficReport(command.getNodesDeepCopy(), shuttleNo, shuttleProtocol.getTaskNo());
-                }
-            }
+            //涓婃姤浜ょ
+            trafficControlThread.trafficReport(command.getNodesDeepCopy(), shuttleNo, shuttleProtocol.getTaskNo());
 
             String currentLocNo = shuttleProtocol.getCurrentLocNo();
             if (targetPoints.contains(Utils.getRow(currentLocNo) + "-" + Utils.getBay(currentLocNo))) {
@@ -503,19 +484,12 @@
             return false;
         }
 
-        NavigateNode startNode = nodeList.get(0);
-        Long linePartFlag = startNode.getLinePartFlag();
-
         List<NavigateNode> totalNodeList = new ArrayList<>();
         for (ShuttleCommand command : commands) {
             if (command.getMode() == ShuttleCommandModeType.MOVE.id) {
-                NavigateNode node = command.getNodes().get(0);
-                Long nodeLinePartFlag = node.getLinePartFlag();
-                if (nodeLinePartFlag.equals(linePartFlag)) {
-                    List<NavigateNode> deepCopy = command.getNodesDeepCopy();
-                    if (deepCopy != null) {
-                        totalNodeList.addAll(deepCopy);
-                    }
+                List<NavigateNode> deepCopy = command.getNodesDeepCopy();
+                if (deepCopy != null) {
+                    totalNodeList.addAll(deepCopy);
                 }
             }
         }
diff --git a/src/main/java/com/zy/core/enums/RedisKeyType.java b/src/main/java/com/zy/core/enums/RedisKeyType.java
index d6e6650..6ea31aa 100644
--- a/src/main/java/com/zy/core/enums/RedisKeyType.java
+++ b/src/main/java/com/zy/core/enums/RedisKeyType.java
@@ -16,9 +16,11 @@
 
     //灏忚溅涓嬪彂鎸囦护绱㈠紩
     SHUTTLE_SEND_COMMAND_INDEX("shuttle_send_command_index_"),
+    //灏忚溅閲嶆柊瑙勫垝璺緞棰戠巼
+    SHUTTLE_RESTART_CALC_PATH("shuttle_restart_calc_path_"),
 
-    //浠诲姟鍫靛鍙敤璁惧鍦板浘
-    TASK_BLOCK_ENABLE_DEVICE_MAP("task_block_enable_device_map"),
+    //浜ょ淇℃伅
+    TRAFFIC_CONTROL_MAP("traffic_control_map"),
 
     //鍦板浘閿佸畾鑺傜偣
     LOCK_MAP_NODES("lock_map_nodes_"),
diff --git a/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java b/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
index 841ec12..5d80355 100644
--- a/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
+++ b/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
@@ -1,6 +1,7 @@
 package com.zy.core.model.command;
 
 import com.zy.common.model.NavigateNode;
+import com.zy.common.model.enums.NavigationMapType;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -77,6 +78,9 @@
      */
     private List<NavigateNode> nodes;
 
+    //鍛戒护浣跨敤鐨勫湴鍥剧被鍨�
+    private List<NavigationMapType> mapTypes;
+
     //灏忚溅绉诲姩杩炵画涓嬪彂鎸囦护
     private Boolean shuttleMoveCommandsContinuously;
 
diff --git a/src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java b/src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java
index f43cec8..d197c86 100644
--- a/src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java
+++ b/src/main/java/com/zy/core/model/command/ShuttleRedisCommand.java
@@ -22,7 +22,4 @@
     //鍛戒护
     private ShuttleAssignCommand assignCommand;
 
-    //鎻愬崌鏈哄畨鍏ㄩ攣瀹氭爣璁�
-    private Boolean liftSecurityMk = false;
-
 }
diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java
index aaa63c0..1909575 100644
--- a/src/main/java/com/zy/core/thread/ShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -76,6 +76,8 @@
 
     JSONObject parseStatusToMsg(ShuttleProtocol shuttleProtocol);
 
+    boolean restartCalcPath();
+
     //***************鑾峰彇鍛戒护*****************
 
     ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes);//鑾峰彇绉诲姩鍛戒护
diff --git a/src/main/java/com/zy/core/thread/TrafficControlThread.java b/src/main/java/com/zy/core/thread/TrafficControlThread.java
index ea0411a..35082eb 100644
--- a/src/main/java/com/zy/core/thread/TrafficControlThread.java
+++ b/src/main/java/com/zy/core/thread/TrafficControlThread.java
@@ -24,6 +24,8 @@
 
     boolean cancelTrafficControl(Integer shuttleNo, Integer taskNo);
 
+    boolean forceCancelTrafficControl(Integer shuttleNo);
+
     TrafficControlDataModel queryTrafficControl(Integer shuttleNo);
 
     List<TrafficControlDataModel> getAllTrafficControl();
diff --git a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
index 2542703..58ecf5e 100644
--- a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -20,8 +20,11 @@
 import com.zy.common.utils.NavigateMapData;
 import com.zy.common.utils.NavigatePositionConvert;
 import com.zy.common.utils.RedisUtil;
+import com.zy.common.utils.ShuttleOperaUtils;
 import com.zy.core.News;
+import com.zy.core.action.ShuttleAction;
 import com.zy.core.model.DeviceCommandMsgModel;
+import com.zy.core.model.command.ShuttleAssignCommand;
 import com.zy.core.utils.DeviceMsgUtils;
 import com.zy.core.cache.OutputQueue;
 import com.zy.core.enums.*;
@@ -852,6 +855,94 @@
     }
 
     @Override
+    public boolean restartCalcPath() {
+        ConfigService configService = SpringUtils.getBean(ConfigService.class);
+        if (configService == null) {
+            return false;
+        }
+
+        ShuttleAction shuttleAction = SpringUtils.getBean(ShuttleAction.class);
+        if (shuttleAction == null) {
+            return false;
+        }
+
+        ShuttleOperaUtils shuttleOperaUtils = SpringUtils.getBean(ShuttleOperaUtils.class);
+        if (shuttleOperaUtils == null) {
+            return false;
+        }
+
+        ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
+        if (objectMapper == null) {
+            return false;
+        }
+
+        boolean trafficControlRestartCalcPath = false;
+        Config trafficControlRestartCalcPathConfig = configService.selectOne(new EntityWrapper<Config>()
+                .eq("code", "trafficControlRestartCalcPath")
+        );
+        if(trafficControlRestartCalcPathConfig != null) {
+            trafficControlRestartCalcPath = trafficControlRestartCalcPathConfig.getValue().equals("Y") ? true : false;
+        }
+
+        if (!trafficControlRestartCalcPath) {
+            return false;
+        }
+
+        if (shuttleProtocol.getTaskNo() == 0) {
+            return false;
+        }
+
+        if (!this.isDeviceIdle()) {
+            return false;
+        }
+
+        Object object = redisUtil.get(RedisKeyType.SHUTTLE_RESTART_CALC_PATH.key + shuttleProtocol.getShuttleNo());
+        if (object != null) {
+            return false;
+        }
+
+        Integer taskNo = shuttleProtocol.getTaskNo();
+        Object obj = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + taskNo);
+        if (obj == null) {
+            return false;
+        }
+
+        ShuttleRedisCommand redisCommand = null;
+        try {
+            redisCommand = objectMapper.readValue(String.valueOf(obj), ShuttleRedisCommand.class);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        if (redisCommand == null) {
+            return false;
+        }
+
+        ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
+        String locNo = assignCommand.getLocNo();
+        List<NavigationMapType> mapTypes = assignCommand.getMapTypes();
+        if (locNo == null) {
+            return false;
+        }
+
+        if (mapTypes == null) {
+            return false;
+        }
+
+        String currentLocNo = shuttleProtocol.getCurrentLocNo();
+        List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(currentLocNo, locNo, mapTypes, assignCommand, this);
+        if (commands == null) {
+            return false;
+        }
+        assignCommand.setCommands(commands);
+
+        //涓嬪彂浠诲姟
+        shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+        redisUtil.set(RedisKeyType.SHUTTLE_RESTART_CALC_PATH.key + shuttleProtocol.getShuttleNo(), true, 60);
+        return true;
+    }
+
+    @Override
     public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes) {
         NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class);
         NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo);
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 40379eb..f15a5c2 100644
--- a/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
+++ b/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
@@ -33,6 +33,9 @@
     private Long detectTime = System.currentTimeMillis();
     private HashMap<String, Integer> deviceMap = null;
     private HashMap<Integer, HashMap<String, List<Integer>>> levNodesMap = null;
+
+
+    private HashMap<Integer,Long> applyRecordsMap = new HashMap<>();
     private HashMap<String, List<NavigateNode>> taskNodesMap = new HashMap<>();
     private List<TrafficControlDataModel> trafficControlDataList = new ArrayList<>();
 
@@ -42,6 +45,12 @@
 
     @Override
     public void run() {
+        //浠庣紦瀛樻仮澶嶄氦绠′俊鎭�
+        Object object = redisUtil.get(RedisKeyType.TRAFFIC_CONTROL_MAP.key);
+        if(object != null) {
+            trafficControlDataList = (List<TrafficControlDataModel>) object;
+        }
+
 //        List<Integer> shuttleNoList = new ArrayList<>();
 //        while (true) {
 //            try {
@@ -198,66 +207,66 @@
         detecting = false;
         detectTime = System.currentTimeMillis();
 
-        //鍙戝竷鍫靛鑺傜偣鍙敤璁惧缂栧彿
-        redisUtil.set(RedisKeyType.TASK_BLOCK_ENABLE_DEVICE_MAP.key, trafficControlDataList);
+//        //鍙戝竷鍫靛鑺傜偣鍙敤璁惧缂栧彿
+//        redisUtil.set(RedisKeyType.TASK_BLOCK_ENABLE_DEVICE_MAP.key, trafficControlDataList);
     }
 
-    //鍒嗛厤鍫靛鑺傜偣鍙墽琛岃澶�
-    public void findDeviceByBlockList(List<List<String>> allLocList, List<List<Integer>> blockNodes) {
-        HashMap<String, Integer> map = new HashMap<>();
-        if (deviceMap == null) {
-            Object object = redisUtil.get(RedisKeyType.TASK_BLOCK_ENABLE_DEVICE_MAP.key);
-            if (object != null) {
-                map = (HashMap<String, Integer>) object;
-            }
-        } else {
-            map = deviceMap;
-        }
-
-        HashMap<String, Integer> newMap = new HashMap<>();
-
-        for (int i = 0; i < blockNodes.size(); i++) {
-            List<Integer> blockNode = blockNodes.get(i);
-            List<String> locs = allLocList.get(i);
-
-            String key = JSON.toJSONString(locs);
-
-            Integer value = -1;
-            if (map.containsKey(key)) {
-                value = map.get(key);
-                map.remove(key);
-
-                if (value > 0) {
-                    ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, value);
-                    if (shuttleThread == null) {
-                        continue;
-                    }
-
-                    ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
-                    if (shuttleProtocol == null) {
-                        continue;
-                    }
-
-                    if (shuttleProtocol.getTaskNo() == 0) {
-                        value = searchDevice(locs, blockNode, newMap);
-                    }
-
-                    if (!shuttleProtocol.getTrafficControl()) {
-                        value = searchDevice(locs, blockNode, newMap);
-                    }
-                }else {
-                    value = searchDevice(locs, blockNode, newMap);
-                }
-            } else {
-                value = searchDevice(locs, blockNode, newMap);
-            }
-            newMap.put(key, value);
-        }
-
-        deviceMap = newMap;
-        //鍙戝竷鍫靛鑺傜偣鍙敤璁惧缂栧彿
-        redisUtil.set(RedisKeyType.TASK_BLOCK_ENABLE_DEVICE_MAP.key, newMap);
-    }
+//    //鍒嗛厤鍫靛鑺傜偣鍙墽琛岃澶�
+//    public void findDeviceByBlockList(List<List<String>> allLocList, List<List<Integer>> blockNodes) {
+//        HashMap<String, Integer> map = new HashMap<>();
+//        if (deviceMap == null) {
+//            Object object = redisUtil.get(RedisKeyType.TASK_BLOCK_ENABLE_DEVICE_MAP.key);
+//            if (object != null) {
+//                map = (HashMap<String, Integer>) object;
+//            }
+//        } else {
+//            map = deviceMap;
+//        }
+//
+//        HashMap<String, Integer> newMap = new HashMap<>();
+//
+//        for (int i = 0; i < blockNodes.size(); i++) {
+//            List<Integer> blockNode = blockNodes.get(i);
+//            List<String> locs = allLocList.get(i);
+//
+//            String key = JSON.toJSONString(locs);
+//
+//            Integer value = -1;
+//            if (map.containsKey(key)) {
+//                value = map.get(key);
+//                map.remove(key);
+//
+//                if (value > 0) {
+//                    ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, value);
+//                    if (shuttleThread == null) {
+//                        continue;
+//                    }
+//
+//                    ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+//                    if (shuttleProtocol == null) {
+//                        continue;
+//                    }
+//
+//                    if (shuttleProtocol.getTaskNo() == 0) {
+//                        value = searchDevice(locs, blockNode, newMap);
+//                    }
+//
+//                    if (!shuttleProtocol.getTrafficControl()) {
+//                        value = searchDevice(locs, blockNode, newMap);
+//                    }
+//                }else {
+//                    value = searchDevice(locs, blockNode, newMap);
+//                }
+//            } else {
+//                value = searchDevice(locs, blockNode, newMap);
+//            }
+//            newMap.put(key, value);
+//        }
+//
+//        deviceMap = newMap;
+//        //鍙戝竷鍫靛鑺傜偣鍙敤璁惧缂栧彿
+//        redisUtil.set(RedisKeyType.TASK_BLOCK_ENABLE_DEVICE_MAP.key, newMap);
+//    }
 
     public Integer searchDevice(List<String> locs, List<Integer> blockNode, HashMap<String, Integer> deviceMap) {
         NavigateUtils navigateUtils = null;
@@ -434,8 +443,24 @@
 
     @Override
     public synchronized boolean applyTrafficControl(List<NavigateNode> totalNodeList, List<NavigateNode> nodeList, Integer shuttleNo, Integer taskNo) {
-        //鍙戝竷鍫靛鑺傜偣鍙敤璁惧缂栧彿
-        redisUtil.set(RedisKeyType.TASK_BLOCK_ENABLE_DEVICE_MAP.key, trafficControlDataList);
+        //鏇存柊浜ょ淇℃伅
+        redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_MAP.key, trafficControlDataList);
+
+        NavigateNode startNode = totalNodeList.get(0);
+        List<int[]> shuttlePoints = Utils.getShuttlePoints(shuttleNo, startNode.getZ());
+
+        int[] currentShuttlePoint = Utils.getShuttlePoint(shuttleNo);
+        if(currentShuttlePoint == null) {
+            return false;
+        }
+        String currentShuttleLoc = Utils.getLocNo(currentShuttlePoint[0], currentShuttlePoint[1], startNode.getZ());
+
+        List<String> shuttleLocList = new ArrayList<>();
+        for (int[] shuttlePoint : shuttlePoints) {
+            String locNo = Utils.getLocNo(shuttlePoint[0], shuttlePoint[1], startNode.getZ());
+            shuttleLocList.add(locNo);
+        }
+
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
         for (int i = 0; i < trafficControlDataList.size(); i++) {
             TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
@@ -445,27 +470,14 @@
                     return false;
                 }
 
-                //浠诲姟鎬绘暟閲忎笉涓�鑷�
-                if (totalNodeList.size() != controlDataModel.getTotalNodeList().size()) {
-                    return false;
-                }
-
-                int startIdx = 0;
-                int targetIdx = totalNodeList.size() - 1;
-                NavigateNode applyStartNode = totalNodeList.get(startIdx);
-                NavigateNode applyTargetNode = totalNodeList.get(targetIdx);
-
-                NavigateNode controlStartNode = controlDataModel.getTotalNodeList().get(startIdx);
-                NavigateNode controlTargetNode = controlDataModel.getTotalNodeList().get(targetIdx);
-
-                //璧风偣涓嶅悓
-                if(!NavigatePositionConvert.equalsNode(applyStartNode, controlStartNode)) {
-                    return false;
-                }
-
-                //缁堢偣涓嶅悓
-                if(!NavigatePositionConvert.equalsNode(applyTargetNode, controlTargetNode)) {
-                    return false;
+                for (NavigateNode node : nodeList) {
+                    String locNo = Utils.getLocNo(node.getX(), node.getY(), node.getZ());
+                    if(shuttleLocList.contains(locNo)) {
+                        ShuttleThread shuttleThread = Utils.searchShuttle(locNo);
+                        if(shuttleThread != null) {
+                            shuttleThread.restartCalcPath();
+                        }
+                    }
                 }
 
                 News.info("traffic running {},{}", shuttleNo, taskNo);
@@ -473,30 +485,45 @@
             }
         }
 
-        NavigateNode startNode = totalNodeList.get(0);
-        List<int[]> shuttlePoints = Utils.getShuttlePoints(shuttleNo, startNode.getZ());
-
-        List<String> shuttleLocList = new ArrayList<>();
-        for (int[] shuttlePoint : shuttlePoints) {
-            String locNo = Utils.getLocNo(shuttlePoint[0], shuttlePoint[1], startNode.getZ());
-            shuttleLocList.add(locNo);
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
+        if (shuttleThread == null) {
+            return false;
         }
 
+        if (!applyRecordsMap.containsKey(shuttleNo)) {
+            applyRecordsMap.put(shuttleNo, System.currentTimeMillis());
+        }
+
+        Long applyRecordTime = applyRecordsMap.get(shuttleNo);
+        if ((System.currentTimeMillis() - applyRecordTime) > 1000 * 10) {
+            shuttleThread.restartCalcPath();
+        }
+
+        List<String> totalLocList = new ArrayList<>();
         for (NavigateNode node : totalNodeList) {
             String locNo = Utils.getLocNo(node.getX(), node.getY(), node.getZ());
-            if(shuttleLocList.contains(locNo)) {
-               return false;//node has shuttle
+            totalLocList.add(locNo);
+        }
+
+        //妫�娴嬭矾寰勬槸鍚︽湁灏忚溅
+        for (String loc : totalLocList) {
+            if(shuttleLocList.contains(loc)) {
+                return false;//node has shuttle
             }
         }
 
         //妫�娴嬭妭鐐规槸鍚﹁浣跨敤
         for (TrafficControlDataModel controlDataModel : trafficControlDataList) {
             List<NavigateNode> list = controlDataModel.getTotalNodeList();
-            for (NavigateNode node1 : list) {
-                for (NavigateNode node2 : totalNodeList) {
-                    if (NavigatePositionConvert.equalsNode(node1, node2)) {
-                        return false;
-                    }
+            for (int i = 0; i < list.size(); i++) {
+                NavigateNode node = list.get(i);
+                String locNo = Utils.getLocNo(node.getX(), node.getY(), node.getZ());
+                if (i == 0 && currentShuttleLoc.equals(locNo)) {
+                    continue;//..todo wait watch problem
+                }
+
+                if(totalLocList.contains(locNo)) {
+                    return false;
                 }
             }
         }
@@ -508,20 +535,36 @@
         model.setNodeList(nodeList);
         model.setTotalNodeList(totalNodeList);
         trafficControlDataList.add(model);
+
+        applyRecordsMap.remove(shuttleNo);
         News.info("receipt traffic {},{}", shuttleNo, taskNo);
         return true;
     }
 
     @Override
-    public boolean trafficReport(List<NavigateNode> nodeList, Integer shuttleNo, Integer taskNo) {
+    public synchronized boolean trafficReport(List<NavigateNode> nodeList, Integer shuttleNo, Integer taskNo) {
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
         for (int i = 0; i < trafficControlDataList.size(); i++) {
             TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
             if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
                 if(controlDataModel.getTaskNo().equals(taskNo)) {
+                    List<NavigateNode> newTotalNodeList = new ArrayList<>();
                     List<NavigateNode> totalNodeList = controlDataModel.getTotalNodeList();
-                    totalNodeList.removeAll(nodeList);
-                    controlDataModel.setTotalNodeList(totalNodeList);
+
+                    List<String> reportList = new ArrayList<>();
+                    for (NavigateNode node : nodeList) {
+                        reportList.add(Utils.getLocNo(node.getX(), node.getY(), node.getZ()));
+                    }
+
+                    for (NavigateNode node : totalNodeList) {
+                        String locNo = Utils.getLocNo(node.getX(), node.getY(), node.getZ());
+                        if(reportList.contains(locNo)) {
+                            continue;
+                        }
+                        newTotalNodeList.add(node);
+                    }
+
+                    controlDataModel.setTotalNodeList(newTotalNodeList);
                     trafficControlDataList.set(i, controlDataModel);
                     return true;
                 }
@@ -546,6 +589,19 @@
     }
 
     @Override
+    public boolean forceCancelTrafficControl(Integer shuttleNo) {
+        //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
+        for (int i = 0; i < trafficControlDataList.size(); i++) {
+            TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
+            if(shuttleNo.equals(controlDataModel.getShuttleNo())) {
+                trafficControlDataList.remove(i);//鍙栨秷绠″埗
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
     public TrafficControlDataModel queryTrafficControl(Integer shuttleNo) {
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
         for (int i = 0; i < trafficControlDataList.size(); i++) {
--
Gitblit v1.9.1