| | |
| | | <!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> |
| | | <!-- 提升机日志输出 --> |
| | | <div class="lift-output-board"> |
| | | <textarea id="lift-output"></textarea> |
| | | </div> |
| | | |
| | | <div id="lift-detl" style="display: none"> |
| | | <div> |
| | | <div class="form-item"> |
| | | <label class="form-label">站号:</label> |
| | | <div class="form-input"> |
| | | <input id="liftNo" name="liftNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled"> |
| | | <!-- 操作控制区域 --> |
| | | <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> |
| | | <div class="form-item"> |
| | | <label class="form-label">工作号:</label> |
| | | <div class="form-input"> |
| | | <input id="workNo" name="workNo" type="number" class="layui-input" lay-verify="number" autocomplete="off"> |
| | | <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 class="form-item"> |
| | | <label class="form-label">作业标记:</label> |
| | | <div class="form-input"> |
| | | <input id="pakMk" name="pakMk" type="text" class="layui-input" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="form-item form-button-container"> |
| | | <button class="form-button" id="save">保存</button> |
| | | <button class="form-button" id="cancel" style="background-color: #D0D0D0">取消</button> |
| | | </div> |
| | | </div> |
| | | |
| | | </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(); |
| | | }); |
| | | var app = new Vue({ |
| | | el: '#app', |
| | | data: { |
| | | ws: null, |
| | | liftList: [], //提升机集合 |
| | | liftAllList: [], |
| | | selectListStatus: "all", |
| | | deviceStatusCountMap: {}, |
| | | controlData: { |
| | | liftNo: "", |
| | | taskNo: "", |
| | | sourceLocNo: "", |
| | | targetLocNo: "" |
| | | }, |
| | | controlLiftInfo: null, |
| | | }, |
| | | created() { |
| | | this.init() |
| | | }, |
| | | watch: { |
| | | |
| | | setInterval(function () { |
| | | getliftStateInfo() |
| | | getliftMsgInfo(); |
| | | },1000) |
| | | setInterval(function () { |
| | | getliftOutput(); |
| | | operatorBlockShow(); |
| | | },500); |
| | | }, |
| | | methods: { |
| | | init() { |
| | | this.consoleInterval = setInterval(() => { |
| | | this.websocketConnect(); |
| | | |
| | | // 判断手动操作模块是否可用 |
| | | 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(); |
| | | } |
| | | } |
| | | this.getLiftStateInfo() //获取提升机信息 |
| | | }, 1000) |
| | | }, |
| | | 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(), |
| | | pakMk: $('#pakMk').val(), |
| | | }, function (res) { |
| | | layer.msg("修改成功", {icon: 1,}); |
| | | layer.close(layerIdx); |
| | | }) |
| | | }) |
| | | list.forEach((item) => { |
| | | allList.push(item) |
| | | |
| | | 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); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // 提升机信息表获取 ---- 表一 |
| | | 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; |
| | | let tmpMap = { |
| | | idle: idleList.length, |
| | | running: runningList.length, |
| | | error: errorList.length, |
| | | offline: offlineList.length, |
| | | online: idleList.length + runningList.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); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | this.deviceStatusCountMap = tmpMap; |
| | | |
| | | // 提升机数据表获取 ---- 表二 |
| | | 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; |
| | | } |
| | | |
| | | // 详情操作 ------------------------------------------------------------------------- |
| | | var layerDetl; |
| | | $(document).on('dblclick ','#lift-msg-table tr', function () { |
| | | var liftNo = $(this).children("td").eq(0).html(); |
| | | if (liftNo !== null && liftNo !== "") { |
| | | layerDetl = layer.open({ |
| | | type: 1, |
| | | title: false, |
| | | shadeClose: true, |
| | | offset: 'rt', |
| | | anim: 5, |
| | | shade: [0], |
| | | area: ['340px', '255px'], |
| | | closeBtn: 0, |
| | | content: $("#lift-detl"), |
| | | success: function(layero, index){ |
| | | $.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; |
| | | for (var i=1;i<=table.length;i++){ |
| | | if (liftNo == table[i-1].liftNo) { |
| | | $('#liftNo').val(liftNo); |
| | | $('#workNo').val(table[i-1].workNo); |
| | | $('#pakMk').val(table[i-1].pakMk); |
| | | } |
| | | } |
| | | } else if (res.code === 403){ |
| | | window.location.href = baseUrl+"/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | this.liftAllList = allList; |
| | | if (this.controlLiftInfo != null) { |
| | | allList.forEach((item) => { |
| | | if(item.liftNo == this.controlLiftInfo.liftNo) { |
| | | this.controlLiftInfo = item; |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | end: function () { |
| | | $('#liftNo').val(""); |
| | | $('#workNo').val(""); |
| | | $('#pakMk').val(""); |
| | | }); |
| | | } |
| | | } |
| | | }) |
| | | }, |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | |
| | | $(document).on('click ','#cancel', function () { |
| | | $('#liftNo').val(""); |
| | | $('#workNo').val(""); |
| | | $('#pakMk').val(""); |
| | | layer.close(layerDetl); |
| | | }) |
| | | |
| | | </script> |
| | | </html> |