| | |
| | | <title>WCS控制中心</title> |
| | | <link rel="stylesheet" href="../static/css/console.css"> |
| | | <link rel="stylesheet" href="../static/css/animate.min.css"> |
| | | <link rel="stylesheet" href="../static/css/toggle-switch.css"> |
| | | <script src="../static/js/jquery/jquery-3.3.1.min.js"></script> |
| | | <script src="../static/js/layer/layer.js"></script> |
| | | <script type="text/javascript" src="../static/js/common.js"></script> |
| | |
| | | </header> |
| | | <main class="main"> |
| | | <!--楼层按钮--> |
| | | <button class="floorBtn btn-16" onclick="changFloor(1)" style="margin-top: 150px">1F</button> |
| | | <button class="floorBtn btn-16" onclick="changFloor(2)" style="margin-top: 200px">2F</button> |
| | | <button class="floorBtn btn-16" onclick="changFloor(3)" style="margin-top: 250px">3F</button> |
| | | <button class="floorBtn btn-16" onclick="testMove()" style="margin-top: 250px">测试移动小车</button> |
| | | <div id="floorBtnBox"> |
| | | <button class="floorBtn btn-16" onclick="changFloor(this,1)" style="margin-top: 150px">1F</button> |
| | | <button class="floorBtn btn-16" onclick="changFloor(this,2)" style="margin-top: 200px">2F</button> |
| | | <button class="floorBtn btn-16" onclick="changFloor(this,3)" style="margin-top: 250px">3F</button> |
| | | <button class="floorBtn btn-16" onclick="changFloor(this,4)" style="margin-top: 300px">4F</button> |
| | | </div> |
| | | <button class="floorBtn btn-16" onclick="testMove()" style="margin-top: 350px;font-size: 14px;">测试移动车</button> |
| | | <button class="floorBtn btn-16" onclick="resetMap()" style="margin-top: 400px;font-size: 14px;">重置地图</button> |
| | | |
| | | <!-- 货架 + 堆垛机 + 入库站点 --> |
| | | <div class="main-part"> |
| | | <!-- 第一组 --> |
| | | <div class="lane" id="mapDataId" style="margin-bottom: 280px"> |
| | | <div class="sxcar" id="sxcar-1"></div> |
| | | <!-- 货架 --> |
| | | <!-- <div class="stock-group">--> |
| | | <!-- <button class="item">1</button>--> |
| | | <!-- <button class="item">2</button>--> |
| | | <!-- <button class="item">3</button>--> |
| | | <!-- <button class="item">4</button>--> |
| | | <!-- <button class="item">5</button>--> |
| | | <!-- <button class="item">6</button>--> |
| | | <!-- <button class="item">7</button>--> |
| | | <!-- <button class="item">8</button>--> |
| | | <!-- <button class="item">9</button>--> |
| | | <!-- <button class="item">10</button>--> |
| | | <!-- <button class="item">11</button>--> |
| | | <!-- <button class="item">12</button>--> |
| | | <!-- <button class="item">13</button>--> |
| | | <!-- <button class="item">14</button>--> |
| | | <!-- <button class="item">15</button>--> |
| | | <!-- <button class="item">16</button>--> |
| | | <!-- <button class="item">17</button>--> |
| | | <!-- <button class="item">18</button>--> |
| | | <!-- <button class="item">19</button>--> |
| | | <!-- <button class="item">20</button>--> |
| | | <!-- <button class="item">21</button>--> |
| | | <!-- <button class="item">22</button>--> |
| | | <!-- <button class="item">23</button>--> |
| | | <!-- <button class="item">24</button>--> |
| | | <!-- <button class="item">25</button>--> |
| | | <!-- <span class="row-no">1#</span>--> |
| | | <!-- </div>--> |
| | | <!-- 堆垛机 --> |
| | | <!-- <div class="crn">--> |
| | | <!-- <hr class="pathway">--> |
| | | <!-- <div id="crn-1" class="machine"></div>--> |
| | | <!-- </div>--> |
| | | |
| | | </div> |
| | | </div> |
| | | </main> |
| | |
| | | <div class="system-state"> |
| | | <div class="body-head">总开关</div> |
| | | <div class="switch"> |
| | | <div id="system-icon" class="system-icon-open" onclick="systemSwitch()"></div> |
| | | <label id="system-toggle" class="toggle-switch" style="margin-left: 20px;"> |
| | | <input id="system-toggle-checked" checked="checked" type="checkbox"> |
| | | <div class="button"> |
| | | <div class="light"></div> |
| | | <div class="dots"></div> |
| | | <div class="characters"></div> |
| | | <div class="shine"></div> |
| | | <div class="shadow"></div> |
| | | </div> |
| | | </label> |
| | | |
| | | <div class="switch_r"> |
| | | <p>系统状态</p> |
| | | <p id="system-run-desc">系统运行中</p> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 堆垛机状态 --> |
| | | <div class="machine-status"> |
| | | <div class="body-head">堆垛机状态</div> |
| | | <div class="state"> |
| | | <span>堆垛机 1</span> |
| | | <span class="state-ss machine-put-flag ">入库</span> |
| | | <!-- 四向穿梭车状态 --> |
| | | <div class="line-status"> |
| | | <div class="body-head">穿梭车状态</div> |
| | | <div id="shuttle-status-box"> |
| | | </div> |
| | | <!-- <div class="state">--> |
| | | <!-- <span>堆垛机 2</span>--> |
| | | <!-- <span class="state-ss machine-auto-flag ">自动</span>--> |
| | | |
| | | <!-- </div>--> |
| | | <div class="button"><span>所有状态</span></div> |
| | | <div class="button item-group"> |
| | | <span class="machine-put-flag">入库</span> |
| | | <span class="machine-take-flag">出库</span> |
| | | <span class="machine-stock-move-flag">库到库</span> |
| | | <span class="machine-site-move-flag">站到站</span> |
| | | <span class="machine-p-move-flag">PToP</span> |
| | | <span class="machine-error-flag">异常</span> |
| | | <span class="machine-auto-flag">自动</span> |
| | | <span class="machine-unauto-flag">非自动/手动</span> |
| | | <span class="shuttle-idle">空闲</span> |
| | | <span class="shuttle-working">作业中</span> |
| | | <span class="shuttle-waiting">等待确认</span> |
| | | <span class="shuttle-charging">充电中</span> |
| | | <span class="shuttle-charging-waiting">充电任务等待确认</span> |
| | | <span class="shuttle-fixing">故障修复中</span> |
| | | <span class="shuttle-offline">离线</span> |
| | | </div> |
| | | </div> |
| | | <!-- 提升机状态 --> |
| | | <div class="line-status"> |
| | | <div class="body-head">提升机状态</div> |
| | | <div id="lift-status-box"> |
| | | |
| | | </div> |
| | | <div class="button"><span>所有状态</span></div> |
| | | <div class="button item-group"> |
| | | <span class="lift-idle">空闲</span> |
| | | <span class="lift-working">作业中</span> |
| | | <span class="lift-waiting">等待确认</span> |
| | | <span class="lift-offline">离线</span> |
| | | </div> |
| | | </div> |
| | | <!-- 输送线状态 --> |
| | |
| | | <li><span>条码名称</span><span class="right">扫码时间</span></li> |
| | | </div> |
| | | <div id="barcode2" class="table-body"> |
| | | |
| | | </div> |
| | | </div> |
| | | <div class="tablebox"> |
| | | <div class="table-head"> |
| | | <li><span>条码名称</span><span class="right">扫码时间</span></li> |
| | | </div> |
| | | <div id="barcode3" class="table-body"> |
| | | |
| | | </div> |
| | | </div> |
| | |
| | | var tData1 = [] |
| | | var tData2 = [] |
| | | var tData3 = [] |
| | | var mapData = [] //地图数据 |
| | | var currentLev = 1;//当前地图楼层 |
| | | function getCodeData(){ |
| | | $.ajax({ |
| | | url:baseUrl +'/console/barcode/output/site', |
| | |
| | | |
| | | |
| | | $(function (){ |
| | | initMap() |
| | | initMap(1) |
| | | }) |
| | | |
| | | setInterval(() => { |
| | | getShuttleStateInfo() |
| | | getLiftStateInfo() |
| | | },1000) |
| | | |
| | | // 提升机信息表获取 |
| | | function getLiftStateInfo() { |
| | | $.ajax({ |
| | | url: baseUrl+ "/lift/table/lift/state", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | method: 'POST', |
| | | success: function (res) { |
| | | $("#lift-status-box").empty() |
| | | res.data.forEach((item,index) => { |
| | | let liftStatusClass = "lift-idle" |
| | | switch (item.status) { |
| | | case 1://空闲 |
| | | liftStatusClass = "lift-idle"; |
| | | break |
| | | case 2://作业中 |
| | | liftStatusClass = "lift-working"; |
| | | break |
| | | case 3://等待确认 |
| | | liftStatusClass = "lift-waiting"; |
| | | break |
| | | case 4://离线 |
| | | liftStatusClass = "lift-offline"; |
| | | break |
| | | default: |
| | | liftStatusClass = "lift-idle" |
| | | } |
| | | let liftStatus = '<div class="state states">' + |
| | | '<span>提升机 ' + item.liftNo + '</span>' + |
| | | '<span class="state-ss ' + liftStatusClass + '">' + item.protocolStatus$ + '</span></div>'; |
| | | $("#lift-status-box").append(liftStatus) |
| | | |
| | | }) |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // 四向穿梭车信息表获取 |
| | | function getShuttleStateInfo() { |
| | | $.ajax({ |
| | | url: baseUrl+ "/shuttle/table/shuttle/state", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | method: 'POST', |
| | | success: function (res) { |
| | | $("#shuttle-status-box").empty() |
| | | res.data.forEach((item,index) => { |
| | | let shuttleStatusClass = "shuttle-idle" |
| | | switch (item.status) { |
| | | case 1://空闲 |
| | | shuttleStatusClass = "shuttle-idle"; |
| | | break |
| | | case 2://作业中 |
| | | shuttleStatusClass = "shuttle-working"; |
| | | break |
| | | case 3://等待确认 |
| | | shuttleStatusClass = "shuttle-waiting"; |
| | | break |
| | | case 4://充电中 |
| | | shuttleStatusClass = "shuttle-charging"; |
| | | break |
| | | case 5://充电任务等待确认 |
| | | shuttleStatusClass = "shuttle-charging-waiting"; |
| | | break |
| | | case 6://故障修复中 |
| | | shuttleStatusClass = "shuttle-fixing"; |
| | | break |
| | | case 7://离线 |
| | | shuttleStatusClass = "shuttle-offline"; |
| | | break |
| | | default: |
| | | shuttleStatusClass = "shuttle-offline" |
| | | } |
| | | let shuttleStatus = '<div class="state">' + |
| | | '<span>四向穿梭车 ' + item.shuttleNo + '</span>' + |
| | | '<span class="state-ss ' + shuttleStatusClass + '">' + item.status$ + '</span></div>'; |
| | | $("#shuttle-status-box").append(shuttleStatus) |
| | | |
| | | if(item.locNoLev != currentLev){ |
| | | //四向穿梭车楼层和当前地图楼层不一致,删除该车辆 |
| | | $("#sxcar-" + item.shuttleNo).remove() |
| | | }else { |
| | | //移动四向穿梭车 |
| | | moveCar(item.shuttleNo,item.locNoX,item.locNoY) |
| | | } |
| | | }) |
| | | } |
| | | }); |
| | | } |
| | | |
| | | //计算四向穿梭车图标位置 |
| | | function getCarPosition(x,y) { |
| | | let top = (x * 30) + "px" |
| | | let left = (y * 40 - 40) + "px" //需要减去小车自己所占宽度 |
| | | let top = (x * 35 - 35) + "px" //需要减去小车自己所占高度 |
| | | let left = (y * 70 - 70) + "px" //需要减去小车自己所占宽度 |
| | | return [top,left]; |
| | | } |
| | | |
| | |
| | | let position = getCarPosition(x,y) |
| | | let top = position[0] |
| | | let left = position[1] |
| | | console.log(top,left) |
| | | $("#sxcar-" + id).animate({top: top,left: left}, 1000); |
| | | } |
| | | |
| | | //初始化地图 |
| | | function initMap() { |
| | | //母轨道第一次索引,用于定位小车 |
| | | let firstMotherIndex = [0,0]; |
| | | function initMap(lev) { |
| | | getMap(lev) |
| | | |
| | | $.ajax({ |
| | | url: baseUrl+ "/shuttle/table/shuttle/state", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | method: 'POST', |
| | | success: function (res) { |
| | | res.data.forEach((item,index) => { |
| | | if(lev == item.locNoLev){ |
| | | let carBox = '<div class="sxcar" id="sxcar-' + item.shuttleNo + '"></div>' |
| | | $("#mapDataId").append(carBox) |
| | | } |
| | | }) |
| | | } |
| | | }); |
| | | } |
| | | |
| | | //获取地图数据 |
| | | function getMap(lev) { |
| | | //母轨道第一次索引,用于定位小车 |
| | | let firstMotherIndex = [0,0]; |
| | | $("#mapDataId").empty() |
| | | $.ajax({ |
| | | type:"get", |
| | | url: baseUrl + "/static/js/map.json", |
| | | success: (data) => { |
| | | // url: baseUrl + "/static/js/map_" + lev + ".json", |
| | | url: baseUrl + "/console/map/" + lev + "/auth", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | success: (res) => { |
| | | let data = res.data |
| | | mapData = data |
| | | let content = "" |
| | | data.forEach((rowData,index) => { |
| | | let lastGroup = '<div class="stock-group">' |
| | | //去掉上下边缘禁区 |
| | | if(!(index == 0 || data.length - 1 == index)){ |
| | | let row = '<div class="stock-group">'; |
| | |
| | | //去掉左右边缘禁区 |
| | | if(!(idx == 0 || rowData.length - 1 == idx)){ |
| | | let col; |
| | | switch (colData){ |
| | | switch (colData.value){ |
| | | case -999: |
| | | col = '<button class="item" style="background:#f83333;color: #fff;">' + idx + '</button>'; |
| | | break; |
| | | case -1: |
| | | //-1禁区不显示,但是需要占用元素位置 |
| | | col = '<button class="item" style="visibility: hidden">' + idx + '</button>'; |
| | | break; |
| | | case 3: |
| | |
| | | firstMotherIndex = [index,idx] |
| | | } |
| | | break; |
| | | case 4: |
| | | //站点 |
| | | var data = colData.data; |
| | | col = '<div id="site-' + data + '" class="site">' + data + '(9991)</div>'; |
| | | break; |
| | | case 5: |
| | | //充电桩 |
| | | col = '<button class="item" style="font-size: 24px">⚡</button>'; |
| | | break; |
| | | default: |
| | | col = '<button class="item">' + index + '</button>'; |
| | | col = '<button class="item">' + idx + '</button>'; |
| | | } |
| | | |
| | | if(data.length - 2 == index){ |
| | | //到达真实数据的最后一行,打上行数标记 |
| | | lastGroup += '<button class="item">' + idx + '#</button>'; |
| | | if(rowData.length - 2 == idx){ |
| | | //打上行数标记 |
| | | col += '<span class="row-no">' + index + '#</span>'; |
| | | } |
| | | row += col |
| | | } |
| | | }) |
| | | lastGroup += '</div>'; |
| | | row += lastGroup; |
| | | row += '</div>'; |
| | | content += row |
| | | } |
| | | }) |
| | | |
| | | |
| | | moveCar(1, firstMotherIndex[0], firstMotherIndex[1]); |
| | | $("#mapDataId").append(content) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | //将地图数据转换成int二维数组(后续用于请求计算路径时携带地图数据参数使用) |
| | | function getMap2TwoArr() { |
| | | let data = [] |
| | | mapData.forEach((item,index) => { |
| | | let data2 = [] |
| | | item.forEach((val,idx) => { |
| | | data2.push(val.value) |
| | | }) |
| | | data.push(data2) |
| | | }) |
| | | |
| | | return data; |
| | | } |
| | | |
| | | function testMove() { |
| | | getMap2TwoArr()//测试地图数据转换是否正常 |
| | | let json = "[{\n" + |
| | | "\t\t\"x\": 5,\n" + |
| | | "\t\t\"y\": 5\n" + |
| | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 重置地图 |
| | | */ |
| | | function resetMap() { |
| | | $.ajax({ |
| | | url:baseUrl+"/console/map/resetMap/auth", |
| | | headers:{ |
| | | 'token': localStorage.getItem('token') |
| | | }, |
| | | data:{}, |
| | | method:'get', |
| | | success:function (res) { |
| | | layer.msg('重置完成'); |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 小车偏移动画 |
| | | function carAnimate(id, target) { |
| | | if (id === 1000) { |
| | |
| | | </script> |
| | | <script type="text/javascript"> |
| | | // 弹窗站点信息 |
| | | $('.site').on('click',function(){ |
| | | $('#mapDataId').on('click','.site',function(){ |
| | | var id = this.id.split("-")[1]; |
| | | $("#siteWindow").attr("style","display:block;");//显示div |
| | | $("#crnWindow").attr("style","display:none;"); |
| | |
| | | }) |
| | | |
| | | |
| | | |
| | | var crn1Position = 0; |
| | | var crn2Position = 0; |
| | | var crn3Position = 0; |
| | |
| | | setInterval(function () { |
| | | getSitesInfo(); |
| | | }, 3000); |
| | | |
| | | $("#system-toggle").on("click",(e) => { |
| | | systemSwitch() |
| | | e.stopPropagation();//表示阻止向父元素冒泡 |
| | | e.preventDefault();//阻止 方法阻止元素发生默认的行为(例如,当点击提交按钮时阻止对表单的提交或者a标签)。 |
| | | }) |
| | | |
| | | // 系统运行开关 |
| | | function systemSwitch() { |
| | |
| | | layer.close(index); |
| | | if (res.code === 200){ |
| | | if (res.data.status) { |
| | | $('#system-icon').attr("class", "system-icon-open"); |
| | | $('#system-toggle-checked').attr("checked", true); |
| | | $('#system-run-desc').html("系统运行中..."); |
| | | parent.systemRunning = true; |
| | | } else { |
| | | $('#system-icon').attr("class", "system-icon-close"); |
| | | $('#system-toggle-checked').attr("checked", false); |
| | | $('#system-run-desc').html("系统已停止!"); |
| | | parent.systemRunning = false; |
| | | } |
| | |
| | | success: function (res) { |
| | | if (res.code === 200){ |
| | | if (res.data.status) { |
| | | $('#system-icon').attr("class", "system-icon-open"); |
| | | $('#system-toggle-checked').attr("checked", true); |
| | | $('#system-run-desc').html("系统运行中..."); |
| | | parent.systemRunning = true; |
| | | } else { |
| | | $('#system-icon').attr("class", "system-icon-close"); |
| | | $('#system-toggle-checked').attr("checked", false); |
| | | $('#system-run-desc').html("系统已停止!"); |
| | | parent.systemRunning = false; |
| | | } |
| | |
| | | }); |
| | | } |
| | | |
| | | // 堆垛机偏移动画 |
| | | function crnAnimate(id, leftVal) { |
| | | switch (id) { |
| | | case 1: |
| | | $("#crn-1").animate({left: leftVal+'px'}, 1000); |
| | | crn1Position = leftVal; |
| | | break; |
| | | case 2: |
| | | $("#crn-2").animate({left: leftVal+'px'}, 1000); |
| | | crn2Position = leftVal; |
| | | break; |
| | | case 3: |
| | | $("#crn-3").animate({left: leftVal+'px'}, 1000); |
| | | crn3Position = leftVal; |
| | | break; |
| | | case 4: |
| | | $("#crn-4").animate({left: leftVal+'px'}, 1000); |
| | | crn4Position = leftVal; |
| | | break; |
| | | case 5: |
| | | $("#crn-5").animate({left: leftVal+'px'}, 1000); |
| | | crn5Position = leftVal; |
| | | break; |
| | | default: |
| | | break |
| | | } |
| | | } |
| | | |
| | | // 页面点击事件监听 --------------------------------------------------------- |
| | | |
| | | // 输送设备点击事件 |
| | | // $('.site').on('click', function () { |
| | | // var id = this.id.split("-")[1]; |
| | | // if (id === undefined) { |
| | | // return; |
| | | // } |
| | | // layer.open({ |
| | | // title: id + " 站点信息详情", |
| | | // closeBtn: 0, |
| | | // skin: 'layui-layer-lan', |
| | | // offset: '180px', |
| | | // type: 1, |
| | | // shadeClose: true, |
| | | // content: $('#siteWindow'), |
| | | // area: ['35rem', '18rem'], |
| | | // btn: ['确定', '关闭'], |
| | | // success: function(layero, index){ |
| | | // http.post(baseUrl+"/console/site/detail", {siteId: id}, function (res) { |
| | | // for (var val in res.data) { |
| | | // var find = $("#siteWindow").find(":input[name='" + val + "']"); |
| | | // if (find[0].type==='text') { |
| | | // find.val(res.data[val]); |
| | | // } else if (find[0].type === 'checkbox') { |
| | | // find.attr("checked", res.data[val] === 'Y'); |
| | | // } |
| | | // } |
| | | // }) |
| | | // }, |
| | | // end: function () { |
| | | // $(':input', $("#siteWindow")).val('').removeAttr('checked').removeAttr('selected'); |
| | | // } |
| | | // }); |
| | | // }); |
| | | |
| | | // 堆垛机点击事件 |
| | | // $('.machine').on('click', function () { |
| | | // var id = this.id.split("-")[1]; |
| | | // layer.open({ |
| | | // title: id+"号堆垛机", |
| | | // skin: 'layui-layer-lan', |
| | | // closeBtn: 0, |
| | | // type: 1, |
| | | // offset: '150px', |
| | | // shadeClose: true, |
| | | // content: $("#crnWindow"), |
| | | // area: ['40rem', '20rem'], |
| | | // btn: ['确定', '关闭'], |
| | | // success: function(layero, index){ |
| | | // http.post(baseUrl+"/console/crn/detail", {crnNo: id}, function (res) { |
| | | // for (var val in res.data) { |
| | | // var find = $("#crnWindow").find(":input[name='" + val + "']"); |
| | | // if (find[0].type==='text') { |
| | | // find.val(res.data[val]); |
| | | // } else if (find[0].type === 'checkbox') { |
| | | // find.attr("checked", res.data[val] === 'Y'); |
| | | // } |
| | | // } |
| | | // }) |
| | | // }, |
| | | // end: function () { |
| | | // $(':input', $("#crnWindow")).val('').removeAttr('checked').removeAttr('selected'); |
| | | // } |
| | | // }); |
| | | // }); |
| | | |
| | | |
| | | // 小车偏移动画 |
| | | function carAnimate(id, target) { |
| | | var targetTop = 122; |
| | |
| | | $("#site-" + id).animate({top: targetTop+'px'}, 1000); |
| | | } |
| | | |
| | | |
| | | //楼层切换按钮 |
| | | function changFloor(x) { |
| | | switch (x) { |
| | | case 1: |
| | | $('#fool1').css("display","block") |
| | | $('#fool2').css("display","none") |
| | | $('#fool3').css("display","none") |
| | | return |
| | | case 2: |
| | | $('#fool1').css("display","none") |
| | | $('#fool2').css("display","block") |
| | | $('#fool3').css("display","none") |
| | | return |
| | | case 3: |
| | | $('#fool1').css("display","none") |
| | | $('#fool2').css("display","none") |
| | | $('#fool3').css("display","block") |
| | | return |
| | | default: |
| | | return; |
| | | |
| | | } |
| | | function changFloor(e,x) { |
| | | $("#floorBtnBox button").each((index,item) => { |
| | | $(item).removeClass("btn-16-active") |
| | | }) |
| | | $(e).addClass("btn-16-active") |
| | | currentLev = x |
| | | initMap(currentLev) |
| | | } |
| | | |
| | | </script> |