#
luxiaotao1123
2024-10-14 d59b127388b6064fb01d6f28834d49e560257f2f
#
6个文件已修改
6个文件已添加
408 ■■■■■ 已修改文件
zy-acs-flow/public/map/agv/ctuEmptyFullBattery.svg 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/public/map/agv/ctuEmptyHalfBattery.svg 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/public/map/agv/ctuEmptyNoBattery.svg 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/public/map/agv/ctuLoadedFullBattery.svg 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/public/map/agv/ctuLoadedHalfBattery.svg 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/public/map/agv/ctuLoadedNoBattery.svg 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/MapPage.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/constants.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/tool.js 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/MapWsAgvVo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/public/map/agv/ctuEmptyFullBattery.svg
New file
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 66.7 108.22">
  <defs>
    <style>
      .cls-1 {
        fill: #70b92f;
      }
      .cls-2 {
        fill: #82e9f4;
      }
      .cls-3 {
        fill: #5cbfcc;
      }
      .cls-4, .cls-5 {
        fill: #eaeaea;
      }
      .cls-5 {
        stroke: #4d9600;
        stroke-miterlimit: 10;
        stroke-width: 3.49px;
      }
    </style>
  </defs>
  <g id="_图层_1-2" data-name="图层 1">
    <rect class="cls-3" x="5.3" y="7" width="56.1" height="97.85" rx="5.58" ry="5.58"/>
    <rect class="cls-2" x="10.6" width="45.5" height="39" rx="10.53" ry="10.53"/>
    <rect class="cls-5" x="10.49" y="9.5" width="45" height="23" rx="2.57" ry="2.57"/>
    <rect class="cls-4" x="11.74" y="70.21" width="43.23" height="38.01" rx="2.53" ry="2.53"/>
    <rect class="cls-2" x="0" y="41.63" width="66.7" height="34.34" rx="8.19" ry="8.19"/>
    <rect class="cls-1" x="15.16" y="14" width="35.39" height="14"/>
  </g>
</svg>
zy-acs-flow/public/map/agv/ctuEmptyHalfBattery.svg
New file
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 66.7 108.22">
  <defs>
    <style>
      .cls-1 {
        fill: #70b92f;
      }
      .cls-2 {
        fill: #82e9f4;
      }
      .cls-3 {
        fill: #5cbfcc;
      }
      .cls-4, .cls-5 {
        fill: #eaeaea;
      }
      .cls-5 {
        stroke: #4d9600;
        stroke-miterlimit: 10;
        stroke-width: 3.49px;
      }
    </style>
  </defs>
  <g id="_图层_1-2" data-name="图层 1">
    <rect class="cls-3" x="5.3" y="7" width="56.1" height="97.85" rx="5.58" ry="5.58"/>
    <rect class="cls-2" x="10.6" width="45.5" height="39" rx="10.53" ry="10.53"/>
    <rect class="cls-5" x="10.49" y="9.5" width="45" height="23" rx="2.57" ry="2.57"/>
    <rect class="cls-4" x="11.74" y="70.21" width="43.23" height="38.01" rx="2.53" ry="2.53"/>
    <rect class="cls-2" x="0" y="41.63" width="66.7" height="34.34" rx="8.19" ry="8.19"/>
    <rect class="cls-1" x="15.16" y="14" width="17.83" height="14"/>
  </g>
</svg>
zy-acs-flow/public/map/agv/ctuEmptyNoBattery.svg
New file
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 66.7 108.22">
  <defs>
    <style>
      .cls-1 {
        stroke: #e50012;
        stroke-miterlimit: 10;
        stroke-width: 3.49px;
      }
      .cls-1, .cls-2 {
        fill: #eaeaea;
      }
      .cls-3 {
        fill: #82e9f4;
      }
      .cls-4 {
        fill: #5cbfcc;
      }
      .cls-5 {
        font-family: huxiaobo-gdh, huxiaobo-gdh;
        font-size: 26.52px;
      }
    </style>
  </defs>
  <g id="_图层_1-2" data-name="图层 1">
    <rect class="cls-4" x="5.3" y="7" width="56.1" height="97.85" rx="5.58" ry="5.58"/>
    <rect class="cls-3" x="10.6" width="45.5" height="39" rx="10.53" ry="10.53"/>
    <rect class="cls-1" x="10.85" y="9.5" width="45" height="23" rx="2.57" ry="2.57"/>
    <rect class="cls-2" x="11.74" y="70.21" width="43.23" height="38.01" rx="2.53" ry="2.53"/>
    <rect class="cls-3" x="0" y="41.63" width="66.7" height="34.34" rx="8.19" ry="8.19"/>
    <text class="cls-5" transform="translate(25.56 30.78) scale(.71 1)"><tspan x="0" y="0">!</tspan></text>
  </g>
