From fd5b2fe041fe583307352d3120f422401e05745b Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@gmail.com>
Date: 星期二, 13 一月 2026 08:04:01 +0800
Subject: [PATCH] Merge branch 'ctu_stable' of github.com:luxiaotao1123/rcs-flow into ctu_stable
---
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java | 135 +++++++++++++++++++++++++++++++-------------
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/LaneServiceImpl.java | 22 +++++++
version/doc/RCS开发进度表.xlsx | 0
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/CodeGapServiceImpl.java | 10 ++
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/LaneService.java | 2
5 files changed, 127 insertions(+), 42 deletions(-)
diff --git "a/version/doc/RCS\345\274\200\345\217\221\350\277\233\345\272\246\350\241\250.xlsx" "b/version/doc/RCS\345\274\200\345\217\221\350\277\233\345\272\246\350\241\250.xlsx"
index 325168a..bbb5c25 100644
--- "a/version/doc/RCS\345\274\200\345\217\221\350\277\233\345\272\246\350\241\250.xlsx"
+++ "b/version/doc/RCS\345\274\200\345\217\221\350\277\233\345\272\246\350\241\250.xlsx"
Binary files differ
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 195e689..41386e6 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
@@ -90,7 +90,7 @@
@Autowired
private SegmentService segmentService;
@Autowired
- private TrafficService trafficService;
+ private LaneService laneService;
@Autowired
private AgvModelService agvModelService;
@Autowired
@@ -907,6 +907,7 @@
AgvModel agvModel = agvModelService.getByAgvId(agvId);
Double workDirection = agvModel.getWorkDirection();
+ final double oppWorkDir = (workDirection + 180) % 360;
boolean backupAction = null != agvModel.getBackupAction() && agvModel.getBackupActionBool();
boolean needUndocking = null != agvModel.getNeedUndocking() && agvModel.getNeedUndockingBool();
AgvSpeedType agvSpeedType = AgvSpeedType.query(agvModel.getTravelSpeed());
@@ -944,51 +945,108 @@
String next = pathListPart.get(i);
Code nextCode = codeService.getCacheByData(next);
+ // 杞﹀ご鏈濆墠鐨勪笅涓�涓璧版柟鍚�
Double nextDirection = mapService.calculateDirection(lastCode, nextCode, angleOffsetVal);
- // 绗竴姝ワ細濡傛灉涓嬩竴涓柟鍚戞濂芥槸浣滀笟鏂瑰悜鐨勭浉鍙嶆柟鍚戯紝鍒欓噸缃笅涓�涓柟鍚戜负浣滀笟鏂瑰悜锛屾爣璁� reverse = true
+ // 鍙嶅悜瑙�
+ final double oppLastDir = (lastDirection + 180) % 360;
+ // 鏄惁鍊掗��琛岃蛋
boolean reverse = false;
- if (nextDirection.equals((workDirection + 180) % 360)) {
- nextDirection = workDirection;
- reverse = true;
- }
- // 绗簩姝ワ細鍒ゆ柇褰撳墠鑺傜偣鏄惁鍙互鏃嬭浆
- if (!lastCode.getCornerBool()) {
- // 濡傛灉鏄綔涓氭柟鍚戯紝浣嗘槸灏忚溅鍦ㄥ贩閬撳唴鏂瑰悜閿欒锛屽垯鍋滄
- if (reverse && !lastDirection.equals(nextDirection)) {
- throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
+ // 宸烽亾閫昏緫
+ if (!laneBuilder.isInitialized()) {
+ throw new CoolException("lanes are not initialized");
+ }
+ LaneDto lastLaneDto = laneBuilder.search(lastCode.getData());
+ LaneDto nextLaneDto = laneBuilder.search(nextCode.getData());
+ // 杩涘叆宸烽亾瑙掑害
+ Double lastLaneDir = laneService.getLaneDirection(lastLaneDto);
+ Double nextLaneDir = laneService.getLaneDirection(nextLaneDto);
+
+ // 宸烽亾寮哄埗杞集锛屼紭鍏堢骇 > workDirection
+ if (null != nextLaneDir) {
+ nextDirection = nextLaneDir;
+
+ if (!lastDirection.equals(nextDirection)) {
+ if (!lastCode.getCornerBool()) {
+ throw new CoolException(agvNo + "鍙峰皬杞﹁繘鍏ュ贩閬撻渶璋冩暣鏂瑰悜涓� " + nextDirection + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
+ }
+ // turn
+ actionList.add(new Action(
+ null, // 缂栧彿s
+ task.getBusId(), // 鎬荤嚎
+ task.getId(), // 浠诲姟
+ null, // 鍔ㄤ綔鍙�
+ null, // 浼樺厛绾�
+ ActionTypeType.TurnCorner.desc, // 鍚嶇О
+ (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ lastCode.getData(), // 鍦伴潰鐮�
+ String.valueOf(nextDirection), // 鍔ㄤ綔鍙傛暟
+ ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
+ actionPrepareSts, // 鍔ㄤ綔杩涘害
+ agvId, // AGV
+ now // 宸ヤ綔鏃堕棿
+ ));
+ lastDirection = nextDirection;
}
- // 濡傛灉涓嶆槸浣滀笟鏂瑰悜锛屽垽鏂槸鍚︾浉鍙嶆柟鍚戯紝濡傛灉鍙嶆柟鍚戝垯鍊掗��琛岃蛋
- if (nextDirection.equals((lastDirection + 180) % 360)) {
- nextDirection = lastDirection;
- reverse = true;
+ } else if (null != lastLaneDir) {
+ nextDirection = lastLaneDir;
+
+ if (!lastDirection.equals(nextDirection)) {
+ if (!lastCode.getCornerBool()) {
+ throw new CoolException(agvNo + "鍙峰皬杞︾寮�宸烽亾闇�璋冩暣鏂瑰悜涓� " + nextDirection + "掳锛岃鎺ㄨ嚦杞集鐐规墜鍔ㄨ皟鏁�");
+ }
}
} else {
- if (!lastDirection.equals(nextDirection)) {
- // 濡傛灉涓嬩釜鑺傜偣鏂瑰悜涓庡綋鍓峚gv鏂瑰悜鐩稿弽锛屽垯鍊掗��琛岃蛋锛屼絾鏄鏋滃綋鍓峚gv鏂瑰悜姝eソ涓庡伐浣滄柟鍚戠浉鍙嶏紝鍒欐棆杞嚦宸ヤ綔鏂瑰悜
- if (nextDirection.equals((lastDirection + 180) % 360) && !workDirection.equals((lastDirection + 180) % 360)) {
+
+ // 濡傛灉涓嬩竴涓柟鍚戞濂芥槸浣滀笟鏂瑰悜鐨勭浉鍙嶆柟鍚戯紝鍒欓噸缃笅涓�涓柟鍚戜负浣滀笟鏂瑰悜锛屾爣璁� reverse = true
+ if (nextDirection.equals(oppWorkDir)) {
+ nextDirection = workDirection;
+ reverse = true;
+ }
+
+ // 鍒ゆ柇褰撳墠鑺傜偣鏄惁鍙互鏃嬭浆
+ if (!lastCode.getCornerBool()) {
+ // 濡傛灉鏄綔涓氭柟鍚戯紝浣嗘槸灏忚溅鍦ㄥ贩閬撳唴鏂瑰悜閿欒锛屽垯鍋滄
+ if (reverse && !lastDirection.equals(nextDirection)) {
+ throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
+ }
+ // 濡傛灉涓嶆槸浣滀笟鏂瑰悜锛堝彟涓�缁勭浉鍙嶆柟鍚戯級锛屽垽鏂槸鍚︾浉鍙嶆柟鍚戯紝濡傛灉鍙嶆柟鍚戝垯鍊掗��琛岃蛋
+ if (nextDirection.equals(oppLastDir)) {
+ // 鍊掗��鏃讹紝鍥犱负agv鏂瑰悜娌″彉锛屾墍浠ヤ笅涓�涓柟鍚戣繕鏄痑gv鏂瑰悜锛屾晠nextDirection = lastDirection;
nextDirection = lastDirection;
reverse = true;
- } else {
- // turn
- actionList.add(new Action(
- null, // 缂栧彿s
- task.getBusId(), // 鎬荤嚎
- task.getId(), // 浠诲姟
- null, // 鍔ㄤ綔鍙�
- null, // 浼樺厛绾�
- ActionTypeType.TurnCorner.desc, // 鍚嶇О
- (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
- lastCode.getData(), // 鍦伴潰鐮�
- String.valueOf(nextDirection), // 鍔ㄤ綔鍙傛暟
- ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
- actionPrepareSts, // 鍔ㄤ綔杩涘害
- agvId, // AGV
- now // 宸ヤ綔鏃堕棿
- ));
+ }
+ // 鎬荤粨锛�1.濡傛灉鏄綔涓氱粍锛堝樊180掳锛夋柟鍚戯紝閭d箞agv鏂瑰悜蹇呴』鏄綔涓氭柟鍚戯紝濡傛灉 reverse 鍒欒鏄庡�掗��锛岃繖鏃跺�檔extDirection鑲畾浼氱瓑浜庝綔涓氭柟鍚戯紙鍓嶉潰璧嬪�间簡锛夛紝濡傛灉涓嶇浉鍚岋紝鍒欐姤閿�
+ // 2.濡傛灉涓嶆槸浣滀笟缁勬柟鍚戯紙鍙︿竴缁勭浉鍙嶆柟鍚戝樊180掳锛夛紝鍥犱负姝ゅ嚱鏁颁笉鑳芥棆杞紝鎵�浠ュ樊180掳鏃跺彧鑳藉�掗��锛屽�掗��鐨勬椂鍊欏洜涓篴gv涓嶄細鏃嬭浆锛屾墍浠extDirection瑕佸彉鎴恆gv鏂瑰悜
+ } else {
+ if (!lastDirection.equals(nextDirection)) {
+ // 濡傛灉涓嬩竴涓柟鍚戜笌agv鏂瑰悜鐩稿弽锛屽垯鍊掗��琛岃蛋锛岄伩鍏嶈繘琛屾鏃犳剰涔夌殑杞集鍔ㄤ綔銆�
+ // 浣嗘槸瑕佹敞鎰忥細濡傛灉agv鏂瑰悜涓庡伐浣滄柟鍚戞濂界浉鍙嶏紝鍒欓渶瑕佹棆杞嚦宸ヤ綔鏂瑰悜锛屼篃灏辨槸涓轰粈涔堣鍔�!workDirection.equals(oppLastDir)鍒ゆ柇
+ if (nextDirection.equals(oppLastDir) && !workDirection.equals(oppLastDir)) {
+ // 鍊掗��鏃讹紝鍥犱负agv鏂瑰悜娌″彉锛屾墍浠ヤ笅涓�涓柟鍚戣繕鏄痑gv鏂瑰悜锛屾晠nextDirection = lastDirection;
+ nextDirection = lastDirection;
+ reverse = true;
+ } else {
+ // turn
+ actionList.add(new Action(
+ null, // 缂栧彿s
+ task.getBusId(), // 鎬荤嚎
+ task.getId(), // 浠诲姟
+ null, // 鍔ㄤ綔鍙�
+ null, // 浼樺厛绾�
+ ActionTypeType.TurnCorner.desc, // 鍚嶇О
+ (double) mapService.spinDirection(lastCode).val, // 灞炴�у��
+ lastCode.getData(), // 鍦伴潰鐮�
+ String.valueOf(nextDirection), // 鍔ㄤ綔鍙傛暟
+ ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
+ actionPrepareSts, // 鍔ㄤ綔杩涘害
+ agvId, // AGV
+ now // 宸ヤ綔鏃堕棿
+ ));
- lastDirection = nextDirection;
+ lastDirection = nextDirection;
+ }
}
}
}
@@ -1016,10 +1074,7 @@
}
// run
- ActionTypeType actionType = ActionTypeType.StraightAheadTurnable;
- if (reverse) {
- actionType = ActionTypeType.StraightBackTurnable;
- }
+ ActionTypeType actionType = reverse ? ActionTypeType.StraightBackTurnable : ActionTypeType.StraightAheadTurnable;
CodeGap gap = codeGapService.findByCodeOfBoth(lastCode.getId(), nextCode.getId());
actionList.add(new Action(
null, // 缂栧彿
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/LaneService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/LaneService.java
index 331edfc..17d2d12 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/LaneService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/LaneService.java
@@ -10,4 +10,6 @@
List<Lane> batchSaveByLaneDtoList(Long zonedId, List<LaneDto> laneDtoList);
+ Double getLaneDirection(LaneDto laneDto);
+
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/CodeGapServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/CodeGapServiceImpl.java
index 138afec..7e73a0d 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/CodeGapServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/CodeGapServiceImpl.java
@@ -75,12 +75,18 @@
}
if (null == codeGap) {
- codeGap = getOne(new LambdaQueryWrapper<CodeGap>().eq(CodeGap::getCode0, code0).eq(CodeGap::getCode1, code1));
+ codeGap = this.getOne(new LambdaQueryWrapper<CodeGap>()
+ .eq(CodeGap::getCode0, code0).eq(CodeGap::getCode1, code1).last("limit 1"));
if (codeGap == null) {
- codeGap = getOne(new LambdaQueryWrapper<CodeGap>().eq(CodeGap::getCode1, code0).eq(CodeGap::getCode0, code1));
+ codeGap = this.getOne(new LambdaQueryWrapper<CodeGap>()
+ .eq(CodeGap::getCode1, code0).eq(CodeGap::getCode0, code1).last("limit 1"));
}
}
+ if (null == codeGap) {
+// throw new CoolException("failed to find code of both " + code0 + " and " + code1);
+ }
+
return codeGap;
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/LaneServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/LaneServiceImpl.java
index 80aeb37..ae91f79 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/LaneServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/LaneServiceImpl.java
@@ -6,6 +6,7 @@
import com.zy.acs.framework.common.SnowflakeIdWorker;
import com.zy.acs.framework.exception.CoolException;
import com.zy.acs.manager.core.domain.LaneDto;
+import com.zy.acs.manager.core.service.MapService;
import com.zy.acs.manager.manager.entity.Lane;
import com.zy.acs.manager.manager.enums.StatusType;
import com.zy.acs.manager.manager.mapper.LaneMapper;
@@ -55,4 +56,25 @@
return lanes;
}
+ @Override
+ public Double getLaneDirection(LaneDto laneDto) {
+ if (null == laneDto) {
+ return null;
+ }
+ Lane lane = this.getById(laneDto.getLaneId());
+ if (null == lane) {
+ return null;
+ }
+ Integer entryAngle = lane.getEntryAngle();
+ if (null == entryAngle) {
+ return null;
+ }
+ if (entryAngle < 0) {
+ return null;
+ }
+ double entryAngleDouble = entryAngle.doubleValue();
+ return MapService.mapToNearest(entryAngleDouble);
+// return entryAngleDouble;
+ }
+
}
--
Gitblit v1.9.1