| <!DOCTYPE html> | 
| <html lang="en"> | 
| <head> | 
|     <meta charset="utf-8"> | 
|     <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> | 
| </head> | 
| <body> | 
| <div class="root"> | 
|     <header class="header"> | 
|         <h1>自动仓库WCS监控图</h1> | 
|         <h6>AUTOMATIC WAREHOUSE WCS MONITORING DIAGRAM</h6> | 
|     </header> | 
|     <main class="main"> | 
|         <!--楼层按钮--> | 
|             <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> | 
|         </div> | 
|     </main> | 
|     <footer class="footer"> | 
|         <!-- 总开关 --> | 
|         <div class="system-state"> | 
|             <div class="body-head">总开关</div> | 
|             <div class="switch"> | 
|                 <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="line-status"> | 
|             <div class="body-head">穿梭车状态</div> | 
|             <div id="shuttle-status-box"> | 
|             </div> | 
|             <div class="button"><span>所有状态</span></div> | 
|             <div class="button item-group"> | 
|                 <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> | 
|         <!-- 输送线状态 --> | 
|         <div class="line-status"> | 
|             <div class="body-head">输送线状态</div> | 
|             <div class="state states"> | 
|                 <span>运输线总数</span> | 
|                 <span class="line-ss">9</span> | 
|             </div> | 
|             <div class="button"><span>所有状态</span></div> | 
|             <div class="button item-group"> | 
|                 <span class="site-auto-run-id">自动+有物+ID</span> | 
|                 <span class="site-auto-run">自动+有物</span> | 
|                 <span class="site-auto-id">自动+ID</span> | 
|                 <span class="site-auto">自动</span> | 
|                 <span class="site-unauto">非自动/手动</span> | 
|             </div> | 
|         </div> | 
|         <!-- 条码表格 --> | 
|         <div class="bar-code"> | 
|             <div class="body-head" id="code">条码扫描器</div> | 
|             <div class="tablebox"> | 
|                 <div class="table-head"> | 
|                     <li><span>条码名称</span><span class="right">扫码时间</span></li> | 
|                 </div> | 
|                 <div id="barcode1" class="table-body"> | 
|   | 
|                 </div> | 
|             </div> | 
|             <div class="tablebox"> | 
|                 <div class="table-head"> | 
|                     <li><span>条码名称</span><span class="right">扫码时间</span></li> | 
|                 </div> | 
|                 <div id="barcode2" class="table-body"> | 
|   | 
|                 </div> | 
|             </div> | 
|         </div> | 
|     </footer> | 
|   | 
|     <!-- 堆垛机弹窗 --> | 
|     <div id="crnWindow" style="display: none;" class="animate__animated animate__fadeIn"> | 
|         <div id="crnWindow-head"> | 
|             <div class='detailed'></div> | 
|             <button></button> | 
|         </div> | 
|         <form> | 
|             <!-- 堆垛机号 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label" style> | 
|                     <span>堆垛机号:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="crnNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 工作号 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>工作号:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="workNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 站源 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>站源:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="sourceStaNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 目标站 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>目标站:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="staNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 工作状态 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>工作状态:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="wrkSts" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 出入类型 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>出入类型:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="ioType" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 源库位 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>源库位:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="sourceLocNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 目标库位 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>目标库位:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="locNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 堆垛机状态 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>堆垛机状态:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="crnStatus" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 异常 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>异常:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="error" value=""> | 
|                 </div> | 
|             </div> | 
|         </form> | 
|     </div> | 
|   | 
|     <!-- 输送设备弹窗 --> | 
|     <div id="siteWindow" style="display: none;" class="animate__animated animate__fadeIn"> | 
|         <!-- 表头 --> | 
|         <div id="siteWindow-head"> | 
|             <div class='detailed'></div> | 
|             <button></button> | 
|         </div> | 
|         <form> | 
|             <!-- 设备号 --> | 
|             <div class="form-item"  > | 
|                 <div class="form-item-label"> | 
|                     <span>设备号:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="siteId" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 工作号 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>工作号:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="workNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 工作状态 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>工作状态:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="wrkSts" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 自动 --> | 
|             <div class="form-item-checkbox"> | 
|                 <div class="form-item-label-checkbox"> | 
|                     <span>自动</span> | 
|                 </div> | 
|                 <div class="form-item-input-checkbox"> | 
|                     <input type="checkbox" name="autoing"> | 
|                 </div> | 
|             </div> | 
|             <!-- 有物 --> | 
|             <div class="form-item-checkbox"> | 
|                 <div class="form-item-label-checkbox"> | 
|                     <span>有物</span> | 
|                 </div> | 
|                 <div class="form-item-input-checkbox"> | 
|                     <input type="checkbox" name="loading"> | 
|                 </div> | 
|             </div> | 
|             <!-- 能入 --> | 
|             <div class="form-item-checkbox"> | 
|                 <div class="form-item-label-checkbox"> | 
|                     <span>能入</span> | 
|                 </div> | 
|                 <div class="form-item-input-checkbox"> | 
|                     <input type="checkbox" name="canining"> | 
|                 </div> | 
|             </div> | 
|             <!-- 能出 --> | 
|             <div class="form-item-checkbox"> | 
|                 <div class="form-item-label-checkbox"> | 
|                     <span>能出</span> | 
|                 </div> | 
|                 <div class="form-item-input-checkbox"> | 
|                     <input type="checkbox" name="canouting"> | 
|                 </div> | 
|             </div> | 
|             <!-- 出入类型 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>出入类型:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="ioType" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 源站 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>源站:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="sourceStaNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 目标站 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>目标站:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="staNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 源库位 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>源库位:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="sourceLocNo" value=""> | 
|                 </div> | 
|             </div> | 
|             <!-- 目标库位 --> | 
|             <div class="form-item"> | 
|                 <div class="form-item-label"> | 
|                     <span>目标库位:</span> | 
|                 </div> | 
|                 <div class="form-item-input"> | 
|                     <input type="text" name="locNo" value=""> | 
|                 </div> | 
|             </div> | 
|   | 
|         </form> | 
|     </div> | 
| </div> | 
| </body> | 
| </html> | 
| <script> | 
|     var tData = [] | 
|     var tData1 = [] | 
|     var tData2 = [] | 
|     var tData3 = [] | 
|     var mapData = [] //地图数据 | 
|     var currentLev = 1;//当前地图楼层 | 
|     function getCodeData(){ | 
|         $.ajax({ | 
|             url:baseUrl +'/console/barcode/output/site', | 
|             method:'GET', | 
|             success:function (res) { | 
|                 if(res.code === 200){ | 
|                     tData = eval(res.data); | 
|                     if(tData.length<=5){ | 
|                         tData1 = tData | 
|                     } else if (tData.length<=10){ | 
|                         tData1 = tData.slice(0,5) | 
|                         // tData.splice(0,4) | 
|                         tData2 = tData.splice(5,10) | 
|                     } else if(tData.length<=15){ | 
|                         tData1 = tData.slice(0,5) | 
|                         tData2 = tData.slice(5,10) | 
|                         // tData.splice(0,10) | 
|                         tData3 = tData.slice(10,15) | 
|                     } else { | 
|                         tData1 = tData.slice(0,5) | 
|                         tData2 = tData.slice(5,10) | 
|                         tData3 = tData.slice(10,15) | 
|                         // tData = tData.slice(-15) | 
|                         // tData1 = tData.slice(-15) | 
|                         // tData2 = tData.slice(-10) | 
|                         // tData3 = tData.slice(-5) | 
|   | 
|                     } | 
|                 } | 
|             } | 
|         }) | 
|     } | 
|     setInterval(function () { | 
|         getCodeData(); | 
|         renderBarCode(); | 
|     }, 1000) | 
|   | 
|   | 
|     function renderBarCode() { | 
|         for (var i = 0;i<tData1.length;i++){ | 
|             var str1 = '<li><span>' + tData1[i].barcode + '</span><span class="right">' + tData1[i].time + '</span></li>' | 
|             $('#barcode1').append(str1) | 
|         } | 
|         for(var j = 0;j<tData2.length;j++){ | 
|             var str2 = '<li><span>' + tData2[j].barcode + '</span><span class="right">' + tData2[j].time + '</span></li>' | 
|             $('#barcode2').append(str2) | 
|         } | 
|         for(var k = 0;k<tData3.length;k++){ | 
|             var str3 = '<li><span>' + tData3[k].barcode + '</span><span class="right">' + tData3[k].time + '</span></li>' | 
|             $('#barcode3').append(str3) | 
|         } | 
|     } | 
|   | 
|   | 
|     $(function (){ | 
|         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 * 35 - 35) + "px" //需要减去小车自己所占高度 | 
|         let left = (y * 70 - 70) + "px" //需要减去小车自己所占宽度 | 
|         return [top,left]; | 
|     } | 
|   | 
|     //移动四向穿梭车图标 | 
|     function moveCar(id,x,y) { | 
|         //获取具体位置top和left值 | 
|         let position = getCarPosition(x,y) | 
|         let top = position[0] | 
|         let left = position[1] | 
|         $("#sxcar-" + id).animate({top: top,left: left}, 1000); | 
|     } | 
|   | 
|     //初始化地图 | 
|     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_" + 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) => { | 
|                     //去掉上下边缘禁区 | 
|                     if(!(index == 0 || data.length - 1 == index)){ | 
|                         let row = '<div class="stock-group">'; | 
|                         rowData.forEach((colData,idx) => { | 
|                             //去掉左右边缘禁区 | 
|                             if(!(idx == 0 || rowData.length - 1 == idx)){ | 
|                                 let col; | 
|                                 switch (colData.value){ | 
|                                     case -999: | 
|                                         col = '<button class="item" style="background:#f83333;color: #fff;">' + idx + '</button>'; | 
|                                         break; | 
|                                     case -1: | 
|                                         col = '<button class="item" style="visibility: hidden">' + idx + '</button>'; | 
|                                         break; | 
|                                     case 3: | 
|                                         //母轨道 | 
|                                         col = '<button class="item" style="background: #5af;">⇅⇄</button>'; | 
|                                         if (firstMotherIndex[0] === 0 && firstMotherIndex[1] === 0) { | 
|                                             //第一次遇到母轨道,则保存该轨道地址(用于小车初始化定位) | 
|                                             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">' + idx + '</button>'; | 
|                                 } | 
|   | 
|                                 if(rowData.length - 2 == idx){ | 
|                                     //打上行数标记 | 
|                                     col += '<span class="row-no">' + index + '#</span>'; | 
|                                 } | 
|                                 row += col | 
|                             } | 
|                         }) | 
|                         row += '</div>'; | 
|                         content += row | 
|                     } | 
|                 }) | 
|   | 
|                 $("#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" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 6,\n" + | 
|             "\t\t\"y\": 5\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 7,\n" + | 
|             "\t\t\"y\": 5\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 8,\n" + | 
|             "\t\t\"y\": 5\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 9,\n" + | 
|             "\t\t\"y\": 5\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 10,\n" + | 
|             "\t\t\"y\": 5\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 11,\n" + | 
|             "\t\t\"y\": 5\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 11,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 12,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 13,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 14,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 15,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 16,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 17,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 18,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 19,\n" + | 
|             "\t\t\"y\": 6\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 19,\n" + | 
|             "\t\t\"y\": 7\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 19,\n" + | 
|             "\t\t\"y\": 8\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 20,\n" + | 
|             "\t\t\"y\": 8\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 21,\n" + | 
|             "\t\t\"y\": 8\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 22,\n" + | 
|             "\t\t\"y\": 8\n" + | 
|             "\t},\n" + | 
|             "\t{\n" + | 
|             "\t\t\"x\": 23,\n" + | 
|             "\t\t\"y\": 8\n" + | 
|             "\t}\n" + | 
|             "]"; | 
|         json = JSON.parse(json) | 
|         json.forEach((item,index) => { | 
|             moveCar(1, item.x, item.y); | 
|         }) | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 重置地图 | 
|      */ | 
|     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) { | 
|             let targetTop = 130; | 
|             switch (target) { | 
|                 case 110: | 
|                     targetTop += 0; | 
|                     break; | 
|                 case 109: | 
|                     targetTop += 60; | 
|                     break; | 
|                 case 108: | 
|                     targetTop += 100; | 
|                     break; | 
|                 case 107: | 
|                     targetTop += 180; | 
|                     break; | 
|                 case 106: | 
|                     targetTop += 220; | 
|                     break; | 
|                 default: | 
|                     return; | 
|             } | 
|             $("#site-" + id).animate({top: targetTop+'px'}, 1000); | 
|         } else if (id === 2000) { | 
|             let targetTop = 130; | 
|             switch (target) { | 
|                 case 226: | 
|                     targetTop += 0; | 
|                     break; | 
|                 case 225: | 
|                     targetTop += 60; | 
|                     break; | 
|                 case 224: | 
|                     targetTop += 100; | 
|                     break; | 
|                 case 223: | 
|                     targetTop += 180; | 
|                     break; | 
|                 case 222: | 
|                     targetTop += 220; | 
|                     break; | 
|                 case 214: | 
|                     targetTop += 280; | 
|                     break; | 
|                 case 220: | 
|                     targetTop += 320; | 
|                     break; | 
|                 default: | 
|                     return; | 
|             } | 
|             $("#site-" + id).animate({top: targetTop+'px'}, 1000); | 
|         } | 
|     } | 
| </script> | 
| <script type="text/javascript"> | 
|     // 弹窗站点信息 | 
|     $('#mapDataId').on('click','.site',function(){ | 
|         var id = this.id.split("-")[1]; | 
|         $("#siteWindow").attr("style","display:block;");//显示div | 
|         $("#crnWindow").attr("style","display:none;"); | 
|         $(".detailed").empty(); | 
|         $('.detailed').append(id+'站点详细信息'); | 
|         $.ajax({ | 
|             url:baseUrl+"/console/site/detail", | 
|             headers:{ | 
|                 'token': localStorage.getItem('token') | 
|             }, | 
|             data:{ | 
|                 siteId: id | 
|             }, | 
|             method:'post', | 
|             success: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'); | 
|                     } | 
|                 } | 
|             } | 
|   | 
|         }) | 
|   | 
|     }); | 
|     // 堆垛机信息 | 
|     $('.machine').on('click',function(){ | 
|         var id = this.id.split("-")[1]; | 
|         $("#crnWindow").attr('style','display:block;'); | 
|         $("#siteWindow").attr("style","display:none;"); | 
|         $('.detailed').empty(); | 
|         $('.detailed').append(id+'号堆垛机'); | 
|         $.ajax({ | 
|             url:baseUrl+"/console/crn/detail", | 
|             headers:{ | 
|                 'token': localStorage.getItem('token') | 
|             }, | 
|             data:{ | 
|                 crnNo: id | 
|             }, | 
|             method:'post', | 
|             success: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'); | 
|                     } | 
|                 } | 
|             } | 
|   | 
|         }) | 
|   | 
|     }) | 
|     // 弹窗关闭 | 
|     $('button').on('click',function(){ | 
|         $('#siteWindow').attr('style','display:none') | 
|         $('#crnWindow').attr('style','display:none') | 
|     }) | 
|   | 
|   | 
|     var crn1Position = 0; | 
|     var crn2Position = 0; | 
|     var crn3Position = 0; | 
|     var crn4Position = 0; | 
|     var crn5Position = 0; | 
|   | 
|     // 初始化 | 
|     getSitesInfo(); | 
|     getCrnInfo(); | 
|     getSystemRunningStatus(); | 
|     getBarcodeInfo(); | 
|     getScaleInfo(); | 
|     // 实时访问 | 
|     setInterval(function () { | 
|         getCrnInfo(); | 
|         getSystemRunningStatus(); | 
|         getBarcodeInfo(); | 
|         getScaleInfo(); | 
|     }, 1000); | 
|     setInterval(function () { | 
|         getSitesInfo(); | 
|     }, 3000); | 
|   | 
|     $("#system-toggle").on("click",(e) => { | 
|         systemSwitch() | 
|         e.stopPropagation();//表示阻止向父元素冒泡 | 
|         e.preventDefault();//阻止 方法阻止元素发生默认的行为(例如,当点击提交按钮时阻止对表单的提交或者a标签)。 | 
|     }) | 
|   | 
|     // 系统运行开关 | 
|     function systemSwitch() { | 
|         if (parent.systemRunning){ | 
|             layer.prompt({title: '请输入口令,并停止 WCS 系统', formType: 1,   shadeClose: true}, function(pass, idx){ | 
|                 layer.close(idx); | 
|                 doSwitch(0, pass); // 停止wcs系统 | 
|             }); | 
|         } else { | 
|             doSwitch(1); // 启动wcs系统 | 
|         } | 
|     } | 
|   | 
|     // 请求服务器控制wcs系统运行状态 | 
|     function doSwitch(operatorType, password) { | 
|         // 加载tips | 
|         var index = layer.load(1, { | 
|             shade: [0.1,'#fff'] | 
|         }); | 
|         $.ajax({ | 
|             url: baseUrl+ "/console/system/switch", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             // async: false, | 
|             data: { | 
|                 operatorType: operatorType, | 
|                 password: password | 
|             }, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 layer.close(index); | 
|                 if (res.code === 200){ | 
|                     if (res.data.status) { | 
|                         $('#system-toggle-checked').attr("checked", true); | 
|                         $('#system-run-desc').html("系统运行中..."); | 
|                         parent.systemRunning = true; | 
|                     } else { | 
|                         $('#system-toggle-checked').attr("checked", false); | 
|                         $('#system-run-desc').html("系统已停止!"); | 
|                         parent.systemRunning = false; | 
|                     } | 
|                 } else if (res.code === 403){ | 
|                     parent.location.href = baseUrl+"/login"; | 
|                 }  else { | 
|                     console.log(res.msg); | 
|   | 
|                 } | 
|             } | 
|         }); | 
|   | 
|     } | 
|   | 
|     // 获取wcs系统运行状态 | 
|     function getSystemRunningStatus() { | 
|         $.ajax({ | 
|             url: baseUrl+ "/console/system/running/status", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 if (res.code === 200){ | 
|                     if (res.data.status) { | 
|                         $('#system-toggle-checked').attr("checked", true); | 
|                         $('#system-run-desc').html("系统运行中..."); | 
|                         parent.systemRunning = true; | 
|                     } else { | 
|                         $('#system-toggle-checked').attr("checked", false); | 
|                         $('#system-run-desc').html("系统已停止!"); | 
|                         parent.systemRunning = false; | 
|                     } | 
|                 } else if (res.code === 403){ | 
|                     parent.location.href = baseUrl+"/login"; | 
|                 }  else { | 
|                     console.log(res.msg); | 
|                 } | 
|             } | 
|         }); | 
|     } | 
|   | 
|     // 输送设备实时数据获取 | 
|     function getSitesInfo(){ | 
|         $.ajax({ | 
|             url: baseUrl+ "/console/latest/data/site", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 if (res.code === 200){ | 
|                     var sites = res.data; | 
|                     for (var i = 0; i < sites.length; i++){ | 
|                         var siteEl = $("#site-"+sites[i].siteId); | 
|                         siteEl.attr("class", "site " + sites[i].siteStatus); | 
|                         if (sites[i].workNo != null && sites[i].workNo>0) { | 
|                             siteEl.html(sites[i].siteId + "[" + sites[i].workNo + "]"); | 
|                         } else { | 
|                             siteEl.html(sites[i].siteId); | 
|                         } | 
|                         if (i+1===8) { | 
|                             carAnimate(i+1, Number(sites[i].nearbySta)); | 
|                         } | 
|                     } | 
|                 } else if (res.code === 403){ | 
|                     parent.location.href = baseUrl+"/login"; | 
|                 }  else { | 
|                     console.log(res.msg); | 
|                 } | 
|             } | 
|         }); | 
|     } | 
|   | 
|     // 堆垛机实时数据获取 | 
|     function getCrnInfo(){ | 
|         $.ajax({ | 
|             url: baseUrl+ "/console/latest/data/crn", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 if (res.code === 200){ | 
|                     var crns = res.data; | 
|                     for (var i = 0; i < crns.length; i++){ | 
|                         var crnEl = $("#crn-"+crns[i].crnId); | 
|                         crnEl.attr("class", "machine " + crns[i].crnStatus); | 
|                         var unit = ($('.item').eq(0).width()+4)/2; | 
|                         crnEl.animate({left: (crns[i].bay * unit + 25) +'px'}, 1000); | 
|                     } | 
|                 } else if (res.code === 403){ | 
|                     parent.location.href = baseUrl+"/login"; | 
|                 }  else { | 
|                     console.log(res.msg); | 
|                 } | 
|             } | 
|         }); | 
|     } | 
|   | 
|     // 扫码器实时数据获取 | 
|     function getBarcodeInfo(){ | 
|         $.ajax({ | 
|             url: baseUrl+ "/console/latest/data/barcode", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 if (res.code === 200){ | 
|                     var barcodes = res.data; | 
|                     for (var i = 0; i < barcodes.length; i++){ | 
|                         $("#code-decoder-data-"+barcodes[i].barcodeId).html(barcodes[i].codeValue); | 
|                     } | 
|                 } else if (res.code === 403){ | 
|                     parent.location.href = baseUrl+"/login"; | 
|                 }  else { | 
|                     console.log(res.msg); | 
|                 } | 
|             } | 
|         }); | 
|     } | 
|   | 
|     // 磅秤实时数据获取 | 
|     function getScaleInfo(){ | 
|         $.ajax({ | 
|             url: baseUrl+ "/console/latest/data/scale", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             method: 'POST', | 
|             success: function (res) { | 
|   | 
|                 if (res.code === 200){ | 
|                     var sclaes = res.data; | 
|                     for (var i = 0; i < sclaes.length; i++){ | 
|                         console.log(sclaes[i].scaleId + ":" + sclaes[i].value) | 
|                         $("#scale-data-"+sclaes[i].scaleId).text(sclaes[i].value); | 
|                     } | 
|                 } else if (res.code === 403){ | 
|                     parent.location.href = baseUrl+"/login"; | 
|                 }  else { | 
|                     console.log(res.msg); | 
|                 } | 
|             } | 
|         }); | 
|     } | 
|   | 
|     // 小车偏移动画 | 
|     function carAnimate(id, target) { | 
|         var targetTop = 122; | 
|         if (id === 8) { | 
|             switch (target) { | 
|                 case 1: | 
|                     targetTop += 160; | 
|                     break; | 
|                 case 2: | 
|                     targetTop += 140; | 
|                     break; | 
|                 case 3: | 
|                     targetTop += 80; | 
|                     break; | 
|                 case 4: | 
|                     targetTop += 40; | 
|                     break; | 
|                 case 7: | 
|                     targetTop += 0; | 
|                     break; | 
|                 default: | 
|                     return; | 
|             } | 
|         } else { | 
|             return; | 
|         } | 
|         $("#site-" + id).animate({top: targetTop+'px'}, 1000); | 
|     } | 
|   | 
|      //楼层切换按钮 | 
|     function changFloor(e,x) { | 
|         $("#floorBtnBox button").each((index,item) => { | 
|             $(item).removeClass("btn-16-active") | 
|         }) | 
|         $(e).addClass("btn-16-active") | 
|         currentLev = x | 
|         initMap(currentLev) | 
|     } | 
|   | 
| </script> |