From 42af11ca3a84e13d1f55207b2770e2454a861983 Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期五, 01 八月 2025 17:05:03 +0800 Subject: [PATCH] # --- src/main/java/com/zy/core/action/ShuttleAction.java | 154 ++++++++++++++++++++++++++------------------------ 1 files changed, 80 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/zy/core/action/ShuttleAction.java b/src/main/java/com/zy/core/action/ShuttleAction.java index 393d2cb..6a968c0 100644 --- a/src/main/java/com/zy/core/action/ShuttleAction.java +++ b/src/main/java/com/zy/core/action/ShuttleAction.java @@ -16,7 +16,6 @@ import com.zy.common.model.NavigateNode; import com.zy.common.service.CommonService; import com.zy.common.utils.NavigateMapUtils; -import com.zy.common.utils.NavigatePositionConvert; import com.zy.common.utils.RedisUtil; import com.zy.core.News; import com.zy.core.cache.SlaveConnection; @@ -71,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(); @@ -91,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; @@ -123,8 +119,10 @@ return false; } + News.info("execute check command {},{}", shuttleNo, taskNo); //妫�娴嬪懡浠� int checked = checkCommand(redisCommand, shuttleNo); + News.info("execute check command complete {},{}", shuttleNo, taskNo); if (checked == 0) { return false; } @@ -163,9 +161,26 @@ //绉诲姩鍛戒护锛岄攣瀹氳矾寰� 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("execute apply control {},{}", shuttleNo, taskNo); + redisUtil.set(RedisKeyType.TRAFFIC_CONTROL_LOCK_APPLY.key + shuttleNo, "lock", 10); + applyTrafficControl(commands, nodes, shuttleNo, taskNo); + News.info("execute apply control complete {},{}", shuttleNo, taskNo); + } + + News.info("execute query control {},{}", shuttleNo, taskNo); + //鏌ヨ绠″埗 + boolean apply = queryTrafficControl(shuttleNo, taskNo); + News.info("execute query control complete {},{}", shuttleNo, taskNo); if(!apply){ return false;//鐢宠澶辫触 } @@ -183,6 +198,7 @@ if (!result) { News.error("{} device can't lock path!", shuttleNo); shuttleThread.offerSystemMsg("{} device can't lock path!", shuttleNo); + trafficControlThread.trafficReportError(shuttleNo, taskNo); return false;//璺緞閿佸畾澶辫触 } } @@ -213,9 +229,6 @@ } shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.WORKING); - - //瀛樺偍涓嬪彂鎸囦护绱㈠紩 - redisUtil.set(RedisKeyType.SHUTTLE_SEND_COMMAND_INDEX.key + shuttleNo + "_" + taskNo + "_" + commandStep, commandStep); commandStep += 1; //鏇存柊redis鏁版嵁 @@ -257,52 +270,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) { @@ -319,7 +326,6 @@ //鏁版嵁鏍囪瘑涓�鑷� return 2;//鍏佽灏忚溅绉诲姩杩炵画涓嬪彂鎸囦护 } - } } @@ -420,33 +426,21 @@ if (trafficControlThread == null) { return false; } - - TrafficControlDataModel trafficControlDataModel = trafficControlThread.queryTrafficControl(shuttleNo); - if (trafficControlDataModel != null) { - //鏈夌鍒朵俊鎭紝杩涜妫�娴� - if (!trafficControlDataModel.getTaskNo().equals(shuttleProtocol.getTaskNo())) { - return false;//浠诲姟涓嶄竴鑷� - } - - //妫�娴嬫槸鍚﹀埌缁堢偣 - List<NavigateNode> totalNodeList = trafficControlDataModel.getTotalNodeList(); - NavigateNode trafficTargetNode = totalNodeList.get(totalNodeList.size() - 1); - String trafficTargetLoc = Utils.getLocNo(trafficTargetNode.getX(), trafficTargetNode.getY(), trafficTargetNode.getZ()); - - //鍒ゆ柇灏忚溅鏄惁鍒扮粓鐐� - if(shuttleProtocol.getCurrentLocNo().equals(trafficTargetLoc)) { - //涓婃姤浜ょ - trafficControlThread.trafficReport(command.getNodesDeepCopy(), shuttleNo, shuttleProtocol.getTaskNo()); - } - } + //涓婃姤浜ょ + News.info("execute check command report traffic {},{}", shuttleNo, shuttleProtocol.getTaskNo()); + trafficControlThread.trafficReport(command.getNodesDeepCopy(), shuttleNo, shuttleProtocol.getTaskNo()); + News.info("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; } @@ -503,23 +497,31 @@ return false; } - NavigateNode startNode = nodeList.get(0); - Long linePartFlag = startNode.getLinePartFlag(); - List<NavigateNode> totalNodeList = new ArrayList<>(); for (ShuttleCommand command : commands) { if (command.getMode() == ShuttleCommandModeType.MOVE.id) { - NavigateNode node = command.getNodes().get(0); - Long nodeLinePartFlag = node.getLinePartFlag(); - if (nodeLinePartFlag.equals(linePartFlag)) { - List<NavigateNode> deepCopy = command.getNodesDeepCopy(); - if (deepCopy != null) { - totalNodeList.addAll(deepCopy); - } + List<NavigateNode> deepCopy = command.getNodesDeepCopy(); + if (deepCopy != null) { + totalNodeList.addAll(deepCopy); } } } return trafficControlThread.applyTrafficControl(totalNodeList, nodeList, shuttleNo, taskNo); + } + + //鏌ヨ鏄惁鐢宠绠″埗鎴愬姛 + public boolean queryTrafficControl(Integer shuttleNo, Integer taskNo) { + TrafficControlThread trafficControlThread = (TrafficControlThread) SlaveConnection.get(SlaveType.TrafficControl, 1); + if (trafficControlThread == null) { + return false; + } + + TrafficControlDataModel trafficControlDataModel = trafficControlThread.queryTrafficControl(shuttleNo, taskNo); + if (trafficControlDataModel == null) { + return false; + } + + return true; } // /** @@ -780,6 +782,10 @@ } } + public synchronized boolean clearPath(Integer shuttleNo) { + return navigateMapUtils.clearPath(shuttleNo); + } + // //璺戝簱绋嬪簭 // public synchronized void moveLoc(Integer shuttleNo) { // ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo); -- Gitblit v1.9.1