<!DOCTYPE html>
|
<html lang="en">
|
<head>
|
<meta charset="UTF-8">
|
<title>WCS控制中心</title>
|
<link rel="stylesheet" href="../../static/css/animate.min.css">
|
<link rel="stylesheet" href="../../static/vue/element/element.css">
|
<link rel="stylesheet" href="../../static/css/watch/console_vue.css">
|
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
|
<script type="text/javascript" src="../../static/layui/layui.js"></script>
|
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.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>
|
</head>
|
<body>
|
<div id="app">
|
<div style="display: flex;margin-top: 30px;margin-left: 20px;">
|
<div style="width: 20%;height: 60vh;margin-right: 20px;">
|
<el-tabs type="border-card" v-model="activateCard" @tab-click="handleCardClick">
|
<el-tab-pane label="堆垛机" name="crn">
|
<watch-crn-card :param="crnParam"></watch-crn-card>
|
</el-tab-pane>
|
<el-tab-pane label="输送站" name="devp">
|
<devp-card :param="devpParam"></devp-card>
|
</el-tab-pane>
|
<el-tab-pane label="RGV" name="rgv">RGV</el-tab-pane>
|
<el-tab-pane label="地图配置" name="mapSetting">
|
<map-setting-card :param="mapSettingParam"></map-setting-card>
|
</el-tab-pane>
|
</el-tabs>
|
</div>
|
<div id="mapDataId" style="position: relative;" :style="{zoom: mapSettingParam.zoom / 100}">
|
<table class="excel-table">
|
<tr v-for="(row,index) in map" :key="index">
|
<td
|
v-for="(col,idx) in row" :key="idx"
|
:rowspan="col.rowSpan"
|
:colspan="col.colSpan"
|
:style="{width: col.width}"
|
v-if="col.type != 'merge'"
|
>
|
<div v-if="col.type == 'none'">
|
<div class="item" style="visibility: hidden">{{idx}}</div>
|
</div>
|
<div v-else-if="col.type == 'shelf'">
|
<div class="shelf">{{col.shelfIdx}}</div>
|
</div>
|
<div v-else-if="col.type == 'devp'">
|
<div class="site" :style="{height: col.rowPx}" :id="'site-' + getStationId(col.value)" @click="openSite(getStationId(col.value))">{{getStationId(col.value)}}</div>
|
</div>
|
<div v-else-if="col.type == 'rgv'" style="position: relative;">
|
<div class="rgv-item" v-if="getDeviceNo(col.value) != -1" :style="{width: col.width}" :id="'rgv-' + getDeviceNo(col.value)" @click="openRgv(getDeviceNo(col.value))">{{getDeviceNo(col.value)}}</div>
|
<div class="track-item" v-if="getTrackSiteNo(col.value) == -1"></div>
|
<div class="track-item" v-else :id="'rgvTrackSiteNo-' + getTrackSiteNo(col.value)"></div>
|
</div>
|
<div v-else-if="col.type == 'crn'">
|
<div class="crn-item" v-if="getDeviceNo(col.value) != -1" :style="{width: col.width}" :id="'crn-' + getDeviceNo(col.value)" @click="openCrn(getDeviceNo(col.value))">{{getDeviceNo(col.value)}}</div>
|
<div class="track-item" v-if="getTrackSiteNo(col.value) == -1"></div>
|
<div class="track-item" v-else :id="'crnTrackSiteNo-' + getTrackSiteNo(col.value)"></div>
|
</div>
|
</td>
|
|
<!-- <td>-->
|
<!-- <!– 显示行号 –>-->
|
<!-- <div class="item" style="background: none;color: #000;">#{{index+1}}</div>-->
|
<!-- </td>-->
|
</tr>
|
</table>
|
</div>
|
</div>
|
|
</div>
|
|
<script src="../../components/WatchCrnCard.js"></script>
|
<script src="../../components/DevpCard.js"></script>
|
<script src="../../components/MapSettingCard.js"></script>
|
<script>
|
var app = new Vue({
|
el: '#app',
|
data: {
|
map: [],//地图数据
|
crnList: [], //堆垛机集合
|
systemStatus: true,//系统运行状态
|
consoleInterval: null,//定时器存储变量
|
crnInitPosition: [],
|
rgvPosition: [],
|
activateCard: 'crn',
|
crnParam: {
|
crnNo: 0
|
},
|
mapSettingParam: {
|
zoom: 70
|
},
|
devpParam: {
|
stationId: 0
|
}
|
},
|
created() {
|
this.init()
|
},
|
watch: {
|
|
},
|
methods: {
|
init() {
|
this.getMap()
|
this.getSystemRunningStatus() //获取系统运行状态
|
|
this.consoleInterval = setInterval(() => {
|
this.getCrnInfo() //获取堆垛机数据
|
this.getSiteInfo() //获取输送站点数据
|
this.getRgvInfo() //获取RGV数据
|
}, 1000)
|
},
|
//获取地图数据
|
getMap() {
|
let rowPx = 35;
|
let colPx = 35;
|
|
$.ajax({
|
url: baseUrl + "/basMap/lev/1/auth",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
method: "get",
|
success: (res) => {
|
let data = res.data;
|
let mapData = JSON.parse(data)
|
mapData.forEach((row) => {
|
let shelfIdx = 1;
|
row.forEach((col) => {
|
if (col.type == 'shelf') {
|
col.shelfIdx = shelfIdx;
|
shelfIdx++;
|
}
|
|
col.rowPx = (col.rowSpan * rowPx) + "px";
|
col.colPx = (col.colSpan * colPx) + "px";
|
|
col.width = (col.cellWidth / 30) + "px";
|
})
|
})
|
this.map = mapData;
|
}
|
})
|
},
|
openCrn(id) {
|
this.crnParam.crnNo = id;
|
},
|
openRgv(id) {
|
this.rgvWindow = true; //打开RGV信息弹窗
|
$(".detailed").empty();
|
$('.detailed').append(id + '号RGV');
|
$.ajax({
|
url: baseUrl + "/console/rgv/detail",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {
|
rgvNo: id
|
},
|
method: 'post',
|
success: function(res) {
|
for (var val in res.data) {
|
var find = $("#rgvWindow").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');
|
}
|
}
|
}
|
|
})
|
},
|
openSite(id) {
|
this.devpParam.stationId = id;
|
},
|
getSiteInfo() {
|
//获取输送站点数据
|
$.ajax({
|
url: baseUrl + "/console/latest/data/station",
|
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].stationId);
|
siteEl.attr("class", "site " + sites[i].stationStatus);
|
if (sites[i].taskNo != null && sites[i].taskNo>0) {
|
siteEl.html(sites[i].stationId + "[" + sites[i].taskNo + "]");
|
} else {
|
siteEl.html(sites[i].stationId);
|
}
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
}
|
}
|
});
|
},
|
getCrnInfo() {
|
let that = this
|
//获取堆垛机数据
|
$.ajax({
|
url: baseUrl + "/console/latest/data/crn",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200) {
|
var crns = res.data;
|
|
if (that.crnInitPosition.length == 0) {
|
let position = []
|
for (var i = 0; i < crns.length; i++) {
|
var crnEl = $("#crn-" + crns[i].crnId);
|
position.push({
|
id: crns[i].crnId,
|
left: crnEl.offset().left + crnEl.width()
|
})
|
}
|
that.crnInitPosition = position
|
return;
|
}
|
|
let crnList = []
|
for (var i = 0; i < crns.length; i++) {
|
var crnEl = $("#crn-" + crns[i].crnId);
|
crnEl.attr("class", "crn-item " + crns[i].crnStatus);
|
|
if (crns[i].bay < 0 || crns[i].bay === -2) {
|
crns[i].bay = 1
|
}
|
|
let basePosition = 0;
|
that.crnInitPosition.forEach((item) => {
|
if (item.id == crns[i].crnId) {
|
basePosition = item.left
|
}
|
})
|
|
var offSet = crns[i].offset;
|
let finalOffset = basePosition + offSet;
|
if (finalOffset < basePosition) {
|
finalOffset = basePosition;
|
}
|
crnEl.animate({left: finalOffset + 'px'}, 1000);
|
|
crnList.push({
|
crnNo: crns[i].crnId,
|
crnStatus: crns[i].crnStatus
|
})
|
}
|
that.crnList = crnList;
|
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
}
|
}
|
});
|
},
|
getRgvInfo() {
|
let that = this
|
//获取RGV数据
|
$.ajax({
|
url: baseUrl + "/console/latest/data/rgv",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200) {
|
var rgvs = res.data;
|
|
if (that.rgvPosition.length == 0) {
|
let position = []
|
for (var i = 0; i < rgvs.length; i++) {
|
var rgvEl = $("#rgv-" + rgvs[i].rgvId);
|
position.push({
|
id: rgvs[i].rgvId,
|
trackSiteNo: rgvs[i].trackSiteNo,
|
initLeft: rgvEl.offset().left
|
})
|
}
|
that.rgvPosition = position
|
return;
|
}
|
|
for (var i = 0; i < rgvs.length; i++) {
|
var rgvEl = $("#rgv-" + rgvs[i].rgvId);
|
if (rgvs[i].rgvStatus == 'IDLE') {
|
rgvEl.attr("class", "rgv-item");
|
}else if (rgvs[i].rgvStatus == 'WORKING') {
|
rgvEl.attr("class", "rgv-item machine-working");
|
}
|
|
let trackSiteNo = rgvs[i].trackSiteNo;
|
let trackSiteEl = $("#rgvTrackSiteNo-" + trackSiteNo);
|
|
let flag = false;
|
that.rgvPosition.forEach((item) => {
|
if (item.id == rgvs[i].rgvId) {
|
if (item.trackSiteNo != trackSiteNo) {
|
flag = true
|
}
|
}
|
})
|
|
if (flag) {
|
let finalOffset = 0;
|
let targetPosition = trackSiteEl.parent().parent().position().left;
|
let rgvPosition = rgvEl.position().left;
|
let calcResult = targetPosition - rgvPosition
|
if (calcResult > 0) {
|
finalOffset = targetPosition + trackSiteEl.width();
|
}else {
|
finalOffset = targetPosition;
|
}
|
|
rgvEl.animate({left: finalOffset + "px"}, 500);
|
|
let position = []
|
that.rgvPosition.forEach((item) => {
|
if (item.id == rgvs[i].rgvId) {
|
item.trackSiteNo = trackSiteNo
|
}
|
position.push(item)
|
})
|
that.rgvPosition = position
|
}
|
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
console.log(res.msg);
|
}
|
}
|
});
|
},
|
systemSwitch() {
|
// 系统开关
|
let that = this
|
if (this.systemStatus) {
|
this.$prompt('请输入口令,并停止WCS系统', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
}).then(({
|
value
|
}) => {
|
that.doSwitch(0, value)
|
}).catch(() => {
|
|
});
|
} else {
|
this.doSwitch(1)
|
}
|
},
|
doSwitch(operatorType, password) {
|
let that = this
|
$.ajax({
|
url: baseUrl + "/console/system/switch",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {
|
operatorType: operatorType,
|
password: password
|
},
|
method: 'POST',
|
success: function(res) {
|
if (res.code === 200) {
|
if (res.data.status) {
|
$('#system-toggle-checked').attr("checked", true);
|
$('#system-run-desc').html("系统运行中...");
|
that.systemStatus = true;
|
parent.systemRunning = true;
|
} else {
|
$('#system-toggle-checked').attr("checked", false);
|
$('#system-run-desc').html("系统已停止!");
|
that.systemStatus = false;
|
parent.systemRunning = false;
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
that.$message({
|
message: res.msg,
|
type: 'error'
|
});
|
}
|
}
|
});
|
},
|
getSystemRunningStatus() {
|
// 获取wcs系统运行状态
|
let that = this
|
$.ajax({
|
url: baseUrl + "/console/system/running/status",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
method: 'POST',
|
success: function(res) {
|
if (res.code === 200) {
|
if (res.data.status) {
|
$('#system-toggle-checked').attr("checked", true);
|
$('#system-run-desc').html("系统运行中...");
|
that.systemStatus = true;
|
parent.systemRunning = true;
|
} else {
|
$('#system-toggle-checked').attr("checked", false);
|
$('#system-run-desc').html("系统已停止!");
|
that.systemStatus = false;
|
parent.systemRunning = false;
|
}
|
} else if (res.code === 403) {
|
parent.location.href = baseUrl + "/login";
|
} else {
|
that.$message({
|
message: res.msg,
|
type: 'error'
|
});
|
}
|
}
|
});
|
},
|
getDeviceNo(obj) {
|
if (this.isJson(obj)) {
|
let data = JSON.parse(obj)
|
if (data.deviceNo == null || data.deviceNo == undefined) {
|
return -1;
|
}
|
return data.deviceNo;
|
}else {
|
return -1;
|
}
|
},
|
getStationId(obj) {
|
if (this.isJson(obj)) {
|
let data = JSON.parse(obj)
|
if (data.stationId == null || data.stationId == undefined) {
|
return -1;
|
}
|
return data.stationId;
|
}else {
|
return -1;
|
}
|
},
|
getTrackSiteNo(obj) {
|
if (this.isJson(obj)) {
|
let data = JSON.parse(obj)
|
if (data.trackSiteNo == null || data.trackSiteNo == undefined) {
|
return -1;
|
}
|
return data.trackSiteNo;
|
}else {
|
return -1;
|
}
|
},
|
isJson(str) {
|
try {
|
JSON.parse(str);
|
return true;
|
} catch (e) {
|
return false;
|
}
|
},
|
handleCardClick(tab, event) {
|
|
}
|
}
|
})
|
</script>
|
</body>
|
</html>
|