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 |  460 +++++++-------------------------------------------------
 1 files changed, 63 insertions(+), 397 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 9a3a6de..7fccedc 100644
--- a/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
+++ b/src/main/java/com/zy/core/thread/impl/TrafficControlImplThread.java
@@ -29,13 +29,8 @@
 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<>();
@@ -54,402 +49,40 @@
             trafficControlDataList = (List<TrafficControlDataModel>) object;
         }
 
-//        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;
-        }
-
-        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;
-//        }
-//
-//        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;
-        try {
-            navigateUtils = SpringUtils.getBean(NavigateUtils.class);
-        }catch (Exception e){}
-
-        if(navigateUtils == null){
-            return -1;
-        }
-
-        Integer value = -1;
-        for (Integer shuttleNo : blockNode) {
-            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
-            if (shuttleThread == null) {
-                continue;
-            }
-
-            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
-            if (shuttleProtocol == null) {
-                continue;
-            }
-
-            if (!shuttleThread.isDeviceIdle()) {
-                continue;
-            }
-
-            if (shuttleProtocol.getTaskNo() == 0) {
-                continue;
-            }
-
-            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;
-        }
-
-        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) {
+    public synchronized boolean processApply(TrafficControlDataModel applyData) {
         ShuttleOperaUtils shuttleOperaUtils = SpringUtils.getBean(ShuttleOperaUtils.class);
         if (shuttleOperaUtils == null) {
             return false;
         }
+
+        if (applyData == null) {
+            return false;
+        }
+
+        if (applyData.getShuttleNo() == null || applyData.getTaskNo() == null || applyData.getNodeList() == null || applyData.getTotalNodeList() == null) {
+            return false;
+        }
+
+        Integer shuttleNo = applyData.getShuttleNo();
+        Integer taskNo = applyData.getTaskNo();
+        List<NavigateNode> nodeList = applyData.getNodeList();
+        List<NavigateNode> totalNodeList = applyData.getTotalNodeList();
 
         //鏇存柊浜ょ淇℃伅
         redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_MAP.key, trafficControlDataList);
@@ -488,7 +121,7 @@
                     }
                 }
 
-                News.info("traffic running {},{}", shuttleNo, taskNo);
+//                News.info("traffic running {},{}", shuttleNo, taskNo);
                 return true;//宸茬粡绠″埗鍏佽鎵ц
             }
         }
@@ -561,15 +194,34 @@
         }
 
         //浜ょ鎺ユ敹
-        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 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;
     }
 
@@ -654,6 +306,20 @@
     }
 
     @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