|
@@ -0,0 +1,250 @@
|
|
|
|
+<template>
|
|
|
|
+ <div
|
|
|
|
+ v-show="!loading"
|
|
|
|
+ id="dedustCss"
|
|
|
|
+ style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 2; top: 0px; left: 0px"
|
|
|
|
+ >
|
|
|
|
+ <FourBorderBg id="dedustEnvA">
|
|
|
|
+ <div class="monitor-item" v-for="(data, index) in configAvailable.dedustEnvModalA" :key="index" :id="`dedustCss3D${index}`">
|
|
|
|
+ <span class="monitor-title">{{ data.label }}:</span>
|
|
|
|
+ <span class="monitor-val">{{ get(deviceInfo, data.prop, '-') }}</span>
|
|
|
|
+ </div>
|
|
|
|
+ <!-- <div class="title">
|
|
|
|
+ {{ monitorData[groupNum - 1]['strname'] }}
|
|
|
|
+ </div> -->
|
|
|
|
+ </FourBorderBg>
|
|
|
|
+ <FourBorderBg id="dedustEnvB">
|
|
|
|
+ <div class="monitor-item" v-for="(data, index) in configAvailable.dedustEnvModalB" :key="index" :id="`dedustCss3D${index}`">
|
|
|
|
+ <span class="monitor-title">{{ data.label }}:</span>
|
|
|
|
+ <span class="monitor-val">{{ get(deviceInfo, data.prop, '-') }}</span>
|
|
|
|
+ </div>
|
|
|
|
+ </FourBorderBg>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="monitor-container">
|
|
|
|
+ <div style="position: absolute; height: 40px; width: 100%; top: calc(50%-20px); font-size: 20px; color: red; text-align: center">
|
|
|
|
+ {{ deviceInfo.warnDes }}
|
|
|
|
+ </div>
|
|
|
|
+ <div class="lr left-box vent-margin-t-10">
|
|
|
|
+ <ventBox1>
|
|
|
|
+ <template #title>
|
|
|
|
+ <div>除尘机状态</div>
|
|
|
|
+ </template>
|
|
|
|
+ <template #container>
|
|
|
|
+ <template v-if="deviceType === 'dedustefan_3567d'">
|
|
|
|
+ <List :labelWidth="280" v-bind="dedustStatusPropC" />
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else>
|
|
|
|
+ <List icon="warning-title" type="status-light" :labelWidth="130" layout="double-columns" title="故障状态" v-bind="dedustStatusPropA" />
|
|
|
|
+ <List icon="warning-title" type="status-light" :labelWidth="300" title="报警状态" v-bind="dedustStatusPropB" />
|
|
|
|
+ <List icon="warning-title" type="status-light" :labelWidth="280" title="激活状态" v-bind="dedustStatusPropC" />
|
|
|
|
+ </template>
|
|
|
|
+ </template>
|
|
|
|
+ </ventBox1>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="lr right-box">
|
|
|
|
+ <ventBox1 class="vent-margin-t-10">
|
|
|
|
+ <template #title>
|
|
|
|
+ <div>监测参数</div>
|
|
|
|
+ </template>
|
|
|
|
+ <template #container>
|
|
|
|
+ <List :labelWidth="200" v-bind="dedustMonitorProp" />
|
|
|
|
+ </template>
|
|
|
|
+ </ventBox1>
|
|
|
|
+ <ventBox1>
|
|
|
|
+ <template #title>
|
|
|
|
+ <div>环境参数</div>
|
|
|
|
+ </template>
|
|
|
|
+ <template #container>
|
|
|
|
+ <List :labelWidth="200" v-bind="dedustEnvProp" />
|
|
|
|
+ </template>
|
|
|
|
+ </ventBox1>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script setup lang="ts">
|
|
|
|
+ import FourBorderBg from '/@/views/vent/comment/components/fourBorderBg.vue';
|
|
|
|
+ import { ref, onMounted, onUnmounted, defineProps, computed, watch } from 'vue';
|
|
|
|
+ import { list } from '../dedust.api';
|
|
|
|
+ import ventBox1 from '/@/components/vent/ventBox1.vue';
|
|
|
|
+ import { mountedThree, destroy, setModelType } from '../dedust.threejs';
|
|
|
|
+ // import { SvgIcon } from '/@/components/Icon';
|
|
|
|
+ import * as configDefault from '../dedust.data';
|
|
|
|
+ import * as config3567D from '../dedust.data.bet';
|
|
|
|
+ import List from '/@/views/vent/gas/components/list/index.vue';
|
|
|
|
+ import _ from 'lodash';
|
|
|
|
+ import { get } from '../../../home/billboard/utils';
|
|
|
|
+
|
|
|
|
+ const props = defineProps({
|
|
|
|
+ deviceId: {
|
|
|
|
+ type: String,
|
|
|
|
+ require: true,
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ const loading = ref(false);
|
|
|
|
+ const deviceInfo = ref<any>({});
|
|
|
|
+ const deviceType = computed(() => {
|
|
|
|
+ return deviceInfo.value.deviceType;
|
|
|
|
+ });
|
|
|
|
+ const configAvailable = computed(() => {
|
|
|
|
+ if (deviceType.value === 'dedustefan_3567d') return config3567D;
|
|
|
|
+ return configDefault;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 将列表配置项转换为列表可用的prop
|
|
|
|
+ function transConfigToProp(config, source) {
|
|
|
|
+ return config.map((c) => {
|
|
|
|
+ if (c.type === 'default' && c.status) {
|
|
|
|
+ return {
|
|
|
|
+ ...c,
|
|
|
|
+ value: c.status.find((e) => _.get(source, c.prop) === e.value)?.label,
|
|
|
|
+ label: c.label,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ ...c,
|
|
|
|
+ value: _.get(source, c.prop),
|
|
|
|
+ label: c.label,
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 各个模块的配置项
|
|
|
|
+ const dedustMonitorProp = computed(() => {
|
|
|
|
+ const { dedustMonitorConfig } = configAvailable.value;
|
|
|
|
+ return {
|
|
|
|
+ items: transConfigToProp(dedustMonitorConfig, deviceInfo.value),
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ const dedustEnvProp = computed(() => {
|
|
|
|
+ const { dedustEnvConfig } = configAvailable.value;
|
|
|
|
+ return {
|
|
|
|
+ items: transConfigToProp(dedustEnvConfig, deviceInfo.value),
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ const dedustStatusPropA = computed(() => {
|
|
|
|
+ const { statusConfigA, dedustStatusConfigA } = configAvailable.value;
|
|
|
|
+ return {
|
|
|
|
+ status: statusConfigA as any,
|
|
|
|
+ items: transConfigToProp(dedustStatusConfigA, deviceInfo.value),
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ const dedustStatusPropB = computed(() => {
|
|
|
|
+ const { statusConfigB, dedustStatusConfigB } = configAvailable.value;
|
|
|
|
+ return {
|
|
|
|
+ status: statusConfigB as any,
|
|
|
|
+ items: transConfigToProp(dedustStatusConfigB, deviceInfo.value),
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ const dedustStatusPropC = computed(() => {
|
|
|
|
+ const { statusConfigC, dedustStatusConfigC } = configAvailable.value;
|
|
|
|
+ return {
|
|
|
|
+ status: statusConfigC as any,
|
|
|
|
+ items: transConfigToProp(dedustStatusConfigC, deviceInfo.value),
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // https获取监测数据
|
|
|
|
+ let timer: NodeJS.Timeout;
|
|
|
|
+ async function getDataSource(systemID) {
|
|
|
|
+ const res = await list({ devicetype: 'sys', systemID, type: 'all' });
|
|
|
|
+ // 保留最后一项数据
|
|
|
|
+ _.forEach(_.get(res, 'deviceInfo.dedustefan.datalist', []), (e) => {
|
|
|
|
+ Object.assign(e, e.readData);
|
|
|
|
+ deviceInfo.value = e || { warnDes: '设备断开' };
|
|
|
|
+ return -1;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ watch(
|
|
|
|
+ () => props.deviceId,
|
|
|
|
+ (val) => {
|
|
|
|
+ return getDataSource(val);
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ immediate: true,
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ onMounted(() => {
|
|
|
|
+ loading.value = true;
|
|
|
|
+ mountedThree('#dedust3D', ['#dedustCss', '#dedustEnvA', '#dedustEnvB']).then(() => {
|
|
|
|
+ setModelType('dedust').finally(() => {
|
|
|
|
+ loading.value = false;
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ timer = setInterval(() => {
|
|
|
|
+ getDataSource(props.deviceId);
|
|
|
|
+ }, 1000);
|
|
|
|
+ });
|
|
|
|
+ onUnmounted(() => {
|
|
|
|
+ clearInterval(timer);
|
|
|
|
+ destroy();
|
|
|
|
+ });
|
|
|
|
+</script>
|
|
|
|
+<style lang="less" scoped>
|
|
|
|
+ @import '/@/design/theme.less';
|
|
|
|
+ @import '/@/design/vent/modal.less';
|
|
|
|
+ // @import '../less/tunFace.less';
|
|
|
|
+ @import '../../comment/less/workFace.less';
|
|
|
|
+ @ventSpace: zxm;
|
|
|
|
+
|
|
|
|
+ .monitor-item {
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ margin-bottom: 3px;
|
|
|
|
+
|
|
|
|
+ .monitor-val {
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .monitor-title {
|
|
|
|
+ width: 200px;
|
|
|
|
+ color: var(--vent-font-action-link);
|
|
|
|
+ font-weight: 400;
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .dust-fan-monitor {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ }
|
|
|
|
+ .dust-fan-monitor-item {
|
|
|
|
+ width: 152px;
|
|
|
|
+ height: 70px;
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ justify-content: center;
|
|
|
|
+ align-items: center;
|
|
|
|
+ border: 1px solid rgba(25, 251, 255, 0.4);
|
|
|
|
+ box-shadow: inset 0 0 20px rgba(0, 197, 255, 0.4);
|
|
|
|
+ background: rgba(0, 0, 0, 0.06666667);
|
|
|
|
+ margin-bottom: 5px;
|
|
|
|
+ padding: 8px 0;
|
|
|
|
+ &:nth-child(2n) {
|
|
|
|
+ margin-left: 12px;
|
|
|
|
+ }
|
|
|
|
+ .title {
|
|
|
|
+ color: #5dfaff;
|
|
|
|
+ }
|
|
|
|
+ .unit {
|
|
|
|
+ font-size: 13px;
|
|
|
|
+ color: #ffffffaa;
|
|
|
|
+ }
|
|
|
|
+ .value {
|
|
|
|
+ color: #ffb212;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .fault {
|
|
|
|
+ .title {
|
|
|
|
+ color: #c4fdff;
|
|
|
|
+ }
|
|
|
|
+ .value {
|
|
|
|
+ // color: #FFB212;
|
|
|
|
+ color: #61ddb1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+</style>
|