|
@@ -0,0 +1,456 @@
|
|
|
+<template>
|
|
|
+ <BasicModal v-bind="$attrs" @register="register" :title="`光纤监测详情 ${currentTime}`" width="1200px" @ok="handleOk"
|
|
|
+ @cancel="handleCancel" wrapClassName="bundle-modal">
|
|
|
+ <div class="fiber-modal">
|
|
|
+ <div class="modal-left">
|
|
|
+ <div v-for="device in deviceList" class="link-item"
|
|
|
+ :class="{ 'active-device-title': device.deviceID === activeDeviceID }" :key="device.deviceID">
|
|
|
+ <span class="" @click="selectDevice(device.deviceID)">{{ device.strinstallpos }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="modal-right">
|
|
|
+ <span class="base-title">实时监测参数</span>
|
|
|
+ <div class="right-top">
|
|
|
+ <div class="top-item">
|
|
|
+ <div class="icon">
|
|
|
+ <SvgIcon class="icon-style" name="aveg-temperature" style="width: 72px; height: 46px; " />
|
|
|
+ </div>
|
|
|
+ <div class="item-container">
|
|
|
+ <div class="title">平均温度</div>
|
|
|
+ <div class="value">{{ posMonitor.avgtemperature !== undefined && posMonitor.avgtemperature !== null ?
|
|
|
+ posMonitor.avgtemperature : '-' }} <span>°C</span> </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="top-item">
|
|
|
+ <div class="icon">
|
|
|
+ <SvgIcon class="icon-style" name="max-temperature" style="width: 72px; height: 46px" />
|
|
|
+ </div>
|
|
|
+ <div class="item-container">
|
|
|
+ <div class="title">最高温度</div>
|
|
|
+ <div class="value">{{ posMonitor.hightemperature !== undefined && posMonitor.hightemperature !== null ?
|
|
|
+ posMonitor.hightemperature : '-' }} <span>°C</span></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="top-item">
|
|
|
+ <div class="icon">
|
|
|
+ <SvgIcon class="icon-style" name="link" style="width: 72px; height: 46px" />
|
|
|
+ </div>
|
|
|
+ <div class="item-container">
|
|
|
+ <div class="title">最高温度位置</div>
|
|
|
+ <div class="value">{{ posMonitor.highposition !== undefined && posMonitor.highposition !== null ?
|
|
|
+ posMonitor.highposition : '-' }} </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="top-item">
|
|
|
+ <div class="icon">
|
|
|
+ <SvgIcon class="icon-style" name="risk-level" style="width: 76px; height: 42px" />
|
|
|
+ </div>
|
|
|
+ <div class="item-container">
|
|
|
+ <div class="title">报警阈值</div>
|
|
|
+ <div class="value">{{ posMonitor.warnthreshold !== undefined && posMonitor.warnthreshold !== null ?
|
|
|
+ posMonitor.warnthreshold : '-' }} <span>°C</span></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="top-item warning-box">
|
|
|
+ <div class="icon">
|
|
|
+ <SvgIcon class="icon-style" size="42" name="alarm-warning" style="margin-top: 5px" />
|
|
|
+ </div>
|
|
|
+ <div class="item-container">
|
|
|
+ <div class="title">报警状态</div>
|
|
|
+ <div :class="{
|
|
|
+ value1: posMonitor['warnstate'] == '0',
|
|
|
+ value2: posMonitor['warnstate'] == '1',
|
|
|
+ value5: posMonitor['warnstate'] == '2',
|
|
|
+ value3: posMonitor['warnstate'] == '3',
|
|
|
+ }">{{ posMonitor['warnstate']=='0' ? '无报警' :posMonitor['warnstate']=='1' ? '定温' : posMonitor['warnstate']=='2' ? '差温' : posMonitor['warnstate']=='3' ? '预报警' : '--' }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="top-item">
|
|
|
+ <div class="icon">
|
|
|
+ <SvgIcon class="icon-style" name="link" style="width: 76px; height: 50px" />
|
|
|
+ </div>
|
|
|
+ <div class="item-container">
|
|
|
+ <div class="title">报警位置</div>
|
|
|
+ <div class="value">{{ posMonitor.warnposition !== undefined && posMonitor.warnposition !== null ? posMonitor.warnposition : '-'
|
|
|
+ }} </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ <div style="width: 100%; display: flex">
|
|
|
+ <div class="right-bottom">
|
|
|
+ <span class="base-title">历史数据监测</span>
|
|
|
+ <div class="echarts-box">
|
|
|
+ <BarAndLine class="echarts-line" :xAxisPropType="xAxisPropType" :dataSource="historyList" height="100%"
|
|
|
+ width="100%" :chartsColumns="chartsColumns" :option="echatsOption" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </BasicModal>
|
|
|
+</template>
|
|
|
+<script lang="ts">
|
|
|
+import { defineComponent, ref, watch, shallowRef, onMounted } from 'vue';
|
|
|
+import { BasicModal, useModalInner } from '/@/components/Modal';
|
|
|
+import BarAndLine from '/@/components/chart/BarAndLine.vue';
|
|
|
+import { SvgIcon } from '/@/components/Icon';
|
|
|
+import dayjs from 'dayjs';
|
|
|
+import { chartsColumnListGx } from '../device.data';
|
|
|
+
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ components: { BasicModal, BarAndLine, SvgIcon, },
|
|
|
+ props: {
|
|
|
+ dataSource: { type: Array },
|
|
|
+ activeID: { type: String },
|
|
|
+ },
|
|
|
+ setup(props) {
|
|
|
+ const currentTime = ref(dayjs().format('YYYY-MM-DD HH:mm:ss'));
|
|
|
+ const modelRef = ref({});
|
|
|
+ const loading = ref(true);
|
|
|
+ const activeDeviceID = ref('');
|
|
|
+ const deviceList = ref<any[]>([]);
|
|
|
+ const historyList = ref<any[]>([]);
|
|
|
+ const posMonitor = shallowRef<any>({});
|
|
|
+
|
|
|
+ const echatsOption = {
|
|
|
+ grid: {
|
|
|
+ top: '14%',
|
|
|
+ left: '3',
|
|
|
+ right: '20',
|
|
|
+ bottom: '3%',
|
|
|
+ containLabel: true,
|
|
|
+ },
|
|
|
+ toolbox: {
|
|
|
+ feature: null,
|
|
|
+ },
|
|
|
+ };
|
|
|
+
|
|
|
+ const chartsColumns = chartsColumnListGx;
|
|
|
+ const xAxisPropType = ref('highposition');
|
|
|
+ const [register, { setModalProps, closeModal }] = useModalInner();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // 选择监测
|
|
|
+ function selectDevice(id) {
|
|
|
+ loading.value = true;
|
|
|
+ setModalProps({ loading: true, confirmLoading: true });
|
|
|
+ setTimeout(() => {
|
|
|
+ loading.value = false;
|
|
|
+ activeDeviceID.value = id;
|
|
|
+ setModalProps({ loading: false, confirmLoading: false });
|
|
|
+ }, 300);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function handleOk(e) {
|
|
|
+ e.preventDefault();
|
|
|
+ closeModal();
|
|
|
+ }
|
|
|
+
|
|
|
+ function handleCancel(e) {
|
|
|
+ e.preventDefault();
|
|
|
+ closeModal();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ watch(
|
|
|
+ [() => props.dataSource, () => props.activeID],
|
|
|
+ ([newDataSource, newActiveID], [oldDataSource, oldActiveID]) => {
|
|
|
+ activeDeviceID.value = activeDeviceID.value ? activeDeviceID.value : newActiveID;
|
|
|
+ deviceList.value = newDataSource?.filter((item: any, index) => {
|
|
|
+ if ((!activeDeviceID.value && index == 0) || item.deviceID === activeDeviceID.value) {
|
|
|
+ // activeDeviceID.value = item.deviceID;
|
|
|
+ posMonitor.value = Object.assign(item, item.readData);
|
|
|
+ historyList.value=item.history || []
|
|
|
+ }
|
|
|
+ item.readTime = item.readTime?.substring(11);
|
|
|
+ return item;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+ );
|
|
|
+ onMounted(() => {
|
|
|
+
|
|
|
+ });
|
|
|
+ return {
|
|
|
+ register,
|
|
|
+ model: modelRef,
|
|
|
+ currentTime,
|
|
|
+ selectDevice,
|
|
|
+ handleOk,
|
|
|
+ handleCancel,
|
|
|
+ deviceList,
|
|
|
+ historyList,
|
|
|
+ activeDeviceID,
|
|
|
+ posMonitor,
|
|
|
+ echatsOption,
|
|
|
+ chartsColumns,
|
|
|
+ xAxisPropType,
|
|
|
+ };
|
|
|
+ },
|
|
|
+});
|
|
|
+</script>
|
|
|
+<style lang="less">
|
|
|
+.bundle-modal {
|
|
|
+ .zxm-modal {
|
|
|
+ top: 30px !important;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|
|
|
+
|
|
|
+<style lang="less" scoped>
|
|
|
+.fiber-modal {
|
|
|
+ width: 100%;
|
|
|
+ height: 650px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: space-between;
|
|
|
+
|
|
|
+ .modal-left {
|
|
|
+ width: 200px;
|
|
|
+ height: 100%;
|
|
|
+ overflow-y: auto;
|
|
|
+ background: #ffffff11;
|
|
|
+ padding: 5px;
|
|
|
+ border-radius: 5px;
|
|
|
+
|
|
|
+ .active-device-title {
|
|
|
+ color: aqua;
|
|
|
+ }
|
|
|
+
|
|
|
+ .link-item {
|
|
|
+ position: relative;
|
|
|
+ cursor: pointer;
|
|
|
+ line-height: 30px;
|
|
|
+ padding-left: 30px;
|
|
|
+
|
|
|
+ span:hover {
|
|
|
+ color: #89ffff;
|
|
|
+ }
|
|
|
+
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ display: block;
|
|
|
+ width: 8px;
|
|
|
+ height: 8px;
|
|
|
+ top: 12px;
|
|
|
+ left: 10px;
|
|
|
+ transform: rotateZ(45deg) skew(10deg, 10deg);
|
|
|
+ background: #45d3fd;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .modal-right {
|
|
|
+ width: calc(100% - 220px);
|
|
|
+ overflow-y: auto;
|
|
|
+
|
|
|
+ .base-title {
|
|
|
+ line-height: 32px;
|
|
|
+ position: relative;
|
|
|
+ padding-left: 20px;
|
|
|
+
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ display: block;
|
|
|
+ width: 4px;
|
|
|
+ height: 12px;
|
|
|
+ top: 4px;
|
|
|
+ left: 10px;
|
|
|
+ background: #45d3fd;
|
|
|
+ border-radius: 4px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .right-top {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: space-between;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ margin-bottom: 10px;
|
|
|
+
|
|
|
+ .top-item {
|
|
|
+ width: 303px;
|
|
|
+ height: 100px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: center;
|
|
|
+ border: 1px solid rgba(25, 237, 255, 0.4);
|
|
|
+ box-shadow: inset 0 0 10px rgba(0, 197, 255, 0.6);
|
|
|
+ background: rgba(0, 0, 0, 0.06666666666666667);
|
|
|
+ padding-top: 20px;
|
|
|
+ margin: 10px 0;
|
|
|
+
|
|
|
+ .icon {
|
|
|
+ margin-right: 10px;
|
|
|
+ margin-top: 5px;
|
|
|
+ color: #fdb146;
|
|
|
+ }
|
|
|
+
|
|
|
+ .item-container {
|
|
|
+ width: 110px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+
|
|
|
+ div {
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ .title {
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value {
|
|
|
+ text-shadow: 0 0 25px #00fbfe;
|
|
|
+ background: linear-gradient(0deg, #45d3fd, #45d3fd, #61ddb1, #61ddb1);
|
|
|
+ font-style: normal;
|
|
|
+ background-size: cover;
|
|
|
+ font-family: electronicFont;
|
|
|
+ font-size: 30px;
|
|
|
+ -webkit-background-clip: text;
|
|
|
+ background-clip: text;
|
|
|
+ -webkit-text-fill-color: transparent;
|
|
|
+ position: relative;
|
|
|
+ top: -8px;
|
|
|
+
|
|
|
+ span {
|
|
|
+ font-family: Arial, Helvetica, sans-serif;
|
|
|
+ font-size: 18px;
|
|
|
+ color: aliceblue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .warning-box {
|
|
|
+ padding-top: 0px;
|
|
|
+
|
|
|
+ .icon {
|
|
|
+ margin-top: 20px;
|
|
|
+
|
|
|
+ :deep(.icon-style) {
|
|
|
+ width: auto;
|
|
|
+ color: #fdb146;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .warning-value {
|
|
|
+ font-size: 18px;
|
|
|
+ color: #61ddb1;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value1 {
|
|
|
+ font-size: 18px;
|
|
|
+ color: rgb(145, 230, 9) !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value2 {
|
|
|
+ font-size: 18px;
|
|
|
+ // color: rgb(0, 242, 255) !important;
|
|
|
+ color: #ffff35 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value3 {
|
|
|
+ font-size: 18px;
|
|
|
+ // color: #ffff35 !important;
|
|
|
+ color: #ff0000 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value4 {
|
|
|
+ font-size: 18px;
|
|
|
+ color: #ffbe69 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value5 {
|
|
|
+ font-size: 18px;
|
|
|
+ color: #ff6f00 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value6 {
|
|
|
+ font-size: 18px;
|
|
|
+ color: #ff0000 !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .right-center {
|
|
|
+ margin-top: 20px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: space-between;
|
|
|
+
|
|
|
+ .table-box {
|
|
|
+ position: relative;
|
|
|
+ width: 500px;
|
|
|
+ height: 250px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .warning-box {
|
|
|
+ width: calc(100% - 520px);
|
|
|
+
|
|
|
+ .warning-container {
|
|
|
+ width: 100%;
|
|
|
+ height: convert;
|
|
|
+ background: #009acd00;
|
|
|
+
|
|
|
+ :deep(.dv-scroll-board) {
|
|
|
+ .row-item {
|
|
|
+ height: 40px !important;
|
|
|
+ line-height: 40px !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .header-item {
|
|
|
+ border-top: 1px solid #91e9fe !important;
|
|
|
+ border-bottom: 1px solid #91e9fe !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .right-bottom {
|
|
|
+ width: 100%;
|
|
|
+ margin-top: 10px;
|
|
|
+
|
|
|
+ .echarts-box {
|
|
|
+ width: 100%;
|
|
|
+ height: 320px;
|
|
|
+ position: relative;
|
|
|
+ // display: flex;
|
|
|
+ // justify-content: space-between;
|
|
|
+
|
|
|
+ .echarts-line {
|
|
|
+ width: calc(100% + 80px);
|
|
|
+ position: absolute;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.zxm-table-body) {
|
|
|
+ border: 1px solid rgba(57, 232, 255, 0.2) !important;
|
|
|
+
|
|
|
+ .zxm-table-tbody>tr>td {
|
|
|
+ border: none !important;
|
|
|
+ }
|
|
|
+}
|
|
|
+:deep(.zxm-table-wrapper){
|
|
|
+ padding-top: 20px;
|
|
|
+ box-sizing: border-box;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.zxm-table-cell) {
|
|
|
+ border-right: none !important;
|
|
|
+}
|
|
|
+</style>
|