</svg>
zy-acs-flow/public/map/agv/ctuLoadedFullBattery.svg
New file
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 66.7 108.22">
  <defs>
    <style>
      .cls-1 {
        fill: #70b92f;
      }
      .cls-2 {
        fill: #82e9f4;
      }
      .cls-3 {
        fill: #5cbfcc;
      }
      .cls-4 {
        fill: #deaf76;
      }
      .cls-5, .cls-6 {
        fill: #eaeaea;
      }
      .cls-6 {
        stroke: #4d9600;
        stroke-miterlimit: 10;
        stroke-width: 3.49px;
      }
    </style>
  </defs>
  <g id="_图层_1-2" data-name="图层 1">
    <rect class="cls-3" x="5.3" y="7" width="56.1" height="97.85" rx="5.58" ry="5.58"/>
    <rect class="cls-2" x="10.6" width="45.5" height="39" rx="10.53" ry="10.53"/>
    <rect class="cls-6" x="10.49" y="9.5" width="45" height="23" rx="2.57" ry="2.57"/>
    <rect class="cls-5" x="11.74" y="70.21" width="43.23" height="38.01" rx="2.53" ry="2.53"/>
    <rect class="cls-4" x="14.65" y="90" width="37.83" height="14.77" rx="1.59" ry="1.59"/>
    <rect class="cls-4" x="14.65" y="72.06" width="37.83" height="14.77" rx="1.59" ry="1.59"/>
    <rect class="cls-2" x="0" y="41.63" width="66.7" height="34.34" rx="8.19" ry="8.19"/>
    <rect class="cls-1" x="15.16" y="14" width="35.39" height="14"/>
  </g>
</svg>
zy-acs-flow/public/map/agv/ctuLoadedHalfBattery.svg
New file
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 66.7 108.22">
  <defs>
    <style>
      .cls-1 {
        fill: #70b92f;
      }
      .cls-2 {
        fill: #82e9f4;
      }
      .cls-3 {
        fill: #5cbfcc;
      }
      .cls-4 {
        fill: #deaf76;
      }
      .cls-5, .cls-6 {
        fill: #eaeaea;
      }
      .cls-6 {
        stroke: #4d9600;
        stroke-miterlimit: 10;
        stroke-width: 3.49px;
      }
    </style>
  </defs>
  <g id="_图层_1-2" data-name="图层 1">
    <rect class="cls-3" x="5.3" y="7" width="56.1" height="97.85" rx="5.58" ry="5.58"/>
    <rect class="cls-2" x="10.6" width="45.5" height="39" rx="10.53" ry="10.53"/>
    <rect class="cls-6" x="10.49" y="9.5" width="45" height="23" rx="2.57" ry="2.57"/>
    <rect class="cls-5" x="11.74" y="70.21" width="43.23" height="38.01" rx="2.53" ry="2.53"/>
    <rect class="cls-4" x="14.65" y="90" width="37.83" height="14.77" rx="1.59" ry="1.59"/>
    <rect class="cls-4" x="14.65" y="72.06" width="37.83" height="14.77" rx="1.59" ry="1.59"/>
    <rect class="cls-2" x="0" y="41.63" width="66.7" height="34.34" rx="8.19" ry="8.19"/>
    <rect class="cls-1" x="15.16" y="14" width="17.83" height="14"/>
  </g>
