Browse Source

1. 保德主风机添加故障设备监测功能

hongrunxia 1 week ago
parent
commit
401e426075

+ 11 - 11
src/views/vent/monitorManager/camera/index.vue

@@ -74,7 +74,7 @@ const current = ref(1)
 const total = ref(0)
 const playerList = ref([])
 const webRtcServerList = <any[]>[]
-let addrList = ref<{ name: string, addr: string, cameraRate: number }[]>([])
+let addrList = ref<{ name: string, addr: string, cameraRate: number; devicekind: string }[]>([])
 
 async function getCameraDevKindList() {
   let res = await getCameraDevKind()
@@ -196,7 +196,7 @@ async function getVideoAddrs() {
   let res = await list({ devKind: paramKind, strType: searchParam.strType, pageSize: pageSize.value, pageNo: current.value })
   total.value = res['total'] || 0
   if (res.records.length != 0) {
-    const cameraList = <{ name: string, addr: string, cameraRate: number }[]>[]
+    const cameraList = <{ name: string, addr: string, cameraRate: number ; devicekind: string }[]>[]
     const cameras = res.records
     for (let i = 0; i < cameras.length; i++) {
       const item = cameras[i];
@@ -207,7 +207,7 @@ async function getVideoAddrs() {
         try {
           const data = await cameraAddr({ cameraCode: item['addr'], videoType });
           if (data) {
-            cameraList.push({ name: item['name'], addr: data['url'], cameraRate: item['cameraRate'] });
+            cameraList.push({ name: item['name'], addr: data['url'], cameraRate: item['cameraRate'], devicekind: item['devicekind'] });
           }
           // cameraList.push({
           //   name: item['name'],
@@ -222,7 +222,7 @@ async function getVideoAddrs() {
         if (item['addr'].includes('0.0.0.0')) {
           item['addr'] = item['addr'].replace('0.0.0.0', window.location.hostname)
         }
-        cameraList.push({ name: item['name'], addr: item['addr'], cameraRate: item['cameraRate'] });
+        cameraList.push({ name: item['name'], addr: item['addr'], cameraRate: item['cameraRate'], devicekind: item['devicekind']  });
       }
     }
     addrList.value = cameraList
@@ -234,7 +234,7 @@ async function getVideoAddrsSon(Id) {
   playerList.value = []
   let res = await getVentanalyCamera({ deviceid: Id })
   if (res.records.length != 0) {
-    const cameraList = <{ name: string, addr: string, cameraRate: number }[]>[]
+    const cameraList = <{ name: string, addr: string, cameraRate: number; devicekind: string }[]>[]
     const cameras = res.records
     for (let i = 0; i < cameras.length; i++) {
       const item = cameras[i];
@@ -245,7 +245,7 @@ async function getVideoAddrsSon(Id) {
         try {
           const data = await cameraAddr({ cameraCode: item['addr'], videoType });
           if (data && data['url']) {
-            cameraList.push({ name: item['name'], addr: data['url'], cameraRate: item['cameraRate'] });
+            cameraList.push({ name: item['name'], addr: data['url'], cameraRate: item['cameraRate'], devicekind: item['devicekind'] });
           }
           // cameraList.push({
           //   name: item['name'],
@@ -260,7 +260,7 @@ async function getVideoAddrsSon(Id) {
         if (item['addr'].includes('0.0.0.0')) {
           item['addr'] = item['addr'].replace('0.0.0.0', window.location.hostname)
         }
-        cameraList.push({ name: item['name'], addr: item['addr'], cameraRate: item['cameraRate']  });
+        cameraList.push({ name: item['name'], addr: item['addr'], cameraRate: item['cameraRate'], devicekind: item['devicekind']  });
       }
     }
     addrList.value = cameraList
@@ -286,14 +286,14 @@ function getVideo() {
       webRtcServerList.push(webRtcServer)
       webRtcServer.connect(item.addr)
     } else {
-      setNoRtspVideo('player' + i, item.addr, item.cameraRate,)
+      setNoRtspVideo('player' + i, item.addr, item.cameraRate, item.devicekind)
     }
   }
 }
 
-function setNoRtspVideo(id, videoAddr, cameraRate) {
+function setNoRtspVideo(id, videoAddr, cameraRate, devicekind) {
   const fileExtension = videoAddr.split('.').pop();
-  if (fileExtension === 'flv') {
+  if (fileExtension === 'flv' || devicekind == 'flv') {
     const player = new Player({
       lang: 'zh',
       id: id,
@@ -331,7 +331,7 @@ function setNoRtspVideo(id, videoAddr, cameraRate) {
     });
     playerList.value.push(player)
   }
-  if (fileExtension === 'm3u8') {
+  if (fileExtension === 'm3u8' || devicekind == 'm3u8') {
     let player
     if (document.createElement('video').canPlayType('application/vnd.apple.mpegurl')) {
       // 原生支持 hls 播放

+ 36 - 2
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -430,6 +430,7 @@
     </div>
   </div>
   <div
+    v-show="showPlay"
     ref="playerRef"
     :class="{ 'to-right': rightColumns.length < 1 || leftColumns.length < 1, 'to-no-right': rightColumns.length > 0 && leftColumns.length > 0 }"
     style="z-index: 999; position: absolute; top: 100px; right: 15px; width: 100%; height: 100%; margin: auto; pointer-events: none"
@@ -557,13 +558,15 @@
       </div>
     </div>
   </a-modal>
+  <!-- 摄像头显示隐藏图标 -->
+  <VideoCameraOutlined class="video-icon" :class="{ 'no-play': !showPlay }" @click="changePlay" />
   <ConditionAssistance @register="registerModalAssistance" :dataSource="historySource" />
   <DeviceBaseInfo @register="registerModal" :device-type="selectData['deviceType']" />
   <reportInfo @register="registerModal1" :editID="editID" :fileType="fileType" />
 </template>
 
 <script setup lang="ts">
-  import { ExclamationCircleFilled, ArrowRightOutlined } from '@ant-design/icons-vue';
+  import { ExclamationCircleFilled, ArrowRightOutlined, VideoCameraOutlined } from '@ant-design/icons-vue';
   import { onBeforeMount, ref, watch, onMounted, nextTick, defineAsyncComponent, reactive, onUnmounted, inject, unref } from 'vue';
   // import BarSingle from '../../../../components/chart/BarSingle.vue';
   import FanDeviceEcharts from '../comment/FanDeviceEcharts.vue';
@@ -612,6 +615,7 @@
   const router = useRouter();
   const { createConfirm } = useMessage();
   const globSetting = useGlobSetting();
+  const showPlay = ref(false);
 
   const modalTypeArr = reactive({
     leftBtnArr: [
@@ -880,7 +884,9 @@
       }
     });
   };
-
+  const changePlay = () => {
+    showPlay.value = !showPlay.value;
+  };
   const tabChange = (activeKeyVal) => {
     activeKey.value = activeKeyVal;
     if (activeKeyVal == 1) {
@@ -1799,4 +1805,32 @@
       z-index: 999;
     }
   }
+  .video-icon {
+    width: 30px;
+    height: 38px;
+    position: absolute;
+    top: 580px;
+    right: 395px;
+    color: #fff;
+    z-index: 1;
+    font-size: 28px;
+  }
+  .no-play {
+    &::after {
+      position: absolute;
+      width: 80%;
+      height: 100%;
+      content: '';
+      left: 12%;
+      top: -5px;
+      background: linear-gradient(
+        to bottom left,
+        transparent 0%,
+        transparent calc(50% - 2px),
+        #ffffff 50%,
+        transparent calc(50% + 2px),
+        transparent 100%
+      );
+    }
+  }
 </style>

+ 25 - 9
src/views/vent/monitorManager/fireDoorMonitor/index.vue

@@ -60,10 +60,16 @@
               :isShowPagination="true"
             >
               <template #filterCell="{ column, record }">
-                <a-tag v-if="column.dataIndex === 'doorOpen' && record.doorOpen == '0' && record.doorClose == '0'" color="red">正在运行</a-tag>
-                <a-tag v-else-if="column.dataIndex === 'doorOpen' && record.doorOpen == '0' && record.doorClose == 1" color="default">关闭</a-tag>
-                <a-tag v-else-if="column.dataIndex === 'doorOpen' && record.doorOpen == '1' && record.doorClose == '0'" color="#46C66F">打开</a-tag>
-                <a-tag v-else-if="column.dataIndex === 'doorOpen' && record.doorOpen == '1' && record.doorClose == '1'" color="#FF0000"
+                <a-tag v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == '0' && record.frontGateClose == '0'" color="red"
+                  >正在运行</a-tag
+                >
+                <a-tag v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == '0' && record.frontGateClose == 1" color="default"
+                  >关闭</a-tag
+                >
+                <a-tag v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == '1' && record.frontGateClose == '0'" color="#46C66F"
+                  >打开</a-tag
+                >
+                <a-tag v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == '1' && record.frontGateClose == '1'" color="#FF0000"
                   >点位异常</a-tag
                 >
                 <template v-else-if="column.dataIndex === 'warnLevel'">
@@ -93,10 +99,20 @@
             <div class="tab-item" v-if="activeKey === '3'">
               <HistoryTable :columnsType="deviceType" :device-type="deviceType" designScope="gate-history" :scroll="scroll">
                 <template #filterCell="{ column, record }">
-                  <a-tag v-if="column.dataIndex === 'doorOpen' && record.doorOpen == '0' && record.doorClose == '0'" color="red">正在运行</a-tag>
-                  <a-tag v-else-if="column.dataIndex === 'doorOpen' && record.doorOpen == '0' && record.doorClose == 1" color="default">关闭</a-tag>
-                  <a-tag v-else-if="column.dataIndex === 'doorOpen' && record.doorOpen == '1' && record.doorClose == '0'" color="#46C66F">打开</a-tag>
-                  <a-tag v-else-if="column.dataIndex === 'doorOpen' && record.doorOpen == '1' && record.doorClose == '1'" color="#FF0000"
+                  <a-tag v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == '0' && record.frontGateClose == '0'" color="red"
+                    >正在运行</a-tag
+                  >
+                  <a-tag v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == '0' && record.frontGateClose == 1" color="default"
+                    >关闭</a-tag
+                  >
+                  <a-tag
+                    v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == '1' && record.frontGateClose == '0'"
+                    color="#46C66F"
+                    >打开</a-tag
+                  >
+                  <a-tag
+                    v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == '1' && record.frontGateClose == '1'"
+                    color="#FF0000"
                     >点位异常</a-tag
                   >
                   <template v-else-if="column.dataIndex === 'warnLevel'">
@@ -189,7 +205,7 @@
   const MonitorDataTable = ref();
   let contrlValue = '';
   const playerRef = ref();
-  const deviceType = ref('firedoor');
+  const deviceType = ref('door');
   const activeKey = ref('1'); // tab
   const loading = ref(false);
 

+ 181 - 26
src/views/vent/monitorManager/mainFanMonitor/index.vue

@@ -106,7 +106,8 @@
       </template>
       <!-- <div class="button-box" v-for="(item, index) in modalTypeArr.centerBtnArr" :key="index" @click="showModal(item)">{{ item.value }}</div> -->
     </div>
-    <div class="data-show-box">
+
+    <div v-if="!faultShow" class="data-show-box">
       <div class="data-item">
         <div class="item-header">设备监测</div>
         <div class="item-container">
@@ -161,16 +162,6 @@
             >
           </div>
           <div class="container-group">
-            <div class="warning-header">
-              <!-- <div class="header-item">
-                <div class="header-title">报警总数</div>
-                <div class="header-value">0</div>
-              </div> -->
-              <div class="header-item">
-                <div class="header-title"> 未处理数</div>
-                <div class="header-value">{{ selectData['warnLogNotOkCount'] }} </div>
-              </div>
-            </div>
             <div class="warning-group">
               <template v-if="deviceType">
                 <div class="warning-item" v-for="(state, index) in rightColumns" :key="index">
@@ -249,10 +240,75 @@
         </div>
       </div>
     </div>
-    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll, 0)">
-      <!-- 摄像头显示隐藏图标 -->
-      <VideoCameraOutlined class="video-icon" :class="{ 'no-play': !showPlay }" @click="changePlay" />
 
+    <div v-else class="data-show-box fault-box">
+      <div class="data-item">
+        <div class="item-header">一级电机监测</div>
+        <div class="item-container">
+          <div class="tab">
+            <div class="tab-item" :class="{ 'tab-item-active-r': dataMonitorRowIndex == 0 }" @click="selectDevice('dataMonitorRowIndex', 0)"
+              >1#风机</div
+            >
+            <div class="tab-item" :class="{ 'tab-item-active-r': dataMonitorRowIndex == 1 }" @click="selectDevice('dataMonitorRowIndex', 1)"
+              >2#风机</div
+            >
+          </div>
+          <div class="container-group fault-container-group">
+            <div class="electric-box">
+              <div class="item" v-for="(item, index) in faultDeviceHeader" :key="index" :style="{ width: item.width }">{{ item.title }}</div>
+            </div>
+            <div class="fault-group">
+              <template v-if="deviceType">
+                <template v-for="(faultItem, faultIndex) in faultData" :key="faultIndex">
+                  <div
+                    class="fault-item"
+                    v-if="faultItem['valueCode'].startsWith(warningMonitorRowIndex === 0 ? 'faultEqu1_electric1' : 'faultEqu2_electric1')"
+                  >
+                    <div class="item" v-for="(item, index) in faultDeviceHeader" :key="index" :style="{ width: item.width }">{{
+                      faultItem[item.code]
+                    }}</div>
+                  </div>
+                </template>
+              </template>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="data-item">
+        <div class="item-header">二级电机监测</div>
+        <div class="item-container">
+          <div class="tab">
+            <div class="tab-item" :class="{ 'tab-item-active-r': warningMonitorRowIndex === 0 }" @click="selectDevice('warningMonitorRowIndex', 0)"
+              >1#风机</div
+            >
+            <div class="tab-item" :class="{ 'tab-item-active-r': warningMonitorRowIndex === 1 }" @click="selectDevice('warningMonitorRowIndex', 1)"
+              >2#风机</div
+            >
+          </div>
+          <div class="container-group fault-container-group">
+            <div class="electric-box">
+              <div class="item" v-for="(item, index) in faultDeviceHeader" :key="index" :style="{ width: item.width }">{{ item.title }}</div>
+            </div>
+            <div class="fault-group">
+              <template v-if="deviceType">
+                <template v-for="(faultItem, faultIndex) in faultData" :key="faultIndex">
+                  <div
+                    class="fault-item"
+                    v-if="faultItem['valueCode'].startsWith(warningMonitorRowIndex === 0 ? 'faultEqu1_electric2' : 'faultEqu2_electric2')"
+                  >
+                    <div class="item" v-for="(item, index) in faultDeviceHeader" :key="index" :style="{ width: item.width }">{{
+                      faultItem[item.code]
+                    }}</div>
+                  </div>
+                </template>
+              </template>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll, 0)">
       <!-- 保德视频及系统外界,保德特有 -->
       <div v-if="sysOrgCode === 'sdmtjtbdmk'" class="bd-control">
         <div class="button-box" @click="goOutLink('1')">视频查看</div>
@@ -366,7 +422,6 @@
   <div style="z-index: -1; position: absolute; top: -100px; right: 10px; width: 300px; height: 280px; margin: auto" class="palyer">
     <LivePlayer id="main-player1" ref="player1" :videoUrl="flvURL1()" muted loop loading controls />
   </div>
-
   <div
     v-show="showPlay"
     ref="playerRef"
@@ -476,6 +531,14 @@
       </div>
     </div>
   </a-modal>
+  <!-- 在线监测和故障诊断 -->
+  <div v-if="sysOrgCode === 'sdmtjtbdmk'" class="monitor-tab" @click="showFault">
+    <div class="item" :class="{ 'item-active': !faultShow }">风机监测</div>
+    <div class="item" :class="{ 'item-active': faultShow }">在线故障诊断监测</div>
+  </div>
+
+  <!-- 摄像头显示隐藏图标 -->
+  <VideoCameraOutlined class="video-icon" :class="{ 'no-play': !showPlay }" @click="changePlay" />
   <!-- 工况辅助决策 -->
   <ConditionAssistance @register="registerModal" :deviceType="deviceType" :selectData="selectData" />
   <DeviceBaseInfo @register="registerModalDeviceEdit" :device-type="selectData['deviceType']" />
@@ -492,12 +555,12 @@
   // import HistoryTable from '../../../vent/comment/history/HistoryTable.vue';
   import AlarmHistoryTable from '../comment/AlarmHistoryTable.vue';
   import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue';
-  import { modalTypeArr, fbmControlData } from './main.data';
+  import { modalTypeArr, fbmControlData, faultDeviceHeader, PointMonitorType } from './main.data';
   import { deviceControlApi } from '/@/api/vent/index';
   import { mountedThree, destroy, addText, setModelType, playAnimate, resetEcharts } from './main.threejs';
   import LivePlayer from '@liveqing/liveplayer-v3';
   import { SvgIcon } from '/@/components/Icon';
-  import { list } from './main.api';
+  import { list, pointMonitor } from './main.api';
   import { list as baseList } from '../../deviceManager/fanTabel/fan.api';
   import { getTableList } from '/@/views/vent/monitorManager/fanLocalMonitor/fanLocal.api';
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
@@ -553,6 +616,10 @@
   const dataMonitorRowIndex = ref(0);
   // 默认数据右边监测的是1#风机
   const warningMonitorRowIndex = ref(0);
+  const faultData = ref<PointMonitorType[]>([]); // 存放故障点位监测数据(查的点表)
+  const explosionDoorData = ref<PointMonitorType[]>([]); // 存放防爆门点位监测数据(查的点表)
+
+  const faultShow = ref(false);
   let headElHeight = ref(0);
 
   // 监测数据
@@ -566,6 +633,7 @@
     deviceType: '',
     Fan2FanPre: '-',
     Fan1FanPre: '-',
+    otherDevice: '',
   });
 
   const deviceType = ref(selectData.deviceType);
@@ -659,6 +727,9 @@
 
   const { getCamera, removeCamera } = useCamera();
 
+  const showFault = () => {
+    faultShow.value = !faultShow.value;
+  };
   const tabChange = (activeKeyVal) => {
     activeKey.value = activeKeyVal;
     // MonitorDataTable.value.setSelectedRowKeys(selectData.deviceID);
@@ -693,9 +764,34 @@
         echartsDataList.value = dataList;
       }
     }
-
+    await getPointData();
     return selectData;
   };
+
+  const getPointData = async () => {
+    const otherDevice = selectData.otherDevice;
+    let faultDevice, doorDevice;
+    if (otherDevice) {
+      //
+      const linkDevices: { deviceType: string; deviceId: string }[] = JSON.parse(otherDevice);
+      linkDevices.filter((item) => {
+        if (item.deviceType == 'faultEqu') {
+          faultDevice = item;
+        } else if (item.deviceType == 'explosionproof') {
+          doorDevice = item;
+        }
+      });
+    }
+    if (faultDevice) {
+      const result = await pointMonitor({ ids: faultDevice.deviceId });
+      faultData.value = result['valueList'] || [];
+    }
+    if (doorDevice) {
+      const result = await pointMonitor({ ids: doorDevice.deviceId });
+      explosionDoorData.value = result['valueList'] || [];
+    }
+  };
+
   // https获取监测数据
   let timer: null | NodeJS.Timeout = null;
   const getMonitor = (flag?) => {
@@ -1314,7 +1410,6 @@
 
   .data-show-box {
     position: relative;
-
     display: flex;
     flex-direction: row;
     justify-content: space-between;
@@ -1329,7 +1424,7 @@
       .item-header {
         width: 374px;
         background: url('/@/assets/images/vent/lr-top-bg.png') no-repeat;
-        background-size: auto;
+        background-size: cover;
         height: 32px;
         text-align: center;
         line-height: 34px;
@@ -1348,6 +1443,7 @@
         .tab {
           width: 323px;
           background: url('/@/assets/images/vent/lr-tab-bg.png') no-repeat;
+          background-size: cover;
           display: flex;
 
           .tab-item {
@@ -1364,7 +1460,7 @@
           }
 
           .tab-item-active-l {
-            color: #ffffff;
+            color: #aff3ff;
             background-image: url('/@/assets/images/vent/l-tab-active.png');
             background-repeat: no-repeat;
             background-size: auto;
@@ -1372,7 +1468,7 @@
           }
 
           .tab-item-active-r {
-            color: #ffffff;
+            color: #aff3ff;
             background-image: url('/@/assets/images/vent/r-tab-active.png');
             background-repeat: no-repeat;
             background-position: 0 3px;
@@ -1492,7 +1588,9 @@
             }
           }
         }
-
+        .fault-container-group {
+          overflow: hidden;
+        }
         .warning-group {
           padding: 0 10px;
           position: relative;
@@ -1539,9 +1637,47 @@
             }
           }
         }
+        .electric-box {
+          display: flex;
+          .item {
+            text-align: center;
+            color: #aff3ffee;
+          }
+        }
+        .fault-group {
+          height: 425px;
+          margin-top: 5px;
+          overflow-y: auto;
+          .fault-item {
+            display: flex;
+            padding: 3px 0px;
+            border-bottom: 1px solid #ffffff22;
+            .item {
+              padding: 0 2px;
+              text-align: center;
+            }
+            &:nth-child(odd) {
+              background-color: #c3fdff05;
+            }
+          }
+        }
       }
     }
   }
+  .fault-box {
+    .item-header {
+      width: 394px !important;
+    }
+    .item-container {
+      width: 366px !important;
+      .tab {
+        width: 343px !important;
+      }
+    }
+    .container-group {
+      width: 334px !important;
+    }
+  }
 
   .scene-box .bottom-tabs-box {
     height: 280px;
@@ -1558,14 +1694,33 @@
       top: 10px;
     }
   }
+  // 保德在线监测和故障诊断切换组件
+  .monitor-tab {
+    display: flex;
+    position: absolute;
+    top: 600px;
+    left: 395px;
+    align-items: center;
+    .item {
+      font-size: 15px;
+      color: #fff;
+      padding: 0 5px;
+      cursor: pointer;
+    }
+    .item-active {
+      transform: skew(-15deg, 0);
+      color: #00f5fe;
+      border-bottom: 1px solid #00f5fe;
+    }
+  }
   .video-icon {
     width: 30px;
     height: 38px;
     position: absolute;
-    top: -40px;
-    right: 390px;
+    top: 600px;
+    right: 395px;
     color: #fff;
-    z-index: 99999;
+    z-index: 1;
     font-size: 28px;
   }
   .no-play {

+ 3 - 0
src/views/vent/monitorManager/mainFanMonitor/main.api.ts

@@ -11,6 +11,7 @@ enum Api {
   lineList = '/Vmodel/ventanalyModelFanChart/list',
   lineAdd = '/Vmodel/ventanalyModelFanChart/add',
   lineEdit = '/Vmodel/ventanalyModelFanChart/edit',
+  pointMonitor = '/ventanaly-device/monitor/onedevice',
 }
 /**
  * 导出api
@@ -45,3 +46,5 @@ export const deviceList = (params) => defHttp.get({ url: Api.deviceList, params
 
 // 风机曲线方程
 export const lineList = (params) => defHttp.get({ url: Api.lineList, params });
+
+export const pointMonitor = (params) => defHttp.post({ url: Api.pointMonitor, params });

+ 44 - 246
src/views/vent/monitorManager/mainFanMonitor/main.data.ts

@@ -8,6 +8,15 @@ type CtrlLockOpenType = {
   CtrlLockOpen: boolean | undefined;
   CtrlExplosionVentOpen: boolean | undefined;
 };
+
+export type PointMonitorType = {
+  valueName: string;
+  valueCode: string;
+  value: number | string;
+  warnMin_201: number | string;
+  warnMin_104: number | string;
+  readTime: string;
+};
 export const columns: BasicColumn[] = [
   {
     title: '名称',
@@ -193,96 +202,6 @@ export const formSchema: FormSchema[] = [
   },
 ];
 
-export const formPasswordSchema: FormSchema[] = [
-  {
-    label: '用户账号',
-    field: 'username',
-    component: 'Input',
-    componentProps: { readOnly: true },
-  },
-  {
-    label: '登录密码',
-    field: 'password',
-    component: 'StrengthMeter',
-    componentProps: {
-      placeholder: '请输入登录密码',
-    },
-    rules: [
-      {
-        required: true,
-        message: '请输入登录密码',
-      },
-    ],
-  },
-  {
-    label: '确认密码',
-    field: 'confirmPassword',
-    component: 'InputPassword',
-    dynamicRules: ({ values }) => rules.confirmPassword(values, true),
-  },
-];
-
-export const formAgentSchema: FormSchema[] = [
-  {
-    label: '',
-    field: 'id',
-    component: 'Input',
-    show: false,
-  },
-  {
-    field: 'userName',
-    label: '用户名',
-    component: 'Input',
-    componentProps: {
-      readOnly: true,
-      allowClear: false,
-    },
-  },
-  {
-    field: 'agentUserName',
-    label: '代理人用户名',
-    required: true,
-    component: 'JSelectUser',
-    componentProps: {
-      rowKey: 'username',
-      labelKey: 'realname',
-      maxSelectCount: 10,
-    },
-  },
-  {
-    field: 'startTime',
-    label: '代理开始时间',
-    component: 'DatePicker',
-    required: true,
-    componentProps: {
-      showTime: true,
-      valueFormat: 'YYYY-MM-DD HH:mm:ss',
-      placeholder: '请选择代理开始时间',
-    },
-  },
-  {
-    field: 'endTime',
-    label: '代理结束时间',
-    component: 'DatePicker',
-    required: true,
-    componentProps: {
-      showTime: true,
-      valueFormat: 'YYYY-MM-DD HH:mm:ss',
-      placeholder: '请选择代理结束时间',
-    },
-  },
-  {
-    field: 'status',
-    label: '状态',
-    component: 'JDictSelectTag',
-    defaultValue: '1',
-    componentProps: {
-      dictCode: 'valid_status',
-      type: 'radioButton',
-    },
-  },
-];
-
 export const tableColumns = [
   {
     title: '',
@@ -409,162 +328,41 @@ export const stateColumns = () => {
   ];
 };
 
-export const getData = () => {
-  return [
-    {
-      id: 0,
-      isCheck: true,
-      address: '1号回风立井',
-      strName: '1号回风立井主机',
-      childName: '1#风机',
-      isRun: false,
-      frequency: 0,
-      windVal: 0,
-      gasVal1: 0,
-      gasVal2: 0,
-      zdX1: 0,
-      zdX2: 0,
-      zdY1: 0,
-      zdY2: 0,
-      yc1: 0,
-      yc2: 0,
-      dqPa: 0,
-      co1: 0,
-      fanSD: 0,
-      fanA: 0,
-      fanU: 0,
-      fanPL: 0,
-      fanGL: 0,
-      fanM3: 0,
-      WXC: 0,
-      UXC: 0,
-      VXC: 0,
-      QZC: 0,
-      HZC: 0,
-      ZCZ1C: 0,
-      ZCZ2C: 0,
-      FTZ1C: 0,
-      FTZ2C: 0,
-      DJQZ1C: 0,
-      C: 0,
-      RH: 0,
-      lubeBoxTemperatureF1High: undefined,
-      lubeBoxTemperatureF1Low: undefined,
-      lubeTemperatureF1High: undefined,
-      lubeTemperatureF1Low: undefined,
-      lubePaF1High: undefined,
-      lubePaF1Low: undefined,
-      singleDoorF1Warn: undefined,
-      lubeF1SlightFault: undefined,
-      lubeF1SevereFault: undefined,
-      f1B1Fault: undefined,
-      f1B2Fault: undefined,
-      f1Fault: undefined,
-    },
-    {
-      id: 1,
-      isCheck: false,
-      address: '1号回风立井',
-      strName: '1号回风立井备机',
-      childName: '2#风机',
-      isRun: false,
-      frequency: 0,
-      windVal: 0,
-      gasVal1: 0,
-      gasVal2: 0,
-      zdX1: 0,
-      zdX2: 0,
-      zdY1: 0,
-      zdY2: 0,
-      yc1: 0,
-      yc2: 0,
-      dqPa: 0,
-      co1: 0,
-      fanSD: 0,
-      fanA: 0,
-      fanU: 0,
-      fanPL: 0,
-      fanGL: 0,
-      fanM3: 0,
-      WXC: 0,
-      UXC: 0,
-      VXC: 0,
-      QZC: 0,
-      HZC: 0,
-      ZCZ1C: 0,
-      ZCZ2C: 0,
-      FTZ1C: 0,
-      FTZ2C: 0,
-      DJQZ1C: 0,
-      C: 0,
-      RH: 0,
-      lubeBoxTemperatureF1High: undefined,
-      lubeBoxTemperatureF1Low: undefined,
-      lubeTemperatureF1High: undefined,
-      lubeTemperatureF1Low: undefined,
-      lubePaF1High: undefined,
-      lubePaF1Low: undefined,
-      singleDoorF1Warn: undefined,
-      lubeF1SlightFault: undefined,
-      lubeF1SevereFault: undefined,
-      f1B1Fault: undefined,
-      f1B2Fault: undefined,
-      f1Fault: undefined,
-    },
-  ];
-};
-export const getMonitorData: any = () => {
-  return {
-    id: 0,
-    isCheck: true,
-    address: '1号回风立井',
-    strName: '1号回风立井主机',
-    childName: '1#风机',
-    isRun: false,
-    frequency: 40,
-    windVal: Math.round((Math.random() * 6 + 4) * 100) / 100,
-    gasVal1: Math.round((Math.random() * 0.03 + 0) * 100) / 100,
-    gasVal2: Math.round((Math.random() * 0.03 + 0) * 100) / 100,
-    zdX1: Math.round((Math.random() + 1) * 100) / 100,
-    zdX2: Math.round((Math.random() * 10 + 10) * 100) / 100,
-    zdY1: Math.round((Math.random() + 1) * 100) / 100,
-    zdY2: Math.round((Math.random() * 10 + 10) * 100) / 100,
-    yc1: Math.round((Math.random() * 70 + 800) * 100) / 100,
-    yc2: Math.round((Math.random() * 100 + 1400) * 100) / 100,
-    dqPa: Math.round((Math.random() * 50 + 1000) * 100) / 100,
-    co1: 0,
-    fanSD: Math.round((Math.random() * 60 + 550) * 100) / 100,
-    fanA: Math.round((Math.random() * 60 + 250) * 100) / 100,
-    fanU: Math.round((Math.random() * 100 + 500) * 100) / 100,
-    fanPL: Math.round((Math.random() * 10 + 40) * 100) / 100,
-    fanGL: Math.round((Math.random() * 100 + 150) * 100) / 100,
-    fanM3: Math.round((Math.random() * 26 + 200) * 100) / 100,
-    WXC: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    UXC: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    VXC: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    QZC: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    HZC: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    ZCZ1C: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    ZCZ2C: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    FTZ1C: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    FTZ2C: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    DJQZ1C: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    C: Math.round((Math.random() * 26 + 10) * 100) / 100,
-    RH: Math.round((Math.random() * 26 + 14) * 100) / 100,
-    lubeBoxTemperatureF1High: true,
-    lubeBoxTemperatureF1Low: true,
-    lubeTemperatureF1High: true,
-    lubeTemperatureF1Low: true,
-    lubePaF1High: true,
-    lubePaF1Low: true,
-    singleDoorF1Warn: true,
-    lubeF1SlightFault: true,
-    lubeF1SevereFault: true,
-    f1B1Fault: true,
-    f1B2Fault: true,
-    f1Fault: true,
-  };
-};
+export const faultDeviceHeader = [
+  {
+    title: '测点名称',
+    code: 'valueName',
+    width: '200px',
+  },
+  {
+    title: '实时数据',
+    code: 'value',
+    width: '110px',
+  },
+  {
+    title: '预警限值',
+    code: 'warnMax_104',
+    width: '110px',
+  },
+  {
+    title: '报警限值',
+    code: 'warnMax_201',
+    width: '110px',
+  },
+];
+
+export const rightFaultDeviceColumns = [
+  {
+    title: '中端X',
+    dataIndex: 'Fault_cd_ZX', // 测点名称
+    width: 120,
+  },
+  {
+    title: '中端X',
+    dataIndex: 'Fault_ZX_val', // 中端X实时监测值
+    width: 120,
+  },
+];
 
 export const modalTypeArr = {
   centerBtnArr: [