d0a010eb5d2c4c78f4c97300361fe87855a7c78f..1190b221b4060b332934f9055656986ea36baeb6
2025-12-12 vincentlu
#
1190b2 对比 | 目录
2025-12-12 vincentlu
#
4b0ea0 对比 | 目录
2025-12-12 vincentlu
#
e9cf7d 对比 | 目录
2025-12-12 vincentlu
#
9c8c1e 对比 | 目录
2025-12-12 vincentlu
#
351f38 对比 | 目录
2025-12-12 vincentlu
#
dad70e 对比 | 目录
2025-12-12 vincentlu
#
956a07 对比 | 目录
2025-12-12 vincentlu
#
bbe325 对比 | 目录
2025-12-12 vincentlu
#
ef6a4c 对比 | 目录
2025-12-12 vincentlu
#
6f945b 对比 | 目录
1个文件已添加
7个文件已修改
208 ■■■■ 已修改文件
version/AGV-RCS 通信协议 V1.0.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/MapPage.jsx 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/constants.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/player.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/settings/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/tool.js 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MapController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/MapAreaResult.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/AGV-RCS 通信协议 V1.0.xlsx
Binary files differ
zy-acs-flow/src/map/MapPage.jsx
@@ -133,9 +133,13 @@
        setDeviceVisible(false);
        setSettingsVisible(false);
        setBatchSelectionVisible(false);
        setAreaDrawing(false);
        Tool.cancelAreaDrawing();
        setCurSprite(null);
        setBatchSprites([]);
        player.deactivateMapMultiSelect();
        switch (mode) {
            case MAP_MODE.OBSERVER_MODE:
@@ -173,7 +177,7 @@
            case MAP_MODE.AREA_MODE:
                Tool.removeAgvGraphics();
                Tool.loadAreas(curZone);
                Tool.loadAreas(curZone, setCurSprite);
                break
            default:
                break
@@ -212,6 +216,10 @@
                setInsightVisible(true);
            }
            if (mode === MAP_MODE.SETTINGS_MODE) {
                Tool.showSelectedEffect(curSprite);
                setSettingsVisible(true);
            }
            if (mode === MAP_MODE.AREA_MODE) {
                Tool.showSelectedEffect(curSprite);
                setSettingsVisible(true);
            }
