From c4b6b51afdd3374735ed5f358457987eaa6e476f Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 05 九月 2025 16:55:20 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/core/action/ShuttleAction.java | 243 +++++++++++++++++++----------------------------
1 files changed, 99 insertions(+), 144 deletions(-)
diff --git a/src/main/java/com/zy/core/action/ShuttleAction.java b/src/main/java/com/zy/core/action/ShuttleAction.java
index a47484b..d709041 100644
--- a/src/main/java/com/zy/core/action/ShuttleAction.java
+++ b/src/main/java/com/zy/core/action/ShuttleAction.java
@@ -22,6 +22,7 @@
import com.zy.core.dispatcher.ShuttleDispatchUtils;
import com.zy.core.enums.*;
import com.zy.core.model.CommandResponse;
+import com.zy.core.model.TrafficControlDataModel;
import com.zy.core.model.command.ShuttleAssignCommand;
import com.zy.core.model.command.ShuttleCommand;
import com.zy.core.model.command.ShuttleRedisCommand;
@@ -69,11 +70,8 @@
return false;
}
- //娓呯┖涓嬪彂绱㈠紩
- Set<String> keys = redisUtil.searchKeys(RedisKeyType.SHUTTLE_SEND_COMMAND_INDEX.key + shuttleNo);
- for (String key : keys) {
- redisUtil.del(key);
- }
+ //Clear Traffic Control
+ trafficControlThread.forceCancelTrafficControl(shuttleNo);
ShuttleRedisCommand redisCommand = new ShuttleRedisCommand();
@@ -89,7 +87,7 @@
return false;
}
- public synchronized boolean executeWork(Integer shuttleNo, Integer taskNo) {
+ public boolean executeWork(Integer shuttleNo, Integer taskNo) {
Object obj = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + taskNo);
if (obj == null) {
return false;
@@ -121,8 +119,10 @@
return false;
}
+ News.info("[RCS Debug] Execute check command {},{}", shuttleNo, taskNo);
//妫�娴嬪懡浠�
int checked = checkCommand(redisCommand, shuttleNo);
+ News.info("[RCS Debug] Execute check command complete {},{}", shuttleNo, taskNo);
if (checked == 0) {
return false;
}
@@ -161,17 +161,29 @@
//绉诲姩鍛戒护锛岄攣瀹氳矾寰�
if (command.getMode() == ShuttleCommandModeType.MOVE.id) {
+ TrafficControlThread trafficControlThread = (TrafficControlThread) SlaveConnection.get(SlaveType.TrafficControl, 1);
+ if (trafficControlThread == null) {
+ return false;
+ }
+
List<NavigateNode> nodes = JSON.parseArray(JSON.toJSONString(command.getNodes()), NavigateNode.class);
- //鐢宠绠″埗
- boolean apply = applyTrafficControl(commands, nodes, shuttleNo, taskNo);
+
+ Object object = redisUtil.get(RedisKeyType.TRAFFIC_CONTROL_LOCK_APPLY.key + shuttleNo);
+ if (object == null) {
+ //鐢宠绠″埗
+ News.info("[RCS Debug] Execute apply control {},{}", shuttleNo, taskNo);
+ redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_LOCK_APPLY.key + shuttleNo, "lock", 10);
+ applyTrafficControl(commands, nodes, shuttleNo, taskNo);
+ News.info("[RCS Debug] Execute apply control complete {},{}", shuttleNo, taskNo);
+ }
+
+ News.info("[RCS Debug] Execute query control {},{}", shuttleNo, taskNo);
+ //鏌ヨ绠″埗
+ boolean apply = queryTrafficControl(shuttleNo, taskNo);
+ News.info("[RCS Debug] Execute query control complete {},{}", shuttleNo, taskNo);
if(!apply){
return false;//鐢宠澶辫触
}
-// //妫�娴嬭矾寰勬槸鍚﹀啿绐�
-// int conflict = searchShuttlePathConflict(nodes, shuttleNo);
-// if(conflict == 2){
-// return false;//妫�娴嬪悗鏈夊啿绐�
-// }
if (checked == 2) {
nodes.remove(0);
@@ -181,12 +193,15 @@
if (!result) {
News.error("{} device can't lock path!", shuttleNo);
shuttleThread.offerSystemMsg("{} device can't lock path!", shuttleNo);
+ trafficControlThread.trafficReportError(shuttleNo, taskNo);
return false;//璺緞閿佸畾澶辫触
}
}
+ News.info("[RCS Debug] Execute send command {},{}", shuttleNo, taskNo);
// 涓嬪彂鍛戒护
CommandResponse response = write(command, shuttleNo);
+ News.info("[RCS Debug] Execute send command complete {},{}", shuttleNo, taskNo);
//淇濆瓨鍛戒护鏃ュ織
BasShuttleOpt basShuttleOpt = new BasShuttleOpt();
@@ -211,9 +226,6 @@
}
shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
-
- //瀛樺偍涓嬪彂鎸囦护绱㈠紩
- redisUtil.set(RedisKeyType.SHUTTLE_SEND_COMMAND_INDEX.key + shuttleNo + "_" + taskNo + "_" + commandStep, commandStep);
commandStep += 1;
//鏇存柊redis鏁版嵁
@@ -255,52 +267,46 @@
return 0;
}
- //涓婁竴鏉℃寚浠�
- String searchKey = RedisKeyType.SHUTTLE_SEND_COMMAND_INDEX.key + shuttleNo + "_" + redisCommand.getWrkNo() + "_";
- Set<String> keys = redisUtil.searchKeys(searchKey);
- TreeSet<Integer> treeSet = new TreeSet<>();
- for (String key : keys) {
- String[] split = key.split(searchKey);
- treeSet.add(Integer.parseInt(split[1]));
+ boolean supportContinuously = false;
+ int checkIdx = commandStep - 2;
+ if (checkIdx < 0) {
+ checkIdx = commandStep - 1;
}
- if (treeSet.isEmpty()) {
- return 1;
+ ShuttleCommand last2Command = commands.get(checkIdx);
+ if(last2Command.getComplete()){
+ supportContinuously = true;
+ checkIdx = commandStep - 1;
}
- String firstKey = searchKey + treeSet.first();
- Integer lastCommandIdx = (Integer) redisUtil.get(firstKey);
- ShuttleCommand lastCommand = commands.get(lastCommandIdx);
+ ShuttleCommand lastCommand = commands.get(checkIdx);
if (!lastCommand.getComplete()) {
//妫�娴嬫洿鏂板懡浠ゅ畬鎴�
- boolean checked = updateCommandComplete(lastCommandIdx, commands, shuttleNo);
+ boolean checked = updateCommandComplete(checkIdx, commands, shuttleNo);
if (checked) {
- //鍒犻櫎绱㈠紩
- redisUtil.del(firstKey);
-
// 鏇存柊redis鏁版嵁
redisUtil.set(RedisKeyType.SHUTTLE_WORK_FLAG.key + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand, SerializerFeature.DisableCircularReferenceDetect));
}else {
//灏忚溅绉诲姩杩炵画涓嬪彂鎸囦护
if (assignCommand.getShuttleMoveCommandsContinuously()) {
- if (treeSet.size() <= 1) {
- if(commandStep >= commands.size()) {
- return 0;
- }
+ if (!supportContinuously) {
+ return 0;
+ }
- //绉诲姩鎸囦护
- if(lastCommand.getMode() != ShuttleCommandModeType.MOVE.id) {
- return 0;
- }
+ //绉诲姩鎸囦护
+ if(lastCommand.getMode() != ShuttleCommandModeType.MOVE.id) {
+ return 0;
+ }
- List<NavigateNode> nodes = lastCommand.getNodes();
- NavigateNode startNode = nodes.get(0);
- if (!startNode.getLinePartAllowGo()) {//鐩寸嚎娈甸儴鍒嗭紝鍏佽鐩存帴琛岃蛋
- return 0;
- }
+ List<NavigateNode> nodes = lastCommand.getNodes();
+ NavigateNode startNode = nodes.get(0);
+ if (!startNode.getLinePartAllowGo()) {//鐩寸嚎娈甸儴鍒嗭紝鍏佽鐩存帴琛岃蛋
+ return 0;
+ }
- //鐩寸嚎娈垫暟鎹爣璇�
- Long linePartFlag = startNode.getLinePartFlag();
+ //鐩寸嚎娈垫暟鎹爣璇�
+ Long linePartFlag = startNode.getLinePartFlag();
+ if(commandStep < commands.size()){
//鍙栨寚浠�
ShuttleCommand currentCommand = commands.get(commandStep);
if(currentCommand.getMode() != ShuttleCommandModeType.MOVE.id) {
@@ -317,7 +323,6 @@
//鏁版嵁鏍囪瘑涓�鑷�
return 2;//鍏佽灏忚溅绉诲姩杩炵画涓嬪彂鎸囦护
}
-
}
}
@@ -332,16 +337,24 @@
// 绯荤粺浠诲姟
if (assignCommand.getAuto()) {
- if (!assignCommand.getCharge()) {
- //瀵逛富绾跨▼鎶涘嚭绛夊緟纭鐘舵�亀aiting
- shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
- } else {
- shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
+ if (assignCommand.getTaskMode() == ShuttleTaskModeType.UPDATE_LOCATION.id) {//鏇存柊鍧愭爣鏃犻渶绛夊緟纭
+ //鐩存帴澶嶄綅绌洪棽鐘舵��
+ shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+ //浠诲姟鍙锋竻闆�
+ shuttleThread.setSyncTaskNo(0);
+ //鏍囪澶嶄綅
+ shuttleThread.setPakMk(true);
+ News.info("鍥涘悜绌挎杞︽洿鏂板潗鏍囦换鍔℃墽琛屽畬鎴愶紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(endCommand));
+ }else {
+ if (!assignCommand.getCharge()) {
+ //瀵逛富绾跨▼鎶涘嚭绛夊緟纭鐘舵�亀aiting
+ shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
+ } else {
+ shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
+ }
+ News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屼笅鍙戝畬鎴愮瓑寰呮墽琛岀粨鏉燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(endCommand));
}
- News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屼笅鍙戝畬鎴愮瓑寰呮墽琛岀粨鏉燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(endCommand));
-
- // 鎵嬪姩浠诲姟
- } else {
+ } else {// 鎵嬪姩浠诲姟
//鎵嬪姩妯″紡涓嶆姏鍑虹瓑寰呯姸鎬侊紝鐩存帴澶嶄綅绌洪棽鐘舵��
shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
//浠诲姟鍙锋竻闆�
@@ -352,7 +365,8 @@
}
//鐢宠鍙栨秷绠″埗
- trafficControlThread.cancelTrafficControl(shuttleNo, shuttleProtocol.getTaskNo());
+ cancelTrafficControl(shuttleNo, shuttleProtocol.getTaskNo());
+
//鍒犻櫎redis
redisUtil.del(RedisKeyType.SHUTTLE_WORK_FLAG.key + redisCommand.getWrkNo());
return 0;//绂佹鍐嶄笅鍙戝懡浠�
@@ -419,15 +433,20 @@
return false;
}
//涓婃姤浜ょ
+ News.info("[RCS Debug] Execute check command report traffic {},{}", shuttleNo, shuttleProtocol.getTaskNo());
trafficControlThread.trafficReport(command.getNodesDeepCopy(), shuttleNo, shuttleProtocol.getTaskNo());
+ News.info("[RCS Debug] Execute check command report traffic complete {},{}", shuttleNo, shuttleProtocol.getTaskNo());
String currentLocNo = shuttleProtocol.getCurrentLocNo();
+ if (currentLocNo == null) {
+ return false;
+ }
if (targetPoints.contains(Utils.getRow(currentLocNo) + "-" + Utils.getBay(currentLocNo))) {
- command.setComplete(true);
boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(shuttleProtocol.getCurrentLocNo()), shuttleProtocol.getShuttleNo(), nodes, false);//瑙i攣璺緞
if (!result) {
return false;//瑙i攣澶辫触
}
+ command.setComplete(true);
}else {
return false;
}
@@ -496,90 +515,22 @@
return trafficControlThread.applyTrafficControl(totalNodeList, nodeList, shuttleNo, taskNo);
}
-// /**
-// * 鎼滅储灏忚溅璺緞鏄惁瀛樺湪鍐茬獊
-// * 0:鏈娴� 1:妫�娴嬫棤鍐茬獊 2:妫�娴嬫湁鍐茬獊
-// */
-// public int searchShuttlePathConflict(List<NavigateNode> nodeList, Integer shuttleNo) {
-// ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
-// if (shuttleThread == null) {
-// return 0;
-// }
-//
-// ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
-// if (shuttleProtocol == null) {
-// return 0;
-// }
-//
-// int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
-//
-// TrafficControlThread trafficControlThread = (TrafficControlThread) SlaveConnection.get(SlaveType.TrafficControl, 1);
-// if (trafficControlThread == null) {
-// return 2;
-// }
-// HashMap<String, List<Integer>> nodeMap = trafficControlThread.getNodesMapByLev(lev);
-// if (nodeMap == null || nodeMap.isEmpty()) {
-// return 2;
-// }
-//
-// List<String> conflictLocList = new ArrayList<>();
-// for (NavigateNode node : nodeList) {
-// String locNo = Utils.getLocNo(node.getX(), node.getY(), lev);
-// if(!nodeMap.containsKey(locNo)) {
-// return 2;
-// }
-//
-// List<Integer> shuttleNos = nodeMap.get(locNo);
-// if (shuttleNos.size() > 1) {
-// //璺緞瀛樺湪澶氳溅锛屽啿绐�
-// conflictLocList.add(locNo);
-// }
-// }
-//
-// if (conflictLocList.isEmpty()) {
-// //鏃犲啿绐侊紝瑙i櫎浜ら�氱鍒�
-// shuttleThread.setTrafficControl(false, null);
-// return 1;//妫�娴嬪悗鏃犲啿绐�
-// }
-//
-// //璺緞瀛樺湪鍐茬獊锛屾娴嬪彲鎵ц杞﹁締鏄惁涓哄綋鍓嶅皬杞�
-// //涓婃姤灏忚溅鐘舵��-浜ら�氱鍒朵腑
-// shuttleThread.setTrafficControl(true, nodeList);
-//
-// HashMap<String, Integer> deviceMap = trafficControlThread.getDeviceMap();
-// if(deviceMap == null) {
-// return 2;
-// }
-//
-// boolean detected = false;
-//// for (Map.Entry<String, Integer> entry : deviceMap.entrySet()) {
-//// List<String> mainList = JSON.parseArray(entry.getKey(), String.class);
-//// Integer device = entry.getValue();
-//// if(result) {
-//// //鍒ゆ柇绠″埗杞﹁締鏄惁鍖归厤
-//// if(shuttleNo.equals(device)) {
-//// detected = true;
-//// break;
-//// }
-//// }
-//// }
-//
-// for (Map.Entry<String, Integer> entry : deviceMap.entrySet()) {
-// String key = entry.getKey();
-// Integer value = entry.getValue();
-// if(shuttleNo.equals(value)) {
-// //鍒ゆ柇绠″埗杞﹁締鏄惁鍖归厤
-// detected = true;
-// break;
-// }
-// }
-//
-// if (detected) {
-// return 1;//妫�娴嬪悗鏃犲啿绐侊紝浜ら�氱鍒跺凡鍏佽姝ゅ皬杞﹁繍琛�
-// }
-//
-// return 2;//妫�娴嬪悗鏈夊啿绐�
-// }
+ //鏌ヨ鏄惁鐢宠绠″埗鎴愬姛
+ public boolean queryTrafficControl(Integer shuttleNo, Integer taskNo) {
+ Object object = redisUtil.get(RedisKeyType.TRAFFIC_CONTROL_SUCCESS_APPLY.key + shuttleNo + "_" + taskNo);
+ if (object == null) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean cancelTrafficControl(Integer shuttleNo, Integer taskNo) {
+ TrafficControlDataModel model = new TrafficControlDataModel();
+ model.setShuttleNo(shuttleNo);
+ model.setTaskNo(taskNo);
+ redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_CANCEL_LIST.key + shuttleNo + "_" + taskNo, model);
+ return true;
+ }
//婕旂ず妯″紡
public synchronized void demo(Integer shuttleNo) {
@@ -752,6 +703,10 @@
} catch (Exception e) {
e.printStackTrace();
}
+ }
+
+ public synchronized boolean clearPath(Integer shuttleNo) {
+ return navigateMapUtils.clearPath(shuttleNo);
}
// //璺戝簱绋嬪簭
@@ -1123,7 +1078,7 @@
// }
// }
- private synchronized CommandResponse write(ShuttleCommand command, Integer shuttleNo) {
+ private CommandResponse write(ShuttleCommand command, Integer shuttleNo) {
CommandResponse response = new CommandResponse(false);
if (null == command) {
News.error("鍥涘悜绌挎杞﹀啓鍏ュ懡浠や负绌�");
--
Gitblit v1.9.1