From d5c06a9e5bc44564cc1d31cb82ec29640c4f2cbb Mon Sep 17 00:00:00 2001 From: vincentlu <t1341870251@gmail.com> Date: 星期二, 21 一月 2025 14:25:01 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/JobType.java | 17 ++-- zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java | 47 ++++++++++- zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/MapWsAgvVo.java | 2 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java | 26 +++++- zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java | 3 zy-acs-flow/src/map/tool.js | 77 ++++++++++++++++++ zy-acs-manager/src/main/java/com/zy/acs/manager/core/cache/CoreCache.java | 3 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java | 44 +---------- 8 files changed, 157 insertions(+), 62 deletions(-) diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js index c64b332..946a72a 100644 --- a/zy-acs-flow/src/map/tool.js +++ b/zy-acs-flow/src/map/tool.js @@ -652,6 +652,55 @@ } } +export function createAgvJobPanel(parentContainer, text) { + const panel = new PIXI.Container(); + + const sideLen = 50; + const halfCircle = new PIXI.Graphics(); + halfCircle.beginFill(themeMode === 'light' ? '#5c5a5a' : '#eee'); + halfCircle.lineStyle(2, themeMode === 'light' ? '#5c5a5a' : '#eee'); + halfCircle.arc(0, 0, sideLen, 0, Math.PI); + halfCircle.endFill(); + + const rectangle = new PIXI.Graphics(); + rectangle.lineStyle(2, themeMode === 'light' ? '#5c5a5a' : '#eee', 1); + rectangle.drawRoundedRect( + -sideLen / 2, // 宸︿笂瑙� x + -sideLen / 2, // 宸︿笂瑙� y + sideLen, // 瀹� + sideLen - 20, // 楂� (鐣欎竴鐐圭┖闂达紝鐪嬭捣鏉ユ洿鍍忓崐鍦嗗鍣�) + 16 // 鍦嗚 + ); + rectangle.endFill(); + rectangle.mask = halfCircle; + + panel.addChild(rectangle, halfCircle); + + const msg = new PIXI.Text(text, { + fill: themeMode === 'light' ? '#2b2b2b' : '#eee', + fontSize: 12, + fontFamily: 'MicrosoftYaHei', + fontWeight: 'bold', + align: 'center', + }); + msg.anchor.set(0.5); + msg.position.set(0, -10); + + panel.addChild(msg); + panel.scale.set(3); + parentContainer.addChild(panel); + + let phase = 0; + function onTick(delta) { + phase += delta / 8; // 鏃嬭浆閫熷害鍙皟 + phase %= (Math.PI * 2); + halfCircle.rotation = phase; + } + app.ticker.add(onTick); + + panel._onTick = onTick; + return panel; +} // dynamic graphic ---------------- @@ -666,13 +715,16 @@ const agvRotationOffset = rotationParseNum(agvRotationOffsetDegrees); const showAgvSprite = (curZone, agvVo, setCurSprite) => { - const { agvNo, code, direction, battery, backpack, error } = agvVo; + const { agvNo, code, direction, battery, jobType, backpack: backpackCount, error } = agvVo; if (!code) { return; } const codeSprite = querySprite(DEVICE_TYPE.POINT, code); if (!codeSprite) { return; } - + if (agvNo === '12') { + console.log(backpackCount); + } + const targetRotation = rotationParseNum(direction); - const backpackCount = backpack?.filter(item => item.loaded === true).length || 0; + // const backpackCount = backpack?.filter(item => item.loaded === true).length || 0; let agvSprite = querySprite(DEVICE_TYPE.AGV, agvNo); if (!agvSprite) { @@ -722,6 +774,25 @@ animateRotation(agvSprite, targetRotation + agvRotationOffset, agvRotationOffset); } + // job effect + if (jobType) { + if (!agvSprite.data.jobEffect) { + agvSprite.data.jobEffect = createAgvJobPanel(agvSprite, jobType); + agvSprite.data.jobEffect.x = -80; + agvSprite.data.jobEffect.y = 0; + } + if (agvSprite.data.jobEffect) { + agvSprite.data.jobEffect.rotation = -agvSprite.rotation - rotationParseNum(MAP_DEFAULT_ROTATION); + } + } else { + if (agvSprite.data.jobEffect) { + app.ticker.remove(agvSprite.data.jobEffect._onTick); + agvSprite.removeChild(agvSprite.data.jobEffect); + agvSprite.data.jobEffect.destroy(true); + agvSprite.data.jobEffect = null; + } + } + if (error) { agvSprite.tint = 0xff3f34; } else { diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/cache/CoreCache.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/cache/CoreCache.java index 7b420ff..7f3d215 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/cache/CoreCache.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/cache/CoreCache.java @@ -1,6 +1,7 @@ package com.zy.acs.manager.core.cache; import com.zy.acs.manager.core.domain.CodeStepDto; +import com.zy.acs.manager.core.domain.type.JobType; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -9,6 +10,8 @@ public static final Map<Long, Integer> AGV_BACKPACK_USED_CACHE = new ConcurrentHashMap<>(); + public static final Map<String, JobType> AGV_MOCK_JOB_CACHE = new ConcurrentHashMap<>(); + public static final Map<Long, CodeStepDto> AGV_MOCK_STEP_CACHE = new ConcurrentHashMap<>(); } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/MapWsAgvVo.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/MapWsAgvVo.java index c841bdf..5072c4d 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/MapWsAgvVo.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/MapWsAgvVo.java @@ -19,7 +19,7 @@ private Double direction = 0.0; - private List<BackpackDto> backpack = new ArrayList<>(); + private int backpack = 0; private List<String> dynamicRoute = new ArrayList<>(); diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/JobType.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/JobType.java index 55fcab7..bd7135f 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/JobType.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/JobType.java @@ -3,19 +3,18 @@ @SuppressWarnings("all") public enum JobType { - CONVEYOR_PICK(2000), - CONVEYOR_DROP(2000), - LOC_PICK(500), - LOCK_DROP(500), + CONVEYOR_PICK(2000, "鍙栨枡绠�"), + CONVEYOR_DROP(2000, "鏀炬枡绠�"), + LOC_PICK(1000, "鍙栨枡绠�"), + LOCK_DROP(1000, "鏀炬枡绠�"), ; - public static void main(String[] args) { - System.out.println(); - } - public long waitTime; + public String breif; - JobType(long waitTime) { + JobType(long waitTime, String breif) { this.waitTime = waitTime; + this.breif = breif; } + } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java index 6b0b89c..56015c9 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java @@ -1,5 +1,6 @@ package com.zy.acs.manager.core.scheduler; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.common.utils.GsonUtils; import com.zy.acs.framework.common.Cools; @@ -8,6 +9,7 @@ import com.zy.acs.manager.core.domain.CodeStepDto; import com.zy.acs.manager.core.domain.MapWsAgvVo; import com.zy.acs.manager.core.domain.MapWsVo; +import com.zy.acs.manager.core.domain.type.JobType; import com.zy.acs.manager.core.service.MapService; import com.zy.acs.manager.manager.entity.Agv; import com.zy.acs.manager.manager.entity.AgvDetail; @@ -87,14 +89,16 @@ Code code = codeService.getCacheById(recentCode); if (null == code) { continue; } + JobType jobType = this.getJobType(agv.getId(), code.getData()); + MapWsAgvVo vo = new MapWsAgvVo(); vo.setAgvModel(agvModel.getType()); vo.setAgvNo(agv.getUuid()); vo.setCode(code.getData()); vo.setDirection(agvDetail.getAgvAngle()); - vo.setBackpack(GsonUtils.fromJsonToList(agvDetail.getBackpack(), BackpackDto.class)); + vo.setBackpack(this.getBackpack(agv.getId(), agvDetail.getBackpack())); vo.setBattery(agvDetail.getSoc()); - vo.setJobType(this.getJobType(agv.getId(), code.getData())); + vo.setJobType(null == jobType ? null : jobType.breif); vo.setError(agvDetail.realError()); vo.setDynamicRoute(codeDataListMap.get(agv.getUuid())); @@ -105,7 +109,7 @@ return agvVos; } - private String getJobType(Long agvId, String currCodeData) { + private JobType getJobType(Long agvId, String currCodeData) { if (null == agvId || Cools.isEmpty(currCodeData)) { return null; } @@ -116,7 +120,7 @@ if (!codeStepDto.getCodeData().equals(currCodeData)) { return null; } - return codeStepDto.getJobType().toString(); + return codeStepDto.getJobType(); } @PreDestroy @@ -124,4 +128,18 @@ this.singleThreadExecutor.shutdownNow(); } + private Integer getBackpack(Long agvId, String backpackJson) { + if (null == agvId || Cools.isEmpty(backpackJson)) { + return null; + } + List<BackpackDto> backpackDtoList = JSON.parseArray(backpackJson, BackpackDto.class); + int jsonCount = (int) backpackDtoList.stream().filter(BackpackDto::getLoaded).count(); + + Integer cacheCount = CoreCache.AGV_BACKPACK_USED_CACHE.get(agvId); + if (null == cacheCount) { + return jsonCount; + } + return Math.max(jsonCount, cacheCount); + } + } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java index 9dd818d..2f8d57d 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java @@ -53,8 +53,6 @@ add("00000246"); }}; - private Map<String, JobType> agvJobMap = new ConcurrentHashMap<>(); - @Autowired private AgvService agvService; @Autowired @@ -89,9 +87,9 @@ return; } - JobType jobType = this.agvJobMap.get(agvNo); + JobType jobType = CoreCache.AGV_MOCK_JOB_CACHE.get(agvNo); if (null == jobType) { - this.agvJobMap.put(agvNo, JobType.LOC_PICK); + CoreCache.AGV_MOCK_JOB_CACHE.put(agvNo, JobType.LOC_PICK); CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, 0); jobType = JobType.LOC_PICK; } @@ -130,40 +128,6 @@ log.info( "{}寮�濮嬩綔涓氭紨绀�...", agvNo); CoreCache.AGV_MOCK_STEP_CACHE.put(agvId, CodeStepDto.build(destinationCodeData, jobType)); - switch (jobType) { - case LOC_PICK: - Integer usedSlotsByLocPick = CoreCache.AGV_BACKPACK_USED_CACHE.get(agvId); - usedSlotsByLocPick++; - - if (Objects.equals(agvModelService.getByAgvId(agvId).getBackpack(), usedSlotsByLocPick)) { - this.agvJobMap.put(agvNo, JobType.CONVEYOR_DROP); - } else { - CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, usedSlotsByLocPick); - } - break; - case CONVEYOR_DROP: - CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, 0); - - this.agvJobMap.put(agvNo, JobType.CONVEYOR_PICK); - break; - case CONVEYOR_PICK: - CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, agvModelService.getByAgvId(agvId).getBackpack()); - - this.agvJobMap.put(agvNo, JobType.LOCK_DROP); - break; - case LOCK_DROP: - Integer usedSlotsByLocDrop = CoreCache.AGV_BACKPACK_USED_CACHE.get(agvId); - usedSlotsByLocDrop--; - - if (usedSlotsByLocDrop == 0) { - this.agvJobMap.put(agvNo, JobType.LOC_PICK); - } else { - CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, usedSlotsByLocDrop); - } - break; - default: - break; - } } } @@ -320,8 +284,8 @@ AGV_PATROL_MAP.remove(agvNo); CoreCache.AGV_BACKPACK_USED_CACHE.remove(agvId); CoreCache.AGV_MOCK_STEP_CACHE.remove(agvId); - this.agvJobMap.remove(agvNo); - log.info("宸插仠姝GV " + agvNo + " 鐨勮窇搴撲换鍔°��"); + CoreCache.AGV_MOCK_JOB_CACHE.remove(agvNo); + log.info("宸插仠姝GV {} 鐨勮窇搴撲换鍔°��", agvNo); return R.ok("宸插仠姝GV " + agvNo + " 鐨勮窇搴撲换鍔°��"); } else { log.error("鏈兘鎴愬姛鍋滄AGV " + agvNo + " 鐨勮窇搴撲换鍔°��"); diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java index 102a266..9a7a5b7 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java @@ -6,6 +6,7 @@ import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.manager.core.cache.CoreCache; import com.zy.acs.manager.core.domain.CodeStepDto; +import com.zy.acs.manager.core.domain.type.JobType; import com.zy.acs.manager.core.scheduler.MapDataWsScheduler; import com.zy.acs.manager.core.service.MainService; import com.zy.acs.manager.core.service.MapService; @@ -14,10 +15,7 @@ import com.zy.acs.manager.manager.entity.Code; import com.zy.acs.manager.manager.enums.ActionStsType; import com.zy.acs.manager.manager.enums.ActionTypeType; -import com.zy.acs.manager.manager.service.ActionService; -import com.zy.acs.manager.manager.service.AgvDetailService; -import com.zy.acs.manager.manager.service.CodeService; -import com.zy.acs.manager.manager.service.JamService; +import com.zy.acs.manager.manager.service.*; import lombok.extern.slf4j.Slf4j; import java.util.List; @@ -31,6 +29,7 @@ private final Agv agv; private final AgvDetailService agvDetailService; + private final AgvModelService agvModelService; private final ActionService actionService; private final CodeService codeService; private final MapService mapService; @@ -46,6 +45,7 @@ Agv agv , RedisSupport redis , AgvDetailService agvDetailService + , AgvModelService agvModelService , ActionService actionService , CodeService codeService , MapService mapService @@ -56,6 +56,7 @@ this.agv = agv; this.redis = redis; this.agvDetailService = agvDetailService; + this.agvModelService = agvModelService; this.actionService = actionService; this.codeService = codeService; this.mapService = mapService; @@ -145,12 +146,48 @@ } private void finishActionList(String qrCode) { + Long agvId = this.agv.getId(); + String agvNo = this.agv.getUuid(); // 1.show effect - CodeStepDto codeStepDto = CoreCache.AGV_MOCK_STEP_CACHE.get(this.agv.getId()); + CodeStepDto codeStepDto = CoreCache.AGV_MOCK_STEP_CACHE.get(agvId); if (null != codeStepDto && qrCode.equals(codeStepDto.getCodeData())) { // Code currentCode = agvDetailService.getCurrentCode(this.agv.getId()); try { Thread.sleep(codeStepDto.getJobType().waitTime); } catch (InterruptedException ignore) {} CoreCache.AGV_MOCK_STEP_CACHE.remove(this.agv.getId()); + + JobType jobType = CoreCache.AGV_MOCK_JOB_CACHE.get(this.agv.getUuid()); + switch (jobType) { + case LOC_PICK: + Integer usedSlotsByLocPick = CoreCache.AGV_BACKPACK_USED_CACHE.get(agvId); + usedSlotsByLocPick++; + CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, usedSlotsByLocPick); + + if (Objects.equals(agvModelService.getByAgvId(agvId).getBackpack(), usedSlotsByLocPick)) { + CoreCache.AGV_MOCK_JOB_CACHE.put(agvNo, JobType.CONVEYOR_DROP); + } + break; + case CONVEYOR_DROP: + CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, 0); + + CoreCache.AGV_MOCK_JOB_CACHE.put(agvNo, JobType.CONVEYOR_PICK); + break; + case CONVEYOR_PICK: + CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, agvModelService.getByAgvId(agvId).getBackpack()); + + CoreCache.AGV_MOCK_JOB_CACHE.put(agvNo, JobType.LOCK_DROP); + break; + case LOCK_DROP: + Integer usedSlotsByLocDrop = CoreCache.AGV_BACKPACK_USED_CACHE.get(agvId); + usedSlotsByLocDrop--; + CoreCache.AGV_BACKPACK_USED_CACHE.put(agvId, usedSlotsByLocDrop); + + if (usedSlotsByLocDrop == 0) { + CoreCache.AGV_MOCK_JOB_CACHE.put(agvNo, JobType.LOC_PICK); + } + break; + default: + break; + } } // 2.complete data diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java index 534778a..0457ea7 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java @@ -55,6 +55,8 @@ @Autowired private AgvDetailService agvDetailService; @Autowired + private AgvModelService agvModelService; + @Autowired private ActionService actionService; @Autowired private ConfigService configService; @@ -133,6 +135,7 @@ agv , redis , agvDetailService + , agvModelService , actionService , codeService , mapService -- Gitblit v1.9.1