05a412d04ce5994285eb807d87a50c663ea16621..1195f70c061d9205837eb731f24e1a3e34747c87
2025-12-19 vincentlu
#
1195f7 对比 | 目录
2025-12-19 vincentlu
#
19ff3f 对比 | 目录
2025-12-19 vincentlu
#
44b905 对比 | 目录
2025-12-19 vincentlu
#
5df750 对比 | 目录
2025-12-19 vincentlu
#
cd4737 对比 | 目录
2025-12-19 vincentlu
# algo scope area
b639c5 对比 | 目录
2025-12-19 vincentlu
#
f57772 对比 | 目录
2025-12-19 vincentlu
#
9bcc96 对比 | 目录
2025-12-19 vincentlu
#
c7a5f2 对比 | 目录
4个文件已添加
11个文件已修改
2 文件已重命名
294 ■■■■ 已修改文件
version/doc/AGV-RCS 通信协议 V1.0.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/RCS开发进度表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/hik/10、点区域空满交换业务操作手册V21_20210910_20210910135732_xujiangtao6.pdf 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/hik/【0402002】潜伏机器人业务部署手册V2.1_20230518.pdf 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/hik/【0402008】空满交换业务操作手册V2.3_20220117.pdf 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/logical-line.xmind 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/constants.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/player.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/tool.js 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvAreaDispatcher.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/AStarNavigateService.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/AgvController.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java 109 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/AGV-RCS ͨÐÅЭÒé V1.0.xlsx
Binary files differ
version/doc/RCS¿ª·¢½ø¶È±í.xlsx
Binary files differ
version/doc/hik/10¡¢µãÇøÓò¿ÕÂú½»»»ÒµÎñ²Ù×÷ÊÖ²áV21_20210910_20210910135732_xujiangtao6.pdf
Binary files differ
version/doc/hik/¡¾0402002¡¿Ç±·ü»úÆ÷ÈËÒµÎñ²¿ÊðÊÖ²áV2.1_20230518.pdf
Binary files differ
version/doc/hik/¡¾0402008¡¿¿ÕÂú½»»»ÒµÎñ²Ù×÷ÊÖ²áV2.3_20220117.pdf
Binary files differ
version/doc/logical-line.xmind
Binary 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;
    }