<!DOCTYPE html>
|
<html lang="en">
|
<head>
|
<meta charset="UTF-8">
|
<title>堆垛机监控管理</title>
|
<meta name="renderer" content="webkit">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
<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/css/crn.css">
|
<script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
|
<script type="text/javascript" src="../static/js/common.js"></script>
|
<script type="text/javascript" src="../static/js/layer/layer.js"></script>
|
<style>
|
|
</style>
|
</head>
|
<body>
|
<!-- 日志监控板 -->
|
<div class="log-board">
|
<!-- 执行命令 -->
|
<div class="command-log">
|
<h2>执行中的命令</h2>
|
<div class="crn-command-item">
|
<label>1#</label>
|
<span> </span>
|
<input id="crn1" disabled="disabled">
|
</div>
|
<div class="crn-command-item">
|
<label>2#</label>
|
<span> </span>
|
<input id="crn2" disabled="disabled">
|
</div>
|
</div>
|
<!-- 堆垛机状态位信息 -->
|
<div class="crn-state">
|
<table id="crn-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>报警码</th>
|
</tr>
|
</thead>
|
<tbody>
|
</tbody>
|
</table>
|
</div>
|
</div>
|
<!-- 堆垛机状态 -->
|
<div class="crn-msg">
|
<table id="crn-msg-table">
|
<thead>
|
<tr>
|
<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="crn-operation">
|
|
<!-- 遮罩层 -->
|
<div class="crn-operation-shade">
|
<span class="crn-operation-shade-span">
|
WCS 系统运行中,请停止后操作
|
</span>
|
</div>
|
|
<!-- 设备任务选择 -->
|
<div class="task-select">
|
<!-- 堆垛机选择 -->
|
<div id="crn-select" class="operator-item">
|
<span class="select-title">堆垛机号</span>
|
<div class="select-container">
|
<label><input type="radio" name="crnSelect" value="1" checked> 1号堆垛机</label>
|
<label><input type="radio" name="crnSelect" value="2"> 2号堆垛机</label>
|
</div>
|
</div>
|
<!-- 源站/源库位 选择 -->
|
<div id="source-select" class="operator-item">
|
<span class="select-title">源站/源库位</span>
|
<div class="select-container">
|
<div class="select-container-item">
|
<span>站</span>
|
<label><input id="sourceStaNo" type="number" name="points" min="0" /></label>
|
</div>
|
<div class="select-container-item">
|
<span>排</span>
|
<label><input id="sourceRow" type="number" name="points" min="0" style="background-color: #a9eeff" /></label>
|
</div>
|
<div class="select-container-item">
|
<span>列</span>
|
<label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" /></label>
|
</div>
|
<div class="select-container-item">
|
<span>层</span>
|
<label><input id="sourceLev" type="number" name="points" min="0" style="background-color: #a9eeff" /></label>
|
</div>
|
</div>
|
</div>
|
<!-- 目标站/目标库位 选择 -->
|
<div id="target-select" class="operator-item">
|
<span class="select-title">目标站/目标库位</span>
|
<div class="select-container">
|
<div class="select-container-item">
|
<span>站</span>
|
<label><input id="staNo" type="number" name="points" min="0" /></label>
|
</div>
|
<div class="select-container-item">
|
<span>排</span>
|
<label><input id="row" type="number" name="points" min="0" style="background-color: #a9eeff" /></label>
|
</div>
|
<div class="select-container-item">
|
<span>列</span>
|
<label><input id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" /></label>
|
</div>
|
<div class="select-container-item">
|
<span>层</span>
|
<label><input id="lev" type="number" name="points" min="0" style="background-color: #a9eeff" /></label>
|
</div>
|
</div>
|
</div>
|
</div>
|
|
<!-- 设备任务操作 -->
|
<div class="task-operator">
|
<fieldset>
|
<legend>手动操作</legend>
|
<div class="button-group">
|
<button class="item" onclick="put()">入库</button>
|
<button class="item" onclick="take()">出库</button>
|
<button class="item" onclick="stockMove()">库位转移</button>
|
<button class="item" onclick="siteMove()">站到站</button>
|
<button class="item" onclick="coorMove()">坐标移动</button>
|
<button class="item" onclick="bacOrigin()">回原点</button>
|
<button class="item" onclick="taskComplete()">任务完成</button>
|
<button class="item" onclick="pause()">暂停</button>
|
<button class="item" onclick="boot()">启动</button>
|
<button class="item" onclick="clearCommand()">清除命令</button>
|
</div>
|
</fieldset>
|
</div>
|
|
</div>
|
<!-- 堆垛机日志输出 -->
|
<div class="crn-output-board">
|
<textarea id="crn-output"></textarea>
|
</div>
|
</body>
|
<script>
|
// 空白行数
|
var crnStateTableBlankRows = 0;
|
var crnMsgTableBlankRows = 0;
|
// 实际行数
|
var crnStateTableFullRows = 0;
|
var crnMsgTableFullRows = 0;
|
// 初始化
|
var crnOutputDom = document.getElementById("crn-output");
|
$(document).ready(function() {
|
getCommandLog();
|
initCrnStateTable();
|
getCrnStateInfo();
|
initCrnMsgTable();
|
getCrnMsgInfo();
|
operatorBlockShow();
|
});
|
// 数据更新
|
setInterval(function () {
|
getCrnStateInfo();
|
getCrnMsgInfo();
|
getCommandLog();
|
},1000);
|
setInterval(function () {
|
getSiteOutput();
|
operatorBlockShow();
|
},500);
|
|
// 判断手动操作模块是否可用
|
function operatorBlockShow() {
|
if (systemRunning) {
|
$('.crn-operation').css("opacity", "0.5");
|
$('.crn-operation-shade').show();
|
$('.crn-operation-shade-span').show();
|
} else {
|
$('.crn-operation').css("opacity", "1");
|
$('.crn-operation-shade').hide();
|
$('.crn-operation-shade-span').hide();
|
}
|
}
|
|
// 获取堆垛机执行中的命令
|
function getCommandLog() {
|
$.ajax({
|
url: baseUrl + "/crn/command/ongoing",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200) {
|
var commands = res.data;
|
for (var i=0; i<commands.length;i++){
|
$("#crn"+commands[i].crnNo).val(commands[i].command);
|
}
|
} else if (res.code === 403) {
|
window.location.href = baseUrl + "/login";
|
} else {
|
alert(res.msg);
|
}
|
}
|
})
|
}
|
|
// 堆垛机信息表获取 ---- 表一
|
function getCrnStateInfo() {
|
var tableEl = $('#crn-state-table');
|
$.ajax({
|
url: baseUrl+ "/crn/table/crn/state",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200){
|
var table = res.data;
|
if (table.length > crnStateTableBlankRows && table.length !== crnStateTableFullRows) {
|
initCrnStateTable(table.length-crnStateTableBlankRows);
|
crnStateTableFullRows = 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].crnNo);
|
setVal(tr.children("td").eq(1), table[i-1].type);
|
setVal(tr.children("td").eq(2), table[i-1].warn);
|
setVal(tr.children("td").eq(3), table[i-1].loading);
|
setVal(tr.children("td").eq(4), table[i-1].bay);
|
setVal(tr.children("td").eq(5), table[i-1].lev);
|
setVal(tr.children("td").eq(6), table[i-1].forkOffset);
|
setVal(tr.children("td").eq(7), table[i-1].bayCoor);
|
setVal(tr.children("td").eq(8), table[i-1].levCoor);
|
setVal(tr.children("td").eq(9), table[i-1].complete);
|
setVal(tr.children("td").eq(10), table[i-1].workNo);
|
setVal(tr.children("td").eq(11), table[i-1].status);
|
setVal(tr.children("td").eq(12), table[i-1].warnCode);
|
}
|
} else if (res.code === 403){
|
window.location.href = baseUrl+"/login";
|
} else {
|
alert(res.msg);
|
}
|
}
|
});
|
}
|
|
// 堆垛机数据表获取 ---- 表二
|
function getCrnMsgInfo() {
|
var tableEl = $('#crn-msg-table');
|
$.ajax({
|
url: baseUrl+ "/crn/table/crn/msg",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200){
|
var table = res.data;
|
if (table.length > crnStateTableBlankRows && table.length !== crnMsgTableFullRows) {
|
initCrnStateTable(table.length-crnStateTableBlankRows);
|
crnMsgTableFullRows = 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].crnNo);
|
setVal(tr.children("td").eq(1), table[i-1].status);
|
setVal(tr.children("td").eq(2), table[i-1].workNo);
|
setVal(tr.children("td").eq(3), table[i-1].sourceStaNo);
|
setVal(tr.children("td").eq(4), table[i-1].staNo);
|
setVal(tr.children("td").eq(5), table[i-1].sourceLocNo);
|
setVal(tr.children("td").eq(6), table[i-1].locNo);
|
setVal(tr.children("td").eq(7), table[i-1].error);
|
setVal(tr.children("td").eq(8), table[i-1].origin);
|
setVal(tr.children("td").eq(9), table[i-1].command);
|
}
|
} else if (res.code === 403){
|
window.location.href = baseUrl+"/login";
|
} else {
|
alert(res.msg);
|
}
|
}
|
});
|
}
|
|
// 堆垛机手动操作区 -----------------------------------------------------------------------
|
|
function getReqParam() {
|
var crnNo = $('input[name="crnSelect"]:checked').val();
|
var sourceStaNo = $('#sourceStaNo').val();
|
var sourceRow = $('#sourceRow').val();
|
var sourceBay = $('#sourceBay').val();
|
var sourceLev = $('#sourceLev').val();
|
var staNo = $('#staNo').val();
|
var row = $('#row').val();
|
var bay = $('#bay').val();
|
var lev = $('#lev').val();
|
return {
|
crnNo: crnNo,
|
sourceStaNo: sourceStaNo,
|
sourceRow: sourceRow,
|
sourceBay: sourceBay,
|
sourceLev: sourceLev,
|
staNo: staNo,
|
row: row,
|
bay: bay,
|
lev: lev
|
};
|
}
|
|
// 入库
|
function put() {
|
http.post(baseUrl+"/crn/operator/put", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 出库
|
function take() {
|
http.post(baseUrl+"/crn/operator/take", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 库位转移
|
function stockMove() {
|
http.post(baseUrl+"/crn/operator/stockMove", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 站到站
|
function siteMove() {
|
http.post(baseUrl+"/crn/operator/siteMove", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 坐标移动
|
function coorMove() {
|
http.post(baseUrl+"/crn/operator/coorMove", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 回原点
|
function bacOrigin() {
|
http.post(baseUrl+"/crn/operator/bacOrigin", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 任务完成
|
function taskComplete() {
|
http.post(baseUrl+"/crn/operator/taskComplete", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 暂停
|
function pause() {
|
http.post(baseUrl+"/crn/operator/pause", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 启动
|
function boot() {
|
http.post(baseUrl+"/crn/operator/boot", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 清除命令
|
function clearCommand() {
|
http.post(baseUrl+"/crn/operator/clearCommand", getReqParam(), function (res) {
|
layer.msg(res.msg);
|
});
|
}
|
|
// 输送设备日志输出 -----------------------------------------------------------------------
|
function getSiteOutput() {
|
$.ajax({
|
url: baseUrl + "/crn/output/site",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200) {
|
crnOutput(res.data);
|
} else if (res.code === 403) {
|
window.location.href = baseUrl + "/login";
|
} else {
|
alert(res.msg);
|
}
|
}
|
})
|
}
|
|
// ------------------------------------------------------------------------------------------------
|
|
// 堆垛机信息表获取 ----- 表一
|
function initCrnStateTable(row) {
|
var line;
|
if (row === undefined){
|
var one = $('#crn-state-table thead').height();
|
var total = $('.crn-state').height();
|
var count = total / one;
|
count = parseInt(count) - 1;
|
crnStateTableBlankRows = count;
|
line = count;
|
} else {
|
line = row;
|
}
|
var html = "";
|
for (var 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" +
|
" </tr>\n";
|
}
|
$('#crn-state-table tbody').after(html);
|
}
|
|
// 堆垛机数据表获取 ----- 表二
|
function initCrnMsgTable(row) {
|
var line;
|
if (row === undefined){
|
var one = $('#crn-msg-table thead').height();
|
var total = $('.crn-msg').height();
|
var count = total / one;
|
count = parseInt(count) - 1;
|
crnMsgTableBlankRows = count;
|
line = count;
|
} else {
|
line = row;
|
}
|
var html = "";
|
for (var 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" +
|
" </tr>\n";
|
}
|
$('#crn-msg-table tbody').after(html);
|
}
|
|
// 日志输出框
|
function crnOutput(content){
|
crnOutputDom.value += content;
|
crnOutputDom.scrollTop = crnOutputDom.scrollHeight;
|
}
|
|
</script>
|
</html>
|