From d59b127388b6064fb01d6f28834d49e560257f2f Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期一, 14 十月 2024 17:01:57 +0800 Subject: [PATCH] # --- zy-acs-flow/src/map/constants.js | 11 + zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java | 48 ++++++ zy-acs-flow/public/map/agv/ctuEmptyFullBattery.svg | 36 +++++ zy-acs-flow/public/map/agv/ctuEmptyHalfBattery.svg | 36 +++++ zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/MapWsAgvVo.java | 6 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java | 5 zy-acs-flow/public/map/agv/ctuLoadedHalfBattery.svg | 42 ++++++ zy-acs-flow/public/map/agv/ctuLoadedNoBattery.svg | 43 ++++++ zy-acs-flow/src/map/tool.js | 98 ++++++++++++- zy-acs-flow/public/map/agv/ctuLoadedFullBattery.svg | 42 ++++++ zy-acs-flow/src/map/MapPage.jsx | 4 zy-acs-flow/public/map/agv/ctuEmptyNoBattery.svg | 37 +++++ 12 files changed, 392 insertions(+), 16 deletions(-) diff --git a/zy-acs-flow/public/map/agv/ctuEmptyFullBattery.svg b/zy-acs-flow/public/map/agv/ctuEmptyFullBattery.svg new file mode 100644 index 0000000..9943124 --- /dev/null +++ b/zy-acs-flow/public/map/agv/ctuEmptyFullBattery.svg @@ -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> \ No newline at end of file diff --git a/zy-acs-flow/public/map/agv/ctuEmptyHalfBattery.svg b/zy-acs-flow/public/map/agv/ctuEmptyHalfBattery.svg new file mode 100644 index 0000000..8b5526a --- /dev/null +++ b/zy-acs-flow/public/map/agv/ctuEmptyHalfBattery.svg @@ -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> \ No newline at end of file diff --git a/zy-acs-flow/public/map/agv/ctuEmptyNoBattery.svg b/zy-acs-flow/public/map/agv/ctuEmptyNoBattery.svg new file mode 100644 index 0000000..eb541a1 --- /dev/null +++ b/zy-acs-flow/public/map/agv/ctuEmptyNoBattery.svg @@ -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> \ No newline at end of file diff --git a/zy-acs-flow/public/map/agv/ctuLoadedFullBattery.svg b/zy-acs-flow/public/map/agv/ctuLoadedFullBattery.svg new file mode 100644 index 0000000..3cbc57d --- /dev/null +++ b/zy-acs-flow/public/map/agv/ctuLoadedFullBattery.svg @@ -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> \ No newline at end of file diff --git a/zy-acs-flow/public/map/agv/ctuLoadedHalfBattery.svg b/zy-acs-flow/public/map/agv/ctuLoadedHalfBattery.svg new file mode 100644 index 0000000..34940d0 --- /dev/null +++ b/zy-acs-flow/public/map/agv/ctuLoadedHalfBattery.svg @@ -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> \ No newline at end of file diff --git a/zy-acs-flow/public/map/agv/ctuLoadedNoBattery.svg b/zy-acs-flow/public/map/agv/ctuLoadedNoBattery.svg new file mode 100644 index 0000000..1e7691e --- /dev/null +++ b/zy-acs-flow/public/map/agv/ctuLoadedNoBattery.svg @@ -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> \ No newline at end of file diff --git a/zy-acs-flow/src/map/MapPage.jsx b/zy-acs-flow/src/map/MapPage.jsx index 17a7f13..1d34847 100644 --- a/zy-acs-flow/src/map/MapPage.jsx +++ b/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(() => { diff --git a/zy-acs-flow/src/map/constants.js b/zy-acs-flow/src/map/constants.js index 2256db6..00b8c0e 100644 --- a/zy-acs-flow/src/map/constants.js +++ b/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, +}) \ No newline at end of file diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js index 2aafe7c..18ba33e 100644 --- a/zy-acs-flow/src/map/tool.js +++ b/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 + } } \ No newline at end of file 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 ff37c36..08adcab 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 @@ -12,4 +12,10 @@ private String code; + private Double direction = 0.0; + + private Integer backpack = 0; + + private Double battery; + } 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 84b7755..7a3095b 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 @@ -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); } diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java index b98d2ab..1371a0a 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java +++ b/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); + } // 蹇冭烦鍖� -- Gitblit v1.9.1