From d64ddaa5a1db6098a498a0c74d723068851cb088 Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期四, 22 一月 2026 10:17:52 +0800
Subject: [PATCH] #
---
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java | 91 ++++++++++++++++++++++++---------------------
1 files changed, 49 insertions(+), 42 deletions(-)
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
index 90f5fe9..a4580e6 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -11,6 +11,7 @@
import com.zy.acs.common.domain.protocol.*;
import com.zy.acs.common.domain.protocol.action.*;
import com.zy.acs.common.enums.*;
+import com.zy.acs.common.utils.Base62;
import com.zy.acs.common.utils.GsonUtils;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.common.utils.Utils;
@@ -251,33 +252,28 @@
, (task, agvNo, sta) -> {
Long agvId = agvService.getAgvId(agvNo);
-// List<Travel> travelList = travelService.list(new LambdaQueryWrapper<Travel>()
-// .eq(Travel::getAgvId, agvId)
-// .eq(Travel::getState, TravelStateType.RUNNING.toString())
-// .orderByDesc(Travel::getCreateTime));
-// if (Cools.isEmpty(travelList)) {
-// throw new BusinessException("[Agv: " + agvNo + "]allocate inbound failed to find travel");
+ Travel travel = travelService.findRunningTravel(agvId);
+ if (null == travel) {
+ throw new CoolException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting travel");
+ }
+
+ // curr segment
+ Segment currSeg = segmentService.getCurrWaitingSeg(travel.getId(), agvId);
+// if (null == currSeg) {
+// currSeg = segmentService.getCurrRunningSeg(travel.getId(), agvId, null);
// }
-// Travel travel = travelList.get(0);
-//
-// List<Segment> currSegments = segmentService.list(new LambdaQueryWrapper<Segment>()
-// .eq(Segment::getAgvId, agvId)
-// .eq(Segment::getTravelId, travel.getId())
-// );
- // load segment
- Segment currSeg = segmentService.getRollerWaiting(agvId, sta.getCode(), TaskPosDto.PosType.ORI_STA);
if (null == currSeg) {
- throw new BusinessException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting segment");
+ throw new CoolException("[Agv:" + agvNo + "] allocate inbound failed: no waiting segment");
}
// get backpack lev
int backpackLev = 0;
- int backpack = agvService.getBackpack(agvId);
+ int backpackCap = agvService.getBackpack(agvId);
List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
- if (usedBackpacks.size() >= backpack) {
+ if (usedBackpacks.size() >= backpackCap) {
throw new CoolException("[Agv:" + agvNo + "] allocate inbound segment failed: no idle backpack to use");
}
- for (int lev = 1; lev <= backpack; lev++) {
+ for (int lev = 1; lev <= backpackCap; lev++) {
if (!usedBackpacks.contains(lev)) {
backpackLev = lev;
break;
@@ -512,9 +508,9 @@
return o2.getPriority() - o1.getPriority();
}
});
- Integer backpack = agvService.getBackpack(agvId);
- if (taskList.size() > backpack) {
- taskList = taskList.subList(0, backpack);
+ Integer backpackCap = agvService.getBackpack(agvId);
+ if (taskList.size() > backpackCap) {
+ taskList = taskList.subList(0, backpackCap);
}
AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId);
@@ -584,7 +580,7 @@
}
- if (backpackLev > backpack) {
+ if (backpackLev > backpackCap) {
throw new BusinessException("瑙f瀽Task澶辫触,AGV鑳岀瘬宸叉弧......");
}
@@ -788,7 +784,8 @@
task.setAgvId(agvId);
task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
List<Task> lastTasks = taskService.list(new LambdaQueryWrapper<Task>().orderByDesc(Task::getId));
- task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+// task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+ task.setSeqNum(Base62.encode(snowflakeIdWorker.nextId()));
task.setOriCode(agvDetail.getCode());
task.setDestCode(endCode.getId());
// lane
@@ -936,7 +933,6 @@
if (!lastCode.getData().equals(code.getData())) {
// 璧拌璺緞鑺傜偣
-// List<String> pathList = mapService.checkoutPath(agv.getUuid(), lastCode, code);
List<String> pathListPart = pathList.subList(pathList.indexOf(lastCode.getData()), pathList.indexOf(code.getData()) + 1);
for (int i = 0; i < pathListPart.size(); i++) {
@@ -965,11 +961,11 @@
// 宸烽亾寮哄埗杞集锛屼紭鍏堢骇 > workDirection
if (null != nextLaneDir) {
- nextDirection = nextLaneDir;
+ final double oppNextLaneDir = (nextLaneDir + 180) % 360;
- if (!lastDirection.equals(nextDirection)) {
+ if (!lastDirection.equals(nextLaneDir)) {
if (!lastCode.getCornerBool()) {
- throw new CoolException(agvNo + "鍙峰皬杞﹁繘鍏ュ贩閬撻渶璋冩暣鏂瑰悜涓� " + nextDirection + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
+ throw new CoolException(agvNo + "鍙峰皬杞﹁繘鍏ュ贩閬撻渶璋冩暣鏂瑰悜涓� " + nextLaneDir + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
}
// turn
actionList.add(new Action(
@@ -979,24 +975,34 @@
null, // 鍔ㄤ綔鍙�
null, // 浼樺厛绾�
ActionTypeType.TurnCorner.desc, // 鍚嶇О
- (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ (double) MapService.calcSpinDirection(lastCode, lastDirection, nextLaneDir).val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
- String.valueOf(nextDirection), // 鍔ㄤ綔鍙傛暟
+ String.valueOf(nextLaneDir), // 鍔ㄤ綔鍙傛暟
ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
actionPrepareSts, // 鍔ㄤ綔杩涘害
agvId, // AGV
now // 宸ヤ綔鏃堕棿
));
- lastDirection = nextDirection;
+ lastDirection = nextLaneDir;
}
- } else if (null != lastLaneDir) {
- nextDirection = lastLaneDir;
- if (!lastDirection.equals(nextDirection)) {
+ if (nextDirection.equals(oppNextLaneDir)) {
+ reverse = true;
+ }
+ nextDirection = nextLaneDir; // 闃叉 绗竴涓姩浣滀竴瀹氭槸 turn 鍑洪棶棰�
+ } else if (null != lastLaneDir) { // turn 鐜舰鐩磋涓嶅簲璇ュ瓨鍦ㄤ簬lane涓�
+ final double oppLastLaneDir = (lastLaneDir + 180) % 360;
+
+ if (!lastDirection.equals(lastLaneDir)) {
if (!lastCode.getCornerBool()) {
throw new CoolException(agvNo + "鍙峰皬杞︾寮�宸烽亾闇�璋冩暣鏂瑰悜涓� " + nextDirection + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
}
}
+
+ if (nextDirection.equals(oppLastLaneDir)) {
+ reverse = true;
+ }
+ nextDirection = lastLaneDir; // 闃叉 绗竴涓姩浣滀竴瀹氭槸 turn 鍑洪棶棰�
} else {
// 濡傛灉涓嬩竴涓柟鍚戞濂芥槸浣滀笟鏂瑰悜鐨勭浉鍙嶆柟鍚戯紝鍒欓噸缃笅涓�涓柟鍚戜负浣滀笟鏂瑰悜锛屾爣璁� reverse = true
@@ -1036,7 +1042,7 @@
null, // 鍔ㄤ綔鍙�
null, // 浼樺厛绾�
ActionTypeType.TurnCorner.desc, // 鍚嶇О
- (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ (double) MapService.calcSpinDirection(lastCode, lastDirection, nextDirection).val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
String.valueOf(nextDirection), // 鍔ㄤ綔鍙傛暟
ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
@@ -1061,7 +1067,7 @@
null, // 鍔ㄤ綔鍙�
null, // 浼樺厛绾�
ActionTypeType.TurnCorner.desc, // 鍚嶇О
- (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ (double) MapService.calcSpinDirection(lastCode, lastDirection, nextDirection).val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
String.valueOf(nextDirection), // 鍔ㄤ綔鍙傛暟
ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
@@ -1128,7 +1134,7 @@
null, // 鍔ㄤ綔鍙�
null, // 浼樺厛绾�
ActionTypeType.TurnCorner.desc, // 鍚嶇О
- (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ (double) MapService.calcSpinDirection(lastCode, lastDirection, firstTurnDir).val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
String.valueOf(firstTurnDir), // 鍔ㄤ綔鍙傛暟
ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
@@ -1254,7 +1260,7 @@
null, // 鍔ㄤ綔鍙�
null, // 浼樺厛绾�
ActionTypeType.TurnCorner.desc, // 鍚嶇О
- (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ (double) MapService.calcSpinDirection(lastCode, lastDirection, oriStaWorkDirection).val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
String.valueOf(oriStaWorkDirection), // 鍔ㄤ綔鍙傛暟
ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
@@ -1318,7 +1324,7 @@
null, // 鍔ㄤ綔鍙�
null, // 浼樺厛绾�
ActionTypeType.TurnCorner.desc, // 鍚嶇О
- (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ (double) MapService.calcSpinDirection(lastCode, lastDirection, destStaWorkDirection).val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
String.valueOf(destStaWorkDirection), // 鍔ㄤ綔鍙傛暟
ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
@@ -1377,7 +1383,7 @@
null, // 鍔ㄤ綔鍙�
null, // 浼樺厛绾�
ActionTypeType.TurnCorner.desc, // 鍚嶇О
- (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ (double) MapService.calcSpinDirection(lastCode, lastDirection, chargeDirection).val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
String.valueOf(chargeDirection), // 鍔ㄤ綔鍙傛暟
ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
@@ -1826,7 +1832,7 @@
Code code = codeService.getCacheByData(agv_06_up.getQrCode());
// query current segment
- Segment currSeg = segmentService.getCurrRunningSeg(agv.getId(), code.getId());
+ Segment currSeg = segmentService.getCurrRunningSeg(null, agv.getId(), code.getId());
if (null == currSeg) {
log.error("failed to find curr segment [{}]", agv.getUuid());
} else {
@@ -1859,6 +1865,7 @@
staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT);
break;
}
+ log.info("AGV[{}] load permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
success = true;
break;
case DEST_STA:
@@ -1874,6 +1881,7 @@
staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN);
break;
}
+ log.info("AGV[{}] unload permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
success = true;
break;
default:
@@ -1890,8 +1898,7 @@
AGV_06_DOWN agv_06_down = new AGV_06_DOWN();
agv_06_down.setSerialNo(agv_06_up.getSerialNo());
agv_06_down.setActionCode(agv_06_up.getActionCode());
- //agv_06_down.setResult(success ? 1 : 0);
- agv_06_down.setResult(1);
+ agv_06_down.setResult(success ? 1 : 0);
redis.push(RedisConstant.AGV_PATH_DOWN_FLAG, AgvProtocol.build(protocol.getAgvNo()).setMessageBody(agv_06_down));
}
--
Gitblit v1.9.1