version/doc/AGV-RCS ͨÐÅÐÒé V1.0.xlsxBinary files differ
version/doc/RCS¿ª·¢½ø¶È±í.xlsxBinary files differ
version/doc/hik/10¡¢µãÇøÓò¿ÕÂú½»»»ÒµÎñ²Ù×÷ÊÖ²áV21_20210910_20210910135732_xujiangtao6.pdfBinary files differ
version/doc/hik/¡¾0402002¡¿Ç±·ü»úÆ÷ÈËÒµÎñ²¿ÊðÊÖ²áV2.1_20230518.pdfBinary files differ
version/doc/hik/¡¾0402008¡¿¿ÕÂú½»»»ÒµÎñ²Ù×÷ÊÖ²áV2.3_20220117.pdfBinary files differ
version/doc/logical-line.xmindBinary files differ
zy-acs-flow/src/map/constants.js
@@ -1,9 +1,9 @@ export const MAP_DEFAULT_ROTATION = 180; export const MAP_DEFAULT_ROTATION = 270; export const AGV_ANGLE_OFFSET_VAL = 90; export const MAP_MIRROR = true; export const MAP_MIRROR = false; export const ANIMATE_DURING_TIME = 60; zy-acs-flow/src/map/player.js
@@ -231,8 +231,8 @@ } this.scale = Math.min( this.app.renderer.width / (maxX - minX) * 0.8, this.app.renderer.height / (maxY - minY) * 0.8 this.app.renderer.width / (maxX - minX) * 0.55, this.app.renderer.height / (maxY - minY) * 0.55, ); let centerPoint = { zy-acs-flow/src/map/tool.js
@@ -597,6 +597,12 @@ if (!mapContainer || !sprite) { return; } const data = sprite.data || (sprite.data = {}); if (data.rotationTween) { data.rotationTween.stop(); data.rotationTween = null; } // origin let currentRotation = sprite.rotation + rotationOffset; // target @@ -612,7 +618,7 @@ // destination const endRotation = sprite.rotation + rotationDifference; new TWEEDLE.Tween(sprite) const rotationTween = new TWEEDLE.Tween(sprite) .to({ rotation: endRotation }, ANIMATE_DURING_TIME) .easing(TWEEDLE.Easing.Linear.None) .onUpdate(() => { @@ -622,6 +628,12 @@ } }) .start(); data.rotationTween = rotationTween; rotationTween.onComplete(() => { if (data.rotationTween === rotationTween) { data.rotationTween = null; } }); }; export const incrementSpriteNo = (str, incrementValue) => { @@ -843,13 +855,24 @@ beInsight(agvSprite, setCurSprite); new TWEEDLE.Tween(agvSprite.position) if (agvSprite.data.moveTween) { agvSprite.data.moveTween.stop(); agvSprite.data.moveTween = null; } const moveTween = new TWEEDLE.Tween(agvSprite.position) .to({ x: codeSprite.position.x, y: codeSprite.position.y }, ANIMATE_DURING_TIME) .easing(TWEEDLE.Easing.Linear.None) .start(); agvSprite.data.moveTween = moveTween; moveTween.onComplete(() => { if (agvSprite.data?.moveTween === moveTween) { agvSprite.data.moveTween = null; } }); } const drawerAgvPath = (curZone, agvVo) => { @@ -900,6 +923,14 @@ for (let i = mapContainer.children.length - 1; i >= 0; i--) { const child = mapContainer.children[i]; if (child?.data?.type === DEVICE_TYPE.AGV) { if (child.data.moveTween) { child.data.moveTween.stop(); child.data.moveTween = null; } if (child.data.rotationTween) { child.data.rotationTween.stop(); child.data.rotationTween = null; } if (child.data.jobEffect) { app?.ticker.remove(child.data.jobEffect._onTick); child.removeChild(child.data.jobEffect); @@ -943,7 +974,7 @@ const label = new PIXI.Text(text ?? '', labelStyle); label.anchor.set(0.5); label.position.set(centerX, centerY); label.rotation = rotationParseNum(MAP_DEFAULT_ROTATION); label.rotation = -rotationParseNum(MAP_DEFAULT_ROTATION); label.scale.set(MAP_MIRROR ? -1 : 1, 1); draft.addChild(label); }; @@ -1203,4 +1234,4 @@ .easing(TWEEDLE.Easing.Quadratic.Out) .to(targetPos, 500) .start(); }; }; zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java
@@ -13,6 +13,7 @@ import com.zy.acs.manager.common.exception.BusinessException; import com.zy.acs.manager.core.service.*; import com.zy.acs.manager.core.service.astart.MapDataDispatcher; import com.zy.acs.manager.core.service.astart.domain.DynamicNode; import com.zy.acs.manager.manager.entity.*; import com.zy.acs.manager.manager.enums.*; import com.zy.acs.manager.manager.service.*; @@ -87,10 +88,27 @@ @PostMapping("/patrol/batch/startup") public synchronized R patrolBatchStartup() { List<Agv> list = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val)); DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(MapDataDispatcher.MAP_DEFAULT_LEV); int result = 0; for (Agv agv : list) { patrolService.startupPatrol(agv.getUuid()); result++; String agvNo = agv.getUuid(); boolean inMap = false; label: for (int i = 0; i < dynamicMatrix.length; i++) { for (int j = 0; j < dynamicMatrix[i].length; j++) { DynamicNode dynamicNode = dynamicMatrix[i][j]; String vehicle = dynamicNode.getVehicle(); if (agvNo.equals(vehicle)) { inMap = true; break label; } } } if (inMap) { patrolService.startupPatrol(agvNo); result++; } } return R.ok().add(result); } zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java
@@ -322,21 +322,17 @@ // STOCK List<Loc> stockLocList = locService.selectRandByLocSts(LocStsType.STOCK.val(), maxCapacity); // LambdaQueryWrapper<Loc> stockWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getLocSts, LocStsType.STOCK.val()); // List<Loc> stockList = locService.list(stockWrapper); // if (Cools.isEmpty(stockList) || stockList.size() < agvModel.getBackpack()) { // return; // } // Collections.shuffle(stockList); if (Cools.isEmpty(stockLocList)) { return; } Collections.shuffle(stockLocList); // IDLE List<Loc> idleLocList = locService.selectRandByLocSts(LocStsType.IDLE.val(), maxCapacity); // LambdaQueryWrapper<Loc> idleWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getLocSts, LocStsType.IDLE.val()); // List<Loc> idleList = locService.list(idleWrapper); // if (Cools.isEmpty(idleList)) { // return; // } // Collections.shuffle(idleList); if (Cools.isEmpty(idleLocList)) { return; } Collections.shuffle(idleLocList); OpenBusSubmitParam param = new OpenBusSubmitParam(); param.setBatch(String.valueOf(snowflakeIdWorker.nextId()).substring(13, 19)); @@ -351,6 +347,7 @@ param.getTaskList().add(taskDto); } if (Cools.isEmpty(param.getTaskList())) { return; } mainService.generateBusAndTask(param, memo); } zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvAreaDispatcher.java
@@ -79,9 +79,13 @@ return areaGovernService.queryCodes(areaIds); } // å¤æè½¦è¾æ¯å¦è¢«areaç»å®ï¼å¦æç»å®è¿å trueï¼ å¦ææ²¡ç»å®è¿å false public Boolean isAgvExistsInAnyArea(Long agvId) { List<Long> agvIdsWithoutAreaAgv = areaAgvService.findAgvIdsWithoutAreaAgv(); return !Cools.isEmpty(agvIdsWithoutAreaAgv) && agvIdsWithoutAreaAgv.contains(agvId); List<Long> agvIdsWithoutAreaAgv = areaAgvService.findAgvIdsWithoutAreaAgv(); // 没æè¢«ç»å®ç车è¾éå if (Cools.isEmpty(agvIdsWithoutAreaAgv)) { return true; } return !agvIdsWithoutAreaAgv.contains(agvId); } } zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
@@ -52,6 +52,8 @@ private SegmentService segmentService; @Autowired private JamService jamService; @Autowired private AgvAreaDispatcher agvAreaDispatcher; /** * avoidPathList ===>> [ minor vehicle ] [wave] [ curr vehicle ] [ code2 ] [ code3 ] ...... @@ -63,6 +65,17 @@ } Integer lev = null; Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class); // scope code area: 4ms Long agvId = agvService.getAgvId(agvNo); Boolean withinArea = agvAreaDispatcher.isAgvExistsInAnyArea(agvId); List<String> scopeCodeList = new ArrayList<>(); if (withinArea) { scopeCodeList = agvAreaDispatcher.getCodesByAgvId(agvId); if (!Cools.isEmpty(scopeCodeList) && !scopeCodeList.contains(start.getCodeData())) { withinArea = false; } } String breakPoint = avoidPathList.stream().findFirst().orElse(null); List<String> blackList = Utils.singletonList(sponsor); @@ -96,6 +109,11 @@ label: for (RetreatNavigateNode node : neighborNodes) { if (node.getCodeData().equals(breakPoint)) { continue; } if (withinArea) { assert !Cools.isEmpty(scopeCodeList); if (!scopeCodeList.contains(node.getCodeData())) { continue; } } int weight = 0; // wave zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/AStarNavigateService.java
@@ -3,11 +3,13 @@ import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; import com.zy.acs.manager.common.utils.MapDataUtils; import com.zy.acs.manager.core.service.AgvAreaDispatcher; import com.zy.acs.manager.core.service.LaneService; import com.zy.acs.manager.core.service.astart.domain.AStarNavigateNode; import com.zy.acs.manager.core.service.astart.domain.DynamicNode; import com.zy.acs.manager.core.utils.RouteGenerator; import com.zy.acs.manager.manager.entity.Segment; import com.zy.acs.manager.manager.service.AgvService; import com.zy.acs.manager.manager.service.JamService; import com.zy.acs.manager.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; @@ -40,12 +42,28 @@ private LaneService laneService; @Autowired private ConfigService configService; @Autowired private AgvAreaDispatcher agvAreaDispatcher; @Autowired private AgvService agvService; public synchronized AStarNavigateNode execute(String agvNo, AStarNavigateNode start, AStarNavigateNode end , Boolean lock, List<String> blackList, Segment segment) { if (start.getX() == end.getX() && start.getY() == end.getY()) { return end; } // scope code area: 4ms Long agvId = agvService.getAgvId(agvNo); Boolean withinArea = agvAreaDispatcher.isAgvExistsInAnyArea(agvId); List<String> scopeCodeList = new ArrayList<>(); if (withinArea) { scopeCodeList = agvAreaDispatcher.getCodesByAgvId(agvId); if (!Cools.isEmpty(scopeCodeList) && !scopeCodeList.contains(start.getCodeData())) { withinArea = false; } } Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class); PriorityQueue<AStarNavigateNode> openQueue = new PriorityQueue<>(); @@ -66,9 +84,6 @@ DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(null); String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(null); long getNeighborNodesTime = 0; int getNeighborNodesCount = 0; while (!openQueue.isEmpty()) { // åä¼å éåé¡¶é¨å ç´ å¹¶ä¸æè¿ä¸ªå ç´ ä»Open表ä¸å é¤ï¼åF弿å°çèç¹ AStarNavigateNode currentNode = openQueue.poll(); @@ -80,11 +95,14 @@ } long currentTime = System.currentTimeMillis(); List<AStarNavigateNode> neighbourNodes = this.getNeighborNodes(currentNode, mapMatrix, existNodes); getNeighborNodesTime += System.currentTimeMillis() - currentTime; getNeighborNodesCount ++; for (AStarNavigateNode node : neighbourNodes) { node.setCodeData(codeMatrix[node.getX()][node.getY()]); if (withinArea) { assert !Cools.isEmpty(scopeCodeList); if (!scopeCodeList.contains(node.getCodeData())) { continue; } } boolean isEndNode = node.getX() == end.getX() && node.getY() == end.getY(); int weight = 0; zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvController.java
@@ -43,21 +43,6 @@ private TaskService taskService; @Autowired private MapDataDispatcher mapDataDispatcher; @Autowired private AreaAgvService areaAgvService; // @PreAuthorize("hasAuthority('manager:agv:list')") // @PostMapping("/agv/page") // public R page(@RequestBody Map<String, Object> map) { // BaseParam baseParam = buildParam(map, BaseParam.class); // PageParam<Agv, BaseParam> pageParam = new PageParam<>(baseParam, Agv.class); // PageParam<Agv, BaseParam> page = agvService.page(pageParam, pageParam.buildWrapper(true)); // for (Agv agv : page.getRecords()) { // AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); // agv.setAgvDetail(agvDetail); // } // return R.ok().add(page); // } @PreAuthorize("hasAuthority('manager:agv:list')") @PostMapping("/agv/page") @@ -89,7 +74,6 @@ Agv agv = agvService.getById(id); if (null != agv) { agv.setOnline(agvService.judgeOnline(agv.getId())); if (agv.getUuid().equals("2")) { agv.setOnline(true); } AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); if (null != agvDetail) { agv.setAgvDetail(agvDetail); @@ -134,30 +118,19 @@ @OperationLog("Update Agv") @PostMapping("/agv/update") public R update(@RequestBody Agv agv) { if (agvService.count(new LambdaQueryWrapper<Agv>() .eq(Agv::getUuid, agv.getUuid()) .ne(Agv::getId, agv.getId())) > 0) { return R.error("Update Fail"); } agv.setUpdateBy(getLoginUserId()); agv.setUpdateTime(new Date()); if (!agvService.updateById(agv)) { return R.error("Update Fail"); } return R.ok("Update Success").add(agv); return R.ok("Update Success").add(agvService.modify(agv, getLoginUserId())); } @PreAuthorize("hasAuthority('manager:agv:remove')") @OperationLog("Delete Agv") @PostMapping("/agv/remove/{ids}") public R remove(@PathVariable Long[] ids) { Long userId = getLoginUserId(); List<Long> agvIds = new ArrayList<>(); for (Long agvId : ids) { areaAgvService.removeByAgvId(agvId); agvIds.add(agvService.delete(agvId, userId)); } if (!agvService.removeByIds(Arrays.asList(ids))) { return R.error("Delete Fail"); } return R.ok("Delete Success").add(ids); return R.ok("Delete Success").add(agvIds); } @PreAuthorize("hasAuthority('manager:agv:list')") zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java
@@ -26,6 +26,10 @@ String getAgvNo(Long agvId); Agv modify(Agv agv, Long userId); Long delete(Long agvId, Long userId); Boolean judgeEnable(Long agvId); Boolean judgeEnable(Long agvId, Boolean withBattery); zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -6,11 +6,13 @@ import com.zy.acs.common.enums.AgvStatusType; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.exception.CoolException; import com.zy.acs.manager.common.domain.BaseParam; import com.zy.acs.manager.common.domain.PageParam; import com.zy.acs.manager.common.domain.PageResult; import com.zy.acs.manager.core.cache.CoreCache; import com.zy.acs.manager.core.domain.VehicleDto; import com.zy.acs.manager.core.service.astart.MapDataDispatcher; import com.zy.acs.manager.manager.controller.result.AgvResult; import com.zy.acs.manager.manager.entity.Agv; import com.zy.acs.manager.manager.entity.AgvDetail; @@ -23,12 +25,14 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.HashMap; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * åå ¸æ°æ®Serviceå®ç° @@ -42,9 +46,9 @@ private final RedisSupport redis = RedisSupport.defaultRedisSupport; private static final Map<String, Long> AGV_ID_MAP = new HashMap<>(); public static final Map<String, Long> AGV_ID_MAP = new ConcurrentHashMap<>(); private static final Map<Long, String> AGV_NO_MAP = new HashMap<>(); public static final Map<Long, String> AGV_NO_MAP = new ConcurrentHashMap<>(); @Autowired private AgvDetailService agvDetailService; @@ -58,6 +62,10 @@ private SegmentService segmentService; @Autowired private TaskService taskService; @Autowired private AreaAgvService areaAgvService; @Autowired private MapDataDispatcher mapDataDispatcher; @PostConstruct public void init() { @@ -80,27 +88,96 @@ @Override public Long getAgvId(String uuid) { if (Cools.isEmpty(uuid)) { Agv agv = this.selectByUuid(uuid); if (agv != null) { AGV_ID_MAP.put(uuid, agv.getId()); } else { return null; } return null; } return AGV_ID_MAP.get(uuid); Long agvId = AGV_ID_MAP.get(uuid); if (agvId != null) { return agvId; } Agv agv = this.selectByUuid(uuid); if (agv == null) { return null; } AGV_ID_MAP.put(uuid, agv.getId()); return agv.getId(); } @Override public String getAgvNo(Long agvId) { if (Cools.isEmpty(agvId)) { Agv agv = this.getById(agvId); if (agv != null) { AGV_NO_MAP.put(agvId, agv.getUuid()); } else { return null; return null; } String agvNo = AGV_NO_MAP.get(agvId); if (!Cools.isEmpty(agvNo)) { return agvNo; } Agv agv = this.getById(agvId); if (null == agv) { return null; } AGV_NO_MAP.put(agvId, agv.getUuid()); return agv.getUuid(); } @Override public Agv modify(Agv agv, Long userId) { if (agv == null || agv.getId() == null) { throw new CoolException("Update Fail"); } Date now = new Date(); // å¯ä¸æ§æ ¡éªï¼åªæå½ uuid éç©ºæ¶ææ ¡éªï¼é¿å 空å¼è¯¯å¤ï¼ if (!Cools.isEmpty(agv.getUuid())) { boolean exists = this.count(new LambdaQueryWrapper<Agv>() .eq(Agv::getUuid, agv.getUuid()) .ne(Agv::getId, agv.getId())) > 0; if (exists) { throw new CoolException("Update Fail"); } } return AGV_NO_MAP.get(agvId); Agv oldAgv = this.getById(agv.getId()); String oldAgvNo = oldAgv.getUuid(); agv.setUpdateBy(userId); agv.setUpdateTime(now); if (!this.updateById(agv)) { throw new CoolException("Update Fail"); } // 以 DB æç»å¼ä¸ºåå·æ°ç¼åï¼é²æ¢è¯·æ±ä½ç¼ºå段/ä¸ºç©ºï¼ Agv newAgv = this.getById(agv.getId()); String newAgvNo = newAgv.getUuid(); if (!oldAgvNo.equals(newAgvNo)) { AGV_ID_MAP.remove(oldAgvNo); AGV_ID_MAP.put(newAgvNo, newAgv.getId()); AGV_NO_MAP.remove(newAgv.getId()); AGV_NO_MAP.put(newAgv.getId(), newAgvNo); } return newAgv; } @Override @Transactional(rollbackFor = Exception.class) public Long delete(Long agvId, Long userId) { if (Cools.isEmpty(agvId)) { return null; } Agv agv = this.getById(agvId); AGV_NO_MAP.remove(agvId); AGV_ID_MAP.remove(agv.getUuid()); mapDataDispatcher.modifyDynamicMatrix(MapDataDispatcher.MAP_DEFAULT_LEV, null, agv.getUuid(), true); areaAgvService.removeByAgvId(agvId); this.removeById(agvId); agvDetailService.removeByAgvId(agvId); return agvId; }