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/thread/impl/TrafficControlImplThread.java |  252 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 154 insertions(+), 98 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..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