| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | |
| | | <head> |
| | | <meta charset="UTF-8"> |
| | | <title>库位地图</title> |
| | |
| | | } |
| | | </style> |
| | | </head> |
| | | |
| | | <body> |
| | | <div id="app"> |
| | | <div id="pixiView"> |
| | |
| | | <el-button @click="drawer = true">操作</el-button> |
| | | </div> |
| | | |
| | | <el-drawer |
| | | title="操作区域" |
| | | :visible.sync="drawer" |
| | | :with-header="true" |
| | | :modal="false" |
| | | > |
| | | <el-drawer title="操作区域" :visible.sync="drawer" :with-header="true" :modal="false"> |
| | | <div class="floorBtnBox" v-for="(lev,idx) in floorList"> |
| | | <el-button :style="{background:currentLev === lev ? '#7DCDFF':''}" @click="changeFloor(lev)">{{lev}}F</el-button> |
| | | <el-button :style="{background:currentLev === lev ? '#7DCDFF':''}" |
| | | @click="changeFloor(lev)">{{lev}}F</el-button> |
| | | </div> |
| | | </el-drawer> |
| | | |
| | | <el-drawer |
| | | title="库位详情" |
| | | :visible.sync="drawerLocNo" |
| | | :with-header="true" |
| | | :modal="false" |
| | | > |
| | | <el-drawer title="库位详情" :visible.sync="drawerLocNo" :with-header="true" :modal="false"> |
| | | <div v-if="drawerLocNoData!=null"> |
| | | <div style="margin: 10px;"> |
| | | <div style="margin-top: 5px;">排:{{drawerLocNoData.row}}</div> |
| | |
| | | </div> |
| | | </el-drawer> |
| | | |
| | | <el-drawer |
| | | title="小车信息" |
| | | :visible.sync="drawerShuttle" |
| | | :with-header="true" |
| | | :modal="false" |
| | | > |
| | | <el-drawer title="小车信息" :visible.sync="drawerShuttle" :with-header="true" :modal="false"> |
| | | <div v-if="drawerShuttleData!=null"> |
| | | <div style="margin: 10px;"> |
| | | <div style="margin-top: 5px;">小车:{{drawerShuttleData.shuttleNo}}</div> |
| | |
| | | </div> |
| | | </el-drawer> |
| | | |
| | | <el-drawer |
| | | title="站点信息" |
| | | :visible.sync="drawerSta" |
| | | :with-header="true" |
| | | :modal="false" |
| | | > |
| | | <el-drawer title="站点信息" :visible.sync="drawerSta" :with-header="true" :modal="false"> |
| | | <div v-if="drawerStaData!=null"> |
| | | <div style="margin: 10px;"> |
| | | <div style="margin-top: 5px;">站点:{{drawerStaData.siteId}}</div> |
| | |
| | | </div> |
| | | </el-drawer> |
| | | |
| | | <el-drawer |
| | | title="提升机信息" |
| | | :visible.sync="drawerLift" |
| | | :with-header="true" |
| | | :modal="false" |
| | | > |
| | | <el-drawer title="提升机信息" :visible.sync="drawerLift" :with-header="true" :modal="false"> |
| | | <div v-if="drawerLiftData!=null"> |
| | | <div style="margin: 10px;"> |
| | | <div style="margin-top: 5px;">提升机:{{liftList[drawerLiftData-1].liftNo}}</div> |
| | |
| | | let pixiShuttleMap = new Map(); |
| | | let pixiShuttleMoveAdvancePathMap = new Map(); |
| | | let pixiShuttleMoveAdvancePathList = []; |
| | | let pixiShuttleLockPathMap = new Map(); |
| | | let pixiStaMap = new Map(); |
| | | let objectsContainer; |
| | | let objectsContainer2; |
| | | let objectsContainer3; |
| | | let graphics0; |
| | | let graphics3; |
| | | let graphics4; |
| | | let graphics5; |
| | | let graphics9; |
| | | let graphics67; |
| | | let graphicsLock; |
| | | let graphicsShelf; |
| | | let graphicsDevp; |
| | | let graphicsCrn; |
| | | let graphicsCrnTrack; |
| | | let ws; |
| | | |
| | | var app = new Vue({ |
| | |
| | | getMap(lev) { |
| | | let that = this; |
| | | $.ajax({ |
| | | url: baseUrl + "/console/map/" + lev + "/auth", |
| | | url: baseUrl + "/basMap/lev/" + this.currentLev + "/auth", |
| | | headers: { |
| | | 'token': localStorage.getItem('token') |
| | | }, |
| | |
| | | success: function(res) { |
| | | //获取地图数据 |
| | | let data = res.data |
| | | that.createMapData(data) |
| | | let mapData = JSON.parse(data) |
| | | that.createMapData(mapData) |
| | | } |
| | | }) |
| | | }, |
| | |
| | | this.reloadMap = true |
| | | this.reloadSta = true |
| | | this.getMap(lev) |
| | | |
| | | //清空占用路径 |
| | | objectsContainer3.removeChildren(); |
| | | pixiShuttleLockPathMap = new Map(); |
| | | |
| | | //清空预计路径 |
| | | objectsContainer2.removeChildren(); |
| | |
| | | pixiApp.loader.add('shuttle', '../static/images/sxcar.png'); |
| | | |
| | | // 从Graphics对象创建一个纹理 |
| | | graphicsF = pixiApp.renderer.generateTexture(getContainer(1000)); |
| | | graphics0 = pixiApp.renderer.generateTexture(getContainer(0)); |
| | | graphics3 = pixiApp.renderer.generateTexture(getContainer(3)); |
| | | graphics4 = pixiApp.renderer.generateTexture(getContainer(4)); |
| | | graphics5 = pixiApp.renderer.generateTexture(getContainer(5)); |
| | | graphics9 = pixiApp.renderer.generateTexture(getContainer(9)); |
| | | graphics67 = pixiApp.renderer.generateTexture(getContainer(67)); |
| | | graphicsLock = pixiApp.renderer.generateTexture(getContainer(-999)); |
| | | graphicsShelf = pixiApp.renderer.generateTexture(getContainer('shelf')); |
| | | graphicsDevp = pixiApp.renderer.generateTexture(getContainer('devp')); |
| | | graphicsCrn = pixiApp.renderer.generateTexture(getContainer('crn')); |
| | | graphicsCrnTrack = createTrackTexture(); |
| | | |
| | | // 创建一个容器来管理大批量的显示对象 |
| | | objectsContainer = new PIXI.Container(); |
| | |
| | | // 创建一个容器来管理大批量的显示对象 |
| | | objectsContainer2 = new PIXI.Container(); |
| | | pixiApp.stage.addChild(objectsContainer2); |
| | | |
| | | // 创建一个容器来管理大批量的显示对象 |
| | | objectsContainer3 = new PIXI.Container(); |
| | | pixiApp.stage.addChild(objectsContainer3); |
| | | |
| | | //*******************拖动画布******************* |
| | | let stageOriginalPos; |
| | |
| | | pixiStageList[index] = [item.length] |
| | | for (let idx = 0; idx < item.length; idx++) { |
| | | let val = item[idx] |
| | | if (val.value < 0 && (val.value != -999)) { |
| | | |
| | | // 跳过合并单元格的占位符 |
| | | if (val.type === 'merge') { |
| | | continue; |
| | | } |
| | | |
| | | let sprite = getSprite(val.value, idx * width, index * height, val, (e) => { |
| | | if (val.value == 4) { |
| | | //站点 |
| | | this.openDrawerSta(val) |
| | | } else if (val.value == 67) { |
| | | //提升机 |
| | | this.openDrawerLift(val) |
| | | } else { |
| | | //库位 |
| | | this.rightEvent(index, idx, e); |
| | | updateColor(sprite, 0x9900ff); |
| | | } |
| | | }); |
| | | |
| | | if (val.value == 4) { |
| | | // 创建文本对象 |
| | | const style = new PIXI.TextStyle({ |
| | | fontFamily: 'Arial', |
| | | fontSize: 10, |
| | | fill: '#000000', |
| | | }); |
| | | const text = new PIXI.Text(val.data, style); |
| | | text.anchor.set(0.5); // 设置文本锚点为中心点 |
| | | text.position.set(sprite.width / 2, sprite.height / 2); // 将文本位置设置为Graphics对象的中心点 |
| | | // 将文本对象添加到Graphics对象中 |
| | | sprite.addChild(text); |
| | | sprite.textObj = text; |
| | | pixiStaMap.set(parseInt(val.data), sprite);//站点数据添加到map中 |
| | | }else if (val.value == 67) { |
| | | // 创建提升机文本对象 |
| | | const style = new PIXI.TextStyle({ |
| | | fontFamily: 'Arial', |
| | | fontSize: 10, |
| | | fill: '#000000', |
| | | }); |
| | | const text = new PIXI.Text(val.data, style); |
| | | text.anchor.set(0.5); // 设置文本锚点为中心点 |
| | | text.position.set(sprite.width / 2, sprite.height / 2); // 将文本位置设置为Graphics对象的中心点 |
| | | // 将文本对象添加到Graphics对象中 |
| | | sprite.addChild(text); |
| | | sprite.textObj = text; |
| | | pixiStaMap.set(parseInt(val.data), sprite);//站点数据添加到map中 |
| | | if (val.type == undefined || val.type === 'none') { |
| | | continue; |
| | | } |
| | | |
| | | if (val.value == -999) { |
| | | pixiShuttleLockPathMap.set(val.locNo, sprite); |
| | | objectsContainer3.addChild(sprite); |
| | | }else { |
| | | // 计算合并单元格的实际宽高 |
| | | let cellWidth = val.colSpan ? val.colSpan * width : width; |
| | | let cellHeight = val.rowSpan ? val.rowSpan * height : height; |
| | | |
| | | let sprite = getSpriteWithSize(val.value, idx * width, index * height, cellWidth, cellHeight, val, (e) => { |
| | | // if (val.value == 4) { |
| | | // //站点 |
| | | // this.openDrawerSta(val) |
| | | // } else if (val.value == 67) { |
| | | // //提升机 |
| | | // this.openDrawerLift(val) |
| | | // } else { |
| | | // //库位 |
| | | // this.rightEvent(index, idx, e); |
| | | // updateColor(sprite, 0x9900ff); |
| | | // } |
| | | }); |
| | | |
| | | if (sprite == null) { |
| | | continue; |
| | | } |
| | | |
| | | // if (val.value == 4) { |
| | | // // 创建文本对象 |
| | | // const style = new PIXI.TextStyle({ |
| | | // fontFamily: 'Arial', |
| | | // fontSize: 10, |
| | | // fill: '#000000', |
| | | // }); |
| | | // const text = new PIXI.Text(val.data, style); |
| | | // text.anchor.set(0.5); // 设置文本锚点为中心点 |
| | | // text.position.set(sprite.width / 2, sprite.height / 2); // 将文本位置设置为Graphics对象的中心点 |
| | | // // 将文本对象添加到Graphics对象中 |
| | | // sprite.addChild(text); |
| | | // sprite.textObj = text; |
| | | // pixiStaMap.set(parseInt(val.data), sprite);//站点数据添加到map中 |
| | | // }else if (val.value == 67) { |
| | | // // 创建提升机文本对象 |
| | | // const style = new PIXI.TextStyle({ |
| | | // fontFamily: 'Arial', |
| | | // fontSize: 10, |
| | | // fill: '#000000', |
| | | // }); |
| | | // const text = new PIXI.Text(val.data, style); |
| | | // text.anchor.set(0.5); // 设置文本锚点为中心点 |
| | | // text.position.set(sprite.width / 2, sprite.height / 2); // 将文本位置设置为Graphics对象的中心点 |
| | | // // 将文本对象添加到Graphics对象中 |
| | | // sprite.addChild(text); |
| | | // sprite.textObj = text; |
| | | // pixiStaMap.set(parseInt(val.data), sprite);//站点数据添加到map中 |
| | | // } |
| | | |
| | | objectsContainer.addChild(sprite); |
| | | } |
| | | pixiStageList[index][idx] = sprite |
| | | } |
| | | }); |
| | |
| | | diff.forEach((item, index) => { |
| | | //获取old元素 |
| | | let oldSprite = pixiStageList[item.x][item.y] |
| | | if (item.originData == -999) { |
| | | //移除old路径元素 |
| | | objectsContainer3.removeChild(oldSprite); |
| | | }else { |
| | | if (!oldSprite) return; // 跳过不存在的元素 |
| | | |
| | | //移除old元素 |
| | | objectsContainer.removeChild(oldSprite); |
| | | } |
| | | |
| | | let sprite = getSprite(item.data, item.y * width, item.x * height, item, (e) => { |
| | | // 计算合并单元格的实际宽高 |
| | | let cellWidth = item.colSpan ? item.colSpan * width : width; |
| | | let cellHeight = item.rowSpan ? item.rowSpan * height : height; |
| | | |
| | | let sprite = getSpriteWithSize(item.data, item.y * width, item.x * height, cellWidth, cellHeight, item, (e) => { |
| | | this.rightEvent(item.x, item.y, e); |
| | | updateColor(sprite, 0x9900ff); |
| | | }); |
| | | |
| | | if (item.data == -999) { |
| | | //添加路径元素 |
| | | objectsContainer3.addChild(sprite); |
| | | }else { |
| | | //添加元素 |
| | | objectsContainer.addChild(sprite); |
| | | } |
| | | |
| | | //保存新元素 |
| | | pixiStageList[item.x][item.y] = sprite |
| | |
| | | }, |
| | | rightEvent(x, y, e) { |
| | | this.drawerLocNo = true |
| | | this.drawerLocNoData = {x:x, y: y, z: this.currentLev, locNo: this.map[x][y].locNo, |
| | | locSts: this.map[x][y].locSts,row:this.map[x][y].row, bay: this.map[x][y].bay, lev: this.currentLev}; |
| | | this.drawerLocNoData = { |
| | | x: x, y: y, z: this.currentLev, locNo: this.map[x][y].locNo, |
| | | locSts: this.map[x][y].locSts, row: this.map[x][y].row, bay: this.map[x][y].bay, lev: this.currentLev |
| | | }; |
| | | }, |
| | | findDiffList(arr1, arr2) { |
| | | let diff = [] |
| | |
| | | } |
| | | }) |
| | | |
| | | function getContainer(value) { |
| | | function getContainer(type) { |
| | | let graphics = new PIXI.Graphics(); |
| | | let drawBorder = true; |
| | | if (type == 'shelf') { |
| | | graphics.beginFill(0x55aaff); |
| | | } else if (type == 'devp') { |
| | | graphics.beginFill(0xffff00); |
| | | graphics.visible = true; |
| | | } else if (type == 'crn') { |
| | | graphics.beginFill(0xaaffff); |
| | | } |
| | | if (drawBorder) { |
| | | graphics.lineStyle(1, 0xffffff, 1); |
| | | graphics.drawRect(0, 0, width, height); |
| | | } |
| | | graphics.endFill(); |
| | | |
| | | return graphics; |
| | | } |
| | | |
| | | function createTrackTexture() { |
| | | const g = new PIXI.Graphics(); |
| | | const t = Math.max(2, Math.round(height * 0.08)); |
| | | const gap = Math.round(height * 0.30); |
| | | const mid = Math.round(height / 2); |
| | | const y1 = mid - Math.round(gap / 2); |
| | | const y2 = mid + Math.round(gap / 2); |
| | | const tHalf = Math.round(t / 2); |
| | | const topRailTopY = y1 - tHalf; |
| | | const bottomRailTopY = y2 - tHalf; |
| | | g.beginFill(0x666666); |
| | | g.drawRect(0, topRailTopY, width, t); |
| | | g.drawRect(0, bottomRailTopY, width, t); |
| | | g.endFill(); |
| | | g.beginFill(0x777777); |
| | | const sTop = topRailTopY + t; |
| | | const sBottom = bottomRailTopY; |
| | | const sHeight = Math.max(1, sBottom - sTop); |
| | | for (let i = 0; i < width; i += 5) { |
| | | g.drawRect(i, sTop, 2, sHeight); |
| | | } |
| | | g.endFill(); |
| | | const rt = PIXI.RenderTexture.create({ width: width, height: height }); |
| | | pixiApp.renderer.render(g, rt); |
| | | return rt; |
| | | } |
| | | |
| | | function getContainerWithSize(value, w, h) { |
| | | let graphics = new PIXI.Graphics(); |
| | | if (value === 0) { |
| | | graphics.beginFill(0x55aaff); |
| | |
| | | graphics.beginFill(0xf83333); |
| | | } |
| | | graphics.lineStyle(1, 0xffffff, 1); |
| | | graphics.drawRect(0, 0, width, height); |
| | | graphics.drawRect(0, 0, w, h); |
| | | graphics.endFill(); |
| | | |
| | | return graphics; |
| | |
| | | |
| | | function getSprite(value, x, y, item, pointerDownEvent) { |
| | | let sprite; |
| | | if (value == 0) { |
| | | if(item.locSts == 'O') { |
| | | sprite = new PIXI.Sprite(graphics0); |
| | | }else if(item.locSts == 'F') { |
| | | sprite = new PIXI.Sprite(graphicsF); |
| | | console.log(item.type); |
| | | if (item.type == 'shelf') { |
| | | sprite = new PIXI.Sprite(graphicsShelf); |
| | | } else if (item.type == 'devp') { |
| | | sprite = new PIXI.Sprite(graphicsDevp); |
| | | } else if (item.type == 'crn') { |
| | | if (getDeviceNo(value) == -1) { |
| | | sprite = new PIXI.Sprite(graphicsCrnTrack); |
| | | }else { |
| | | sprite = new PIXI.Sprite(graphics0); |
| | | sprite = new PIXI.Sprite(graphicsCrn); |
| | | } |
| | | } else if (value == 3) { |
| | | sprite = new PIXI.Sprite(graphics3); |
| | | } else if (value == 4) { |
| | | sprite = new PIXI.Sprite(graphics4); |
| | | } else if (value == 5) { |
| | | sprite = new PIXI.Sprite(graphics5); |
| | | } else if (value == 9) { |
| | | sprite = new PIXI.Sprite(graphics9); |
| | | } else if (value == 67) { |
| | | sprite = new PIXI.Sprite(graphics67); |
| | | } else if (value == -999) { |
| | | sprite = new PIXI.Sprite(graphicsLock); |
| | | } else if (item.type == 'crnTrack') { |
| | | sprite = new PIXI.Sprite(graphicsCrnTrack); |
| | | } else { |
| | | sprite = new PIXI.Sprite(graphics0); |
| | | return null; |
| | | } |
| | | sprite.position.set(x, y); |
| | | sprite.interactive = true; // 必须要设置才能接收事件 |
| | | sprite.buttonMode = true; // 让光标在hover时变为手型指针 |
| | | |
| | | sprite.on('pointerdown', (e) => { |
| | | pointerDownEvent(e) |
| | | }) |
| | | |
| | | return sprite; |
| | | } |
| | | |
| | | function getSpriteWithSize(value, x, y, w, h, item, pointerDownEvent) { |
| | | let sprite; |
| | | |
| | | // 如果是标准尺寸,使用缓存的纹理 |
| | | if (w === width && h === height) { |
| | | return getSprite(value, x, y, item, pointerDownEvent); |
| | | } |
| | | |
| | | // 合并单元格需要动态创建纹理 |
| | | let graphics = getContainerWithSize(value, w, h); |
| | | let texture = pixiApp.renderer.generateTexture(graphics); |
| | | sprite = new PIXI.Sprite(texture); |
| | | |
| | | sprite.position.set(x, y); |
| | | sprite.interactive = true; |
| | | sprite.buttonMode = true; |
| | | |
| | | sprite.on('pointerdown', (e) => { |
| | | pointerDownEvent(e) |
| | |
| | | sprite.tint = color; |
| | | } |
| | | |
| | | function isJson(str) { |
| | | try { |
| | | JSON.parse(str); |
| | | return true; |
| | | } catch (e) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | function getDeviceNo(obj) { |
| | | if (this.isJson(obj)) { |
| | | let data = JSON.parse(obj) |
| | | if (data.deviceNo == null || data.deviceNo == undefined) { |
| | | return -1; |
| | | } |
| | | return data.deviceNo; |
| | | } else { |
| | | return -1; |
| | | } |
| | | } |
| | | |
| | | function getStationId(obj) { |
| | | if (this.isJson(obj)) { |
| | | let data = JSON.parse(obj) |
| | | if (data.stationId == null || data.stationId == undefined) { |
| | | return -1; |
| | | } |
| | | return data.stationId; |
| | | } else { |
| | | return -1; |
| | | } |
| | | } |
| | | |
| | | function getTrackSiteNo(obj) { |
| | | if (this.isJson(obj)) { |
| | | let data = JSON.parse(obj) |
| | | if (data.trackSiteNo == null || data.trackSiteNo == undefined) { |
| | | return -1; |
| | | } |
| | | return data.trackSiteNo; |
| | | } else { |
| | | return -1; |
| | | } |
| | | } |
| | | |
| | | </script> |
| | | </body> |
| | | </html> |