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); } // 心跳包