From 728ad81fa10d2879654c5f9ae4314db94eafb865 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 01 八月 2025 08:08:18 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java |  618 +++++++++++++++++--------------------------------------
 1 files changed, 196 insertions(+), 422 deletions(-)

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..7fccedc 100644
--- a/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
+++ b/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
@@ -9,6 +9,7 @@
 import com.zy.common.utils.NavigatePositionConvert;
 import com.zy.common.utils.NavigateUtils;
 import com.zy.common.utils.RedisUtil;
+import com.zy.common.utils.ShuttleOperaUtils;
 import com.zy.core.News;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.RedisKeyType;
@@ -28,11 +29,11 @@
 public class TrafficControlImplThread implements TrafficControlThread {
 
     private RedisUtil redisUtil;
-    private boolean detecting = false;
-    private boolean updateDetect = false;
-    private Long detectTime = System.currentTimeMillis();
-    private HashMap<String, Integer> deviceMap = null;
-    private HashMap<Integer, HashMap<String, List<Integer>>> levNodesMap = null;
+
+    private List<TrafficControlDataModel> applyList = new ArrayList<>();
+    private HashMap<Integer,Long> shuttleReportErrorMap = new HashMap<>();
+    private HashMap<Integer,Long> pathIdleShuttleMap = new HashMap<>();
+    private HashMap<Integer,Long> applyRecordsMap = new HashMap<>();
     private HashMap<String, List<NavigateNode>> taskNodesMap = new HashMap<>();
     private List<TrafficControlDataModel> trafficControlDataList = new ArrayList<>();
 
@@ -42,400 +43,65 @@
 
     @Override
     public void run() {
-//        List<Integer> shuttleNoList = new ArrayList<>();
-//        while (true) {
-//            try {
-//                DeviceConfigService deviceConfigService = null;
-//                try {
-//                    deviceConfigService = SpringUtils.getBean(DeviceConfigService.class);
-//                }catch (Exception e){}
-//
-//                if(deviceConfigService == null){
-//                    continue;
-//                }
-//
-//                if(shuttleNoList.isEmpty()){
-//                    List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
-//                            .eq("device_type", String.valueOf(SlaveType.Shuttle)));
-//                    for (DeviceConfig deviceConfig : shuttleList) {
-//                        shuttleNoList.add(deviceConfig.getDeviceNo());
-//                    }
-//                }
-//
-//                if((updateDetect) || ((System.currentTimeMillis() - detectTime) > 1000 * 2)) {
-//                    detect(shuttleNoList);
-//                }
-//            }catch (Exception e){
-//                e.printStackTrace();
-//            }
-//        }
-
-    }
-
-    public synchronized void detect(List<Integer> shuttleNoList) {
-        detecting = true;
-        updateDetect = false;
-        ObjectMapper objectMapper = null;
-        try {
-            objectMapper = SpringUtils.getBean(ObjectMapper.class);
-        }catch (Exception e){}
-
-        if(objectMapper == null){
-            return;
+        //浠庣紦瀛樻仮澶嶄氦绠′俊鎭�
+        Object object = redisUtil.get(RedisKeyType.TRAFFIC_CONTROL_MAP.key);
+        if(object != null) {
+            trafficControlDataList = (List<TrafficControlDataModel>) object;
         }
 
-        HashMap<String, List<NavigateNode>> tmpTaskNodesMap = new HashMap<>();
-        for (Integer shuttleNo : shuttleNoList) {
-            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
-            if (shuttleThread == null) {
-                continue;
-            }
-
-            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
-            if (shuttleProtocol == null) {
-                continue;
-            }
-
-            if (shuttleProtocol.getTaskNo() == 0) {
-                continue;
-            }
-
-            if (shuttleProtocol.getCurrentLocNo() == null) {
-                continue;
-            }
-
-            int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
-
-            Object obj = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + shuttleProtocol.getTaskNo());
-            if (obj == null) {
-                continue;
-            }
-
-            ShuttleRedisCommand redisCommand = null;
+        while (true) {
             try {
-                redisCommand = objectMapper.readValue(String.valueOf(obj), ShuttleRedisCommand.class);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-
-            if (redisCommand == null) {
-                continue;
-            }
-
-            ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
-            if (assignCommand == null) {
-                continue;
-            }
-
-            List<NavigateNode> nodeList = assignCommand.getNodesDeepCopy();
-            if (nodeList == null || nodeList.isEmpty()) {
-                continue;
-            }
-
-            tmpTaskNodesMap.put(shuttleProtocol.getTaskNo() + "-" + shuttleNo, nodeList);
-        }
-        this.taskNodesMap = tmpTaskNodesMap;
-        HashMap<Integer, HashMap<String, List<Integer>>> levNodesMap = calcNodeList();
-
-        HashMap<Integer, HashMap<String, List<Integer>>> levBlockMap = new HashMap<>();
-        //杩囨护涓嶉渶瑕佺鍒惰妭鐐�
-        for (Map.Entry<Integer, HashMap<String, List<Integer>>> entry : levNodesMap.entrySet()) {
-            Integer lev = entry.getKey();
-            HashMap<String, List<Integer>> value = entry.getValue();
-
-            HashMap<String, List<Integer>> blockMap = new HashMap<>();
-            for (Map.Entry<String, List<Integer>> listEntry : value.entrySet()) {
-                String locNo = listEntry.getKey();
-                List<Integer> shuttleNos = listEntry.getValue();
-                if (shuttleNos.size() <= 1) {
+                if (applyList.isEmpty()) {
                     continue;
                 }
-                blockMap.put(locNo, shuttleNos);
-            }
 
-            levBlockMap.put(lev, blockMap);
+                TrafficControlDataModel dataModel = applyList.get(0);
+                processApply(dataModel);
+                applyList.remove(0);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
         }
 
-        //璁$畻鍫靛鑼冨洿
-        List<List<String>> allLocList = new ArrayList<>();
-        List<List<Integer>> allDeviceNodes = new ArrayList<>();
-        for (Map.Entry<Integer, HashMap<String, List<Integer>>> entry : levBlockMap.entrySet()) {
-            Integer lev = entry.getKey();
-            HashMap<String, List<Integer>> nodes = entry.getValue();
-
-            Set<String> sets = new HashSet<>();
-            for (Map.Entry<String, List<Integer>> val : nodes.entrySet()) {
-                String locNo = val.getKey();
-                sets.add(locNo);
-            }
-
-            List<List<String>> locList = TrafficControlUtils.groupNodes(sets);
-            List<List<Integer>> deviceNodes = new ArrayList<>();
-
-            //get devices
-            for (List<String> list : locList) {
-                List<List<Integer>> tmpDeviceNodes = new ArrayList<>();
-                for (String loc : list) {
-                    List<Integer> shuttleNos = nodes.get(loc);
-                    if(!tmpDeviceNodes.contains(shuttleNos)) {
-                        tmpDeviceNodes.add(shuttleNos);
-                    }
-                }
-                //鑺傜偣骞堕泦-鑾峰彇鍫靛璁惧缂栧彿
-                List<List<Integer>> deviceList = mergeConnectedComponents(tmpDeviceNodes);
-                deviceNodes.addAll(deviceList);
-            }
-
-            allLocList.addAll(locList);
-            allDeviceNodes.addAll(deviceNodes);
-        }
-
-        System.out.println(JSON.toJSONString(allLocList));
-        System.out.println(JSON.toJSONString(allDeviceNodes));
-//        //鍒嗛厤鍫靛鑺傜偣鍙墽琛岃澶�
-//        findDeviceByBlockList(allLocList, allDeviceNodes);
-
-        detecting = false;
-        detectTime = System.currentTimeMillis();
-
-        //鍙戝竷鍫靛鑺傜偣鍙敤璁惧缂栧彿
-        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;
+    public synchronized boolean processApply(TrafficControlDataModel applyData) {
+        ShuttleOperaUtils shuttleOperaUtils = SpringUtils.getBean(ShuttleOperaUtils.class);
+        if (shuttleOperaUtils == null) {
+            return false;
         }
 
-        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);
+        if (applyData == null) {
+            return false;
         }
 
-        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;
-        try {
-            navigateUtils = SpringUtils.getBean(NavigateUtils.class);
-        }catch (Exception e){}
-
-        if(navigateUtils == null){
-            return -1;
+        if (applyData.getShuttleNo() == null || applyData.getTaskNo() == null || applyData.getNodeList() == null || applyData.getTotalNodeList() == null) {
+            return false;
         }
 
-        Integer value = -1;
-        for (Integer shuttleNo : blockNode) {
-            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
-            if (shuttleThread == null) {
-                continue;
-            }
+        Integer shuttleNo = applyData.getShuttleNo();
+        Integer taskNo = applyData.getTaskNo();
+        List<NavigateNode> nodeList = applyData.getNodeList();
+        List<NavigateNode> totalNodeList = applyData.getTotalNodeList();
 
-            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
-            if (shuttleProtocol == null) {
-                continue;
-            }
+        //鏇存柊浜ょ淇℃伅
+        redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_MAP.key, trafficControlDataList);
 
-            if (!shuttleThread.isDeviceIdle()) {
-                continue;
-            }
+        NavigateNode startNode = totalNodeList.get(0);
+        List<int[]> shuttlePoints = Utils.getShuttlePoints(shuttleNo, startNode.getZ());
 
-            if (shuttleProtocol.getTaskNo() == 0) {
-                continue;
-            }
+        int[] currentShuttlePoint = Utils.getShuttlePoint(shuttleNo);
+        if(currentShuttlePoint == null) {
+            return false;
+        }
+        String currentShuttleLoc = Utils.getLocNo(currentShuttlePoint[0], currentShuttlePoint[1], startNode.getZ());
 
-            if (!shuttleProtocol.getTrafficControl()) {
-                continue;//灏忚溅鏈敵璇蜂氦閫氱鍒�
-            }
-
-            //妫�娴嬪皬杞︽槸鍚﹀凡缁忓垎閰�
-            if (deviceMap.containsValue(shuttleNo)) {
-                continue;
-            }
-
-            List<NavigateNode> trafficControlNodes = shuttleProtocol.getTrafficControlNodes();
-            List<String> trafficControlLocs = new ArrayList<>();
-            for (NavigateNode node : trafficControlNodes) {
-                trafficControlLocs.add(Utils.getLocNo(node.getX(), node.getY(), node.getZ()));
-            }
-
-            //妫�娴嬪綋鍓嶅皬杞﹁妭鐐规槸鍚﹀尮閰嶄氦閫氱鍒惰妭鐐�
-            boolean result = false;
-            for (String loc : locs) {
-                if (trafficControlLocs.contains(loc)) {
-                    result = true;
-                    break;
-                }
-            }
-
-            if (!result) {
-                continue;
-            }
-
-            //check path
-            String currentLocNo = shuttleProtocol.getCurrentLocNo();
-            for (String loc : locs) {
-                if (loc.equals(currentLocNo)) {
-                    continue;
-                }
-                List<NavigateNode> nodeList = navigateUtils.calc(currentLocNo, loc, NavigationMapType.getNormalWithDevice(), Utils.getShuttlePoints(shuttleNo, Utils.getLev(loc)), null);
-                if (nodeList == null) {
-                    break;
-                }
-            }
-
-            value = shuttleNo;
-            break;
+        List<String> shuttleLocList = new ArrayList<>();
+        for (int[] shuttlePoint : shuttlePoints) {
+            String locNo = Utils.getLocNo(shuttlePoint[0], shuttlePoint[1], startNode.getZ());
+            shuttleLocList.add(locNo);
         }
 
-        return value;
-    }
-
-    //鑺傜偣骞堕泦
-    public List<List<Integer>> mergeConnectedComponents(List<List<Integer>> lists) {
-        // 1. 鏀堕泦鎵�鏈夊敮涓�鍏冪礌
-        Set<Integer> allElements = new HashSet<>();
-        for (List<Integer> list : lists) {
-            allElements.addAll(list);
-        }
-
-        // 2. 鍒濆鍖栧苟鏌ラ泦
-        Map<Integer, Integer> parent = new HashMap<>();
-        for (Integer element : allElements) {
-            parent.put(element, element);
-        }
-
-        // 3. 瀹氫箟鏌ユ壘鏍硅妭鐐圭殑鍑芥暟锛堝甫璺緞鍘嬬缉锛�
-        Function<Integer, Integer> find = x -> {
-            int root = x;
-            while (parent.get(root) != root) {
-                root = parent.get(root);
-            }
-            // 璺緞鍘嬬缉
-            int current = x;
-            while (parent.get(current) != root) {
-                int next = parent.get(current);
-                parent.put(current, root);
-                current = next;
-            }
-            return root;
-        };
-
-        // 4. 閬嶅巻姣忎釜鍒楄〃骞跺悎骞跺厓绱�
-        for (List<Integer> list : lists) {
-            if (list.isEmpty()) continue;
-            int first = list.get(0);
-            for (int i = 1; i < list.size(); i++) {
-                int a = first;
-                int b = list.get(i);
-                int rootA = find.apply(a);
-                int rootB = find.apply(b);
-                if (rootA != rootB) {
-                    parent.put(rootB, rootA); // 鍚堝苟闆嗗悎
-                }
-            }
-        }
-
-        // 5. 鎸夋牴鑺傜偣鍒嗙粍
-        Map<Integer, Set<Integer>> components = new HashMap<>();
-        for (Integer element : allElements) {
-            int root = find.apply(element);
-            components.computeIfAbsent(root, k -> new TreeSet<>()).add(element);
-        }
-
-        // 6. 杞崲涓烘湁搴忓垪琛�
-        List<List<Integer>> result = new ArrayList<>();
-        for (Set<Integer> set : components.values()) {
-            result.add(new ArrayList<>(set));
-        }
-
-        return result;
-    }
-
-    private HashMap<Integer, HashMap<String, List<Integer>>> calcNodeList() {
-        HashMap<Integer, HashMap<String, List<Integer>>> levNodesMap = new HashMap<>();
-        for (Map.Entry<String, List<NavigateNode>> entry : taskNodesMap.entrySet()) {
-            String key = entry.getKey();
-            String[] split = key.split("-");
-            Integer taskNo = Integer.parseInt(split[0]);
-            Integer shuttleNo = Integer.parseInt(split[1]);
-
-            List<NavigateNode> nodeList = entry.getValue();
-            NavigateNode node1 = nodeList.get(0);
-            int lev = node1.getZ();
-
-            HashMap<String, List<Integer>> nodeMap = new HashMap<>();
-            if(levNodesMap.containsKey(lev)) {
-                nodeMap = levNodesMap.get(lev);
-            }
-
-            for (NavigateNode node : nodeList) {
-                String locNo = Utils.getLocNo(node.getX(), node.getY(), lev);
-                List<Integer> shuttleNos = new ArrayList<>();
-                if (nodeMap.containsKey(locNo)) {
-                    shuttleNos = nodeMap.get(locNo);
-                }
-
-                if (!shuttleNos.contains(shuttleNo)) {
-                    shuttleNos.add(shuttleNo);
-                }
-                nodeMap.put(locNo, shuttleNos);
-            }
-            levNodesMap.put(lev, nodeMap);
-        }
-        this.levNodesMap = levNodesMap;
-        return levNodesMap;
-    }
-
-    @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);
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
         for (int i = 0; i < trafficControlDataList.size(); i++) {
             TrafficControlDataModel controlDataModel = trafficControlDataList.get(i);
@@ -445,89 +111,170 @@
                     return false;
                 }
 
-                //浠诲姟鎬绘暟閲忎笉涓�鑷�
-                if (totalNodeList.size() != controlDataModel.getTotalNodeList().size()) {
-                    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();
+                        }
+                    }
                 }
 
-                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;
-                }
-
-                News.info("traffic running {},{}", shuttleNo, taskNo);
+//                News.info("traffic running {},{}", shuttleNo, taskNo);
                 return true;//宸茬粡绠″埗鍏佽鎵ц
             }
         }
 