</svg>
zy-acs-flow/public/map/agv/ctuLoadedNoBattery.svg
New file
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 66.7 108.22">
  <defs>
    <style>
      .cls-1 {
        stroke: #e50012;
        stroke-miterlimit: 10;
        stroke-width: 3.49px;
      }
      .cls-1, .cls-2 {
        fill: #eaeaea;
      }
      .cls-3 {
        fill: #82e9f4;
      }
      .cls-4 {
        fill: #5cbfcc;
      }
      .cls-5 {
        fill: #deaf76;
      }
      .cls-6 {
        font-family: huxiaobo-gdh, huxiaobo-gdh;
        font-size: 26.52px;
      }
    </style>
  </defs>
  <g id="_图层_1-2" data-name="图层 1">
    <rect class="cls-4" x="5.3" y="7" width="56.1" height="97.85" rx="5.58" ry="5.58"/>
    <rect class="cls-3" x="10.6" width="45.5" height="39" rx="10.53" ry="10.53"/>
    <rect class="cls-1" x="10.85" y="9.5" width="45" height="23" rx="2.57" ry="2.57"/>
    <rect class="cls-2" x="11.74" y="70.21" width="43.23" height="38.01" rx="2.53" ry="2.53"/>
    <rect class="cls-5" x="14.43" y="91" width="37.83" height="14.77" rx="1.59" ry="1.59"/>
    <rect class="cls-5" x="14.43" y="73.06" width="37.83" height="14.77" rx="1.59" ry="1.59"/>
    <rect class="cls-3" x="0" y="41.63" width="66.7" height="34.34" rx="8.19" ry="8.19"/>
    <text class="cls-6" transform="translate(25.56 30.81) scale(.71 1)"><tspan x="0" y="0">!</tspan></text>
  </g>
