|
|
|
|
@ -27,8 +27,8 @@
|
|
|
|
|
<Chart ref="successRateRef"></Chart>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="menu">
|
|
|
|
|
<el-menu active-text-color="#ffd04b" background-color="#545c64" class="el-menu-vertical-demo" default-active="2" text-color="#fff">
|
|
|
|
|
<template v-for="(i, index) in treeData" :key="i.id">
|
|
|
|
|
<el-menu active-text-color="#ffd04b" background-color="#062852" class="el-menu-vertical-demo" default-active="2" text-color="#fff">
|
|
|
|
|
<template v-for="(i, index) in centerData" :key="i.id">
|
|
|
|
|
<MenuItem :data="i" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-menu>
|
|
|
|
|
@ -64,10 +64,10 @@
|
|
|
|
|
</div>
|
|
|
|
|
<div class="center" ref="scrollNodeRef" @mouseenter="mouseenter" @mouseleave="mouseleave">
|
|
|
|
|
<div v-masonry style="width: 100%; height: 100%" ref="masonryRef">
|
|
|
|
|
<TreeItem v-masonry-tile :data="i" v-for="i in centerData" :key="i.id" :wsData="wsData" :copy="false" />
|
|
|
|
|
<TreeItem v-masonry-tile :data="i" v-for="i in centerData" :key="i.id" :deviceData="deviceData" :copy="false" />
|
|
|
|
|
</div>
|
|
|
|
|
<div v-masonry style="width: 100%; height: 100%">
|
|
|
|
|
<TreeItem v-masonry-tile :data="i" v-for="i in centerData" :key="i.id" :wsData="wsData" :copy="true" />
|
|
|
|
|
<TreeItem v-masonry-tile :data="i" v-for="i in centerData" :key="i.id" :deviceData="deviceData" :copy="true" />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
@ -83,10 +83,10 @@ import { useRouter } from 'vue-router';
|
|
|
|
|
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
const toIndex = () => {
|
|
|
|
|
router.push('index');
|
|
|
|
|
router.push('/index');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
import { getRealtimeStats, getLocationTree, getSuccessRateTrends } from '@/api/rfid/dashboard';
|
|
|
|
|
import { getRealtimeStats, getLocationTree, getSuccessRateTrends, getDeviceLatestRecords } from '@/api/rfid/dashboard';
|
|
|
|
|
|
|
|
|
|
let timer = null;
|
|
|
|
|
|
|
|
|
|
@ -98,13 +98,11 @@ function findParentsWithLocationType3(arr) {
|
|
|
|
|
let hasChildWith3 = false;
|
|
|
|
|
|
|
|
|
|
if (item.children && Array.isArray(item.children)) {
|
|
|
|
|
// 遍历 children,看是否有 locationType 为 "3"
|
|
|
|
|
for (const child of item.children) {
|
|
|
|
|
if (child.locationType === '3') {
|
|
|
|
|
hasChildWith3 = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 递归继续遍历 children
|
|
|
|
|
traverse(item.children);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -147,7 +145,7 @@ const mouseleave = () => {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
hover.value = false;
|
|
|
|
|
scrollNodeRef.value.scrollTop -= 1;
|
|
|
|
|
}, 500);
|
|
|
|
|
}, 100);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const overview = ref({});
|
|
|
|
|
@ -168,7 +166,7 @@ const hover = ref(false);
|
|
|
|
|
const tableData = ref();
|
|
|
|
|
const treeData = ref();
|
|
|
|
|
const centerData = ref([]);
|
|
|
|
|
const wsData = ref({});
|
|
|
|
|
const deviceData = ref({});
|
|
|
|
|
|
|
|
|
|
const MenuItem = defineComponent({
|
|
|
|
|
name: 'MenuItem',
|
|
|
|
|
@ -348,9 +346,6 @@ const getData = () => {
|
|
|
|
|
treeData.value = res.data;
|
|
|
|
|
centerData.value = findParentsWithLocationType3(res.data);
|
|
|
|
|
console.log(centerData.value);
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
scrollToBottom(scrollNodeRef.value, 2);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -402,32 +397,55 @@ const getSocket = () => {
|
|
|
|
|
|
|
|
|
|
socket.addEventListener('message', (event) => {
|
|
|
|
|
let data = JSON.parse(event.data);
|
|
|
|
|
console.log(data);
|
|
|
|
|
if (data?.deviceStatus === '1') {
|
|
|
|
|
wsData.value[data.deviceId] = data;
|
|
|
|
|
|
|
|
|
|
if (data?.dataType === '2') {
|
|
|
|
|
deviceData.value[data.deviceId] = {
|
|
|
|
|
status: data.readStatus === '1',
|
|
|
|
|
code: data.epcStr,
|
|
|
|
|
time: parseTime(data.recordTime)
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
if (data?.deviceStatus === '2' && data?.alarmFlag === '1') {
|
|
|
|
|
if (data?.dataType === '1') {
|
|
|
|
|
deviceData.value[data.deviceId] = {
|
|
|
|
|
status: false,
|
|
|
|
|
code: '',
|
|
|
|
|
time: parseTime(data.recordTime)
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
if (data?.alarmFlag === '1') {
|
|
|
|
|
tableData.value.push({
|
|
|
|
|
alarmTime: parseTime(data.recordTime),
|
|
|
|
|
deviceName: wsData.value[data.deviceId]?.epcStr.trimStart() || '',
|
|
|
|
|
deviceName: deviceData.value[data.deviceId]?.epcStr?.trimStart() || '',
|
|
|
|
|
location: centerData.value.flatMap((item) => item.children || []).find((child) => child.deviceId === targetDeviceId)?.locationAlias || '',
|
|
|
|
|
alarmAction: data.alarmAction
|
|
|
|
|
});
|
|
|
|
|
if (data.dataType === '2') {
|
|
|
|
|
wsData.value[data.deviceId] = data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (data?.deviceStatus === '3' && data?.alarmFlag === '1') {
|
|
|
|
|
tableData.value.push({
|
|
|
|
|
alarmTime: parseTime(data.recordTime),
|
|
|
|
|
deviceName: wsData.value[data.deviceId]?.epcStr.trimStart() || '',
|
|
|
|
|
location: centerData.value.flatMap((item) => item.children || []).find((child) => child.deviceId === targetDeviceId)?.locationAlias || '',
|
|
|
|
|
alarmAction: data.alarmAction
|
|
|
|
|
});
|
|
|
|
|
if (data.dataType === '2') {
|
|
|
|
|
wsData.value[data.deviceId] = data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if (data?.deviceStatus === '1') {
|
|
|
|
|
// deviceData.value[data.deviceId] = data;
|
|
|
|
|
// }
|
|
|
|
|
// if (data?.deviceStatus === '2' && data?.alarmFlag === '1') {
|
|
|
|
|
// tableData.value.push({
|
|
|
|
|
// alarmTime: parseTime(data.recordTime),
|
|
|
|
|
// deviceName: deviceData.value[data.deviceId]?.epcStr.trimStart() || '',
|
|
|
|
|
// location: centerData.value.flatMap((item) => item.children || []).find((child) => child.deviceId === targetDeviceId)?.locationAlias || '',
|
|
|
|
|
// alarmAction: data.alarmAction
|
|
|
|
|
// });
|
|
|
|
|
// if (data.dataType === '2') {
|
|
|
|
|
// deviceData.value[data.deviceId] = data;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// if (data?.deviceStatus === '3' && data?.alarmFlag === '1') {
|
|
|
|
|
// tableData.value.push({
|
|
|
|
|
// alarmTime: parseTime(data.recordTime),
|
|
|
|
|
// deviceName: deviceData.value[data.deviceId]?.epcStr.trimStart() || '',
|
|
|
|
|
// location: centerData.value.flatMap((item) => item.children || []).find((child) => child.deviceId === targetDeviceId)?.locationAlias || '',
|
|
|
|
|
// alarmAction: data.alarmAction
|
|
|
|
|
// });
|
|
|
|
|
// if (data.dataType === '2') {
|
|
|
|
|
// deviceData.value[data.deviceId] = data;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
socket.addEventListener('close', () => {
|
|
|
|
|
@ -440,9 +458,32 @@ const getSocket = () => {
|
|
|
|
|
// console.error('⚠️ WebSocket 出错:', error);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
let timer1 = null;
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
getData();
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
scrollToBottom(scrollNodeRef.value, 2);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
getDeviceLatestRecords().then((res) => {
|
|
|
|
|
res.data.forEach((item) => {
|
|
|
|
|
deviceData.value[item.deviceId] = {
|
|
|
|
|
code: item.latestBarcode,
|
|
|
|
|
status: item.readStatus === '1',
|
|
|
|
|
time: parseTime(new Date())
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
getSocket();
|
|
|
|
|
timer1 = setInterval(() => {
|
|
|
|
|
getData();
|
|
|
|
|
}, 1000 * 30);
|
|
|
|
|
});
|
|
|
|
|
onBeforeMount(() => {
|
|
|
|
|
if (timer1) {
|
|
|
|
|
clearInterval(timer1);
|
|
|
|
|
timer1 = null;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
<style scoped lang="less">
|
|
|
|
|
@ -578,6 +619,8 @@ onMounted(() => {
|
|
|
|
|
width: 14.7%;
|
|
|
|
|
height: 69.5%;
|
|
|
|
|
overflow: auto;
|
|
|
|
|
border-top-left-radius: 1.3vw;
|
|
|
|
|
border-top-right-radius: 1.3vw;
|
|
|
|
|
|
|
|
|
|
&::-webkit-scrollbar {
|
|
|
|
|
display: none;
|
|
|
|
|
@ -653,4 +696,8 @@ onMounted(() => {
|
|
|
|
|
/deep/ .el-menu {
|
|
|
|
|
border: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/deep/ .el-sub-menu {
|
|
|
|
|
border-bottom: 1px solid #061b3d;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
|