@@ -355,6 +363,7 @@
                            sx={{}}
                            disabled={areaDrawing}
                            onClick={() => {
                                setCurSprite(null);
                                const started = Tool.startAreaDrawing({
                                    promptText: translate('page.map.prompt.areaName'),
                                    onComplete: ({ name, start, end, color }) => {
@@ -365,7 +374,8 @@
                                    },
                                    onFinish: () => {
                                        setAreaDrawing(false);
                                    }
                                    },
                                    setCurSprite,
                                });
                                if (started) {
                                    setAreaDrawing(true);
zy-acs-flow/src/map/constants.js
@@ -80,6 +80,8 @@
    AGV: 0x74b9ff,
    POINT: 0xC9E6DA,
    AREA: 0x2c7ac3,
})
export const AGV_STATUS_MODE = Object.freeze({
@@ -95,4 +97,4 @@
    OUT_OF_ORDER: 0,
    ORDER: 1,
    REVERSE_ORDER: 2,
})
})
zy-acs-flow/src/map/player.js
@@ -117,6 +117,19 @@
        this.mapContainer.parent.on('mousedown', mapMultiSelectHandle)
    }
    deactivateMapMultiSelect = () => {
        if (!this.mapContainer?.parent) {
            return;
        }
        this.mapContainer.parent.off('mousedown');
        this.clearSelectedSprites();
        if (this.selectionBox) {
            this.selectionBox.clear();
            this.app?.stage.removeChild(this.selectionBox);
            this.selectionBox = null;
        }
    }
    clearSelectedSprites = () => {
        if (this.selectedSprites && this.selectedSprites.length > 0) {
            this.selectedSprites.forEach(child => {
@@ -471,4 +484,4 @@
    mapContainer.name = name;
    mapContainer.data = {};
    return mapContainer;
}
}
zy-acs-flow/src/map/settings/index.jsx
@@ -31,7 +31,7 @@
                open={open}
                anchor="right"
                onClose={handleClose}
                sx={{ zIndex: 100, opacity: .8 }}
                sx={{ zIndex: 100, opacity: .9 }}
            >
                {open && (
                    <Box pt={12} width={{ xs: '100vW', sm: width }} height={'calc(100vh - 200px);'} mt={{ xs: 2, sm: 1 }} sx={{
zy-acs-flow/src/map/tool.js
@@ -31,7 +31,7 @@
import ctuLoadedFullBattery from '/map/agv/ctuLoadedFullBattery.svg';
let app, mapContainer, themeMode;
let selectedSprite, effectCircle, effectTicker;
let selectedSprite, effectOverlay, effectTicker;
let tooltip;
export function getApp() {
@@ -422,6 +422,38 @@
}
export const showSelectedEffect = (sprite) => {
    if (!sprite) {
        return;
    }
    // area
    if (sprite.data?.type === DEVICE_TYPE.AREA) {
        const { start, end } = sprite.data || {};
        const hasBounds = start && end;
        const minX = hasBounds ? Math.min(start.x, end.x) : 0;
        const maxX = hasBounds ? Math.max(start.x, end.x) : 0;
        const minY = hasBounds ? Math.min(start.y, end.y) : 0;
        const maxY = hasBounds ? Math.max(start.y, end.y) : 0;
        const width = hasBounds ? Math.abs(maxX - minX) : Math.abs(sprite.width);
        const height = hasBounds ? Math.abs(maxY - minY) : Math.abs(sprite.height);
        const centerX = hasBounds ? (minX + maxX) / 2 : sprite.x;
        const centerY = hasBounds ? (minY + maxY) / 2 : sprite.y;
        const color = DEVICE_SELECTED_EFFECT_COLOR[DEVICE_TYPE.AREA] || (themeMode === 'light' ? '#747d8c' : '#718093');
        const lineWidth = Math.max(2, 4 / Math.abs(mapContainer.scale.x || 1));
        effectOverlay = new PIXI.Graphics();
        effectOverlay.lineStyle(lineWidth, color, 1);
        effectOverlay.drawRect(-width / 2, -height / 2, width, height);
        effectOverlay.position.set(centerX, centerY);
        effectOverlay.zIndex = sprite.zIndex + 1;
        effectOverlay.blendMode = PIXI.BLEND_MODES.NORMAL;
        mapContainer.addChild(effectOverlay);
        selectedSprite = sprite;
        effectTicker = null;
        return;
    }
    // others
    if (!sprite?.texture || !sprite?.texture?.valid) {
        return;
    }
@@ -440,15 +472,15 @@
    const alpha = 1;
    effectCircle = new PIXI.Graphics();
    effectCircle.beginFill(color, alpha);
    effectCircle.drawCircle(0, 0, radius);
    effectCircle.endFill();
    effectCircle.position.set(sprite.x, sprite.y);
    effectCircle.zIndex = -1;
    effectCircle.blendMode = PIXI.BLEND_MODES.NORMAL;
    effectOverlay = new PIXI.Graphics();
    effectOverlay.beginFill(color, alpha);
    effectOverlay.drawCircle(0, 0, radius);
    effectOverlay.endFill();
    effectOverlay.position.set(sprite.x, sprite.y);
    effectOverlay.zIndex = -1;
    effectOverlay.blendMode = PIXI.BLEND_MODES.NORMAL;
    mapContainer.addChild(effectCircle);
    mapContainer.addChild(effectOverlay);
    selectedSprite = sprite;
@@ -467,8 +499,8 @@
                scalingUp = true;
            }
        }
        effectCircle.scale.set(pulseScale);
        effectCircle.position.set(sprite.x, sprite.y);
        effectOverlay.scale.set(pulseScale);
        effectOverlay.position.set(sprite.x, sprite.y);
    };
    app.ticker.add(effectTicker);
@@ -479,18 +511,11 @@
        app.ticker.remove(effectTicker);
        effectTicker = null;
    }
    if (effectCircle) {
        mapContainer?.removeChild(effectCircle);
        effectCircle = null;
    if (effectOverlay) {
        mapContainer?.removeChild(effectOverlay);
        effectOverlay = null;
    }
    selectedSprite = null;
};
export const updateEffect = () => {
    if (!selectedSprite || !effectCircle) {
        return;
    }
    effectCircle.position.set(selectedSprite.x, selectedSprite.y);
};
export const showRoutes = (curZone, setShowRoutes, setLoading) => {
@@ -881,6 +906,7 @@
let areaDrawingCleanup = null;
const AREA_COLOR = 0x3498db;
const AREA_BORDER_COLOR = 0x6c7a89;
const addAreaLabel = (draft, text, from, to) => {
    const centerX = (from.x + to.x) / 2;
@@ -897,20 +923,20 @@
    draft.addChild(label);
};
export const loadAreas = (curZone) => {
export const loadAreas = (curZone, setCurSprite) => {
    if (!mapContainer) return;
    clearAreas();
    fetchAreaList(curZone).then((areas) => {
        areas.forEach((area) => {
            const { name, color, id } = area || {};
            const start = area?.start || (area?.startX != null ? { x: area.startX, y: area.startY } : null);
            const end = area?.end || (area?.endX != null ? { x: area.endX, y: area.endY } : null);
            if (!start || !end || !name) {
            const start = area?.start;
            const end = area?.end;
            if (!start || !end || !name || !id) {
                return;
            }
            const g = createAreaGraphic({ name, start, end, color, id });
            if (g) {
                mapContainer.addChild(g);
            const graphics = createAreaGraphic({ name, start, end, color, id }, setCurSprite);
            if (graphics) {
                mapContainer.addChild(graphics);
            }
        });
    });
@@ -927,7 +953,7 @@
    }
};
const createAreaGraphic = ({ name, start, end, color, id }) => {
const createAreaGraphic = ({ name, start, end, color, id }, setCurSprite) => {
    if (!mapContainer) return null;
    const from = start || { x: 0, y: 0 };
    const to = end || { x: 0, y: 0 };
@@ -936,7 +962,7 @@
    const draft = new PIXI.Graphics();
    draft.name = id ? `area_${id}` : 'area_' + generateID();
    draft.zIndex = DEVICE_Z_INDEX.AREA;
    draft.lineStyle(4 / Math.abs(mapContainer.scale.x || 1), areaColor, 0.8);
    draft.lineStyle(2 / Math.abs(mapContainer.scale.x || 1), AREA_BORDER_COLOR, 0.9);
    draft.beginFill(areaColor, 0.18);
    draft.drawRect(
        Math.min(from.x, to.x),
@@ -946,11 +972,17 @@
    );
    draft.endFill();
    addAreaLabel(draft, name, from, to);
    draft.data = { ...(draft.data || {}), type: DEVICE_TYPE.AREA, name, color: areaColor, id };
    draft.data = { ...(draft.data || {}), type: DEVICE_TYPE.AREA, name, color: areaColor, id, start: from, end: to };
    draft.eventMode = 'static';
    draft.cursor = 'pointer';
    if (setCurSprite) {
        draft.off('click');
        draft.on('click', () => setCurSprite(draft));
    }
    return draft;
};
export const startAreaDrawing = ({ promptText, onComplete, onFinish } = {}) => {
export const startAreaDrawing = ({ promptText, onComplete, onFinish, setCurSprite } = {}) => {
    if (!mapContainer || !mapContainer.parent) {
        return false;
    }
@@ -973,7 +1005,7 @@
    const drawRect = (from, to) => {
        draft.clear();
        const strokeColor = areaColor;
        draft.lineStyle(4 / Math.abs(mapContainer.scale.x || 1), strokeColor, 0.8);
        draft.lineStyle(2 / Math.abs(mapContainer.scale.x || 1), AREA_BORDER_COLOR, 0.9);
        draft.beginFill(strokeColor, 0.18);
        draft.drawRect(
            Math.min(from.x, to.x),
@@ -1030,7 +1062,13 @@
        }
        addAreaLabel(draft, areaName, startPoint, endPoint);
        draft.data = { ...(draft.data || {}), type: DEVICE_TYPE.AREA, name: areaName, color: areaColor };
        draft.data = { ...(draft.data || {}), type: DEVICE_TYPE.AREA, name: areaName, color: areaColor, start: startPoint, end: endPoint };
        draft.eventMode = 'static';
        draft.cursor = 'pointer';
        if (setCurSprite) {
            draft.off('click');
            draft.on('click', () => setCurSprite(draft));
        }
        if (onComplete) {
            onComplete({
@@ -1048,3 +1086,9 @@
    stage.on('pointerup', handleUp);
    return true;
};
export const cancelAreaDrawing = () => {
    if (areaDrawingCleanup) {
        areaDrawingCleanup();
    }
};
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MapController.java
@@ -22,6 +22,7 @@
import com.zy.acs.manager.manager.controller.param.MapDataParam;
import com.zy.acs.manager.manager.controller.param.MapParam;
import com.zy.acs.manager.manager.controller.result.MapAgvVo;
import com.zy.acs.manager.manager.controller.result.MapAreaResult;
import com.zy.acs.manager.manager.controller.result.MapPointVo;
import com.zy.acs.manager.manager.controller.result.MapRouteVo;
import com.zy.acs.manager.manager.entity.*;
@@ -432,8 +433,12 @@
    @PostMapping("/area/list")
    public R areaFetch(@RequestParam(required = false) Long zoneId, @RequestParam(required = false) Integer floor) {
        List<Area> areaList = areaService.list(new LambdaQueryWrapper<Area>().eq(Area::getStatus, StatusType.ENABLE.val));
        return R.ok();
        List<MapAreaResult> list = new ArrayList<>();
        for (Area area : areaList) {
            MapAreaResult result = new MapAreaResult();
            list.add(result.sync(area));
        }
        return R.ok().add(list);
    }
    @PreAuthorize("hasAuthority('manager:loc:update')")
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/result/MapAreaResult.java
New file
@@ -0,0 +1,52 @@
package com.zy.acs.manager.manager.controller.result;
import com.alibaba.fastjson.JSON;
import com.zy.acs.manager.common.domain.AreaShapeDto;
import com.zy.acs.manager.common.domain.MapPointDto;
import com.zy.acs.manager.manager.entity.Area;
import lombok.Data;
@Data
public class MapAreaResult {
    private Long id;
    private String name;
    private MapPointDto start;
    private MapPointDto end;
    private String color;
    private String code;
    private String type;
    private Integer maxCount;
    private String speedLimit;
    private Integer priority;
    private String memo;
    public MapAreaResult sync(Area area) {
        this.setId(area.getId());
        this.setName(area.getName());
        AreaShapeDto shapeDto = JSON.parseObject(area.getShapeData(), AreaShapeDto.class);
        this.setStart(shapeDto.getStart());
        this.setEnd(shapeDto.getEnd());
        this.setColor(color);
        this.setCode(area.getCode());
        this.setType(area.getType());
        this.setMaxCount(area.getMaxCount());
        this.setSpeedLimit(area.getSpeedLimit());
        this.setPriority(area.getPriority());
        this.setMemo(area.getMemo());
        return this;
    }
}