</svg>
zy-acs-flow/src/map/MapPage.jsx
@@ -84,8 +84,8 @@
            await Http.fetchMapData();
            websocket.connect();
            websocket.onMessage = (data) => {
                Tool.generateDynamicGraphic(curZone, data);
            websocket.onMessage = (wsMsg) => {
                Tool.generateDynamicGraphic(curZone, JSON.parse(wsMsg));
            }
            setTimeout(() => {
zy-acs-flow/src/map/constants.js
@@ -22,6 +22,15 @@
    CHARGE: 1,
    DIRECTION: 1,
    AGV: 2,
    AGV: 3,
    POINT: 2,
})
export const AGV_STATUS_MODE = Object.freeze({
    EMPTY_NO_BATTERY: 1,
    EMPTY_HALF_BATTERY: 2,
    EMPTY_FULL_BATTERY: 3,
    LOADED_NO_BATTERY: 4,
    LOADED_HALF_BATTERY: 5,
    LOADED_FULL_BATTERY: 6,
})
zy-acs-flow/src/map/tool.js
@@ -3,6 +3,7 @@
import {
    DEVICE_TYPE,
    DEVICE_Z_INDEX,
    AGV_STATUS_MODE,
} from './constants';
import shelf from '/map/shelf.svg';
@@ -10,6 +11,13 @@
import station from '/map/station.svg';
import direction from '/map/direction.svg';
import point from '/map/point.svg';
// agv
import ctuEmptyNoBattery from '/map/agv/ctuEmptyNoBattery.svg';
import ctuEmptyHalfBattery from '/map/agv/ctuEmptyHalfBattery.svg';
import ctuEmptyFullBattery from '/map/agv/ctuEmptyFullBattery.svg';
import ctuLoadedNoBattery from '/map/agv/ctuLoadedNoBattery.svg';
import ctuLoadedHalfBattery from '/map/agv/ctuLoadedHalfBattery.svg';
import ctuLoadedFullBattery from '/map/agv/ctuLoadedFullBattery.svg';
let app, mapContainer, themeMode;
let selectedSprite, effectTick, effectHalfCircle, effectRectangle;
@@ -47,7 +55,7 @@
    }
}
export const generateSprite = (deviceType) => {
export const generateSprite = (deviceType, source) => {
    let sprite;
    switch (deviceType) {
        case DEVICE_TYPE.SHELF:
@@ -75,6 +83,15 @@
            sprite.zIndex = DEVICE_Z_INDEX.DIRECTION;
            break;
        case DEVICE_TYPE.AGV:
            if (source) {
                sprite = new PIXI.Sprite(PIXI.Texture.from(source, { resourceOptions: { scale: 1 } }));
            }
            sprite.width = 300;
            sprite.height = 500;
            sprite.zIndex = DEVICE_Z_INDEX.AGV;
            break
        case DEVICE_TYPE.POINT:
            sprite = new PIXI.Sprite(PIXI.Texture.from(point, { resourceOptions: { scale: 1 } }));
            // sprite.width = 112;
@@ -99,6 +116,17 @@
        type: type,
        uuid: generateID()
    };
}
export const querySprite = (type, no) => {
    if (!mapContainer) {
        return;
    }
    for (const sprite of mapContainer.children) {
        if (sprite.data?.type === type && sprite.data?.no === no) {
            return sprite;
        }
    }
}
export const markSprite = (sprite) => {
@@ -379,23 +407,71 @@
}
// service ------------------------
export const getAgvStatusMode = (backpack, battery) => {
    if (backpack === 0) {
        if (battery < 10) {
            return AGV_STATUS_MODE.EMPTY_NO_BATTERY;
        }
        if (battery < 80) {
            return AGV_STATUS_MODE.EMPTY_HALF_BATTERY;
        }
        return AGV_STATUS_MODE.EMPTY_FULL_BATTERY;
    } else {
        if (battery < 10) {
            return AGV_STATUS_MODE.LOADED_NO_BATTERY;
        }
        if (battery < 80) {
            return AGV_STATUS_MODE.LOADED_HALF_BATTERY;
        }
        return AGV_STATUS_MODE.LOADED_FULL_BATTERY;
    }
}
export const generateAgvSpriteTexture = (agvStatusMode) => {
    switch (agvStatusMode) {
        case AGV_STATUS_MODE.EMPTY_NO_BATTERY:
            return ctuEmptyNoBattery;
        case AGV_STATUS_MODE.EMPTY_HALF_BATTERY:
            return ctuEmptyHalfBattery;
        case AGV_STATUS_MODE.EMPTY_FULL_BATTERY:
            return ctuEmptyFullBattery;
        case AGV_STATUS_MODE.LOADED_NO_BATTERY:
            return ctuLoadedNoBattery;
        case AGV_STATUS_MODE.LOADED_HALF_BATTERY:
            return ctuLoadedHalfBattery;
        case AGV_STATUS_MODE.LOADED_FULL_BATTERY:
            return ctuLoadedFullBattery;
        default:
            return;
    }
}
// dynamic graphic ----------------
export const generateDynamicGraphic = (curZone, data) => {
    console.log("ws", curZone, data);
    const dynamicData = JSON.parse(data);
    console.log("ws", curZone, dynamicData);
    for (const agvVo of data.agvVos) {
        showAgvSprite(curZone, agvVo)
    }
}
const showAgvSprite = (curZone, agvVo) => {
    const { agvNo, code, direction, backpack, battery, ...rest } = agvVo;
    if (!code) { return }
    const codeSprite = querySprite(DEVICE_TYPE.POINT, code);
    if (!codeSprite) { return }
    let agvSprite = querySprite(DEVICE_TYPE.AGV, agvNo);
    if (!agvSprite) {
        agvSprite = generateSprite(DEVICE_TYPE.AGV, generateAgvSpriteTexture(getAgvStatusMode(backpack, battery)));
        initSprite(agvSprite, DEVICE_TYPE.AGV);
        agvSprite.data.no = agvNo;
        agvSprite.position.set(codeSprite.position.x, codeSprite.position.y);
        mapContainer.addChild(agvSprite);
        // viewFeature(shuttle, setCurSPrite); // todo
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/MapWsAgvVo.java
@@ -12,4 +12,10 @@
    private String code;
    private Double direction = 0.0;
    private Integer backpack = 0;
    private Double battery;
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java
@@ -52,8 +52,9 @@
            MapWsAgvVo vo = new MapWsAgvVo();
            vo.setAgvNo(agv.getUuid());
            vo.setCode(code.getData());
            vo.setDirection(agvDetail.getAgvAngle());
            vo.setBackpack(agvDetail.getTempQua());
            vo.setBattery(vo.getBattery());
            agvVos.add(vo);
        }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java
@@ -166,6 +166,30 @@
        detail.setSensorSts((long) mesBody.getSensorStatusFlags());
        int tempQua = 0;
        if (mesBody.isTempLoc1()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc2()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc3()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc4()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc5()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc6()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc7()) {
            tempQua ++;
        }
        detail.setTempQua(tempQua);
    }
    // 无码实时数据包
@@ -194,6 +218,30 @@
        detail.setSensorSts((long) mesBody.getSensorStatusFlags());
        int tempQua = 0;
        if (mesBody.isTempLoc1()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc2()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc3()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc4()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc5()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc6()) {
            tempQua ++;
        }
        if (mesBody.isTempLoc7()) {
            tempQua ++;
        }
        detail.setTempQua(tempQua);
    }
    // 心跳包