<template>
|
<div id="title">
|
<div id="bkuang" style="border-top: none">
|
<!-- GM仓堆垛机状态面板 -->
|
<div class="skuang">
|
<div class="zhuname">干膜仓堆垛机</div>
|
<div class="zhankuang">
|
<div class="xname">堆垛机状态:</div>
|
<div class="xzhi" :title="gmData.R_GM_Status">{{ gmData.R_GM_Status || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">堆垛机手自动状态:</div>
|
<div class="xzhi" :title="gmData.R_GM_AutoStatus">{{ gmData.R_GM_AutoStatus || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">正在执行的任务号:</div>
|
<div class="xzhi" :title="gmData.R_GM_TaskNum">{{ gmData.R_GM_TaskNum || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">堆垛机工作状态:</div>
|
<div class="xzhi" :title="gmData.R_GM_WorkStatus">{{ gmData.R_GM_WorkStatus || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">作业类型:</div>
|
<div class="xzhi" :title="gmData.R_GM_WorkType">{{ gmData.R_GM_WorkType || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">托盘类型:</div>
|
<div class="xzhi" :title="gmData.R_GM_TrayType">{{ gmData.R_GM_TrayType || '-' }}</div>
|
</div>
|
<!-- 新增:当前列状态显示 -->
|
<div class="zhankuang">
|
<div class="xname">当前所在列:</div>
|
<div class="xzhi" :title="gmData.R_GM_Column">{{ gmData.R_GM_Column || '未知' }}</div>
|
</div>
|
</div>
|
|
<!-- GM关联站台(入库7003) -->
|
<div class="skuang">
|
<div class="zhuname">入库7003站台</div>
|
<div class="zhankuang">
|
<div class="xname">读取箱体码(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Boxcode">{{ gmData.R_GM_Boxcode || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">握手信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_HandShake3">{{ gmData.R_GM_HandShake3 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否联机(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Online3">{{ gmData.R_GM_Online3 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否空闲(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Free3">{{ gmData.R_GM_Free3 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否有货(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Goods3">{{ gmData.R_GM_Goods3 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否故障(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Alarm3">{{ gmData.R_GM_Alarm3 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">请求信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_STB3">{{ gmData.R_GM_STB3 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">响应信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_ACK3">{{ gmData.R_GM_ACK3 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">请求信号(写):</div>
|
<div class="xzhi" :title="gmData.W_GM_STB3">{{ gmData.W_GM_STB3 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">响应信号(写):</div>
|
<div class="xzhi" :title="gmData.W_GM_ACK3">{{ gmData.W_GM_ACK3 || '-' }}</div>
|
</div>
|
</div>
|
|
<!-- GM关联站台(出库7004+7005) -->
|
<div class="skuang">
|
<div class="zhuname">出库终点7004站台</div>
|
<div class="zhankuang">
|
<div class="xname">握手信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_HandShake4">{{ gmData.R_GM_HandShake4 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否联机(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Online4">{{ gmData.R_GM_Online4 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否空闲(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Free4">{{ gmData.R_GM_Free4 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否有货(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Goods4">{{ gmData.R_GM_Goods4 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否故障(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Alarm4">{{ gmData.R_GM_Alarm4 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">请求信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_STB4">{{ gmData.R_GM_STB4 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">响应信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_ACK4">{{ gmData.R_GM_ACK4 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">请求信号(写):</div>
|
<div class="xzhi" :title="gmData.W_GM_STB4">{{ gmData.W_GM_STB4 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">响应信号(写):</div>
|
<div class="xzhi" :title="gmData.W_GM_ACK4">{{ gmData.W_GM_ACK4 || '-' }}</div>
|
</div>
|
|
<div class="zhuname">出库7005站台</div>
|
<div class="zhankuang">
|
<div class="xname">握手信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_HandShake5">{{ gmData.R_GM_HandShake5 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否联机(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Online5">{{ gmData.R_GM_Online5 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否空闲(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Free5">{{ gmData.R_GM_Free5 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否有货(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Goods5">{{ gmData.R_GM_Goods5 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">是否故障(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_Alarm5">{{ gmData.R_GM_Alarm5 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">请求信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_STB5">{{ gmData.R_GM_STB5 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">响应信号(读):</div>
|
<div class="xzhi" :title="gmData.R_GM_ACK5">{{ gmData.R_GM_ACK5 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">请求信号(写):</div>
|
<div class="xzhi" :title="gmData.W_GM_STB5">{{ gmData.W_GM_STB5 || '-' }}</div>
|
</div>
|
<div class="zhankuang">
|
<div class="xname">响应信号(写):</div>
|
<div class="xzhi" :title="gmData.W_GM_ACK5">{{ gmData.W_GM_ACK5 || '-' }}</div>
|
</div>
|
</div>
|
</div>
|
|
<!-- 新增:堆垛机当前列文字显示 -->
|
<div id="gm-nowcolumn" :class="{ 'abnormal-column': gmData.R_GM_Status !== '正常' }">
|
<div>干膜堆垛机当前所在列:
|
<span :title="gmData.R_GM_Column">{{ gmData.R_GM_Column || '未知' }}</span>
|
</div>
|
</div>
|
|
<!-- 新增:列方格展示区域 -->
|
<div class="gm-column-container" :class="{ 'pp-status-abnormal': gmData.R_GM_Status !== '正常' }">
|
<!-- 上方1-24列 -->
|
<div class="column-grid-container">
|
<div
|
v-for="num in 20"
|
:key="num"
|
class="column-grid-item"
|
:class="{ 'active': num == gmData.R_GM_Column }"
|
:title="`列号: ${num}`"
|
>
|
{{ num }}
|
</div>
|
</div>
|
<!-- 下方25-47列 (23个) -->
|
<div class="column-grid-container">
|
<div
|
v-for="i in 19"
|
:key="'gm-lower-' + i"
|
class="column-grid-item"
|
:class="{ 'active': (20 + i) == gmData.R_GM_Column }"
|
:title="`列号: ${20 + i}`"
|
>
|
{{ 20 + i }}
|
</div>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import { ref, nextTick, watch, onUnmounted } from "vue";
|
import { useStore } from "vuex";
|
import { onMounted } from "vue";
|
|
export default {
|
data() {
|
return {
|
xuan: 0
|
};
|
},
|
setup() {
|
const store = useStore();
|
const gmData = ref({});
|
|
const UPDATE_DELAY = 300;
|
let updateTimer = null;
|
|
// GM数据映射规则(新增列号处理)
|
const gmStatusConfig = {
|
coreStatus: {
|
R_GM_Status: { 0: "正常", 1: "故障", 2: "急停", 3: "未知" },
|
R_GM_AutoStatus: { 0: "维修", 1: "手动", 2: "半自动", 3: "自动" },
|
R_GM_WorkStatus: { 0: "待机", 1: "取货中", 2: "取货完成", 4: "放货中", 5: "放货完成", 6: "任务完成" },
|
R_GM_WorkType: { 0: "无作业任务(0)", 1: "取放货作业(1)", 2: "只取货作业(2)", 3: "只放货作业(3)", 4: "移动到指定位置" },
|
R_GM_TrayType: { "-1": "空箱(-1)", 1: "小托盘(1)", 2: "中托盘(2)", 3: "大托盘(3)", 4: "特大托盘(4)" },
|
// 新增:列号映射处理
|
R_GM_Column: (val) => val !== undefined ? val : "未知"
|
},
|
onlineStatus: {
|
keys: ["R_GM_Online3", "R_GM_Online4", "R_GM_Online5"],
|
map: { true: "联机", false: "脱机" }
|
},
|
alarmStatus: {
|
keys: ["R_GM_Alarm3", "R_GM_Alarm4", "R_GM_Alarm5"],
|
map: { true: "故障", false: "正常" }
|
},
|
freeStatus: {
|
keys: ["R_GM_Free3", "R_GM_Free4", "R_GM_Free5"],
|
map: { true: "空闲", false: "繁忙" }
|
},
|
goodsStatus: {
|
keys: ["R_GM_Goods3", "R_GM_Goods4", "R_GM_Goods5"],
|
map: { true: "有货", false: "无货" }
|
},
|
signalFields: {
|
keys: [
|
"R_GM_HandShake3", "R_GM_STB3", "R_GM_ACK3", "W_GM_STB3", "W_GM_ACK3",
|
"R_GM_HandShake4", "R_GM_STB4", "R_GM_ACK4", "W_GM_STB4", "W_GM_ACK4",
|
"R_GM_HandShake5", "R_GM_STB5", "R_GM_ACK5", "W_GM_STB5", "W_GM_ACK5"
|
],
|
map: { true: "是", false: "否" }
|
}
|
};
|
|
// 处理GM原始数据(包含列号处理)
|
const processGMData = (rawData) => {
|
if (!rawData) return {};
|
const processed = { ...rawData };
|
|
// 处理核心状态字段
|
Object.entries(gmStatusConfig.coreStatus).forEach(([key, handler]) => {
|
if (processed.hasOwnProperty(key)) {
|
// 列号字段使用函数处理,其他使用映射表
|
processed[key] = typeof handler === 'function'
|
? handler(processed[key])
|
: (handler[processed[key]] || processed[key]);
|
}
|
});
|
|
// 批量处理分组字段
|
[
|
gmStatusConfig.onlineStatus,
|
gmStatusConfig.alarmStatus,
|
gmStatusConfig.freeStatus,
|
gmStatusConfig.goodsStatus,
|
gmStatusConfig.signalFields
|
].forEach(group => {
|
group.keys.forEach(key => {
|
if (processed.hasOwnProperty(key)) {
|
processed[key] = group.map[processed[key]] || processed[key];
|
}
|
});
|
});
|
|
return processed;
|
};
|
|
const delayedUpdateGMData = (newRawData) => {
|
if (updateTimer) clearTimeout(updateTimer);
|
|
updateTimer = setTimeout(() => {
|
if (newRawData && newRawData.R_GM_Status !== undefined) {
|
gmData.value = processGMData(newRawData);
|
|
nextTick(() => {
|
const valueElements = document.getElementsByClassName("xzhi");
|
for (let i = 0; i < valueElements.length; i++) {
|
const text = valueElements[i].innerHTML;
|
if (text === "是" || text === "联机") {
|
valueElements[i].style.color = "yellow";
|
} else if (text === "否") {
|
valueElements[i].style.color = "red";
|
}
|
}
|
});
|
}
|
}, UPDATE_DELAY);
|
};
|
|
onMounted(() => {
|
const initialData = store.state.homedata;
|
if (initialData && initialData.R_GM_Status !== undefined) {
|
gmData.value = processGMData(initialData);
|
}
|
|
const unwatch = watch(
|
() => store.state.homedata,
|
(newData) => {
|
if (newData && newData.R_GM_Status !== undefined) {
|
delayedUpdateGMData(newData);
|
}
|
},
|
{ deep: true }
|
);
|
|
onUnmounted(() => {
|
unwatch();
|
if (updateTimer) clearTimeout(updateTimer);
|
});
|
});
|
|
return {
|
gmData
|
};
|
}
|
};
|
</script>
|
|
<style scoped>
|
/* 原有样式保持不变 */
|
.ding {
|
float: left;
|
width: 20px;
|
height: 20px;
|
margin-top: 7px;
|
}
|
.yan {
|
color: white;
|
float: left;
|
font-size: 25px;
|
}
|
.dakuang {
|
width: 250px;
|
height: 50px;
|
position: absolute;
|
top: 150px;
|
left: 200px;
|
}
|
#xiugai {
|
width: 100px;
|
height: 30px;
|
float: left;
|
border-radius: 5px;
|
text-align: center;
|
line-height: 30px;
|
cursor: pointer;
|
border: 1px solid white;
|
color: white;
|
background: rgba(255, 255, 255, 0.5);
|
font-size: 25px;
|
position: absolute;
|
top: 150px;
|
left: 450px;
|
}
|
#xiugai:hover {
|
background: #f60;
|
}
|
#shu1,
|
#shu2 {
|
width: 200px;
|
height: 30px;
|
float: left;
|
margin-top: 0px;
|
margin-right: 0px;
|
border-radius: 5px;
|
border: 1px solid white;
|
}
|
#guan {
|
width: 40px;
|
height: 40px;
|
float: left;
|
font-size: 1.1cqw;
|
text-align: center;
|
line-height: 40px;
|
cursor: pointer;
|
margin-left: 560px;
|
color: white;
|
position: absolute;
|
}
|
#ti {
|
width: 600px;
|
height: 300px;
|
position: relative;
|
background: rgba(255, 255, 255, 1);
|
border-radius: 10px;
|
top: 230px;
|
left: 35%;
|
display: none;
|
background-image: url("../../img/1.png");
|
background-repeat: no-repeat;
|
background-size: 170%;
|
background-position: -220px 0px;
|
}
|
.zhuname {
|
width: 100%;
|
height: 5vh;
|
float: left;
|
text-align: center;
|
line-height: 50px;
|
font-weight: 700;
|
font-size: 1.1cqw;
|
color: white;
|
}
|
.xname {
|
width: 70%;
|
height: 80px;
|
float: left;
|
line-height: 7vh;
|
font-size: 1.1cqw;
|
color: white;
|
}
|
.xzhi {
|
width: 30%;
|
height: 7vh;
|
float: left;
|
line-height: 50px;
|
font-size: 1.1cqw;
|
color: rgb(242, 242, 50);
|
white-space: nowrap;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
}
|
.zhankuang {
|
width: 45%;
|
height: 3vh;
|
margin-top: 10px;
|
margin-left: 5%;
|
float: left;
|
}
|
#title {
|
float: left;
|
width: 95%;
|
height: 88vh;
|
margin-top: 40px;
|
margin-left: 3%;
|
background-image: url("../../img/1.png");
|
background-repeat: no-repeat;
|
background-size: 100%;
|
container-type: inline-size;
|
}
|
#bkuang {
|
width: 100%;
|
height: 55vh;
|
float: left;
|
}
|
.skuang {
|
width: 31%;
|
height: 55vh;
|
float: left;
|
border-top: none;
|
border-left: none;
|
border-bottom: none;
|
background: rgba(255, 255, 255, 0.2);
|
margin-left: 1.7%;
|
border-radius: 10px;
|
}
|
|
/* 新增:GM堆垛机当前列样式 */
|
#gm-nowcolumn {
|
width: 100%;
|
height: 70px;
|
float: left;
|
display: flex;
|
justify-content: center;
|
align-items: center;
|
font-size: 1.5cqw;
|
font-weight: bold;
|
color: #00ff4c;
|
}
|
|
/* 异常状态文字变色 */
|
#gm-nowcolumn.abnormal-column {
|
color: red !important;
|
}
|
#gm-nowcolumn.abnormal-column span {
|
color: red !important;
|
}
|
|
/* 列容器样式 */
|
.gm-column-container {
|
width: 95%;
|
margin: 0 auto;
|
position: relative;
|
clear: both;
|
padding-top: 15px;
|
}
|
|
/* 方格容器样式 */
|
.column-grid-container {
|
width: 100%;
|
display: flex;
|
flex-wrap: nowrap;
|
justify-content: space-between;
|
align-items: center;
|
gap: 2px;
|
position: relative;
|
z-index: 2;
|
margin-bottom: 10px;
|
padding: 0 2px;
|
}
|
|
/* 方格样式 */
|
.column-grid-item {
|
flex: 1;
|
min-width: 24px;
|
max-width: 60px;
|
height: 30px;
|
border: 1px solid #fff;
|
border-radius: 8px 8px 0 0;
|
color: white;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
font-size: clamp(8px, 1vw, 14px);
|
box-sizing: border-box;
|
transition: background-color 0.3s ease;
|
}
|
|
/* 当前列高亮 */
|
.column-grid-item.active {
|
background-color: green;
|
font-weight: bold;
|
}
|
|
/* 异常状态下当前列红色高亮 */
|
.pp-status-abnormal .column-grid-item.active {
|
background-color: red !important;
|
}
|
</style>
|