<!DOCTYPE html>
|
<html lang="en">
|
<head>
|
<meta charset="UTF-8">
|
<title>自动仓库wcs系统</title>
|
<link rel="stylesheet" href="../static/css/render.css">
|
<script src="../static/js/jquery/jquery-3.3.1.min.js"></script>
|
<script src="../static/js/layer/layer.js"></script>
|
<!--地图json-->
|
<script src="../static/js/console.map.js"></script>
|
<script src="../static/js/console.js"></script>
|
<script src="../static/js/common.js"></script>
|
|
|
</head>
|
<body>
|
<div id="main">
|
<div class="head">
|
<div class="head-left">
|
<h1>自动仓库WCS监控图</h1>
|
<h6>AUTOMATIC WAREHOUSE WCS MONITORING DIAGRAM</h6>
|
</div>
|
<div class="head-right">
|
<img src="../static/images/zy-logo.png" alt="中扬" height="44" width="80">
|
</div>
|
</div>
|
<!-- 货架 + 堆垛机 + 入库站点 -->
|
<div class="main-part">
|
|
</div>
|
<div id="body">
|
<!-- 总开关 -->
|
<div class="system-state">
|
<div class="body-head">总开关</div>
|
<div class="switch">
|
<div id="system-icon" class="system-icon-open" onclick="systemSwitch()"></div>
|
<div class="switch_r">
|
<p>系统状态</p>
|
<p id="system-run-desc">系统运行中</p>
|
</div>
|
</div>
|
</div>
|
<!-- 堆垛机状态 -->
|
<div class="machine-status">
|
<div class="body-head">堆垛机状态</div>
|
<div class="state">
|
<span>堆垛机 1</span>
|
<span class="state-ss machine-put-flag ">入库</span>
|
</div>
|
<div class="state">
|
<span>堆垛机 2</span>
|
<span class="state-ss machine-auto-flag ">自动</span>
|
|
</div>
|
<div class="button"><span>所有状态</span></div>
|
<div class="button item-group">
|
<span class="machine-put-flag">入库</span>
|
<span class="machine-take-flag">出库</span>
|
<span class="machine-stock-move-flag">库到库</span>
|
<span class="machine-site-move-flag">站到站</span>
|
<span class="machine-p-move-flag">PToP</span>
|
<span class="machine-error-flag">异常</span>
|
<span class="machine-auto-flag">自动</span>
|
<span class="machine-unauto-flag">非自动/手动</span>
|
</div>
|
</div>
|
<div class="line-status">
|
<div class="body-head">输送线状态</div>
|
<div class="state states">
|
<span>运输线总数</span>
|
<span id="line-total" class="line-ss"></span>
|
</div>
|
<div class="button"><span>所有状态</span></div>
|
<div class="button item-group">
|
<span class="site-auto-run-id">自动+有物+ID</span>
|
<span class="site-auto-run">自动+有物</span>
|
<span class="site-auto-id">自动+ID</span>
|
<span class="site-auto">自动</span>
|
<span class="site-unauto">非自动/手动</span>
|
</div>
|
</div>
|
<div class="bar-code">
|
<div class="body-head" id="code">条码扫描器</div>
|
<div class="tablebox">
|
<div class="table-head">
|
<li><span>条码名称</span><span class="right">扫码时间</span></li>
|
</div>
|
<div id="barcode1" class="table-body">
|
|
</div>
|
</div>
|
<div class="tablebox">
|
<div class="table-head">
|
<li><span>条码名称</span><span class="right">扫码时间</span></li>
|
</div>
|
<div id="barcode2" class="table-body">
|
|
</div>
|
</div>
|
<div class="tablebox">
|
<div class="table-head">
|
<li><span>条码名称</span><span class="right">扫码时间</span></li>
|
</div>
|
<div id="barcode3" class="table-body">
|
|
</div>
|
</div>
|
</div>
|
</div>
|
<!-- 堆垛机弹窗 -->
|
<div id="crnWindow" style="display: none;" class="animate__animated animate__fadeIn">
|
<div id="crnWindow-head">
|
<div class='detailed'></div>
|
<button></button>
|
</div>
|
<form>
|
<!-- 堆垛机号 -->
|
<div class="form-item">
|
<div class="form-item-label" style>
|
<span>堆垛机号:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="crnNo" value="">
|
</div>
|
</div>
|
<!-- 工作号 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>工作号:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="workNo" value="">
|
</div>
|
</div>
|
<!-- 站源 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>站源:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="sourceStaNo" value="">
|
</div>
|
</div>
|
<!-- 目标站 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>目标站:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="staNo" value="">
|
</div>
|
</div>
|
<!-- 工作状态 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>工作状态:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="wrkSts" value="">
|
</div>
|
</div>
|
<!-- 出入类型 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>出入类型:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="ioType" value="">
|
</div>
|
</div>
|
<!-- 源库位 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>源库位:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="sourceLocNo" value="">
|
</div>
|
</div>
|
<!-- 目标库位 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>目标库位:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="locNo" value="">
|
</div>
|
</div>
|
<!-- 堆垛机状态 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>堆垛机状态:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="crnStatus" value="">
|
</div>
|
</div>
|
<!-- 异常 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>异常:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="error" value="">
|
</div>
|
</div>
|
</form>
|
</div>
|
<!-- 输送设备弹窗 -->
|
<div id="siteWindow" style="display: none;" class="animate__animated animate__fadeIn">
|
<!-- 表头 -->
|
<div id="siteWindow-head">
|
<div class='detailed'></div>
|
<button></button>
|
</div>
|
<form>
|
<!-- 设备号 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>设备号:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="siteId" value="">
|
</div>
|
</div>
|
<!-- 工作号 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>工作号:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="workNo" value="">
|
</div>
|
</div>
|
<!-- 工作状态 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>工作状态:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="wrkSts" value="">
|
</div>
|
</div>
|
<!-- 自动 -->
|
<div class="form-item-checkbox">
|
<div class="form-item-label-checkbox">
|
<span>自动</span>
|
</div>
|
<div class="form-item-input-checkbox">
|
<input type="checkbox" name="autoing">
|
</div>
|
</div>
|
<!-- 有物 -->
|
<div class="form-item-checkbox">
|
<div class="form-item-label-checkbox">
|
<span>有物</span>
|
</div>
|
<div class="form-item-input-checkbox">
|
<input type="checkbox" name="loading">
|
</div>
|
</div>
|
<!-- 能入 -->
|
<div class="form-item-checkbox">
|
<div class="form-item-label-checkbox">
|
<span>能入</span>
|
</div>
|
<div class="form-item-input-checkbox">
|
<input type="checkbox" name="canining">
|
</div>
|
</div>
|
<!-- 能出 -->
|
<div class="form-item-checkbox">
|
<div class="form-item-label-checkbox">
|
<span>能出</span>
|
</div>
|
<div class="form-item-input-checkbox">
|
<input type="checkbox" name="canouting">
|
</div>
|
</div>
|
<!-- 出入类型 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>出入类型:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="ioType" value="">
|
</div>
|
</div>
|
<!-- 源站 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>源站:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="sourceStaNo" value="">
|
</div>
|
</div>
|
<!-- 目标站 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>目标站:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="staNo" value="">
|
</div>
|
</div>
|
<!-- 源库位 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>源库位:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="sourceLocNo" value="">
|
</div>
|
</div>
|
<!-- 目标库位 -->
|
<div class="form-item">
|
<div class="form-item-label">
|
<span>目标库位:</span>
|
</div>
|
<div class="form-item-input">
|
<input type="text" name="locNo" value="">
|
</div>
|
</div>
|
|
</form>
|
</div>
|
</div>
|
|
</body>
|
|
</html>
|
<script>
|
getMap();
|
</script>
|
<script>
|
setInterval(function () {
|
getCodeData();
|
renderBarCode();
|
}, 1000)
|
var tData = [],tData1 = [],tData2 = [],tData3 = [];
|
function getCodeData() {
|
$.ajax({
|
url: baseUrl + '/console/barcode/output/site',
|
method: 'GET',
|
success: function (res) {
|
console.log(res)
|
if (res.code === 200) {
|
tData = eval(res.data);
|
if (tData.length <= 5) {
|
tData1 = tData
|
} else if (tData.length <= 10) {
|
tData1 = tData.slice(0, 5)
|
tData.splice(0, 5)
|
tData2 = tData
|
} else if (tData.length <= 15) {
|
tData1 = tData.slice(0, 5)
|
tData2 = tData.slice(6, 10)
|
tData.splice(0, 10)
|
tData3 = tData
|
} else {
|
tData = tData.slice(-15)
|
tData1 = tData.slice(-15)
|
tData2 = tData.slice(-10)
|
tData3 = tData.slice(-5)
|
}
|
}
|
}
|
})
|
}
|
function renderBarCode() {
|
for (var i = 0; i < tData1.length; i++) {
|
var str1 = '<li><span>' + tData1[i].barcode + '</span><span class="right">' + tData1[i].time + '</span></li>'
|
$('#barcode1').append(str1)
|
}
|
for (var j = 0; j < tData2.length; j++) {
|
var str2 = '<li><span>' + tData2[j].barcode + '</span><span class="right">' + tData2[j].time + '</span></li>'
|
$('#barcode2').append(str2)
|
}
|
for (var k = 0; k < tData3.length; k++) {
|
var str3 = '<li><span>' + tData3[k].barcode + '</span><span class="right">' + tData3[k].time + '</span></li>'
|
$('#barcode3').append(str3)
|
}
|
}
|
</script>
|
<script type="text/javascript">
|
// 弹窗站点信息
|
$('.site').on('click', function () {
|
var id = this.id.split("-")[1];
|
$("#siteWindow").attr("style", "display:block;");//显示div
|
$("#crnWindow").attr("style", "display:none;");
|
$(".detailed").empty();
|
$('.detailed').append(id + '站点详细信息');
|
$.ajax({
|
url: baseUrl + "/console/site/detail",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {
|
siteId: id
|
},
|
method: 'post',
|
success: function (res) {
|
for (var val in res.data) {
|
var find = $("#siteWindow").find(":input[name='" + val + "']");
|
if (find[0].type === 'text') {
|
find.val(res.data[val]);
|
} else if (find[0].type === 'checkbox') {
|
find.attr("checked", res.data[val] === 'Y');
|
}
|
}
|
}
|
|
})
|
|
});
|
// 堆垛机信息
|
$('.machine').on('click', function () {
|
var id = this.id.split("-")[1];
|
$("#crnWindow").attr('style', 'display:block;');
|
$("#siteWindow").attr("style", "display:none;");
|
$('.detailed').empty();
|
$('.detailed').append(id + '号堆垛机');
|
$.ajax({
|
url: baseUrl + "/console/crn/detail",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {
|
crnNo: id
|
},
|
method: 'post',
|
success: function (res) {
|
for (var val in res.data) {
|
var find = $("#crnWindow").find(":input[name='" + val + "']");
|
if (find[0].type === 'text') {
|
find.val(res.data[val]);
|
} else if (find[0].type === 'checkbox') {
|
find.attr("checked", res.data[val] === 'Y');
|
}
|
}
|
}
|
|
})
|
|
})
|
// 弹窗关闭
|
$('button').on('click', function () {
|
$('#siteWindow').attr('style', 'display:none')
|
$('#crnWindow').attr('style', 'display:none')
|
})
|
|
|
var crn1Position = 0;
|
var crn2Position = 0;
|
var crn3Position = 0;
|
var crn4Position = 0;
|
var crn5Position = 0;
|
|
// 初始化
|
getSitesInfo();
|
getCrnInfo();
|
getSystemRunningStatus();
|
getBarcodeInfo();
|
getScaleInfo();
|
// 实时访问
|
setInterval(function () {
|
getCrnInfo();
|
getSystemRunningStatus();
|
getBarcodeInfo();
|
getScaleInfo();
|
}, 1000);
|
setInterval(function () {
|
getSitesInfo();
|
}, 3000);
|
|
// 系统运行开关
|
function systemSwitch() {
|
if (parent.systemRunning) {
|
layer.prompt({title: '请输入口令,并停止 WCS 系统', formType: 1, shadeClose: true}, function (pass, idx) {
|
layer.close(idx);
|
doSwitch(0, pass); // 停止wcs系统
|
});
|
} else {
|
doSwitch(1); // 启动wcs系统
|
}
|
}
|
|
// 请求服务器控制wcs系统运行状态
|
function doSwitch(operatorType, password) {
|
// 加载tips
|
var index = layer.load(1, {
|
shade: [0.1, '#fff']
|
});
|
$.ajax({
|
url: baseUrl + "/console/system/switch",
|
headers: {'token': localStorage.getItem('token')},
|
// async: false,
|
data: {
|
operatorType: operatorType,
|
password: password
|
},
|
method: 'POST',
|
success: function (res) {
|
layer.close(index);
|
if (res.code === 200) {
|
if (res.data.status) {
|
$('#system-icon').attr("class", "system-icon-open");
|
$('#system-run-desc').html("系统运行中...");
|
parent.systemRunning = true;
|
} else {
|
$('#system-icon').attr("class", "system-icon-close");
|
$('#system-run-desc').html("系统已停止!");
|
parent.systemRunning = false;
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
|
}
|
}
|
});
|
|
}
|
|
// 获取wcs系统运行状态
|
function getSystemRunningStatus() {
|
$.ajax({
|
url: baseUrl + "/console/system/running/status",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200) {
|
if (res.data.status) {
|
$('#system-icon').attr("class", "system-icon-open");
|
$('#system-run-desc').html("系统运行中...");
|
parent.systemRunning = true;
|
} else {
|
$('#system-icon').attr("class", "system-icon-close");
|
$('#system-run-desc').html("系统已停止!");
|
parent.systemRunning = false;
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
}
|
}
|
});
|
}
|
|
// 输送设备实时数据获取
|
function getSitesInfo() {
|
$.ajax({
|
url: baseUrl + "/console/latest/data/site",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200) {
|
var sites = res.data;
|
for (var i = 0; i < sites.length; i++) {
|
var siteEl = $("#site-" + sites[i].siteId);
|
siteEl.attr("class", "site " + sites[i].siteStatus);
|
if (sites[i].workNo != null && sites[i].workNo > 0) {
|
siteEl.html(sites[i].siteId + "[" + sites[i].workNo + "]");
|
} else {
|
siteEl.html(sites[i].siteId);
|
}
|
if (i + 1 === 8) {
|
carAnimate(i + 1, Number(sites[i].nearbySta));
|
}
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
}
|
}
|
});
|
}
|
|
// 堆垛机实时数据获取
|
function getCrnInfo() {
|
$.ajax({
|
url: baseUrl + "/console/latest/data/crn",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
// console.log(res)
|
if (res.code === 200) {
|
var crns = res.data;
|
for (var i = 0; i < crns.length; i++) {
|
var crnEl = $("#crn-" + crns[i].crnId);
|
crnEl.attr("class", "machine " + crns[i].crnStatus);
|
var unit = 0;//($('.item').eq(0).width() + 13) / 2;
|
|
if (crns[i].bay < 0 || crns[i].bay === -2) {
|
crns[i].bay = 1
|
}
|
// crnEl.animate({left: (crns[i].bay * unit) + 'px'}, 1000);
|
crns[i].bay = 15;
|
|
var offSet = 0;
|
unit = 60;
|
offSet = 325;
|
|
|
if(crns[i].bay === 1){
|
crnEl.animate({left: offSet + 'px'}, 1000);
|
} else {
|
crnEl.animate({left: (offSet - unit + (crns[i].bay * unit)) + 'px'}, 1000);
|
}
|
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
}
|
}
|
});
|
}
|
|
// 扫码器实时数据获取
|
function getBarcodeInfo() {
|
$.ajax({
|
url: baseUrl + "/console/latest/data/barcode",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200) {
|
var barcodes = res.data;
|
for (var i = 0; i < barcodes.length; i++) {
|
$("#code-decoder-data-" + barcodes[i].barcodeId).html(barcodes[i].codeValue);
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
}
|
}
|
});
|
}
|
|
// 磅秤实时数据获取
|
function getScaleInfo() {
|
$.ajax({
|
url: baseUrl + "/console/latest/data/scale",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
|
if (res.code === 200) {
|
var sclaes = res.data;
|
for (var i = 0; i < sclaes.length; i++) {
|
console.log(sclaes[i].scaleId + ":" + sclaes[i].value)
|
$("#scale-data-" + sclaes[i].scaleId).text(sclaes[i].value);
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
}
|
}
|
});
|
}
|
|
// 堆垛机偏移动画
|
function crnAnimate(id, leftVal) {
|
// console.log(crn1Position)
|
switch (id) {
|
case 1:
|
$("#crn-1").animate({left: leftVal + 'px'}, 1000);
|
crn1Position = leftVal;
|
break;
|
case 2:
|
$("#crn-2").animate({left: leftVal + 'px'}, 1000);
|
crn2Position = leftVal;
|
break;
|
case 3:
|
$("#crn-3").animate({left: leftVal + 'px'}, 1000);
|
crn3Position = leftVal;
|
break;
|
case 4:
|
$("#crn-4").animate({left: leftVal + 'px'}, 1000);
|
crn4Position = leftVal;
|
break;
|
case 5:
|
$("#crn-5").animate({left: leftVal + 'px'}, 1000);
|
crn5Position = leftVal;
|
break;
|
default:
|
break
|
}
|
}
|
|
// 小车偏移动画
|
function carAnimate(id, target) {
|
var targetTop = 122;
|
if (id === 8) {
|
switch (target) {
|
case 1:
|
targetTop += 160;
|
break;
|
case 2:
|
targetTop += 140;
|
break;
|
case 3:
|
targetTop += 80;
|
break;
|
case 4:
|
targetTop += 40;
|
break;
|
case 7:
|
targetTop += 0;
|
break;
|
default:
|
return;
|
}
|
} else {
|
return;
|
}
|
$("#site-" + id).animate({top: targetTop + 'px'}, 1000);
|
}
|
|
|
</script>
|