-        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)) {
+                ShuttleThread pathShuttleThread = Utils.searchShuttle(loc);
+                if (pathShuttleThread == null) {
+                    return false;
+                }
+
+                ShuttleProtocol shuttleProtocol = pathShuttleThread.getStatus();
+                if(shuttleProtocol == null) {
+                    return false;
+                }
+
+                if (pathShuttleThread.isIdle()) {
+                    if(pathIdleShuttleMap.containsKey(shuttleProtocol.getShuttleNo())) {
+                        Long idleTime = pathIdleShuttleMap.get(shuttleProtocol.getShuttleNo());
+                        if((System.currentTimeMillis() - idleTime) > 1000 * 10) {
+                            //妫�娴嬮殰纰嶇墿杞�
+                            boolean checkObstacle = shuttleOperaUtils.checkObstacle(shuttleProtocol.getCurrentLocNo(), new ArrayList<Integer>() {{
+                                add(shuttleNo);
+                            }});
+                            pathIdleShuttleMap.remove(shuttleProtocol.getShuttleNo());
+                        }
+                    }else {
+                        pathIdleShuttleMap.put(shuttleProtocol.getShuttleNo(), System.currentTimeMillis());
+                    }
+                }
+                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;
                 }
             }
         }
 
         //浜ょ鎺ユ敹
