|  |  | 
 |  |  | <!DOCTYPE html> | 
 |  |  | <html lang="en"> | 
 |  |  | <html lang="zh-CN"> | 
 |  |  | <head> | 
 |  |  |     <meta charset="UTF-8"> | 
 |  |  |     <title>提升机监控管理</title> | 
 |  |  |     <link rel="stylesheet" type="text/css" href="../static/css/normalize.css"> | 
 |  |  |     <link rel="stylesheet" type="text/css" href="../static/css/common.css"> | 
 |  |  |     <link rel="stylesheet" type="text/css" href="../static/layui/css/layui.css"> | 
 |  |  |     <link rel="stylesheet" href="../static/css/lift.css"> | 
 |  |  |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | 
 |  |  |     <title>提升机监控系统</title> | 
 |  |  |     <link rel="stylesheet" href="../static/vue/element/element.css"> | 
 |  |  |     <link rel="stylesheet" href="../static/css/shuttle_page.min.css"> | 
 |  |  |     <script src="../static/js/shuttle_page.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/js/layer/layer.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/layui/layui.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/js/common.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/vue/js/vue.min.js"></script> | 
 |  |  |     <script type="text/javascript" src="../static/vue/element/element.js"></script> | 
 |  |  |     <style> | 
 |  |  |         body { | 
 |  |  |             font-family: 'Noto Sans SC', sans-serif; | 
 |  |  |             background-color: #0f172a; | 
 |  |  |             color: #e2e8f0; | 
 |  |  |         } | 
 |  |  |         .card { | 
 |  |  |             background-color: #1e293b; | 
 |  |  |             border-radius: 0.75rem; | 
 |  |  |             box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | 
 |  |  |             transition: all 0.3s ease; | 
 |  |  |         } | 
 |  |  |         /*.card:hover {*/ | 
 |  |  |         /*    transform: translateY(-2px);*/ | 
 |  |  |         /*    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.2);*/ | 
 |  |  |         /*}*/ | 
 |  |  |         .btn { | 
 |  |  |             background-color: #3b82f6; | 
 |  |  |             color: white; | 
 |  |  |             border-radius: 0.5rem; | 
 |  |  |             padding: 0.5rem 1rem; | 
 |  |  |             transition: all 0.3s ease; | 
 |  |  |         } | 
 |  |  |         .btn:hover { | 
 |  |  |             background-color: #2563eb; | 
 |  |  |             transform: translateY(-1px); | 
 |  |  |         } | 
 |  |  |         .status-active { | 
 |  |  |             color: #4ade80; | 
 |  |  |         } | 
 |  |  |         .status-inactive { | 
 |  |  |             color: #f87171; | 
 |  |  |         } | 
 |  |  |         .progress-bar { | 
 |  |  |             height: 0.75rem; | 
 |  |  |             border-radius: 0.375rem; | 
 |  |  |             background-color: #334155; | 
 |  |  |         } | 
 |  |  |         .progress-fill { | 
 |  |  |             height: 100%; | 
 |  |  |             border-radius: 0.375rem; | 
 |  |  |             background-color: #4ade80; | 
 |  |  |             transition: width 0.5s ease; | 
 |  |  |         } | 
 |  |  |         .table-striped tbody tr:nth-child(odd) { | 
 |  |  |             background-color: #1e293b; | 
 |  |  |         } | 
 |  |  |         .table-striped tbody tr:nth-child(even) { | 
 |  |  |             background-color: #1a2537; | 
 |  |  |         } | 
 |  |  |     </style> | 
 |  |  | </head> | 
 |  |  | <body> | 
 |  |  | <div style="padding: 10px;height: 100%;float: left;width: 6%"> | 
 |  |  |     <div class="button-window"></div> | 
 |  |  | </div> | 
 |  |  | <div style="height: 100%;padding-left: 6%"> | 
 |  |  |     <div style="padding: 10px;height: 100%"> | 
 |  |  |         <!-- 日志监控板 --> | 
 |  |  |         <div class="log-board"> | 
 |  |  |             <div class="command-log" id="commandLogId" style="width: 10%;"> | 
 |  |  |             </div> | 
 |  |  |             <div class="lift-state" style="width: 90%;"> | 
 |  |  |                 <table id="lift-state-table"> | 
 |  |  |                     <thead> | 
 |  |  |                     <tr> | 
 |  |  |                         <th>提升机</th> | 
 |  |  |                         <th>工作号</th> | 
 |  |  |                         <th>任务状态</th> | 
 |  |  |                         <th>提升机锁定</th> | 
 |  |  |                         <th>位置到达反馈</th> | 
 |  |  |                         <th>准备就绪</th> | 
 |  |  |                         <th>运行中</th> | 
 |  |  |                         <th>联机/单机</th> | 
 |  |  |                         <th>平台位置偏差报警</th> | 
 |  |  |                         <th>平台扭矩偏差报警</th> | 
 |  |  |                         <th>平台四向车检测</th> | 
 |  |  |                         <th>未就绪状态</th> | 
 |  |  |                         <th>伺服1错误</th> | 
 |  |  |                         <th>伺服2错误</th> | 
 |  |  |                         <th>伺服3错误</th> | 
 |  |  |                         <th>伺服4错误</th> | 
 |  |  |                         <th>提升机实际速度反馈</th> | 
 |  |  |                     </tr> | 
 |  |  |                     </thead> | 
 |  |  |                     <tbody> | 
 |  |  |                     </tbody> | 
 |  |  |                 </table> | 
 |  |  |             </div> | 
 |  |  |         </div> | 
 |  |  |         <!-- 提升机状态 --> | 
 |  |  |         <div class="lift-msg"> | 
 |  |  |             <table id="lift-msg-table"> | 
 |  |  |                 <thead> | 
 |  |  |                 <tr> | 
 |  |  |                     <th>提升机</th> | 
 |  |  |                     <th>工作号</th> | 
 |  |  |                     <th>输送线前端光电有货</th> | 
 |  |  |                     <th>输送线正转反馈</th> | 
 |  |  |                     <th>输送线反转反馈</th> | 
 |  |  |                     <th>输送线电机过载</th> | 
 |  |  |                     <th>输送线末端光电有货</th> | 
 |  |  |                     <th>进输送线卡托盘报警</th> | 
 |  |  |                     <th>出输送线卡托盘报警</th> | 
 |  |  |                     <th>作业标记</th> | 
 |  |  |                     <th>穿梭车号</th> | 
 |  |  |                 </tr> | 
 |  |  |                 </thead> | 
 |  |  |                 <tbody> | 
 |  |  |                 </tbody> | 
 |  |  |             </table> | 
 |  |  |         </div> | 
 |  |  |         <!-- 手动操作 --> | 
 |  |  |         <div class="lift-operation"> | 
 |  |  |             <!-- 遮罩层 --> | 
 |  |  |             <div class="lift-operation-shade"> | 
 |  |  |                     <span class="lift-operation-shade-span"> | 
 |  |  |                         WCS 系统运行中,请停止后操作 | 
 |  |  |                     </span> | 
 |  |  |             </div> | 
 |  |  |             <!-- 设备任务选择 --> | 
 |  |  |             <div class="task-select"> | 
 |  |  |                 <!-- 选择 --> | 
 |  |  |                 <div id="lift-select" class="operator-item"> | 
 |  |  |                     <span class="select-title">提升机号</span> | 
 |  |  |                     <div class="select-container" id="liftRadioBoxId"> | 
 |  |  |                         <!--                            <label><input type="radio" name="liftSelect" value="1" checked> 1号提升机</label>--> | 
 |  |  | <body class="min-h-screen"> | 
 |  |  |     <div id="app"> | 
 |  |  |         <div class="container mx-auto px-4 py-8"> | 
 |  |  |             <!-- 顶部标题和状态栏 --> | 
 |  |  |             <div class="flex flex-col md:flex-row justify-between items-center mb-8"> | 
 |  |  |                 <h1 class="text-3xl font-bold text-blue-400 mb-4 md:mb-0"> | 
 |  |  |                     <i class="fas fa-robot mr-2"></i>提升机监控系统 | 
 |  |  |                 </h1> | 
 |  |  |                 <div class="flex items-center space-x-4"> | 
 |  |  |                     <div class="flex items-center"> | 
 |  |  |                         <div class="w-3 h-3 rounded-full bg-green-500 mr-2"></div> | 
 |  |  |                         <span>在线: {{ deviceStatusCountMap.online }}</span> | 
 |  |  |                     </div> | 
 |  |  |                     <div class="flex items-center"> | 
 |  |  |                         <div class="w-3 h-3 rounded-full bg-yellow-500 mr-2"></div> | 
 |  |  |                         <span>故障: {{ deviceStatusCountMap.error }}</span> | 
 |  |  |                     </div> | 
 |  |  |                     <div class="flex items-center"> | 
 |  |  |                         <div class="w-3 h-3 rounded-full bg-red-500 mr-2"></div> | 
 |  |  |                         <span>离线: {{ deviceStatusCountMap.offline }}</span> | 
 |  |  |                     </div> | 
 |  |  |                 </div> | 
 |  |  |             </div> | 
 |  |  |  | 
 |  |  |             <!-- 设备任务操作 --> | 
 |  |  |             <div class="task-operator"> | 
 |  |  |                 <fieldset> | 
 |  |  |                     <legend>手动操作</legend> | 
 |  |  |                     <div class="button-group"> | 
 |  |  |                         <select id="liftLev"> | 
 |  |  |                             <option value="1" selected>1F</option> | 
 |  |  |                             <option value="3">2F</option> | 
 |  |  |                             <option value="4">3F</option> | 
 |  |  |                             <option value="5">4F</option> | 
 |  |  |                             <option value="2">输送线位置</option> | 
 |  |  |                         </select> | 
 |  |  |                         <button class="item" onclick="liftOperator(1)">移动提升机</button> | 
 |  |  |                         <button class="item" onclick="liftOperator(3)">无货正转</button> | 
 |  |  |                         <button class="item" onclick="liftOperator(4)">无货反转</button> | 
 |  |  |                         <button class="item" onclick="liftOperator(5)">有货正转</button> | 
 |  |  |                         <button class="item" onclick="liftOperator(6)">有货反转</button> | 
 |  |  |                         <button class="item" onclick="liftOperator(7)">链条停止</button> | 
 |  |  |                         <button class="item" onclick="liftOperator(0)">复位</button> | 
 |  |  |             <!-- 主要监控区域 --> | 
 |  |  |             <div class="card p-6 mb-8"> | 
 |  |  |                 <!-- 提升机状态表格 --> | 
 |  |  |                 <div class="card p-6"> | 
 |  |  |                     <div class="flex justify-between items-center mb-4"> | 
 |  |  |                         <h2 class="text-xl font-semibold text-blue-300"> | 
 |  |  |                             <i class="fas fa-list-alt mr-2"></i>提升机状态 | 
 |  |  |                         </h2> | 
 |  |  |                         <div class="relative"> | 
 |  |  |                             <select v-model="selectListStatus" class="bg-slate-700 text-white rounded px-3 py-1 pr-8"> | 
 |  |  |                                 <option value="all">全部状态</option> | 
 |  |  |                                 <option value="online">在线</option> | 
 |  |  |                                 <option value="idle">空闲</option> | 
 |  |  |                                 <option value="running">运行中</option> | 
 |  |  |                                 <option value="offline">离线</option> | 
 |  |  |                                 <option value="error">故障</option> | 
 |  |  |                             </select> | 
 |  |  |                         </div> | 
 |  |  |                     </div> | 
 |  |  |                 </fieldset> | 
 |  |  |                     <div class="overflow-auto" style="height: 500px;"> | 
 |  |  |                         <table class="w-full table-striped"> | 
 |  |  |                             <thead> | 
 |  |  |                             <tr class="text-left text-slate-300 border-b border-slate-600 bg-slate-800 sticky top-0 z-10"> | 
 |  |  |                                 <th class="py-3 px-4">编号</th> | 
 |  |  |                                 <th class="py-3 px-4">工作号</th> | 
 |  |  |                                 <th class="py-3 px-4">PLC工作号</th> | 
 |  |  |                                 <th class="py-3 px-4">设备模式</th> | 
 |  |  |                                 <th class="py-3 px-4">设备状态</th> | 
 |  |  |                                 <th class="py-3 px-4">任务状态</th> | 
 |  |  |                                 <th class="py-3 px-4">任务模式</th> | 
 |  |  |                                 <th class="py-3 px-4">取货数据</th> | 
 |  |  |                                 <th class="py-3 px-4">放货数据</th> | 
 |  |  |                                 <th class="py-3 px-4">出入库模式</th> | 
 |  |  |                                 <th class="py-3 px-4">托盘</th> | 
 |  |  |                                 <th class="py-3 px-4">小车</th> | 
 |  |  |                                 <th class="py-3 px-4">故障码</th> | 
 |  |  |                                 <th class="py-3 px-4">层</th> | 
 |  |  |                                 <th class="py-3 px-4">站点信息</th> | 
 |  |  |                             </tr> | 
 |  |  |                             </thead> | 
 |  |  |                             <tbody> | 
 |  |  |                                 <tr v-for="(item,idx) in liftList" :key="idx" class="hover:bg-slate-700"> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.liftNo }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.taskNo }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.plcTaskNo }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.model$ }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.deviceStatus$ }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.protocolStatus$ }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.taskMode$ }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.pick }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.put }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.iOMode$ }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.hasTray ? '有':'无' }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.hasCar ? '有':'无' }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.errorCode }}</td> | 
 |  |  |                                     <td class="py-3 px-4">{{ item.lev }}</td> | 
 |  |  |                                     <td class="py-3 px-4"> | 
 |  |  |                                         <div v-for="(sta,id) in item.liftStaProtocols" :key="id"> | 
 |  |  |                                             {{ sta.lev }}层,托盘:{{ sta.hasTray ? 'Y':'N' }},小车:{{ sta.hasCar ? 'Y':'N' }} | 
 |  |  |                                         </div> | 
 |  |  |                                     </td> | 
 |  |  |                                 </tr> | 
 |  |  |                             </tbody> | 
 |  |  |                         </table> | 
 |  |  |                     </div> | 
 |  |  |                 </div> | 
 |  |  |             </div> | 
 |  |  |  | 
 |  |  |             <!-- 操作控制区域 --> | 
 |  |  |             <div class="card p-6 mb-8"> | 
 |  |  |                 <h2 class="text-xl font-semibold text-blue-300 mb-4"> | 
 |  |  |                     <i class="fas fa-sliders-h mr-2"></i>控制面板 | 
 |  |  |                 </h2> | 
 |  |  |                 <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-2"> | 
 |  |  |                     <div class="bg-slate-700 p-4 rounded-lg"> | 
 |  |  |                         <h3 class="text-lg font-medium mb-2">设备控制</h3> | 
 |  |  |                         <div class="flex flex-wrap gap-2" style="display: flex;justify-content: center;"> | 
 |  |  |                             <div> | 
 |  |  |                                 <el-input @change="changeControlLiftNo" v-model="controlData.liftNo" style="width: 150px;" placeholder="编号"></el-input> | 
 |  |  |                             </div> | 
 |  |  |                             <div> | 
 |  |  |                                 <el-input v-model="controlData.sourceStaNo" style="width: 200px;" placeholder="源站"></el-input> | 
 |  |  |                             </div> | 
 |  |  |                             <div> | 
 |  |  |                                 <el-input v-model="controlData.staNo" style="width: 200px;" placeholder="目标站"></el-input> | 
 |  |  |                             </div> | 
 |  |  |                         </div> | 
 |  |  |                     </div> | 
 |  |  |                     <div class="bg-slate-700 p-4 rounded-lg"> | 
 |  |  |                         <h3 class="text-lg font-medium mb-2">设备指令</h3> | 
 |  |  |                         <div class="flex flex-wrap gap-2" style="display: flex;justify-content: center;"> | 
 |  |  |                             <button class="btn bg-slate-600 hover:bg-slate-500" @click="liftOperator('movePallet')"> | 
 |  |  |                                 <i class="fas fa-level-up mr-1"></i>移动托盘 | 
 |  |  |                             </button> | 
 |  |  |                             <button class="btn bg-slate-600 hover:bg-slate-500" @click="liftOperator('switchShuttle')"> | 
 |  |  |                                 <i class="fas fa-level-down mr-1"></i>小车换层 | 
 |  |  |                             </button> | 
 |  |  |                             <button class="btn bg-slate-600 hover:bg-slate-500" @click="liftOperator('move')"> | 
 |  |  |                                 <i class="fas fa-battery-three-quarters mr-1"></i>移动 | 
 |  |  |                             </button> | 
 |  |  |                             <button class="btn bg-slate-600 hover:bg-slate-500" @click="liftOperator('reset')"> | 
 |  |  |                                 <i class="fas fa-home mr-1"></i>复位 | 
 |  |  |                             </button> | 
 |  |  |                         </div> | 
 |  |  |                     </div> | 
 |  |  |                 </div> | 
 |  |  |             </div> | 
 |  |  |  | 
 |  |  |         </div> | 
 |  |  |         <!-- 提升机日志输出 --> | 
 |  |  |         <div class="lift-output-board"> | 
 |  |  |             <textarea id="lift-output"></textarea> | 
 |  |  |         </div> | 
 |  |  |     </div> | 
 |  |  | </div> | 
 |  |  | </body> | 
 |  |  | </html> | 
 |  |  |  | 
 |  |  | <script> | 
 |  |  |     // 空白行数 | 
 |  |  |     var liftStateTableBlankRows = 0; | 
 |  |  |     var liftMsgTableBlankRows = 0; | 
 |  |  |     // 实际行数 | 
 |  |  |     var liftStateTableFullRows = 0; | 
 |  |  |     var liftMsgTableFullRows = 0; | 
 |  |  |     // 初始化 | 
 |  |  |     var liftOutputDom = document.getElementById("lift-output"); | 
 |  |  |     $(document).ready(function() { | 
 |  |  |         initliftStateTable(); | 
 |  |  |         getliftStateInfo(); | 
 |  |  |         initliftMsgTable(); | 
 |  |  |         getliftMsgInfo(); | 
 |  |  |         operatorBlockShow(); | 
 |  |  |         setliftRadio(); | 
 |  |  |     }); | 
 |  |  |  | 
 |  |  |     setInterval(function () { | 
 |  |  |         getliftStateInfo() | 
 |  |  |         getliftMsgInfo(); | 
 |  |  |     },1000) | 
 |  |  |     setInterval(function () { | 
 |  |  |         getliftOutput(); | 
 |  |  |         operatorBlockShow(); | 
 |  |  |     },500); | 
 |  |  |  | 
 |  |  |     // 判断手动操作模块是否可用 | 
 |  |  |     function operatorBlockShow() { | 
 |  |  |         if (parent.systemRunning) { | 
 |  |  |             $('.lift-operation').css("opacity", "0.5"); | 
 |  |  |             $('.lift-operation-shade').show(); | 
 |  |  |             $('.lift-operation-shade-span').show(); | 
 |  |  |         }  else { | 
 |  |  |             $('.lift-operation').css("opacity", "1"); | 
 |  |  |             $('.lift-operation-shade').hide(); | 
 |  |  |             $('.lift-operation-shade-span').hide(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     var layerIdx; | 
 |  |  |     $(document).on('click ','.pos-btn', function () { | 
 |  |  |         let liftNo = Number($(this).parent().attr("data-liftNo")); | 
 |  |  |         layerIdx = layer.open({ | 
 |  |  |             type: 1, | 
 |  |  |             title: false, | 
 |  |  |             shadeClose: true, | 
 |  |  |             offset: [$(this).offset().top + 30 + 'px', $(this).offset().left + 'px'], | 
 |  |  |             anim: 5, | 
 |  |  |             shade: [0], | 
 |  |  |             area: ['310px', '370px'], | 
 |  |  |             closeBtn: 0, | 
 |  |  |             content: $("#lift-detl"), | 
 |  |  |             success: function(layero, index){ | 
 |  |  |                 http.get(baseUrl+ "/lift/detl/"+liftNo, null, function (res) { | 
 |  |  |                     $('#liftNo').val(liftNo); | 
 |  |  |                     $('#workNo').val(res.data.workNo); | 
 |  |  |                     $('#row').val(res.data.row); | 
 |  |  |                     $('#bay').val(res.data.bay); | 
 |  |  |                     $('#lev').val(res.data.lev); | 
 |  |  |                     $('#crnNo').val(res.data.crnNo); | 
 |  |  |                     $('#pakMk').val(res.data.pakMk); | 
 |  |  |                 }) | 
 |  |  |     var app = new Vue({ | 
 |  |  |         el: '#app', | 
 |  |  |         data: { | 
 |  |  |             ws: null, | 
 |  |  |             liftList: [], //提升机集合 | 
 |  |  |             liftAllList: [], | 
 |  |  |             selectListStatus: "all", | 
 |  |  |             deviceStatusCountMap: {}, | 
 |  |  |             controlData: { | 
 |  |  |                 liftNo: "", | 
 |  |  |                 taskNo: "", | 
 |  |  |                 sourceLocNo: "", | 
 |  |  |                 targetLocNo: "" | 
 |  |  |             }, | 
 |  |  |             end: function () { | 
 |  |  |                 $('#liftNo').val(""); | 
 |  |  |                 $('#workNo').val(""); | 
 |  |  |                 $('#row').val(""); | 
 |  |  |                 $('#bay').val(""); | 
 |  |  |                 $('#lev').val(""); | 
 |  |  |                 $('#crnNo').val(""); | 
 |  |  |                 $('#pakMk').val(""); | 
 |  |  |             } | 
 |  |  |         }) | 
 |  |  |     }) | 
 |  |  |             controlLiftInfo: null, | 
 |  |  |         }, | 
 |  |  |         created() { | 
 |  |  |             this.init() | 
 |  |  |         }, | 
 |  |  |         watch: { | 
 |  |  |  | 
 |  |  |     var layerIdx0; | 
 |  |  |     $(document).on('click ','.mode-btn', function () { | 
 |  |  |         let liftNo = Number($(this).parent().attr("data-liftNo")); | 
 |  |  |         layerIdx0 = layer.open({ | 
 |  |  |             type: 1, | 
 |  |  |             title: false, | 
 |  |  |             shadeClose: true, | 
 |  |  |             offset: [$(this).offset().top + 30 + 'px', $(this).offset().left + 'px'], | 
 |  |  |             anim: 5, | 
 |  |  |             shade: [0], | 
 |  |  |             area: ['70%', '85%'], | 
 |  |  |             closeBtn: 0, | 
 |  |  |             content: $("#lift-detl2"), | 
 |  |  |             success: function(layero, index){ | 
 |  |  |                 console.log(liftNo) | 
 |  |  |                 http.get(baseUrl+ "/lift/sensor/detl/"+liftNo, null, function (res) { | 
 |  |  |                     $('#liftNo1').val(res.data.liftNo); | 
 |  |  |                     getColor(res.data.pakInTask,'#pakInTask'); | 
 |  |  |                     getColor(res.data.pakOutTask,'#pakOutTask'); | 
 |  |  |                     getColor(res.data.pakMoveTask,'#pakMoveTask'); | 
 |  |  |                     getColor(res.data.goHpTask,'#goHpTask'); | 
 |  |  |                     getColor(res.data.goOHpTask,'#goOHpTask'); | 
 |  |  |                     getColor(res.data.goHpAvoid,'#goHpAvoid'); | 
 |  |  |                     getColor(res.data.goOHpAvoid,'#goOHpAvoid'); | 
 |  |  |                     getColor(res.data.pakInEmpty,'#pakInEmpty'); | 
 |  |  |                     getColor(res.data.pakInFinish,'#pakInFinish'); | 
 |  |  |                     getColor(res.data.pakOutEmpty,'#pakOutEmpty'); | 
 |  |  |                     getColor(res.data.pakOutFinish,'#pakOutFinish'); | 
 |  |  |                     getColor(res.data.goHpAvoidFinish,'#goHpAvoidFinish'); | 
 |  |  |                     getColor(res.data.goOHpAvoidFinish,'#goOHpAvoidFinish'); | 
 |  |  |                     getColor(res.data.goHpAvoidErr,'#goHpAvoidErr'); | 
 |  |  |                     getColor(res.data.goOHpAvoidErr,'#goOHpAvoidErr'); | 
 |  |  |                 }) | 
 |  |  |         }, | 
 |  |  |         methods: { | 
 |  |  |             init() { | 
 |  |  |                 this.consoleInterval = setInterval(() => { | 
 |  |  |                     this.websocketConnect(); | 
 |  |  |  | 
 |  |  |                     this.getLiftStateInfo() //获取提升机信息 | 
 |  |  |                 }, 1000) | 
 |  |  |             }, | 
 |  |  |             end: function () { | 
 |  |  |                 $('#liftNo').val(""); | 
 |  |  |             } | 
 |  |  |         }) | 
 |  |  |     }) | 
 |  |  |             getLiftStateInfo() { | 
 |  |  |                 this.sendWs(JSON.stringify({ | 
 |  |  |                     "url": "/lift/table/lift/state", | 
 |  |  |                     "data": {} | 
 |  |  |                 })) | 
 |  |  |             }, | 
 |  |  |             setLiftStateInfo(res) { | 
 |  |  |                 // 提升机信息表获取 | 
 |  |  |                 if (res.code == 200) { | 
 |  |  |                     let list = res.data; | 
 |  |  |  | 
 |  |  |     function getColor(res,e){ | 
 |  |  |         $(e).val(res?"✔":"—"); | 
 |  |  |         if (res){ | 
 |  |  |             $(e).attr("style", "color: #FD482C;"); | 
 |  |  |         }else { | 
 |  |  |             $(e).attr("style", "color: #00FF00;"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |                     let allList = [] | 
 |  |  |                     let runningList = [] | 
 |  |  |                     let idleList = [] | 
 |  |  |                     let errorList = [] | 
 |  |  |                     let offlineList = [] | 
 |  |  |                     let onlineList = [] | 
 |  |  |  | 
 |  |  |     $(document).on('click ','#save', function () { | 
 |  |  |         http.post(baseUrl+ "/lift/detl/update", { | 
 |  |  |             liftNo: $('#liftNo').val(), | 
 |  |  |             workNo: $('#workNo').val(), | 
 |  |  |             row:  $('#row').val(), | 
 |  |  |             bay: $('#bay').val(), | 
 |  |  |             lev:  $('#lev').val(), | 
 |  |  |             crnNo: $('#crnNo').val(), | 
 |  |  |             pakMk: $('#pakMk').val(), | 
 |  |  |         }, function (res) { | 
 |  |  |             layer.msg("修改成功", {icon: 1,}); | 
 |  |  |             layer.close(layerIdx); | 
 |  |  |         }) | 
 |  |  |     }) | 
 |  |  |                     list.forEach((item) => { | 
 |  |  |                         allList.push(item) | 
 |  |  |  | 
 |  |  |     $(document).on('click ','#cancel', function () { | 
 |  |  |         layer.close(layerIdx); | 
 |  |  |     }) | 
 |  |  |  | 
 |  |  |     function setliftRadio() { | 
 |  |  |         $.ajax({ | 
 |  |  |             url: baseUrl+ "/lift/table/lift/state", | 
 |  |  |             headers: {'token': localStorage.getItem('token')}, | 
 |  |  |             method: 'POST', | 
 |  |  |             success: function (res) { | 
 |  |  |                 if (res.code === 200){ | 
 |  |  |                     let table = res.data; | 
 |  |  |                     for (let i=1;i<=table.length;i++){ | 
 |  |  |                         //渲染提升机选项html | 
 |  |  |                         let liftRadioBox = '<label><input type="radio" name="liftSelect" '; | 
 |  |  |                         if (i === 1) { | 
 |  |  |                             liftRadioBox += 'checked ' | 
 |  |  |                         if(item.protocolStatusType == "WORKING") { | 
 |  |  |                             runningList.push(item) | 
 |  |  |                         } | 
 |  |  |                         liftRadioBox += 'value="' + table[i - 1].liftNo + '"> ' + table[i - 1].liftNo + '号提升机</label>' | 
 |  |  |                         $("#liftRadioBoxId").append(liftRadioBox) | 
 |  |  |  | 
 |  |  |                         if(item.protocolStatusType == "IDLE") { | 
 |  |  |                             idleList.push(item) | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         //渲染提升机数据维护和设备信息html | 
 |  |  |                         let liftCommandLogBox = '<div class="lift-command-item" data-liftNo="' + table[i - 1].liftNo + '">\n' + | 
 |  |  |                             '<label>' + table[i - 1].liftNo + '#</label>\n' + | 
 |  |  |                             '</div>' | 
 |  |  |                         $("#commandLogId").append(liftCommandLogBox); | 
 |  |  |                         if(item.errorCode > 0) { | 
 |  |  |                             errorList.push(item) | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         if (item.protocolStatusType == "NONE") { | 
 |  |  |                             offlineList.push(item) | 
 |  |  |                         }else { | 
 |  |  |                             onlineList.push(item) | 
 |  |  |                         } | 
 |  |  |                     }) | 
 |  |  |  | 
 |  |  |                     if (this.selectListStatus == "all") { | 
 |  |  |                         this.liftList = allList; | 
 |  |  |                     }else if (this.selectListStatus == "running") { | 
 |  |  |                         this.liftList = runningList; | 
 |  |  |                     }else if (this.selectListStatus == "idle") { | 
 |  |  |                         this.liftList = idleList; | 
 |  |  |                     }else if (this.selectListStatus == "error") { | 
 |  |  |                         this.liftList = errorList; | 
 |  |  |                     }else if (this.selectListStatus == "offline") { | 
 |  |  |                         this.liftList = offlineList; | 
 |  |  |                     }else if (this.selectListStatus == "online") { | 
 |  |  |                         this.liftList = onlineList; | 
 |  |  |                     } | 
 |  |  |                 } else if (res.code === 403){ | 
 |  |  |                     window.location.href = baseUrl+"/login"; | 
 |  |  |                 }  else { | 
 |  |  |                     console.log(res.msg); | 
 |  |  |  | 
 |  |  |                     let tmpMap = { | 
 |  |  |                         idle: idleList.length, | 
 |  |  |                         running: runningList.length, | 
 |  |  |                         error: errorList.length, | 
 |  |  |                         offline: offlineList.length, | 
 |  |  |                         online: idleList.length + runningList.length, | 
 |  |  |                     } | 
 |  |  |                     this.deviceStatusCountMap = tmpMap; | 
 |  |  |  | 
 |  |  |                     this.liftAllList = allList; | 
 |  |  |                     if (this.controlLiftInfo != null) { | 
 |  |  |                         allList.forEach((item) => { | 
 |  |  |                             if(item.liftNo == this.controlLiftInfo.liftNo) { | 
 |  |  |                                 this.controlLiftInfo = item; | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             }, | 
 |  |  |             liftOperator(type) { | 
 |  |  |                 let that = this; | 
 |  |  |                 if (this.controlData.liftNo == null || this.controlData.liftNo == "") { | 
 |  |  |                     this.$message({ | 
 |  |  |                         message: '请输入设备编号', | 
 |  |  |                         type: 'warning' | 
 |  |  |                     }); | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 let requestParam = { | 
 |  |  |                     liftNo: this.controlData.liftNo | 
 |  |  |                 }; | 
 |  |  |  | 
 |  |  |                 if (type == 'movePallet') { | 
 |  |  |                     if (this.controlData.sourceStaNo == null || this.controlData.sourceStaNo == "") { | 
 |  |  |                         this.$message({ | 
 |  |  |                             message: '请输入源站', | 
 |  |  |                             type: 'warning' | 
 |  |  |                         }); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     if (this.controlData.staNo == null || this.controlData.staNo == "") { | 
 |  |  |                         this.$message({ | 
 |  |  |                             message: '请输入目标站', | 
 |  |  |                             type: 'warning' | 
 |  |  |                         }); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     requestParam.liftTaskMode = 1; | 
 |  |  |                     requestParam.sourceStaNo = this.controlData.sourceStaNo; | 
 |  |  |                     requestParam.staNo = this.controlData.staNo; | 
 |  |  |                 }else if (type == 'switchShuttle') { | 
 |  |  |                     if (this.controlData.sourceStaNo == null || this.controlData.sourceStaNo == "") { | 
 |  |  |                         this.$message({ | 
 |  |  |                             message: '请输入源站', | 
 |  |  |                             type: 'warning' | 
 |  |  |                         }); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     if (this.controlData.staNo == null || this.controlData.staNo == "") { | 
 |  |  |                         this.$message({ | 
 |  |  |                             message: '请输入目标站', | 
 |  |  |                             type: 'warning' | 
 |  |  |                         }); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     requestParam.liftTaskMode = 2; | 
 |  |  |                     requestParam.sourceStaNo = this.controlData.sourceStaNo; | 
 |  |  |                     requestParam.staNo = this.controlData.staNo; | 
 |  |  |                 }else if (type == 'move') { | 
 |  |  |                     if (this.controlData.sourceStaNo == null || this.controlData.sourceStaNo == "") { | 
 |  |  |                         this.$message({ | 
 |  |  |                             message: '请输入源站', | 
 |  |  |                             type: 'warning' | 
 |  |  |                         }); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     if (this.controlData.staNo == null || this.controlData.staNo == "") { | 
 |  |  |                         this.$message({ | 
 |  |  |                             message: '请输入目标站', | 
 |  |  |                             type: 'warning' | 
 |  |  |                         }); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     requestParam.liftTaskMode = 3; | 
 |  |  |                     requestParam.sourceStaNo = this.controlData.sourceStaNo; | 
 |  |  |                     requestParam.staNo = this.controlData.staNo; | 
 |  |  |                 }else if (type == 'reset') { | 
 |  |  |                     requestParam.liftTaskMode = 9996; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 $.ajax({ | 
 |  |  |                     url: baseUrl + "/lift/operator/lift", | 
 |  |  |                     headers: {'token': localStorage.getItem('token')}, | 
 |  |  |                     method: 'POST', | 
 |  |  |                     data: requestParam, | 
 |  |  |                     success: function (res) { | 
 |  |  |                         if (res.code === 200) { | 
 |  |  |                             that.$message({ | 
 |  |  |                                 message: res.msg, | 
 |  |  |                                 type: 'success' | 
 |  |  |                             }); | 
 |  |  |                         } else if (res.code === 403) { | 
 |  |  |                             window.location.href = baseUrl + "/login"; | 
 |  |  |                         } else { | 
 |  |  |                             that.$message({ | 
 |  |  |                                 message: res.msg, | 
 |  |  |                                 type: 'warning' | 
 |  |  |                             }); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |             changeControlLiftNo() { | 
 |  |  |                 let liftNo = this.controlData.liftNo; | 
 |  |  |                 if (liftNo == null || liftNo == "") { | 
 |  |  |                     this.controlLiftInfo = null | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 this.liftAllList.forEach((item) => { | 
 |  |  |                     if (item.liftNo == liftNo) { | 
 |  |  |                         this.controlLiftInfo = item; | 
 |  |  |                     } | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |             websocketConnect() { | 
 |  |  |                 if (this.ws == null) { | 
 |  |  |                     this.ws = new WebSocket("ws://" + window.location.host + baseUrl + "/console/websocket"); | 
 |  |  |                     this.ws.onopen = this.webSocketOnOpen | 
 |  |  |                     this.ws.onerror = this.webSocketOnError | 
 |  |  |                     this.ws.onmessage = this.webSocketOnMessage | 
 |  |  |                     this.ws.onclose = this.webSocketClose | 
 |  |  |                 } | 
 |  |  |             }, | 
 |  |  |             webSocketOnOpen(e) { | 
 |  |  |                 console.log("open"); | 
 |  |  |             }, | 
 |  |  |             webSocketOnError(e) { | 
 |  |  |                 this.ws = null; | 
 |  |  |                 console.log(e); | 
 |  |  |             }, | 
 |  |  |             webSocketOnMessage(e) { | 
 |  |  |                 const result = JSON.parse(e.data); | 
 |  |  |                 if (result.url == "/lift/table/lift/state") { | 
 |  |  |                     this.setLiftStateInfo(JSON.parse(result.data)) | 
 |  |  |                 } | 
 |  |  |             }, | 
 |  |  |             webSocketClose(e) { | 
 |  |  |                 this.ws = null; | 
 |  |  |                 console.log("close"); | 
 |  |  |             }, | 
 |  |  |             sendWs(message) { | 
 |  |  |                 if (this.ws == null) { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (this.ws.readyState == WebSocket.OPEN) { | 
 |  |  |                     this.ws.send(message); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 提升机信息表获取 ---- 表一 | 
 |  |  |     function getliftStateInfo() { | 
 |  |  |         let tableEl = $('#lift-state-table'); | 
 |  |  |         $.ajax({ | 
 |  |  |             url: baseUrl+ "/lift/table/lift/state", | 
 |  |  |             headers: {'token': localStorage.getItem('token')}, | 
 |  |  |             method: 'POST', | 
 |  |  |             success: function (res) { | 
 |  |  |                 if (res.code === 200){ | 
 |  |  |                     let table = res.data; | 
 |  |  |                     if (table.length > liftStateTableBlankRows && table.length !== liftStateTableFullRows) { | 
 |  |  |                         initliftStateTable(table.length-liftStateTableBlankRows); | 
 |  |  |                         liftStateTableFullRows = table.length; | 
 |  |  |                     } | 
 |  |  |                     for (let i=1;i<=table.length;i++){ | 
 |  |  |                         // $("#mode-"+table[i-1].liftNo).html(table[i-1].statusVal===0?'联机':'脱机'); | 
 |  |  |                         let tr = tableEl.find("tr").eq(i); | 
 |  |  |                         setVal(tr.children("td").eq(0), table[i-1].liftNo); | 
 |  |  |                         setVal(tr.children("td").eq(1), table[i-1].taskNo); | 
 |  |  |                         setVal(tr.children("td").eq(2), table[i-1].protocolStatus$); | 
 |  |  |                         setVal(tr.children("td").eq(3), table[i-1].liftLock$); | 
 |  |  |                         setVal(tr.children("td").eq(4), table[i-1].positionArrivalFeedback); | 
 |  |  |                         setVal(tr.children("td").eq(5), table[i-1].ready$); | 
 |  |  |                         setVal(tr.children("td").eq(6), table[i-1].running$); | 
 |  |  |                         setVal(tr.children("td").eq(7), table[i-1].mode$); | 
 |  |  |                         setVal(tr.children("td").eq(8), table[i-1].platPositionDeviationAlarm$); | 
 |  |  |                         setVal(tr.children("td").eq(9), table[i-1].platTorqueDeviationAlarm$); | 
 |  |  |                         setVal(tr.children("td").eq(10), table[i-1].platShuttleCheck$); | 
 |  |  |                         setVal(tr.children("td").eq(11), table[i-1].notReady$); | 
 |  |  |                         setVal(tr.children("td").eq(12), table[i-1].servoError1); | 
 |  |  |                         setVal(tr.children("td").eq(13), table[i-1].servoError2); | 
 |  |  |                         setVal(tr.children("td").eq(14), table[i-1].servoError3); | 
 |  |  |                         setVal(tr.children("td").eq(15), table[i-1].servoError4); | 
 |  |  |                         setVal(tr.children("td").eq(16), table[i-1].liftActualSpeed); | 
 |  |  |                     } | 
 |  |  |                 } else if (res.code === 403){ | 
 |  |  |                     window.location.href = baseUrl+"/login"; | 
 |  |  |                 }  else { | 
 |  |  |                     console.log(res.msg); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 提升机数据表获取 ---- 表二 | 
 |  |  |     function getliftMsgInfo() { | 
 |  |  |         let tableEl = $('#lift-msg-table'); | 
 |  |  |         $.ajax({ | 
 |  |  |             url: baseUrl+ "/lift/table/lift/msg", | 
 |  |  |             headers: {'token': localStorage.getItem('token')}, | 
 |  |  |             method: 'POST', | 
 |  |  |             success: function (res) { | 
 |  |  |                 if (res.code === 200){ | 
 |  |  |                     var table = res.data; | 
 |  |  |                     if (table.length > liftMsgTableBlankRows && table.length !== liftMsgTableFullRows) { | 
 |  |  |                         initliftMsgTable(table.length-liftMsgTableBlankRows); | 
 |  |  |                         liftMsgTableFullRows = table.length; | 
 |  |  |                     } | 
 |  |  |                     for (var i=1;i<=table.length;i++){ | 
 |  |  |                         var tr = tableEl.find("tr").eq(i); | 
 |  |  |                         setVal(tr.children("td").eq(0), table[i-1].liftNo); | 
 |  |  |                         setVal(tr.children("td").eq(1), table[i-1].workNo); | 
 |  |  |                         setVal(tr.children("td").eq(2), table[i-1].lineFrontHasStock$); | 
 |  |  |                         setVal(tr.children("td").eq(3), table[i-1].forwardRotationFeedback$); | 
 |  |  |                         setVal(tr.children("td").eq(4), table[i-1].reverseFeedback$); | 
 |  |  |                         setVal(tr.children("td").eq(5), table[i-1].motorOverload$); | 
 |  |  |                         setVal(tr.children("td").eq(6), table[i-1].lineEndHasStock$); | 
 |  |  |                         setVal(tr.children("td").eq(7), table[i-1].inConveyLineCardTrayAlarm$); | 
 |  |  |                         setVal(tr.children("td").eq(8), table[i-1].outConveyLineCardTrayAlarm$); | 
 |  |  |                         setVal(tr.children("td").eq(9), table[i-1].pakMk); | 
 |  |  |                         setVal(tr.children("td").eq(10), table[i-1].shuttleNo); | 
 |  |  |                     } | 
 |  |  |                 } else if (res.code === 403){ | 
 |  |  |                     window.location.href = baseUrl+"/login"; | 
 |  |  |                 }  else { | 
 |  |  |                     console.log(res.msg); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 提升机日志输出 ----------------------------------------------------------------------- | 
 |  |  |     function getliftOutput() { | 
 |  |  |         $.ajax({ | 
 |  |  |             url: baseUrl + "/lift/output/lift", | 
 |  |  |             headers: {'token': localStorage.getItem('token')}, | 
 |  |  |             method: 'POST', | 
 |  |  |             success: function (res) { | 
 |  |  |                 if (res.code === 200) { | 
 |  |  |                     liftOutput(res.data); | 
 |  |  |                 } else if (res.code === 403) { | 
 |  |  |                     window.location.href = baseUrl + "/login"; | 
 |  |  |                 } else { | 
 |  |  |                     console.log(res.msg); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }) | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 任务指令下发 | 
 |  |  |     function liftOperator(liftTaskMode) { | 
 |  |  |         http.post(baseUrl+"/lift/operator/lift", { | 
 |  |  |             liftNo: $('input[name="liftSelect"]:checked').val(), | 
 |  |  |             liftTaskMode: liftTaskMode, | 
 |  |  |             lev: $("#liftLev").val() | 
 |  |  |         }, function (res) { | 
 |  |  |             layer.msg(res.msg, {icon: 1}); | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     // ------------------------------------------------------------------------------------------------ | 
 |  |  |  | 
 |  |  |     // 提升机信息表获取  ----- 表一 | 
 |  |  |     function initliftStateTable(row) { | 
 |  |  |         let line; | 
 |  |  |         if (row === undefined){ | 
 |  |  |             let one = $('#lift-state-table thead').height(); | 
 |  |  |             let total = $('.lift-state').height(); | 
 |  |  |             let count = total / one; | 
 |  |  |             count = parseInt(count) - 1; | 
 |  |  |             liftStateTableBlankRows = count; | 
 |  |  |             line = count; | 
 |  |  |         } else { | 
 |  |  |             line = row; | 
 |  |  |         } | 
 |  |  |         let html = ""; | 
 |  |  |         for (let i = 0; i < line; i ++){ | 
 |  |  |             html += " <tr>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "     </tr>\n"; | 
 |  |  |         } | 
 |  |  |         $('#lift-state-table tbody').after(html); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 提升机数据表获取  ----- 表二 | 
 |  |  |     function initliftMsgTable(row) { | 
 |  |  |         let line; | 
 |  |  |         if (row === undefined){ | 
 |  |  |             let one = $('#lift-msg-table thead').height(); | 
 |  |  |             let total = $('.lift-msg').height(); | 
 |  |  |             let count = total / one; | 
 |  |  |             count = parseInt(count) - 1; | 
 |  |  |             liftMsgTableBlankRows = count; | 
 |  |  |             line = count; | 
 |  |  |         } else { | 
 |  |  |             line = row; | 
 |  |  |         } | 
 |  |  |         let html = ""; | 
 |  |  |         for (let i = 0; i < line; i ++){ | 
 |  |  |             html += " <tr>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "       <td></td>\n" + | 
 |  |  |                 "     </tr>\n"; | 
 |  |  |         } | 
 |  |  |         $('#lift-msg-table tbody').after(html); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 日志输出框 | 
 |  |  |     function liftOutput(content){ | 
 |  |  |         liftOutputDom.value += content; | 
 |  |  |         liftOutputDom.scrollTop = liftOutputDom.scrollHeight; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     }) | 
 |  |  | </script> | 
 |  |  | </html> |