<!DOCTYPE html>
|
<html lang="en">
|
<head>
|
<meta charset="utf-8">
|
<title>环形穿梭车智能系统</title>
|
<link rel="stylesheet" href="../static/css/element.css">
|
<link rel="stylesheet" href="../static/css/element-ui.css">
|
<link rel="icon" href="../static/images/favicon.ico" type="image/x-icon">
|
<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/vue.min.js"></script>
|
<script type="text/javascript" src="../static/js/element.js"></script>
|
<script type="text/javascript" src="testPosition.js"></script>
|
<style>
|
body {
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
margin: 0;
|
padding: 0;
|
background-color: #a0d2eb;
|
color: #ffffff;
|
display: flex;
|
justify-content: center;
|
align-items: center;
|
height: 100vh;
|
}
|
header {
|
background-color: #2196F3;
|
color: white;
|
padding: 15px 20px;
|
text-align: center;
|
font-size: 24px;
|
letter-spacing: 1px;
|
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
|
}
|
.map {
|
position: relative;
|
width: 52vw;
|
height: 80vh;
|
border-radius: 50%;
|
display: flex;
|
justify-content: center;
|
align-items: center;
|
}
|
.inner-ring, .outer-ring {
|
position: absolute;
|
border-radius: 50%;
|
}
|
.inner-ring {
|
width: 72vh;
|
height: 72vh;
|
border: 4px solid #00E676;
|
box-shadow: inset 0 0 30px rgba(0, 230, 118, 0.5), 0 0 20px rgba(0, 230, 118, 0.5);
|
}
|
.outer-ring {
|
width: 80vh;
|
height: 80vh;
|
border: 4px solid #00E676;
|
box-shadow: inset 0 0 30px rgba(0, 230, 118, 0.5), 0 0 20px rgba(0, 230, 118, 0.5);
|
}
|
.station {
|
position: absolute;
|
width: 20px;
|
height: 14px;
|
text-align: center;
|
line-height: 1.5; /* 调整行高与字体大小的比值 */
|
font-size: 10px; /* 设置更小的字体 */
|
font-weight: bold;
|
transition: transform 0.3s ease;
|
background-color: #ab1839;
|
transform: scale(1); /* 可选:如果不需要放大效果 */
|
}
|
.bus {
|
font-size: 10px;
|
background-color: #2196F3;
|
border: 10px solid #ffffff;
|
position: absolute;
|
width: 15px;
|
height: 15px;
|
border-radius: 50%;
|
text-align: center;
|
line-height: 15px;
|
font-weight: bold;
|
transition: transform 0.3s ease;
|
}
|
.station:hover, .bus:hover {
|
transform: scale(1.4);
|
z-index: 999;
|
}
|
|
.task-bar-left {
|
position: fixed;
|
top: 1%;
|
/*transform: translateY(-50%);*/
|
width: 25%; /* 设置宽度 */
|
background-color: rgba(255, 255, 255, 0); /* 半透明背景 */
|
|
border-radius: 5px;
|
padding: 10px;
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0);
|
z-index: 1000; /* 确保在其他元素之上 */
|
}
|
|
.task-bar-right {
|
position: fixed;
|
top: 1%;
|
/*transform: translateY(-50%);*/
|
width: 25%; /* 设置宽度 */
|
background-color: rgba(255, 255, 255, 0); /* 半透明背景 */
|
|
border-radius: 5px;
|
padding: 10px;
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0);
|
z-index: 1000; /* 确保在其他元素之上 */
|
}
|
|
.task-bar-div1 {
|
/*width: 100%; !* 设置宽度 *!*/
|
background-color: rgba(255, 255, 255, 0.8); /* 半透明背景 */
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
|
}
|
|
.left-task-bar {
|
left: 20px; /* 距离左边的距离 */
|
/*bottom: 100px;*/
|
}
|
|
.right-task-bar {
|
/*bottom: 100px;*/
|
right: 20px; /* 距离右边的距离 */
|
}
|
|
.el-table .warning-row {
|
background: oldlace;
|
}
|
|
.el-table .success-row {
|
background: #f0f9eb;
|
}
|
.container {
|
width: 100vh;
|
height: 72vh;
|
position: absolute;
|
/*background: #8c939d;*/
|
}
|
.bus-station {
|
width: 100vh;
|
height: 72vh;
|
position: absolute;
|
display: flex;
|
/*background: #8c939d;*/
|
}
|
.bus-item-top {
|
background: red;
|
position: relative;
|
width: 40px;
|
height: 60px;
|
line-height: 60px;
|
top: 880px;
|
text-align: center;
|
}
|
.bus-item-left {
|
background: red;
|
position: relative;
|
width: 60px;
|
height: 40px;
|
line-height: 40px;
|
left: 1230px;
|
text-align: center;
|
}
|
.bus-item-left2 {
|
background: red;
|
position: relative;
|
width: 60px;
|
height: 40px;
|
line-height: 40px;
|
left: 1000px;
|
text-align: center;
|
}
|
</style>
|
</head>
|
<body>
|
<!--<header>-->
|
<!-- 环形穿梭车智能系统-->
|
<!--</header>-->
|
<div id="app">
|
<div class="map">
|
<div v-if="licenseDayI <=30 ">
|
<div style="color: red">{{licenseDay}}</div>
|
</div>
|
<!-- <div class="inner-ring"></div>-->
|
<!-- <div class="outer-ring"></div>-->
|
<!-- <div v-for="track in energyGatheringRing" class="inner-ring" :style="{ borderColor: track.trackColor , boxShadow : 'inset 0 0 30px '+track.radiationColor+', 0 0 20px '+track.radiationColor}"></div>-->
|
<!-- <div v-for="track in energyGatheringRing" class="outer-ring" :style="{ borderColor: track.trackColor , boxShadow : 'inset 0 0 30px '+track.radiationColor+', 0 0 20px '+track.radiationColor}"></div>-->
|
<svg class="container">
|
<!-- <path d="M 100,250-->
|
<!-- L 100,800-->
|
<!-- C 100,800 100,850 150,850-->
|
<!-- C 150,850 200,850 200,800-->
|
<!-- L 200,250-->
|
<!-- C 200,250 200,200 250,200-->
|
<!-- L 1100,200-->
|
<!-- C 1100,200 1150,200 1150,150-->
|
<!-- C 1150,150 1150,100 1100,100-->
|
<!-- L 250,100-->
|
<!-- C 250,100 90,90 100,250 z"-->
|
<!-- style="fill:none; stroke:blue; stroke-width:4;" />-->
|
<path d="M 0 0
|
L 80 0
|
L 80 600
|
L 800 600
|
L 800 650
|
L 0 650
|
Z"
|
style="fill:none; stroke:blue; stroke-width:4;" />
|
</svg>
|
<!-- <div class="bus-station">-->
|
<!-- <div v-for="(item,i) in devpPos1" class="bus-item-top" :style="'left:' + (75 + i * 15) + 'px'">{{item.dev_no}}</div>-->
|
<!-- </div>-->
|
<!-- <div class="bus-station" style="flex-direction: column">-->
|
<!-- <div v-for="(item,i) in devpPos2" class="bus-item-left" :style="'top:' + (200 + i * 50) + 'px'">{{item.dev_no}}</div>-->
|
<!-- </div>-->
|
<!-- <div class="bus-station" style="flex-direction: column">-->
|
<!-- <div v-for="(item,i) in devpPos3" class="bus-item-left2" :style="'top:' + (100 + i * 10) + 'px'">{{item.dev_no}}</div>-->
|
<!-- </div>-->
|
<!-- Stations on outer ring-->
|
<div v-for="station in tableDataDev" class="station" :style="{ top: station.valueY + 'px', left: station.valueX + 'px' }">{{ station.index }}</div>
|
<div>
|
<el-switch
|
style="display: block"
|
v-model="valueSystem"
|
active-color="#13ce66"
|
inactive-color="#A64036"
|
active-text="系统运行中..."
|
inactive-text="系统已停止!"
|
@change='upDateValueSystem'>
|
</el-switch>
|
</div>
|
<!-- Buses -->
|
<div v-for="bus in tableDataRgv" class="bus" :style="{ top: bus.valueY + 'px', left: bus.valueX + 'px' , borderColor: bus.modeColor, backgroundColor: bus.statusColor}">{{ bus.index }}</div>
|
</div>
|
|
<!-- Left Task Bar -->
|
<div class="task-bar-left left-task-bar" >
|
<div>
|
<el-tooltip :content="'Switch value: ' + valueLeft" placement="top">
|
<el-switch
|
v-model="valueLeft"
|
active-color="#13ce66"
|
inactive-color="#ff4949"
|
active-value="100"
|
inactive-value="0">
|
</el-switch>
|
</el-tooltip>
|
</div>
|
<div v-if="valueLeft === '100' " class="task-bar-div1">
|
<el-table
|
:data="tableDataLeft"
|
style="width: 100%"
|
:row-class-name="tableRowClassName">
|
<el-table-column
|
prop="wrkNo"
|
label="工作号">
|
</el-table-column>
|
<el-table-column
|
prop="rgvNo"
|
label="RGV号">
|
</el-table-column>
|
<el-table-column
|
prop="wrkSts$"
|
label="工作状态">
|
</el-table-column>
|
<el-table-column
|
prop="sourceStaNo"
|
label="源站">
|
</el-table-column>
|
<el-table-column
|
prop="staNo"
|
label="目标站">
|
</el-table-column>
|
<el-table-column
|
prop="modiTime"
|
label="下发时间">
|
</el-table-column>
|
<!-- <el-table-column-->
|
<!-- prop="modiTime"-->
|
<!-- label="更新时间">-->
|
<!-- </el-table-column>-->
|
<el-table-column
|
prop="rgvSts"
|
label="RGV状态">
|
</el-table-column>
|
<el-table-column
|
label="操作"
|
type="template">
|
<template slot-scope="scope">
|
<el-button
|
type="danger"
|
size="small"
|
@click="taskDelete(scope.row)">
|
删除
|
</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
</div>
|
</div>
|
|
<!-- Right Task Bar -->
|
<div class="task-bar-right right-task-bar">
|
<div>
|
<el-tooltip :content="'Switch value: ' + valueRight" placement="top">
|
<el-switch
|
v-model="valueRight"
|
active-color="#13ce66"
|
inactive-color="#ff4949"
|
active-value="100"
|
inactive-value="0">
|
</el-switch>
|
</el-tooltip>
|
</div>
|
<div v-if="valueRight === '100' " class="task-bar-div1">
|
<el-table
|
:data="tableDataRight"
|
style="width: 100%"
|
:row-class-name="tableRowClassName">
|
<el-table-column
|
prop="rgvId"
|
label="编号"
|
width="80">
|
</el-table-column>
|
<el-table-column
|
prop="rgvNo"
|
label="小车号">
|
</el-table-column>
|
<el-table-column
|
prop="position"
|
label="位置">
|
</el-table-column>
|
<el-table-column
|
prop="status$"
|
label="状态">
|
</el-table-column>
|
<el-table-column
|
label="操作"
|
type="template">
|
<template slot-scope="scope">
|
<el-button
|
:type="scope.row.status === 0 ? 'primary' : 'danger'"
|
size="small"
|
@click="toggleStatus(scope.$index, scope.row)">
|
{{ scope.row.status === 0 ? '禁用' : '解除禁用' }}
|
</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
</div>
|
</div>
|
</div>
|
|
<script>
|
var app = new Vue({
|
el: '#app',
|
data: {
|
activeNames: ['1'],
|
valueLeft: '0',
|
valueRight: '0',
|
licenseDay: '已过期',
|
licenseDayI: 100,
|
valueSystem: false,
|
tableDataRgv: [],
|
tableDataDev: [],
|
energyGatheringRing: [],
|
tableDataLeft: [],
|
tableDataRight: [],
|
devpPos1:[
|
{dev_no: 116,pos:633980},
|
{dev_no: 117,pos:604043},
|
{dev_no: 118,pos:574323},
|
{dev_no: 119,pos:559534},
|
{dev_no: 120,pos:544682},
|
{dev_no: 121,pos:514912},
|
{dev_no: 122,pos:485227},
|
{dev_no: 123,pos:470367},
|
{dev_no: 124,pos:455514},
|
{dev_no: 125,pos:425768},
|
{dev_no: 126,pos:396268},
|
{dev_no: 127,pos:381106},
|
{dev_no: 128,pos:366311},
|
{dev_no: 129,pos:336638},
|
{dev_no: 130,pos:306820},
|
{dev_no: 131,pos:277067},
|
{dev_no: 132,pos:257418},
|
{dev_no: 133,pos:217730},
|
],
|
devpPos2:[
|
{dev_no: 112,pos:891000},
|
{dev_no: 113,pos:865000},
|
{dev_no: 114,pos:800000},
|
{dev_no: 115,pos:780000},
|
],
|
devpPos3:[
|
{dev_no: 101,pos:1269958},
|
{dev_no: 102,pos:1243454},
|
{dev_no: 103,pos:1229081},
|
{dev_no: 104,pos:1202099},
|
{dev_no: 105,pos:1187564},
|
{dev_no: 106,pos:1160630},
|
{dev_no: 107,pos:1146152},
|
{dev_no: 108,pos:1119463},
|
{dev_no: 109,pos:1105038},
|
{dev_no: 110,pos:1077961},
|
{dev_no: 111,pos:1063813},
|
],
|
},
|
created(){
|
this.init();
|
this.devpPos1.reverse()
|
this.devpPos3.reverse()
|
},
|
watch: {
|
|
},
|
methods: {
|
init(){
|
this.getTableDataRgv()
|
this.getTableDataDev()
|
this.getTableDataTrack()
|
this.getTableDataLeft()
|
this.getTableDataRight()
|
this.getValueSystem()
|
this.getLicenseDays()
|
|
setInterval(() => {
|
this.getTableDataRgv()
|
this.getTableDataDev()
|
this.getTableDataTrack()
|
this.getTableDataLeft()
|
this.getTableDataRight()
|
this.getValueSystem()
|
this.getLicenseDays()
|
|
}, 1000)
|
},
|
handleChange(val) {
|
console.log(val);
|
if (val.length === 0){
|
valueRight = '0';
|
} else {
|
console.log("2222"+val);
|
|
if (val.length >= 1){
|
this.handleChangeValueRight(1)
|
}
|
}
|
},
|
taskDelete(row) {
|
let that = this;
|
that.$confirm('确认要删除该设备吗?', '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning'
|
}).then(() => {
|
$.ajax({
|
url: baseUrl + "/rgv/disable/task/delete",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
data: {
|
wrkNo: row.wrkNo
|
},
|
success: function (res) {
|
if (res.code === 200) {
|
that.$message.success('删除成功');
|
// 删除当前行
|
that.tableDataRight.splice(that.tableDataRight.indexOf(row), 1);
|
} else {
|
that.$message.error('删除失败');
|
}
|
}
|
});
|
});
|
},
|
toggleStatus(index, row) {
|
let that = this;
|
const currentStatus = row.status;
|
const targetStatus = currentStatus === 0 ? 1 : 0;
|
|
that.$confirm(`确认要${currentStatus === 0 ? '禁用' : '启用'}该设备吗?`, '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning'
|
}).then(() => {
|
$.ajax({
|
url: baseUrl + "/rgv/disable/rgv/status",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
data: {
|
rgvNo: row.rgvNo,
|
status: targetStatus
|
},
|
success: function (res) {
|
if (res.code === 200) {
|
that.$message.success(`状态更新成功`);
|
row.status$ = targetStatus; // 更新前端状态
|
} else {
|
that.$message.error('状态更新失败');
|
}
|
}
|
});
|
});
|
},
|
handleChangeValueRight(val) {
|
console.log("33333"+val);
|
|
switch (val){
|
case 1:
|
valueRight = '100';
|
case 2:
|
valueRight = '100';
|
case 3:
|
valueRight = '100';
|
case 4:
|
valueRight = '100';
|
default:
|
valueRight = '0';
|
}
|
},
|
tableRowClassName({row, rowIndex}) {
|
if (rowIndex === 1) {
|
return 'warning-row';
|
} else if (rowIndex === 3) {
|
return 'success-row';
|
}
|
return '';
|
},
|
getLicenseDays(){
|
let that = this;
|
$.ajax({
|
url: baseUrl + "/license/getLicenseDays",
|
headers: {'token': localStorage.getItem('token')},
|
method: 'POST',
|
success: function (res) {
|
if (res.code == 200) {
|
if (res.data.day<0){
|
that.licenseDay = "已过期"+res.data.day+"天";
|
that.licenseDayI = -1;
|
} else {
|
that.licenseDay = "许可证有效期"+res.data.day+"天";
|
that.licenseDayI = res.data.day;
|
}
|
}else {
|
that.licenseDay = "已过期";
|
that.licenseDayI = -1;
|
}
|
}
|
});
|
|
},
|
getValueSystem() {
|
let that = this;
|
$.ajax({
|
url: baseUrl + "/console/system/running/status",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {},
|
dataType: 'json',
|
contentType: 'application/json;charset=UTF-8',
|
method: 'post',
|
success: function (res) {
|
that.valueSystem = res.data.status
|
}
|
});
|
},
|
upDateValueSystem(){
|
let that = this;
|
let operatorTypeI = 0;
|
if (that.valueSystem){
|
operatorTypeI = 1;
|
}
|
$.ajax({
|
url: baseUrl + "/console/system/switch",
|
headers: {'token': localStorage.getItem('token')},
|
data: {operatorType : operatorTypeI},
|
method: 'POST',
|
success: function (res) {
|
if (res.code === 200) {
|
that.valueSystem = res.data.status;
|
}
|
}
|
});
|
},
|
getTableDataLeft() {
|
let that = this;
|
$.ajax({
|
url: baseUrl + "/rgv/ring/through/task/wrk/mast/position/data",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {},
|
dataType: 'json',
|
contentType: 'application/json;charset=UTF-8',
|
method: 'post',
|
success: function (res) {
|
that.tableDataLeft = res.data
|
}
|
});
|
},
|
getTableDataRight() {
|
let that = this;
|
$.ajax({
|
url: baseUrl + "/rgv/task/rgv/circular/shuttle/mast/position/data",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {},
|
dataType: 'json',
|
contentType: 'application/json;charset=UTF-8',
|
method: 'post',
|
success: function (res) {
|
that.tableDataRight = res.data
|
}
|
});
|
},
|
getTableDataRgv() {
|
let that = this;
|
// that.tableDataRgv = busPsto
|
// return
|
$.ajax({
|
url: baseUrl + "/rgv/ring/through/rgv/position/data",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {},
|
dataType: 'json',
|
contentType: 'application/json;charset=UTF-8',
|
method: 'post',
|
success: function (res) {
|
that.tableDataRgv = res.data
|
}
|
});
|
},
|
getTableDataDev() {
|
let that = this;
|
$.ajax({
|
url: baseUrl + "/rgv/ring/through/dev/position/data",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {},
|
dataType: 'json',
|
contentType: 'application/json;charset=UTF-8',
|
method: 'post',
|
success: function (res) {
|
that.tableDataDev = res.data
|
}
|
});
|
},
|
getTableDataTrack() {
|
let that = this;
|
$.ajax({
|
url: baseUrl + "/rgv/ring/through/track/position/data",
|
headers: {
|
'token': localStorage.getItem('token')
|
},
|
data: {},
|
dataType: 'json',
|
contentType: 'application/json;charset=UTF-8',
|
method: 'post',
|
success: function (res) {
|
that.energyGatheringRing = res.data
|
}
|
});
|
}
|
}
|
})
|
|
</script>
|
</body>
|
|
</html>
|