-        TrafficControlDataModel model = new TrafficControlDataModel();
-        model.setShuttleNo(shuttleNo);
-        model.setTaskNo(taskNo);
-        model.setNodeList(nodeList);
-        model.setTotalNodeList(totalNodeList);
-        trafficControlDataList.add(model);
+        trafficControlDataList.add(applyData);
+
+        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 applyTrafficControl(List<NavigateNode> totalNodeList, List<NavigateNode> nodeList, Integer shuttleNo, Integer taskNo) {
+        boolean add = true;
+        for (TrafficControlDataModel controlDataModel : applyList) {
+            if(controlDataModel.getShuttleNo().equals(shuttleNo)) {
+                add = false;
+                break;
+            }
+        }
+
+        if (add) {
+            TrafficControlDataModel model = new TrafficControlDataModel();
+            model.setShuttleNo(shuttleNo);
+            model.setTaskNo(taskNo);
+            model.setNodeList(nodeList);
+            model.setTotalNodeList(totalNodeList);
+            applyList.add(model);
+        }else {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    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);
+                    shuttleReportErrorMap.remove(shuttleNo);
                     return true;
                 }
             }
         }
         return false;
+    }
+
+    @Override
+    public boolean trafficReportError(Integer shuttleNo, Integer taskNo) {
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
+        if (shuttleThread == null) {
+            return false;
+        }
+
+        if(shuttleReportErrorMap.containsKey(shuttleNo)) {
+            Long errorTime = shuttleReportErrorMap.get(shuttleNo);
+            if((System.currentTimeMillis() - errorTime) > 1000 * 10) {
+                shuttleReportErrorMap.remove(shuttleNo);
+                shuttleThread.restartCalcPath();
+            }
+        }else {
+            shuttleReportErrorMap.put(shuttleNo, System.currentTimeMillis());
+        }
+        return true;
     }
 
     @Override
@@ -546,6 +293,33 @@
     }
 
     @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, 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)) {
+                    return controlDataModel;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
     public TrafficControlDataModel queryTrafficControl(Integer shuttleNo) {
         //妫�娴嬭溅瀛愭槸鍚﹀瓨鍦ㄧ鍒�
         for (int i = 0; i < trafficControlDataList.size(); i++) {

--
Gitblit v1.9.1