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