From 6166c4551aa61019413713e8f2ce1aa626dec971 Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期二, 01 四月 2025 13:50:07 +0800
Subject: [PATCH] #
---
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java | 221 ++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 177 insertions(+), 44 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 efc79ab..99f715d 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
@@ -35,7 +35,7 @@
import com.zy.acs.manager.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -47,7 +47,7 @@
* Created by vincent on 2023/6/14
*/
@Slf4j
-@Component("mainService")
+@Service("mainService")
public class MainService {
@Autowired
@@ -96,7 +96,6 @@
private LaneService laneService;
@Autowired
private ActionSorter actionSorter;
-
@SuppressWarnings("all")
@Transactional
@@ -175,8 +174,28 @@
if (!locService.updateById(oriLoc)) {
throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " failed to update");
}
+
+ destSta = staService.getById(task.getDestSta());
+ if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) {
+ throw new BusinessException("destSta锛�" + task.getDestSta$() + " is not in IDLE status");
+ }
+ destSta.setStaSts(StaStsType.PAKIN.val());
+ destSta.setUpdateTime(now);
+ if (!staService.updateById(destSta)) {
+ throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to update");
+ }
break;
case STA_TO_LOC:
+ oriSta = staService.getById(task.getOriSta());
+ if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) {
+ throw new BusinessException("oriSta锛�" + task.getOriSta$() + " is not in STOCK status");
+ }
+ oriSta.setStaSts(StaStsType.PAKOUT.val());
+ oriSta.setUpdateTime(now);
+ if (!staService.updateById(oriSta)) {
+ throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to update");
+ }
+
destLoc = locService.getById(task.getDestLoc());
if (!destLoc.getLocSts().equals(LocStsType.IDLE.val())) {
throw new BusinessException("destLoc锛�" + task.getDestLoc$() + " is not in IDLE status");
@@ -188,6 +207,25 @@
}
break;
case STA_TO_STA:
+ oriSta = staService.getById(task.getOriSta());
+ if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) {
+ throw new BusinessException("oriSta锛�" + task.getOriSta$() + " is not in STOCK status");
+ }
+ oriSta.setStaSts(StaStsType.PAKOUT.val());
+ oriSta.setUpdateTime(now);
+ if (!staService.updateById(oriSta)) {
+ throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to update");
+ }
+
+ destSta = staService.getById(task.getDestSta());
+ if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) {
+ throw new BusinessException("destSta锛�" + task.getDestSta$() + " is not in IDLE status");
+ }
+ destSta.setStaSts(StaStsType.PAKIN.val());
+ destSta.setUpdateTime(now);
+ if (!staService.updateById(destSta)) {
+ throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to update");
+ }
break;
default:
break;
@@ -223,7 +261,7 @@
for (Task task : taskList) {
Agv agv = allocateService.execute(task);
if (null == agv) {
-// log.warn("Task[{}] has an issue锛� because it failed to checkout agv which is idle...", task.getSeqNum());
+// log.warn("Task[{}] has an issue锛� because it failed to check out agv which is idle...", task.getSeqNum());
continue;
}
task.setAgvId(agv.getId());
@@ -667,7 +705,7 @@
List<Action> actionList = new ArrayList<>();
// start node
Code lastCode = codeService.getCacheById(agvDetail.getRecentCode());
- Double lastDirection = agvDetail.getAgvAngle();
+ Double lastDirection = MapService.mapToNearest(agvDetail.getAgvAngle());
if (!lastCode.getData().equals(pathList.get(0))) {
throw new CoolException("AGV[" + agvNo + "]瀹氫綅鍋忕Щ...");
}
@@ -696,27 +734,34 @@
Code nextCode = codeService.getCacheByData(next);
Double nextDirection = mapService.calculateDirection(lastCode, nextCode, angleOffsetVal);
- // 濡傛灉鍘讳笅涓妭鐐圭殑鏂瑰悜涓庡綋鍓嶆柟鍚戝樊180搴︼紝鍒欎笉闇�瑕佹棆杞紝鏀逛负鍙嶆柟鍚戣璧帮紝nextDirection缁х画璧嬪�兼槸涓轰簡閬垮厤 鈥樼涓�涓姩浣滀竴瀹氭槸 turn鈥� 鐨勫垽鏂�
+ // 绗竴姝ワ細濡傛灉涓嬩竴涓柟鍚戞濂芥槸浣滀笟鏂瑰悜鐨勭浉鍙嶆柟鍚戯紝鍒欓噸缃笅涓�涓柟鍚戜负浣滀笟鏂瑰悜锛屾爣璁� reverse = true
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 (nextDirection.equals((lastDirection + 180) % 360)) {
nextDirection = lastDirection;
reverse = true;
}
} else {
if (!lastDirection.equals(nextDirection)) {
- if (lastDirection.equals((nextDirection + 180) % 360)) {
+ // 濡傛灉涓嬩釜鑺傜偣鏂瑰悜涓庡綋鍓峚gv鏂瑰悜鐩稿弽锛屽垯鍊掗��琛岃蛋锛屼絾鏄鏋滃綋鍓峚gv鏂瑰悜姝eソ涓庡伐浣滄柟鍚戠浉鍙嶏紝鍒欐棆杞嚦宸ヤ綔鏂瑰悜
+ if (nextDirection.equals((lastDirection + 180) % 360) && !workDirection.equals((lastDirection + 180) % 360)) {
nextDirection = lastDirection;
reverse = true;
} else {
// turn
actionList.add(new Action(
- null, // 缂栧彿
+ null, // 缂栧彿s
task.getBusId(), // 鎬荤嚎
task.getId(), // 浠诲姟
null, // 鍔ㄤ綔鍙�
@@ -820,28 +865,12 @@
assert backpackType != null;
// 妫�楠屾柟鍚�
if (!lastDirection.equals(workDirection)) {
- // turn
- actionList.add(new Action(
- null, // 缂栧彿
- task.getBusId(), // 鎬荤嚎
- task.getId(), // 浠诲姟
- null, // 鍔ㄤ綔鍙�
- null, // 浼樺厛绾�
- ActionTypeType.TurnCorner.desc, // 鍚嶇О
- mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 灞炴�у��
- lastCode.getData(), // 鍦伴潰鐮�
- String.valueOf(workDirection), // 鍔ㄤ綔鍙傛暟
- ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
- actionPrepareSts, // 鍔ㄤ綔杩涘害
- agvId, // AGV
- now // 宸ヤ綔鏃堕棿
- ));
- lastDirection = workDirection;
+ throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
}
// 璐ф灦鍙栬揣
Loc oriLoc = locService.getById(task.getOriLoc());
// 璁$畻宸﹀彸鏂瑰悜
- agvDirectionType = mapService.calculateAgvWorkDirection(oriLoc, lastCode);
+ agvDirectionType = mapService.calculateAgvWorkDirectionByShelf(oriLoc, lastCode);
actionList.add(new Action(
null, // 缂栧彿
task.getBusId(), // 鎬荤嚎
@@ -878,23 +907,7 @@
assert backpackType != null;
// 妫�楠屾柟鍚�
if (!lastDirection.equals(workDirection)) {
- // turn
- actionList.add(new Action(
- null, // 缂栧彿
- task.getBusId(), // 鎬荤嚎
- task.getId(), // 浠诲姟
- null, // 鍔ㄤ綔鍙�
- null, // 浼樺厛绾�
- ActionTypeType.TurnCorner.desc, // 鍚嶇О
- mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 灞炴�у��
- lastCode.getData(), // 鍦伴潰鐮�
- String.valueOf(workDirection), // 鍔ㄤ綔鍙傛暟
- ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
- actionPrepareSts, // 鍔ㄤ綔杩涘害
- agvId, // AGV
- now // 宸ヤ綔鏃堕棿
- ));
- lastDirection = workDirection;
+ throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
}
// 鏆傚瓨鐐瑰彇璐ц揣
actionList.add(new Action(
@@ -916,7 +929,7 @@
// 璐ф灦鏀捐揣
Loc destLoc = locService.getById(task.getDestLoc());
// 璁$畻宸﹀彸鏂瑰悜
- agvDirectionType = mapService.calculateAgvWorkDirection(destLoc, lastCode);
+ agvDirectionType = mapService.calculateAgvWorkDirectionByShelf(destLoc, lastCode);
actionList.add(new Action(
null, // 缂栧彿
task.getBusId(), // 鎬荤嚎
@@ -934,8 +947,128 @@
));
break;
case ORI_STA:
+ // 绔欑偣鍙栬揣
+ Sta oriSta = staService.getById(task.getOriSta());
+ Double oriStaWorkDirection = mapService.getStaAngle(oriSta, workDirection);
+ // 妫�楠屾柟鍚�
+ if (!lastDirection.equals(oriStaWorkDirection)) {
+ if (!lastCode.getCornerBool()) {
+ throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
+ }
+ // turn
+ actionList.add(new Action(
+ null, // 缂栧彿
+ task.getBusId(), // 鎬荤嚎
+ task.getId(), // 浠诲姟
+ null, // 鍔ㄤ綔鍙�
+ null, // 浼樺厛绾�
+ ActionTypeType.TurnCorner.desc, // 鍚嶇О
+ mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 灞炴�у��
+ lastCode.getData(), // 鍦伴潰鐮�
+ String.valueOf(oriStaWorkDirection), // 鍔ㄤ綔鍙傛暟
+ ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
+ actionPrepareSts, // 鍔ㄤ綔杩涘害
+ agvId, // AGV
+ now // 宸ヤ綔鏃堕棿
+ ));
+ lastDirection = oriStaWorkDirection;
+ }
+ // 璁$畻璐у弶宸ヤ綔鏂瑰悜
+ agvDirectionType = mapService.calculateAgvWorkDirectionByStation(oriSta, lastCode);
+ actionList.add(new Action(
+ null, // 缂栧彿
+ task.getBusId(), // 鎬荤嚎
+ task.getId(), // 浠诲姟
+ null, // 鍔ㄤ綔鍙�
+ null, // 浼樺厛绾�
+ ActionTypeType.ReadyTakeFromShelvesLoc.desc, // 鍚嶇О
+ (double) agvDirectionType.val, // 灞炴�у��
+ lastCode.getData(), // 鍦伴潰鐮�
+ String.valueOf(oriSta.getOffset()), // 鍔ㄤ綔鍙傛暟
+ ActionTypeType.ReadyTakeFromShelvesLoc.val(), // 鍔ㄤ綔绫诲瀷
+ actionPrepareSts, // 鍔ㄤ綔杩涘害
+ agvId, // AGV
+ now // 宸ヤ綔鏃堕棿
+ ));
+ // 鏆傚瓨鐐规斁璐�
+ assert backpackType != null;
+ actionList.add(new Action(
+ null, // 缂栧彿
+ task.getBusId(), // 鎬荤嚎
+ task.getId(), // 浠诲姟
+ null, // 鍔ㄤ綔鍙�
+ null, // 浼樺厛绾�
+ ActionTypeType.ReadyReleaseToAgvSite.desc, // 鍚嶇О
+ (double) backpackType.lev, // 灞炴�у��
+ lastCode.getData(), // 鍦伴潰鐮�
+ String.valueOf(backpackType.height), // 鍔ㄤ綔鍙傛暟
+ ActionTypeType.ReadyReleaseToAgvSite.val(), // 鍔ㄤ綔绫诲瀷
+ actionPrepareSts, // 鍔ㄤ綔杩涘害
+ agvId, // AGV
+ now // 宸ヤ綔鏃堕棿
+ ));
break;
case DEST_STA:
+ // 绔欑偣鏀捐揣
+ Sta destSta = staService.getById(task.getDestSta());
+ Double destStaWorkDirection = mapService.getStaAngle(destSta, workDirection);
+ // 妫�楠屾柟鍚�
+ if (!lastDirection.equals(destStaWorkDirection)) {
+ if (!lastCode.getCornerBool()) {
+ throw new CoolException(agvNo + "鍙峰皬杞︽柟鍚戦敊璇紝璇锋帹鑷宠浆寮偣鎵嬪姩璋冩暣");
+ }
+ // turn
+ actionList.add(new Action(
+ null, // 缂栧彿
+ task.getBusId(), // 鎬荤嚎
+ task.getId(), // 浠诲姟
+ null, // 鍔ㄤ綔鍙�
+ null, // 浼樺厛绾�
+ ActionTypeType.TurnCorner.desc, // 鍚嶇О
+ mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 灞炴�у��
+ lastCode.getData(), // 鍦伴潰鐮�
+ String.valueOf(destStaWorkDirection), // 鍔ㄤ綔鍙傛暟
+ ActionTypeType.TurnCorner.val(), // 鍔ㄤ綔绫诲瀷
+ actionPrepareSts, // 鍔ㄤ綔杩涘害
+ agvId, // AGV
+ now // 宸ヤ綔鏃堕棿
+ ));
+ lastDirection = destStaWorkDirection;
+ }
+ // 鏆傚瓨鐐瑰彇璐�
+ assert backpackType != null;
+ actionList.add(new Action(
+ null, // 缂栧彿
+ task.getBusId(), // 鎬荤嚎
+ task.getId(), // 浠诲姟
+ null, // 鍔ㄤ綔鍙�
+ null, // 浼樺厛绾�
+ ActionTypeType.ReadyTakeFromAgvSite.desc, // 鍚嶇О
+ (double) backpackType.lev, // 灞炴�у��
+ lastCode.getData(), // 鍦伴潰鐮�
+ String.valueOf(backpackType.height), // 鍔ㄤ綔鍙傛暟
+ ActionTypeType.ReadyTakeFromAgvSite.val(), // 鍔ㄤ綔绫诲瀷
+ actionPrepareSts, // 鍔ㄤ綔杩涘害
+ agvId, // AGV
+ now // 宸ヤ綔鏃堕棿
+ ));
+ // 璁$畻璐у弶宸ヤ綔鏂瑰悜
+ agvDirectionType = mapService.calculateAgvWorkDirectionByStation(destSta, lastCode);
+ actionList.add(new Action(
+ null, // 缂栧彿
+ task.getBusId(), // 鎬荤嚎
+ task.getId(), // 浠诲姟
+ null, // 鍔ㄤ綔鍙�
+ null, // 浼樺厛绾�
+ ActionTypeType.ReadyReleaseToShelvesLoc.desc, // 鍚嶇О
+ (double) agvDirectionType.val, // 灞炴�у��
+ lastCode.getData(), // 鍦伴潰鐮�
+ String.valueOf(destSta.getOffset()), // 鍔ㄤ綔鍙傛暟
+ ActionTypeType.ReadyReleaseToShelvesLoc.val(), // 鍔ㄤ綔绫诲瀷
+ actionPrepareSts, // 鍔ㄤ綔杩涘害
+ agvId, // AGV
+ now // 宸ヤ綔鏃堕棿
+ ));
break;
case TO_CHARGE:
// 妫�楠屾柟鍚�
--
Gitblit v1.9.1