|
|
@@ -1,7 +1,6 @@
|
|
|
<!-- belt-new.vue -->
|
|
|
<template>
|
|
|
<div class="company-home">
|
|
|
- <!-- 顶部标题栏 + 下拉选择 -->
|
|
|
<customHeader> 皮带巷智能管控 </customHeader>
|
|
|
<div class="modal-box" id="modalBox" v-if="pageType !== 'history'">
|
|
|
<Three3D ref="three3D" :modalName="'pidai'" class="modal-3d" @success="initModalAnimate" />
|
|
|
@@ -10,36 +9,12 @@
|
|
|
<div class="top-bg">
|
|
|
<BeltNav @change-page="changePage" :pageType="pageType" />
|
|
|
</div>
|
|
|
- <!-- 主体区域 -->
|
|
|
+
|
|
|
<div class="border">
|
|
|
- <!-- 配置模块区 -->
|
|
|
- <template v-if="pageType == 'fire_risk_warn'">
|
|
|
- <ModuleCommon
|
|
|
- v-for="cfg in configs"
|
|
|
- :key="cfg.deviceType"
|
|
|
- :show-style="cfg.showStyle"
|
|
|
- :module-data="cfg.moduleData"
|
|
|
- :module-name="cfg.moduleName"
|
|
|
- :device-type="cfg.deviceType"
|
|
|
- :page-type="cfg.pageType"
|
|
|
- :data="data"
|
|
|
- :visible="true"
|
|
|
- />
|
|
|
- </template>
|
|
|
- <template v-if="pageType == 'emergencyControl'">
|
|
|
- <ModuleCommon
|
|
|
- v-for="cfg in configs"
|
|
|
- :key="cfg.deviceType"
|
|
|
- :show-style="cfg.showStyle"
|
|
|
- :module-data="cfg.moduleData"
|
|
|
- :module-name="cfg.moduleName"
|
|
|
- :device-type="cfg.deviceType"
|
|
|
- :page-type="cfg.pageType"
|
|
|
- :data="data"
|
|
|
- :visible="true"
|
|
|
- />
|
|
|
+ <template v-if="pageType === 'history'">
|
|
|
+ <History />
|
|
|
</template>
|
|
|
- <template v-if="pageType == 'sprayControl'">
|
|
|
+ <template v-else>
|
|
|
<ModuleCommon
|
|
|
v-for="cfg in configs"
|
|
|
:key="cfg.deviceType"
|
|
|
@@ -52,172 +27,46 @@
|
|
|
:visible="true"
|
|
|
/>
|
|
|
</template>
|
|
|
- <template v-if="pageType == 'history'">
|
|
|
- <History />
|
|
|
- </template>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { onMounted, ref, watch, nextTick } from 'vue';
|
|
|
+import { onMounted, ref, watch, nextTick, onUnmounted } from 'vue';
|
|
|
import customHeader from './components/customHeader-belt.vue';
|
|
|
import { useInitConfigs, useInitPage } from '../hooks/useInit';
|
|
|
import { testBeltNew, testYjkf, testSpary } from './configurable.data';
|
|
|
import ModuleCommon from './components/ModuleCommon.vue';
|
|
|
-import Three3D from '/@/views/vent/home/configurable/components/three3D.vue';
|
|
|
+import Three3D from '/@/views/vent/home/configurable/components/three3d.vue';
|
|
|
import BeltNav from './components/BeltNav.vue';
|
|
|
-import { useRouter, useRoute } from 'vue-router';
|
|
|
+import { useRoute } from 'vue-router';
|
|
|
import { getSystem, getMonitorAndAlertBelt, getDevice } from './configurable.api';
|
|
|
import { modalAnimate } from './threejs/belt.threejs';
|
|
|
import History from './components/detail/history.vue';
|
|
|
-// 初始化配置
|
|
|
+
|
|
|
const { configs, fetchConfigs } = useInitConfigs();
|
|
|
-const { updateEnhancedConfigs, updateData, data } = useInitPage('皮带巷三级防灭火系统');
|
|
|
-// const pageType = computed(() => {
|
|
|
-// const currentType = route.params.type as string;
|
|
|
-// return currentType;
|
|
|
-// });
|
|
|
-const pageType = ref('');
|
|
|
+const { updateData, data } = useInitPage('皮带巷三级防灭火系统');
|
|
|
const route = useRoute();
|
|
|
-// 下拉框选项
|
|
|
+
|
|
|
+// 锁:只初始化一次
|
|
|
+const initialized = ref(false);
|
|
|
+const pageType = ref('fire_risk_warn');
|
|
|
+
|
|
|
+// 缓存所有页面数据(核心:切换不闪烁)
|
|
|
+const pageCache = ref({
|
|
|
+ fire_risk_warn: { configs: testBeltNew },
|
|
|
+ emergencyControl: { configs: testYjkf },
|
|
|
+ sprayControl: { configs: testSpary },
|
|
|
+});
|
|
|
+
|
|
|
+let intervalTimer = null;
|
|
|
const beltOptions = [
|
|
|
{ id: '1', beltName: '主运巷皮带 1' },
|
|
|
{ id: '2', beltName: '主运巷皮带 2' },
|
|
|
];
|
|
|
-
|
|
|
const selectedBeltId = ref('1');
|
|
|
|
|
|
-// 模拟数据
|
|
|
-const readData = {
|
|
|
- fmhjcInfo: [
|
|
|
- {
|
|
|
- beltName: '主运巷皮带1',
|
|
|
- wz: { strtype: 'wz', avg: '111', max: '222', min: '333', alarm: false, pos: 'AAAA', maxTime: '2013-05-24 15:52:42' },
|
|
|
- hcl: { strtype: 'HCl', avg: 'XXX', max: 'XXX', min: 'XXX', alarm: false, pos: 'AAAA', maxTime: '2013-05-24 15:52:42' },
|
|
|
- gx: { strtype: 'gx', avg: 'XXX', max: 'XXX', min: 'XXX', alarm: false, pos: 'AAAA', maxTime: '2013-05-24 15:52:42' },
|
|
|
- co: { strtype: 'CO', avg: 'XXX', max: 'XXX', min: 'XXX', alarm: true, pos: 'AAAA', maxTime: '2013-05-24 15:52:42' },
|
|
|
- wd: { strtype: 'wd', avg: 'XXX', max: 'XXX', min: 'XXX', alarm: false, pos: 'AAAA', maxTime: '2013-05-24 15:52:42' },
|
|
|
- },
|
|
|
- ],
|
|
|
- pdhzfxInfo: [
|
|
|
- {
|
|
|
- beltName: '主运巷皮带1',
|
|
|
- warningLevel: '一般风险',
|
|
|
- sysList: [
|
|
|
- {
|
|
|
- time: '2026-03-21 13:23:34',
|
|
|
- area: '3#皮带区域',
|
|
|
- type: 'CO浓度异常',
|
|
|
- status: '三级预警',
|
|
|
- advice: '立即检查该区域设备,启动应急预案',
|
|
|
- action: '启动喷淋',
|
|
|
- },
|
|
|
- {
|
|
|
- time: '2026-03-21 13:23:34',
|
|
|
- area: '3#皮带区域',
|
|
|
- type: 'CO浓度异常',
|
|
|
- status: '三级预警',
|
|
|
- advice: '立即检查该区域设备,启动应急预案',
|
|
|
- action: '启动喷淋',
|
|
|
- },
|
|
|
- {
|
|
|
- time: '2026-03-21 13:23:34',
|
|
|
- area: '3#皮带区域',
|
|
|
- type: 'CO浓度异常',
|
|
|
- status: '三级预警',
|
|
|
- advice: '立即检查该区域设备,启动应急预案',
|
|
|
- action: '启动喷淋',
|
|
|
- },
|
|
|
- {
|
|
|
- time: '2026-03-21 13:23:34',
|
|
|
- area: '3#皮带区域',
|
|
|
- type: 'CO浓度异常',
|
|
|
- status: '三级预警',
|
|
|
- advice: '立即检查该区域设备,启动应急预案',
|
|
|
- action: '启动喷淋',
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- ],
|
|
|
- sensorAnalysis: {
|
|
|
- hy: { name: '火焰传感器', alarm: false, maxTime: '2013-05-24 15:52:42', pos: '' },
|
|
|
- wd: { name: '温度传感器', alarm: false, maxTime: '2013-05-24 15:52:42', pos: '' },
|
|
|
- yw: { name: '烟雾传感器', alarm: false, maxTime: '2013-05-24 15:52:42', pos: '' },
|
|
|
- },
|
|
|
- vehicleCOAnalysis: {
|
|
|
- isRisk: true,
|
|
|
- activityList: [
|
|
|
- {
|
|
|
- pos: '1#皮带区域',
|
|
|
- vehicle: '车辆23425',
|
|
|
- status: '0',
|
|
|
- // vehicle2: '车辆53456',
|
|
|
- // vehicle3: '未通过车辆',
|
|
|
- // coReason1: 'CO浓度异常升高,已确认为车辆干扰',
|
|
|
- // coReason3: 'CO浓度异常升高,已确认非车辆干扰',
|
|
|
- // possibleCause: '皮带摩擦过热或电器设备故障',
|
|
|
- // recommendation: '立即检查3#皮带区域设备',
|
|
|
- },
|
|
|
- {
|
|
|
- pos: '2#皮带区域',
|
|
|
- vehicle: '车辆53456',
|
|
|
- status: '1',
|
|
|
- },
|
|
|
- {
|
|
|
- pos: '3#皮带区域',
|
|
|
- vehicle: '未通过车辆',
|
|
|
- status: '0',
|
|
|
- },
|
|
|
- ],
|
|
|
- analysisList: [
|
|
|
- {
|
|
|
- pos: '1#皮带区域',
|
|
|
- analysisText: 'CO浓度异常升高,已确认为车辆干扰',
|
|
|
- },
|
|
|
- {
|
|
|
- pos: '1#皮带区域',
|
|
|
- analysisText: 'CO浓度异常升高,已确认为车辆干扰',
|
|
|
- },
|
|
|
- ],
|
|
|
- possibleCause: '皮带摩擦过热或电器设备故障',
|
|
|
- recommendation: '立即检查3#皮带区域设备',
|
|
|
- },
|
|
|
- sprayData: [
|
|
|
- {
|
|
|
- beltArea: '1#皮带区域',
|
|
|
- devicePosition: '1#皮带-50m处',
|
|
|
- netStatus: '0', // 网络状态:0=断开,1=连接
|
|
|
- runStatus: '1', // 运行状态:0=异常,1=正常
|
|
|
- waterVolume: 86,
|
|
|
- waterPressure: 1.4,
|
|
|
- },
|
|
|
- {
|
|
|
- beltArea: '2#皮带区域',
|
|
|
- devicePosition: '2#皮带-120m处',
|
|
|
- netStatus: '1',
|
|
|
- runStatus: '1',
|
|
|
- waterVolume: 72,
|
|
|
- waterPressure: 0.8,
|
|
|
- },
|
|
|
- {
|
|
|
- beltArea: '3#皮带区域',
|
|
|
- devicePosition: '3#皮带-200m处',
|
|
|
- netStatus: '1',
|
|
|
- runStatus: '0',
|
|
|
- waterVolume: 45,
|
|
|
- waterPressure: 1.6,
|
|
|
- },
|
|
|
- ],
|
|
|
-};
|
|
|
-
|
|
|
-// 下拉框切换处理
|
|
|
-function handleBeltChange(id: string) {
|
|
|
- selectedBeltId.value = id;
|
|
|
- refresh();
|
|
|
-}
|
|
|
-
|
|
|
-// 风险等级样式映射
|
|
|
+// 风险等级样式
|
|
|
function getLevelClass(level: string) {
|
|
|
switch (level) {
|
|
|
case '重大风险':
|
|
|
@@ -230,101 +79,93 @@ function getLevelClass(level: string) {
|
|
|
return '';
|
|
|
}
|
|
|
}
|
|
|
-// 刷新数据
|
|
|
-function refresh() {
|
|
|
- fetchConfigs('sys_Leather').then(() => {
|
|
|
- console.log(pageType.value, '========');
|
|
|
- if (pageType.value == 'fire_risk_warn') {
|
|
|
- configs.value = testBeltNew;
|
|
|
- const params = {
|
|
|
- sysId: '1637983899775242242',
|
|
|
- dataList: 'fire_risk_warn,warn_result,vehicle_co_correlate',
|
|
|
- };
|
|
|
- Promise.resolve(getMonitorAndAlertBelt(params)).then(updateData);
|
|
|
- } else if (pageType.value == 'emergencyControl') {
|
|
|
- const params = {
|
|
|
- devicetype: 'sys',
|
|
|
- systemID: '1637983899775242242',
|
|
|
- type: 'ventS',
|
|
|
- };
|
|
|
- Promise.resolve(getSystem(params)).then(updateData);
|
|
|
- configs.value = testYjkf;
|
|
|
- } else if (pageType.value == 'sprayControl') {
|
|
|
- const params = {
|
|
|
- devicetype: 'sys',
|
|
|
- systemID: '2028657172566073346',
|
|
|
- };
|
|
|
- Promise.resolve(getDevice(params)).then((originalData) => {
|
|
|
- updateData(originalData);
|
|
|
- const sprayData: any[] = [];
|
|
|
- if (data.value?.msgTxt) {
|
|
|
- data.value.msgTxt.forEach((item) => {
|
|
|
- const hasSprayAuto = item.type && item.type.toLowerCase().includes('spray_auto');
|
|
|
- if (hasSprayAuto) {
|
|
|
- sprayData.push({
|
|
|
- ...item,
|
|
|
- ...item.readData,
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- data.value.sprayData = sprayData;
|
|
|
- updateData(data.value);
|
|
|
- });
|
|
|
- configs.value = testSpary;
|
|
|
- } else {
|
|
|
- configs.value = testBeltNew;
|
|
|
- }
|
|
|
- });
|
|
|
-}
|
|
|
|
|
|
-// // 定时刷新
|
|
|
-function initInterval() {
|
|
|
- setInterval(() => {
|
|
|
- refresh();
|
|
|
- }, 60000);
|
|
|
-}
|
|
|
+// 刷新:只更新数据,不抖动
|
|
|
+async function refresh(isFirst = false) {
|
|
|
+ await fetchConfigs('sys_Leather');
|
|
|
|
|
|
-async function changePage(pageTypeStr: string) {
|
|
|
- const finalPageType = pageTypeStr || (route.query.pageType as string) || '';
|
|
|
- pageType.value = finalPageType;
|
|
|
- await refresh();
|
|
|
+ if (pageType.value === 'fire_risk_warn') {
|
|
|
+ configs.value = testBeltNew;
|
|
|
+ const res = await getMonitorAndAlertBelt({
|
|
|
+ sysId: '1637983899775242242',
|
|
|
+ dataList: 'fire_risk_warn,warn_result,vehicle_co_correlate',
|
|
|
+ });
|
|
|
+ updateData(res);
|
|
|
+ } else if (pageType.value === 'emergencyControl') {
|
|
|
+ configs.value = testYjkf;
|
|
|
+ const res = await getSystem({
|
|
|
+ devicetype: 'sys',
|
|
|
+ systemID: '1637983899775242242',
|
|
|
+ type: 'ventS',
|
|
|
+ });
|
|
|
+ updateData(res);
|
|
|
+ } else if (pageType.value === 'sprayControl') {
|
|
|
+ const params = {
|
|
|
+ devicetype: 'sys',
|
|
|
+ systemID: '2028657172566073346',
|
|
|
+ };
|
|
|
+ Promise.resolve(getDevice(params)).then((originalData) => {
|
|
|
+ updateData(originalData);
|
|
|
+ const sprayData: any[] = [];
|
|
|
+ if (data.value?.msgTxt) {
|
|
|
+ data.value.msgTxt.forEach((item) => {
|
|
|
+ const hasSprayAuto = item.type && item.type.toLowerCase().includes('spray_auto');
|
|
|
+ if (hasSprayAuto) {
|
|
|
+ sprayData.push({
|
|
|
+ ...item,
|
|
|
+ ...item.readData,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ data.value.sprayData = sprayData;
|
|
|
+ updateData(data.value);
|
|
|
+ });
|
|
|
+ configs.value = testSpary;
|
|
|
+ }
|
|
|
+ // 第一次加载完再渲染,绝不抖动
|
|
|
+ if (isFirst) initialized.value = true;
|
|
|
}
|
|
|
|
|
|
-// watch(
|
|
|
-// // 监听动态路由参数 :type
|
|
|
-// () => route.params.type,
|
|
|
-// (newVal) => {
|
|
|
-// if (newVal) {
|
|
|
-// console.log('切换页面类型:', newVal);
|
|
|
-// refresh(); // 切换路由自动刷新
|
|
|
-// }
|
|
|
-// }
|
|
|
-// );
|
|
|
+// 导航切换:从缓存取,瞬间渲染
|
|
|
+async function changePage(pageTypeStr) {
|
|
|
+ const target = pageTypeStr || route.query.pageType || 'fire_risk_warn';
|
|
|
+ if (pageType.value === target) return;
|
|
|
+
|
|
|
+ // 先切页面
|
|
|
+ pageType.value = target;
|
|
|
+
|
|
|
+ // 从缓存拿配置 → 瞬间显示,绝不空白
|
|
|
+ configs.value = pageCache.value[target]?.configs || testBeltNew;
|
|
|
|
|
|
+ await nextTick();
|
|
|
+ await refresh(); // 后台刷新数据,不影响视图
|
|
|
+}
|
|
|
+
|
|
|
+// 3D 动画
|
|
|
function initModalAnimate(modal) {
|
|
|
- console.log('初始化模型', modal);
|
|
|
modal.isRender = true;
|
|
|
-
|
|
|
modalAnimate(modal);
|
|
|
}
|
|
|
|
|
|
+// 路由监听
|
|
|
watch(
|
|
|
() => route.query.pageType,
|
|
|
- (newQueryType) => {
|
|
|
- if (newQueryType) {
|
|
|
- changePage(newQueryType as string);
|
|
|
- }
|
|
|
+ (val) => {
|
|
|
+ if (val && !initialized.value) changePage(val);
|
|
|
},
|
|
|
- { immediate: true } // 初始化立刻执行
|
|
|
+ { immediate: true }
|
|
|
);
|
|
|
|
|
|
-onMounted(() => {
|
|
|
- refresh();
|
|
|
- initInterval();
|
|
|
+// 挂载:只执行一次,不重复渲染
|
|
|
+onMounted(async () => {
|
|
|
+ configs.value = testBeltNew; // 初始直接给默认配置
|
|
|
+ await refresh(true);
|
|
|
+ intervalTimer = setInterval(() => refresh(), 60000);
|
|
|
});
|
|
|
-</script>
|
|
|
|
|
|
+onUnmounted(() => clearInterval(intervalTimer));
|
|
|
+</script>
|
|
|
<style lang="less" scoped>
|
|
|
.company-home {
|
|
|
background: url('/@/assets/images/beltFire/baseMap.png') no-repeat center;
|
|
|
@@ -361,7 +202,6 @@ onMounted(() => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 中间预警结果区
|
|
|
.center-warning-container {
|
|
|
position: absolute;
|
|
|
left: 50%;
|
|
|
@@ -443,7 +283,6 @@ onMounted(() => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 巷道示意图
|
|
|
.belt-diagram {
|
|
|
position: absolute;
|
|
|
left: 50%;
|
|
|
@@ -468,4 +307,4 @@ onMounted(() => {
|
|
|
position: absolute;
|
|
|
z-index: 1;
|
|
|
}
|
|
|
-</style>
|
|
|
+</style>
|