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