From df362cbfd8680f3d6291be6ca93d5a9c26510954 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 25 七月 2025 13:51:52 +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