Преглед изворни кода

1. 视频提示信息改为中文格式
2. 解决风门首次动画不执行问题
3. 固定式对射测风添加新设备类型
4. 解决瓦斯抽采泵首页加载多次后,页面上的监测数据重复增加的问题

hongrunxia пре 1 година
родитељ
комит
481fc46ba1
26 измењених фајлова са 793 додато и 620 уклоњено
  1. 2 2
      src/components/Form/src/jeecg/components/modal/JPopupOnlReportModal.vue
  2. 1 0
      src/components/Table/src/hooks/useTableForm.ts
  3. 17 27
      src/hooks/system/useCamera.ts
  4. 5 15
      src/views/monitor/quartz/index.vue
  5. 22 22
      src/views/system/examples/demo/index.vue
  6. 2 2
      src/views/system/notice/index.vue
  7. 6 6
      src/views/system/tenant/index.vue
  8. 11 1
      src/views/vent/deviceManager/tableColumns/tableColumns.data.ts
  9. 1 2
      src/views/vent/home/colliery/components/device-warn.vue
  10. 2 2
      src/views/vent/home/colliery/components/fan-monitor.vue
  11. 8 8
      src/views/vent/home/colliery/components/main-monitor.vue
  12. 21 10
      src/views/vent/monitorManager/camera/index.vue
  13. 530 367
      src/views/vent/monitorManager/comment/HistoryTable.vue
  14. 10 3
      src/views/vent/monitorManager/compressor/components/nitrogenHome_bet.vue
  15. 2 2
      src/views/vent/monitorManager/deviceMonitor/components/network/index.vue
  16. 4 1
      src/views/vent/monitorManager/deviceMonitor/components/network/network.data.ts
  17. 0 5
      src/views/vent/monitorManager/fanLocalMonitor/index.vue
  18. 20 32
      src/views/vent/monitorManager/gasPumpMonitor/components/gasPumpHome.vue
  19. 102 102
      src/views/vent/monitorManager/gateMonitor/gate.threejs.qd.ts
  20. 0 1
      src/views/vent/monitorManager/gateMonitor/index.vue
  21. 4 2
      src/views/vent/monitorManager/nitrogen/components/nitrogenHome.vue
  22. 5 1
      src/views/vent/monitorManager/nitrogen/components/nitrogenHomeBLT.vue
  23. 1 1
      src/views/vent/monitorManager/windrectMonitor/duishe.threejs.ts
  24. 4 3
      src/views/vent/monitorManager/windrectMonitor/duisheFixed.threejs.ts
  25. 5 2
      src/views/vent/monitorManager/windrectMonitor/index.vue
  26. 8 1
      src/views/vent/monitorManager/workFaceMonitor/workFace.data.ts

+ 2 - 2
src/components/Form/src/jeecg/components/modal/JPopupOnlReportModal.vue

@@ -18,12 +18,12 @@
             <template v-for="(item, index) in queryInfo">
               <template v-if="item.hidden === '1'">
                 <a-col :md="8" :sm="24" :key="'query' + index" v-show="toggleSearchStatus">
-                  <SearchFormItem :formElRef="formRef" :queryParam="queryParam" :item="item" :dictOptions="dictOptions"></SearchFormItem>
+                  <SearchFormItem :formElRef="formRef" :queryParam="queryParam" :item="item" :dictOptions="dictOptions" />
                 </a-col>
               </template>
               <template v-else>
                 <a-col :md="8" :sm="24" :key="'query' + index">
-                  <SearchFormItem :formElRef="formRef" :queryParam="queryParam" :item="item" :dictOptions="dictOptions"></SearchFormItem>
+                  <SearchFormItem :formElRef="formRef" :queryParam="queryParam" :item="item" :dictOptions="dictOptions" />
                 </a-col>
               </template>
             </template>

+ 1 - 0
src/components/Table/src/hooks/useTableForm.ts

@@ -35,6 +35,7 @@ export function useTableForm(
   }
 
   function handleSearchInfoChange(info: Recordable) {
+    debugger;
     const { handleSearchInfoFn } = unref(propsRef);
     if (handleSearchInfoFn && isFunction(handleSearchInfoFn)) {
       info = handleSearchInfoFn(info) || info;

+ 17 - 27
src/hooks/system/useCamera.ts

@@ -2,10 +2,12 @@ import { defHttp } from '/@/utils/http/axios';
 // import { render, h, nextTick } from 'vue';
 // import LivePlayer from '@liveqing/liveplayer-v3';
 import { useDrag } from '../event/useDrag';
-import Player from 'xgplayer';
+import Player, { I18N } from 'xgplayer';
 import HlsPlugin from 'xgplayer-hls';
 import FlvPlugin from 'xgplayer-flv';
 import 'xgplayer/dist/index.min.css';
+import ZH from 'xgplayer/es/lang/zh-cn';
+I18N.use(ZH);
 
 export function useCamera() {
   const cameraList = (params) => defHttp.get({ url: '/safety/ventanalyCamera/list', params });
@@ -50,15 +52,17 @@ export function useCamera() {
         const item = cameras[i];
         if (item['devicekind'] === 'toHKRtsp') {
           // 从海康平台接口获取视频流
-          const data = await cameraAddr({ cameraCode: item['addr'] });
-          if (data && data['url']) {
-            cameraAddrs.push({ name: item['name'], addr: data['url'] });
-          }
-          // // 从海康平台接口获取视频流测试
-          // cameraAddrs.push({
-          //   name: item['name'],
-          //   addr: 'https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.mp4/.m3u8',
-          // });
+          try {
+            const data = await cameraAddr({ cameraCode: item['addr'] });
+            if (data && data['url']) {
+              cameraAddrs.push({ name: item['name'], addr: data['url'] });
+            }
+            // // 从海康平台接口获取视频流测试
+            // cameraAddrs.push({
+            //   name: item['name'],
+            //   addr: 'https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.mp4/.m3u8',
+            // });
+          } catch (error) {}
         } else if (item['devicekind'] == 'toHKR') {
           cameraNames.push(item['name']);
         } else {
@@ -159,23 +163,6 @@ export function useCamera() {
                   videoParentDomList.push(videoParentDom);
                 }
               } else {
-                // try {
-                //   fetch(cameraUrl.addr, {
-                //     method: 'get',
-                //     mode: 'no-cors',
-                //   })
-                //     .then(() => {
-                //       videoParentDomList.push(['player', cameraUrl]);
-                //       childResolve(null);
-                //     })
-                //     .catch(() => {
-                //       videoParentDomList.push(['onPlayer' + index, cameraUrl]);
-                //       childResolve(null);
-                //     });
-                // } catch (error) {
-                //   // console.log('可以捕获到异常吗?????');
-                //   childResolve(null);
-                // }
                 videoParentDomList.push(['player' + index, cameraUrl]);
                 childResolve(null);
               }
@@ -205,6 +192,7 @@ export function useCamera() {
             let player;
             if (fileExtension === 'flv') {
               player = new Player({
+                lang: 'zh',
                 id: videoParent[0],
                 url: videoParent[1].addr,
                 width: 294,
@@ -243,6 +231,7 @@ export function useCamera() {
               if (document.createElement('video').canPlayType('application/vnd.apple.mpegurl')) {
                 // 原生支持 hls 播放
                 player = new Player({
+                  lang: 'zh',
                   id: videoParent[0],
                   url: videoParent[1].addr,
                   width: 294,
@@ -269,6 +258,7 @@ export function useCamera() {
               } else if (HlsPlugin.isSupported()) {
                 // 第一步
                 player = new Player({
+                  lang: 'zh',
                   id: videoParent[0],
                   url: videoParent[1].addr,
                   width: 294,

+ 5 - 15
src/views/monitor/quartz/index.vue

@@ -9,36 +9,26 @@
           <template #overlay>
             <a-menu>
               <a-menu-item key="1" @click="batchHandleDelete">
-                <Icon icon="ant-design:delete-outlined"></Icon>
+                <Icon icon="ant-design:delete-outlined" />
                 删除
               </a-menu-item>
             </a-menu>
           </template>
           <a-button
             >批量操作
-            <Icon icon="mdi:chevron-down"></Icon>
+            <Icon icon="mdi:chevron-down" />
           </a-button>
         </a-dropdown>
       </template>
       <template #action="{ record }">
         <div class="vent-row-center">
-          <a-popconfirm
-            v-if="record.status == -1"
-            title="是否启动选中任务?"
-            @confirm="handlerResume(record)"
-            style="display: inline-block"
-          >
+          <a-popconfirm v-if="record.status == -1" title="是否启动选中任务?" @confirm="handlerResume(record)" style="display: inline-block">
             <a class="table-action-link">启动</a>
           </a-popconfirm>
-          <a-popconfirm
-            v-if="record.status == 0"
-            title="是否暂停选中任务?"
-            @confirm="handlerPause(record)"
-            style="display: inline-block"
-          >
+          <a-popconfirm v-if="record.status == 0" title="是否暂停选中任务?" @confirm="handlerPause(record)" style="display: inline-block">
             <a class="table-action-link">停止</a>
           </a-popconfirm>
-          <TableAction :dropDownActions="getDropDownAction(record)"/>
+          <TableAction :dropDownActions="getDropDownAction(record)" />
         </div>
       </template>
     </BasicTable>

+ 22 - 22
src/views/system/examples/demo/index.vue

@@ -6,14 +6,14 @@
         <a-row :gutter="24">
           <a-col :lg="8">
             <a-form-item label="用户名">
-              <a-input placeholder="请输入名称模糊查询" v-model:value="queryParam.name"></a-input>
+              <a-input placeholder="请输入名称模糊查询" v-model:value="queryParam.name" />
             </a-form-item>
           </a-col>
           <a-col :lg="8">
             <a-form-item label="年龄">
-              <a-input placeholder="最小年龄" type="ge" v-model:value="queryParam.age_begin" style="width: calc(50% - 15px)"></a-input>
+              <a-input placeholder="最小年龄" type="ge" v-model:value="queryParam.age_begin" style="width: calc(50% - 15px)" />
               <span>~</span>
-              <a-input placeholder="最大年龄" type="le" v-model:value="queryParam.age_end" style="width: calc(50% - 15px)"></a-input>
+              <a-input placeholder="最大年龄" type="le" v-model:value="queryParam.age_end" style="width: calc(50% - 15px)" />
             </a-form-item>
           </a-col>
           <template v-if="toggleSearchStatus">
@@ -43,16 +43,16 @@
     </div>
     <BasicTable @register="registerTable" :rowSelection="rowSelection" :class="{ 'p-4': customSearch }">
       <template #form-age="{ model, field }">
-        <a-input placeholder="最小年龄" type="ge" v-model:value="min" style="width: calc(50% - 15px)" @change="ageChange(model, field)"></a-input>
+        <a-input placeholder="最小年龄" type="ge" v-model:value="min" style="width: calc(50% - 15px)" @change="ageChange(model, field)" />
         <span>~</span>
-        <a-input placeholder="最大年龄" type="le" v-model:value="max" style="width: calc(50% - 15px)" @change="ageChange(model, field)"></a-input>
+        <a-input placeholder="最大年龄" type="le" v-model:value="max" style="width: calc(50% - 15px)" @change="ageChange(model, field)" />
       </template>
       <template #tableTitle>
         <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd">新增</a-button>
         <a-upload name="file" :showUploadList="false" :customRequest="(file) => handleImportXls(file, getImportUrl, reload)">
           <a-button preIcon="ant-design:import-outlined" type="primary">导入</a-button>
         </a-upload>
-        <a-button preIcon="ant-design:export-outlined" type="primary" @click="handleExportXls('单表示例', getExportUrl,exportParams)">导出</a-button>
+        <a-button preIcon="ant-design:export-outlined" type="primary" @click="handleExportXls('单表示例', getExportUrl, exportParams)">导出</a-button>
         <a-button preIcon="ant-design:filter" type="primary" @click="">高级查询</a-button>
         <a-button preIcon="ant-design:plus-outlined" type="primary" @click="openTab">打开Tab页</a-button>
         <a-button preIcon="ant-design:retweet-outlined" type="primary" @click="customSearch = !customSearch">{{
@@ -60,20 +60,20 @@
         }}</a-button>
         <a-button preIcon="ant-design:import-outlined" type="primary" @click="handleImport">弹窗导入</a-button>
 
-        <super-query :config="superQueryConfig" @search="handleSuperQuery"/>
+        <super-query :config="superQueryConfig" @search="handleSuperQuery" />
 
         <a-dropdown v-if="checkedKeys.length > 0">
           <template #overlay>
             <a-menu>
               <a-menu-item key="1" @click="batchHandleDelete">
-                <Icon icon="ant-design:delete-outlined"></Icon>
+                <Icon icon="ant-design:delete-outlined" />
                 删除
               </a-menu-item>
             </a-menu>
           </template>
           <a-button
             >批量操作
-            <Icon style="fontsize: 12px" icon="ant-design:down-outlined"></Icon>
+            <Icon style="fontsize: 12px" icon="ant-design:down-outlined" />
           </a-button>
         </a-dropdown>
       </template>
@@ -81,12 +81,12 @@
         <TableAction :actions="getActions(record)" />
       </template>
     </BasicTable>
-    <DemoModal @register="registerModal" @success="reload" :isDisabled="isDisabled"/>
+    <DemoModal @register="registerModal" @success="reload" :isDisabled="isDisabled" />
     <JImportModal @register="registerModalJimport" :url="getImportUrl" online />
   </div>
 </template>
 <script lang="ts" setup>
-  import { ref, unref, reactive, toRaw, watch,computed } from 'vue';
+  import { ref, unref, reactive, toRaw, watch, computed } from 'vue';
   import { BasicTable, useTable, TableAction } from '/@/components/Table';
   import { useModal } from '/@/components/Modal';
   import DemoModal from './DemoModal.vue';
@@ -99,7 +99,7 @@
   import { useGo } from '/@/hooks/web/usePage';
   import { router } from '/@/router';
   import { filterObj } from '/@/utils/common/compUtils';
-  
+
   const go = useGo();
   const checkedKeys = ref<Array<string | number>>([]);
   const [registerModal, { openModal }] = useModal();
@@ -108,7 +108,7 @@
   const min = ref();
   const max = ref();
   const isDisabled = ref(false);
-  
+
   const [registerTable, { reload, setProps }] = useTable({
     title: '单表示例',
     api: getDemoList,
@@ -159,13 +159,13 @@
     openModalJimport(true);
   }
 
-  const exportParams = computed(()=>{
+  const exportParams = computed(() => {
     let paramsForm = {};
     if (checkedKeys.value && checkedKeys.value.length > 0) {
       paramsForm['selections'] = checkedKeys.value.join(',');
     }
-    return filterObj(paramsForm)
-  })
+    return filterObj(paramsForm);
+  });
   /**
    * 操作列定义
    * @param record
@@ -194,7 +194,7 @@
    * 选择事件
    */
   function onSelectChange(selectedRowKeys: (string | number)[]) {
-    console.log("checkedKeys------>",checkedKeys)
+    console.log('checkedKeys------>', checkedKeys);
     checkedKeys.value = selectedRowKeys;
   }
 
@@ -289,13 +289,13 @@
   //自定义查询----end---------
 
   const superQueryConfig = reactive({
-    name:{ title: "名称", view: "text", type: "string", order: 1 },
-    sex:{ title: "性别", view: "list", type: "string", dictCode:'sex', order: 2 },
+    name: { title: '名称', view: 'text', type: 'string', order: 1 },
+    sex: { title: '性别', view: 'list', type: 'string', dictCode: 'sex', order: 2 },
   });
-  
+
   function handleSuperQuery(params) {
-    Object.keys(params).map(k=>{
-      queryParam[k] = params[k]
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
     });
     searchQuery();
   }

+ 2 - 2
src/views/system/notice/index.vue

@@ -3,8 +3,8 @@
     <BasicTable @register="registerTable" :rowSelection="rowSelection">
       <template #tableTitle>
         <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd">新增</a-button>
-<!--        <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>-->
-<!--        <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>-->
+        <!--        <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>-->
+        <!--        <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>-->
         <a-dropdown v-if="selectedRowKeys.length > 0">
           <template #overlay>
             <a-menu>

+ 6 - 6
src/views/system/tenant/index.vue

@@ -7,14 +7,14 @@
           <template #overlay>
             <a-menu>
               <a-menu-item key="1" @click="batchHandleDelete">
-                <Icon icon="ant-design:delete-outlined"></Icon>
+                <Icon icon="ant-design:delete-outlined" />
                 删除
               </a-menu-item>
             </a-menu>
           </template>
           <a-button
             >批量操作
-            <Icon icon="mdi:chevron-down"></Icon>
+            <Icon icon="mdi:chevron-down" />
           </a-button>
         </a-dropdown>
         <a-button
@@ -80,10 +80,10 @@
         schemas: searchFormSchema,
         fieldMapToTime: [['fieldTime', ['beginDate', 'endDate'], 'YYYY-MM-DD HH:mm:ss']],
       },
-      actionColumn:{
+      actionColumn: {
         width: 150,
-        fixed:'right'
-      }
+        fixed: 'right',
+      },
     },
   });
   const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;
@@ -187,7 +187,7 @@
     packModal(true, {
       tenantId: unref(selectedRowKeys.value.join(',')),
       //我的租户显示新增和编辑产品包
-      showPackAddAndEdit: true
+      showPackAddAndEdit: true,
     });
   }
 

+ 11 - 1
src/views/vent/deviceManager/tableColumns/tableColumns.data.ts

@@ -106,7 +106,7 @@ export const formSchema: FormSchema[] = [
     component: 'Input',
   },
   {
-    label: '是否显示',
+    label: 'PC端是否显示',
     field: 'showflag',
     component: 'JDictSelectTag',
     componentProps: {
@@ -116,6 +116,16 @@ export const formSchema: FormSchema[] = [
     },
   },
   {
+    label: '手机端是否显示',
+    field: 'appShow',
+    component: 'JDictSelectTag',
+    componentProps: {
+      dictCode: 'booltype',
+      placeholder: '请选择状态',
+      stringToNumber: true,
+    },
+  },
+  {
     label: '数据类型',
     field: 'datatype',
     component: 'JDictSelectTag',

+ 1 - 2
src/views/vent/home/colliery/components/device-warn.vue

@@ -57,8 +57,7 @@
     () => props.warnData,
     (val) => {
       val.forEach((el) => {
-        // nowStatus.value = el.netstatus.val;
-        nowStatus.value = 0;
+        nowStatus.value = el.netstatus.val;
         warnList[0].val = el.red.val;
         warnList[1].val = el.alarm.val;
         warnList[2].val = el.orange.val;

+ 2 - 2
src/views/vent/home/colliery/components/fan-monitor.vue

@@ -67,9 +67,9 @@
     if (selectData) {
       fjStatus.value =
         selectData.readData.Fan1StartStatus && selectData.readData.Fan1StartStatus == '1'
-          ? '1号风机'
+          ? '机'
           : selectData.readData.Fan2StartStatus && selectData.readData.Fan2StartStatus == '1'
-          ? '2号风机'
+          ? '机'
           : '断开';
       echartData.xdata = selectData.readData.windQuantity1 || selectData.readData.windQuantity1_merge;
       echartData.ydata = selectData.readData.windQuantity2 || selectData.readData.windQuantity2_merge;

+ 8 - 8
src/views/vent/home/colliery/components/main-monitor.vue

@@ -50,7 +50,7 @@
     dataQ: 0,
     dataH: 0,
   });
-
+  let maxM3 = 400;
   //风机启动状态
   let runStatus = ref('');
   //获取dom节点
@@ -75,16 +75,16 @@
     if (selectData) {
       runStatus.value =
         selectData.readData.Fan1StartStatus && selectData.readData.Fan1StartStatus == '1'
-          ? '机'
+          ? '1#风机'
           : selectData.readData.Fan2StartStatus && selectData.readData.Fan2StartStatus == '1'
-          ? '机'
+          ? '2#风机'
           : '--';
-      if (runStatus.value == '机') {
+      if (runStatus.value == '1#风机') {
         objParam = {
           dataQ: selectData.readData.Fan1m3 || 0,
           dataH: Math.abs(Number(selectData.readData.Fan1FanPre || 0)),
         };
-      } else if (runStatus.value == '机') {
+      } else if (runStatus.value == '2#风机') {
         objParam = {
           dataQ: selectData.readData.Fan2m3 || 0,
           dataH: Math.abs(Number(selectData.readData.Fan2FanPre || 0)),
@@ -189,7 +189,7 @@
             },
             type: 'value',
             min: 0,
-            max: 400,
+            max: maxM3, // 高家梁最大9000,
           },
           {
             name: '',
@@ -327,12 +327,12 @@
     let data2 = [];
     let datax = [];
 
-    for (let i = 30; i <= 400; i++) {
+    for (let i = 30; i <= maxM3; i++) {
       let x = i;
       let y4 = character.dataha0 * (x - q) * (x - q) + character.dataha1 * (x - q) + character.dataha2 + h;
       data2.push([x, y4]);
     }
-    for (let i = 0; i <= 400; i++) {
+    for (let i = 0; i <= maxM3; i++) {
       let x = i;
       let y = (H1 / Q1 / Q1) * x * x;
       data.push([x, y]);

+ 21 - 10
src/views/vent/monitorManager/camera/index.vue

@@ -27,11 +27,14 @@
   import {onMounted, onUnmounted, ref } from 'vue';
   import { Pagination, Empty } from 'ant-design-vue';
   import { list, cameraAddr } from './camera.api'
-  import Player from 'xgplayer';
+  import Player,  {I18N} from 'xgplayer';
+  import ZH from 'xgplayer/es/lang/zh-cn'
   import HlsPlugin from 'xgplayer-hls';
   import FlvPlugin from 'xgplayer-flv';
   import 'xgplayer/dist/index.min.css';
 
+  I18N.use(ZH)
+
   const pageSize = 8
   const current = ref(1)
   const total = ref(0)
@@ -107,18 +110,23 @@
         
         if (item['devicekind'] === 'toHKRtsp') {
           // 从海康平台接口获取视频流
-          const data = await cameraAddr({ cameraCode: item['addr'] });
-          if (data && data['url']) {
-            cameraList.push({ name: item['name'], addr: data['url'] });
+          try {
+            const data = await cameraAddr({ cameraCode: item['addr'] });
+            if (data && data['url']) {
+              cameraList.push({ name: item['name'], addr: data['url'] });
+            }
+            // cameraList.push({
+            //   name: item['name'],
+            //   // addr: 'http://219.151.31.38/liveplay-kk.rtxapp.com/live/program/live/hnwshd/4000000/mnf.m3u8'
+            //   addr: 'https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.mp4/.m3u8',
+            // });
+          } catch (error) {
+            
           }
-          // cameraList.push({
-          //   name: item['name'],
-          //   // addr: 'http://219.151.31.38/liveplay-kk.rtxapp.com/live/program/live/hnwshd/4000000/mnf.m3u8'
-          //   addr: 'https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.mp4/.m3u8',
-          // });
+          
         } else {
           if(item['addr'].includes('0.0.0.0')){
-            item['addr'].replace('0.0.0.0', window.location.hostname)
+            item['addr'] = item['addr'].replace('0.0.0.0', window.location.hostname)
           }
           cameraList.push({ name: item['name'], addr: item['addr'] });
         }
@@ -156,6 +164,7 @@
     // const plugins = fileExtension === 'flv' ? [ FlvPlugin ] : [ HlsPlugin ];
     if(fileExtension === 'flv'){
       const player = new Player({
+        lang: 'zh',
         id: id,
         url: videoAddr,
         width:  421,
@@ -194,6 +203,7 @@
       if (document.createElement('video').canPlayType('application/vnd.apple.mpegurl')) {
         // 原生支持 hls 播放
         player = new Player({
+          lang: 'zh',
           id: id,
           url: videoAddr,
           width: 421,
@@ -220,6 +230,7 @@
         })
       } else if (HlsPlugin.isSupported()) { // 第一步
         player = new Player({
+          lang: 'zh',
           id: id,
           url: videoAddr,
           width: 421,

+ 530 - 367
src/views/vent/monitorManager/comment/HistoryTable.vue

@@ -1,12 +1,13 @@
 <template>
   <div class="history-table" v-if="loading">
-    <BasicTable ref="historyTable" @register="registerTable">
+    <BasicTable ref="historyTable" @register="registerTable" :data-source="dataSource">
       <template #bodyCell="{ column, record }">
         <slot name="filterCell" v-bind="{ column, record }"></slot>
       </template>
-      <!-- <template #form-onExportXls>
-        <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
-      </template> -->
+
+      <template #form-submitBefore>
+        <a-button type="primary" preIcon="ant-design:search-outlined" @click="getDataSource">查询</a-button>
+      </template>
     </BasicTable>
   </div>
 </template>
@@ -24,26 +25,6 @@
   import { onMounted } from 'vue';
 
   const globalConfig = inject('globalConfig');
-
-  const historyTable = ref();
-  const loading = ref(false);
-  const list = (params) => {
-    if (globalConfig.History_Type == 'vent') {
-      debugger;
-      // return defHttp.get({ url: '/safety/ventanalyMonitorData/list', params })
-      return defHttp.get({ url: '/safety/ventanalyMonitorData/listdays', params });
-    } else {
-      return defHttp.post({ url: '/ventanaly-device/history/getHistoryData', params });
-    }
-  };
-  const getExportXlsUrl = () => {
-    if (globalConfig.History_Type == 'vent') {
-      return '/safety/ventanalyMonitorData/exportXls';
-    } else {
-      return '/ventanaly-device/history/getHistoryData/exportXls';
-    }
-  };
-  const emit = defineEmits(['change']);
   const props = defineProps({
     columnsType: {
       type: String,
@@ -80,11 +61,27 @@
       default: () => [],
     },
   });
+
+  const historyTable = ref();
+  const loading = ref(false);
+  const stationType = ref('plc');
+  const dataSource = ref([]);
+
+  const getExportXlsUrl = () => {
+    if (stationType.value !== 'redis') {
+      return '/safety/ventanalyMonitorData/exportXls';
+    } else {
+      return '/ventanaly-device/history/getHistoryData/exportXls';
+    }
+  };
+  const emit = defineEmits(['change']);
+
   const historyType = ref('');
   const columns = ref([]);
   const tableScroll = props.scroll.y ? ref({ y: props.scroll.y - 100 }) : ref({});
   let deviceOptions = ref([]);
   const deviceTypeStr = ref('');
+  loading.value = true;
 
   watch(
     () => {
@@ -133,6 +130,322 @@
     }
   );
 
+  watch(stationType, (type) => {
+    if (type) {
+      getDataSource();
+    }
+  });
+
+  function getTableProps(stationTypeStr) {
+    if (stationTypeStr !== 'redis') {
+      debugger;
+      setProps({
+        api: (params) => defHttp.get({ url: '/safety/ventanalyMonitorData/listdays', params }),
+        formConfig: {
+          labelAlign: 'left',
+          showAdvancedButton: false,
+          baseColProps: {
+            xs: 24,
+            sm: 24,
+            md: 24,
+            lg: 9,
+            xl: 7,
+            xxl: 4,
+          },
+          schemas:
+            props.formSchemas.length > 0
+              ? props.formSchemas
+              : [
+                  {
+                    field: 'ttime_begin',
+                    label: '开始时间',
+                    component: 'DatePicker',
+                    defaultValue: dayjs().startOf('date'),
+                    required: true,
+                    componentProps: {
+                      showTime: true,
+                      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+                      getPopupContainer: getAutoScrollContainer,
+                    },
+                    colProps: {
+                      span: 4,
+                    },
+                  },
+                  {
+                    field: 'ttime_end',
+                    label: '结束时间',
+                    component: 'DatePicker',
+                    defaultValue: dayjs(),
+                    required: true,
+                    componentProps: {
+                      showTime: true,
+                      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+                      getPopupContainer: getAutoScrollContainer,
+                    },
+                    colProps: {
+                      span: 4,
+                    },
+                  },
+                  {
+                    label: '查询设备',
+                    field: 'gdeviceid',
+                    component: 'Select',
+                    defaultValue: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '',
+                    required: true,
+                    componentProps: {
+                      options: deviceOptions,
+                      onChange: (e, option) => {
+                        if (option && (option['strinstallpos'] || option['strtype'] || option['devicekind']))
+                          historyType.value = option['strtype'] || option['devicekind'];
+                        if (option['strtype']) deviceTypeStr.value = option['strtype'];
+                        stationType.value = option['stationtype'];
+                      },
+                    },
+                    colProps: {
+                      span: 4,
+                    },
+                  },
+                  {
+                    label: '间隔时间',
+                    field: 'skip',
+                    component: 'Select',
+                    defaultValue: 5,
+                    componentProps: {
+                      options: [
+                        {
+                          label: '5秒',
+                          value: '1',
+                        },
+                        {
+                          label: '10秒',
+                          value: '2',
+                        },
+                        {
+                          label: '30秒',
+                          value: '3',
+                        },
+                        {
+                          label: '1分钟',
+                          value: '4',
+                        },
+                        {
+                          label: '5分钟',
+                          value: '5',
+                        },
+                        {
+                          label: '10分钟',
+                          value: '6',
+                        },
+                        {
+                          label: '30分钟',
+                          value: '7',
+                        },
+                        {
+                          label: '1小时',
+                          value: '8',
+                        },
+                      ],
+                    },
+                    colProps: {
+                      span: 4,
+                    },
+                  },
+                ],
+        },
+        // fetchSetting: {
+        //   listField: 'datalist',
+        //   totalField: 'datalist.total',
+        // },
+        pagination: {
+          current: 1,
+          pageSize: 10,
+          pageSizeOptions: ['10', '30', '50', '100'],
+          showQuickJumper: false,
+        },
+        // beforeFetch(params) {
+        //   params.strtype = deviceTypeStr.value
+        //     ? deviceTypeStr.value
+        //     : deviceOptions.value[0]['strtype']
+        //     ? deviceOptions.value[0]['strtype']
+        //     : props.deviceType + '*';
+        //   if (props.sysId) {
+        //     params.sysId = props.sysId;
+        //   }
+        //   return params;
+        // },
+        // afterFetch(result) {
+        //   const resultItems = result['records'];
+        //   resultItems.map((item) => {
+        //     Object.assign(item, item['readData']);
+        //   });
+        //   console.log('result---------------->', result);
+        //   return resultItems;
+        // },
+      });
+    } else {
+      setProps({
+        api: (params) => defHttp.post({ url: '/ventanaly-device/history/getHistoryData', params }),
+        formConfig: {
+          labelAlign: 'left',
+          showAdvancedButton: false,
+          // autoAdvancedCol: 2,
+
+          baseColProps: {
+            // offset: 0.5,
+            xs: 24,
+            sm: 24,
+            md: 24,
+            lg: 9,
+            xl: 7,
+            xxl: 4,
+          },
+          schemas:
+            props.formSchemas.length > 0
+              ? props.formSchemas
+              : [
+                  {
+                    field: 'startTime',
+                    label: '开始时间',
+                    component: 'DatePicker',
+                    defaultValue: dayjs().startOf('date'),
+                    required: true,
+                    componentProps: {
+                      showTime: true,
+                      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+                      getPopupContainer: getAutoScrollContainer,
+                    },
+                    colProps: {
+                      span: 4,
+                    },
+                  },
+                  {
+                    field: 'endTime',
+                    label: '结束时间',
+                    component: 'DatePicker',
+                    defaultValue: dayjs(),
+                    required: true,
+                    componentProps: {
+                      showTime: true,
+                      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+                      getPopupContainer: getAutoScrollContainer,
+                    },
+                    colProps: {
+                      span: 4,
+                    },
+                  },
+                  {
+                    label: '查询设备',
+                    field: 'deviceId',
+                    component: 'Select',
+                    defaultValue: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '',
+                    required: true,
+                    componentProps: {
+                      options: deviceOptions,
+                      onChange: (e, option) => {
+                        if (option && (option['strinstallpos'] || option['strtype'] || option['devicekind']))
+                          historyType.value = option['strtype'] || option['devicekind'];
+                        stationType.value = option['stationtype'];
+                      },
+                    },
+                    colProps: {
+                      span: 4,
+                    },
+                    // componentProps: ({ formModel }) => {
+                    //   return {
+                    //     options: deviceOptions.value,
+                    //     // api: () => defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType.startsWith('vehicle') ? 'location_normal' : props.deviceType } }),
+                    //     // resultField: 'result',
+                    //     // labelField: 'strinstallpos',
+                    //     // valueField: 'id',
+                    //     // onChange: (e, option) => {
+                    //     //   if(option && (option['strtype'] || option['devicekind'])) historyType.value = option['strtype'] || option['devicekind']
+                    //     // },
+                    //   }
+                    // },
+                  },
+                  {
+                    label: '间隔时间',
+                    field: 'interval',
+                    component: 'Select',
+                    defaultValue: '30s',
+                    componentProps: {
+                      options: [
+                        {
+                          label: '1秒',
+                          value: '1s',
+                        },
+                        {
+                          label: '5秒',
+                          value: '5s',
+                        },
+                        {
+                          label: '10秒',
+                          value: '10s',
+                        },
+                        {
+                          label: '30秒',
+                          value: '30s',
+                        },
+                        {
+                          label: '1分钟',
+                          value: '1m',
+                        },
+                        {
+                          label: '10分钟',
+                          value: '10m',
+                        },
+                        {
+                          label: '30分钟',
+                          value: '30m',
+                        },
+                        {
+                          label: '1小时',
+                          value: '1h',
+                        },
+                      ],
+                    },
+                    colProps: {
+                      span: 4,
+                    },
+                  },
+                ],
+        },
+        pagination: {
+          current: 1,
+          pageSize: 10,
+          pageSizeOptions: ['10', '30', '50', '100'],
+          showQuickJumper: false,
+        },
+        fetchSetting: {
+          totalField: 'total',
+          // 每页显示多少条
+          sizeField: 'pageSize',
+          // 请求结果列表字段  支持 a.b.c
+          pageField: 'pageNo',
+        },
+        beforeFetch(params) {
+          params.strtype = props.deviceType + '*';
+          if (props.sysId) {
+            params.sysId = props.sysId;
+          }
+          if (params.interval) {
+            params.interval = params.interval;
+          } else {
+            params.interval = '1m';
+          }
+          if (props.deviceType.startsWith('vehicle')) {
+            params['isEmployee'] = false;
+          } else if (props.deviceType.startsWith('location')) {
+            params['isEmployee'] = true;
+          }
+        },
+        afterFetch(result) {
+          return result;
+        },
+      });
+    }
+  }
+
   async function getDeviceList() {
     if (props.deviceType.split('_')[1] && props.deviceType.split('_')[1] === 'history') return;
     let result;
@@ -154,394 +467,244 @@
     }
     if (result) {
       deviceOptions.value = [];
-      deviceOptions.value = result.map((item) => {
+      deviceOptions.value = result.map((item, index) => {
         return {
           label: item['strinstallpos'],
           value: item['id'],
           strtype: item['strtype'],
           strinstallpos: item['strinstallpos'],
           devicekind: item['devicekind'],
+          stationtype: index > 2 ? 'redis' : 'plc',
         };
         // return { label: item['strname'], value: item['id']}
       });
     }
+    console.log('deviceOptions---------------->', deviceOptions.value);
     globalConfig.History_Type == 'vent' && deviceOptions.value[0]
       ? getForm().setFieldsValue({ gdeviceid: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '' })
       : getForm().setFieldsValue({ deviceId: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '' });
   }
 
-  loading.value = true;
+  async function getDataSource() {
+    setLoading(true);
+    const pagination = getPaginationRef();
+    const stationTypeStr = stationType.value;
+    const formData = getForm().getFieldsValue();
+    formData['pageNo'] = pagination['current'];
+    formData['pageSize'] = pagination['pageSize'];
+    formData['column'] = 'createTime';
+    if (stationTypeStr !== 'redis') {
+      formData['strtype'] = deviceTypeStr.value
+        ? deviceTypeStr.value
+        : deviceOptions.value[0]['strtype']
+        ? deviceOptions.value[0]['strtype']
+        : props.deviceType + '*';
+      if (props.sysId) {
+        formData['sysId'] = props.sysId;
+      }
+      const result = await defHttp.get({ url: '/safety/ventanalyMonitorData/listdays', params: formData });
+      if (result['datalist']['records'].length > 0) {
+        dataSource.value = result['datalist']['records'].map((item: any) => {
+          return Object.assign(item, item['readData']);
+        });
+      } else {
+        dataSource.value = [];
+      }
+    } else {
+      const params = {
+        startTime: formData['ttime_begin'],
+        endTime: formData['ttime_end'],
+        deviceId: formData['gdeviceid'],
+        strtype: props.deviceType + '*',
+        sysId: props.sysId,
+        interval: formData['skip'] ? formData['skip'] : '1m',
+        isEmployee: props.deviceType.startsWith('vehicle') ? false : true,
+      };
+      const result = await defHttp.post({ url: '/ventanaly-device/history/getHistoryData', params: params });
+      dataSource.value = result['records'] || [];
+    }
+    setLoading(false);
+  }
+
   // 列表页面公共参数、方法
-  const { tableContext, onExportXls } = useListPage(
-    globalConfig.History_Type == 'vent'
-      ? {
-          tableProps: {
-            api: list,
-            columns: props.columnsType ? columns : (props.columns as any[]),
-            canResize: true,
-            showTableSetting: false,
-            showActionColumn: false,
-            bordered: false,
-            size: 'small',
-            scroll: tableScroll,
-            showIndexColumn: true,
-            formConfig: {
-              labelAlign: 'left',
-              showAdvancedButton: false,
-              baseColProps: {
-                // offset: 0.5,
-                xs: 24,
-                sm: 24,
-                md: 24,
-                lg: 9,
-                xl: 7,
-                xxl: 4,
-              },
-              schemas:
-                props.formSchemas.length > 0
-                  ? props.formSchemas
-                  : [
+  const { tableContext, onExportXls } = useListPage({
+    tableProps: {
+      // api: list,
+      columns: props.columnsType ? columns : (props.columns as any[]),
+      canResize: true,
+      showTableSetting: false,
+      showActionColumn: false,
+      bordered: false,
+      size: 'small',
+      scroll: tableScroll,
+      showIndexColumn: true,
+      formConfig: {
+        labelAlign: 'left',
+        showAdvancedButton: false,
+        showSubmitButton: false,
+        showResetButton: false,
+        baseColProps: {
+          xs: 24,
+          sm: 24,
+          md: 24,
+          lg: 9,
+          xl: 7,
+          xxl: 4,
+        },
+        schemas:
+          props.formSchemas.length > 0
+            ? props.formSchemas
+            : [
+                {
+                  field: 'ttime_begin',
+                  label: '开始时间',
+                  component: 'DatePicker',
+                  defaultValue: dayjs().startOf('date'),
+                  required: true,
+                  componentProps: {
+                    showTime: true,
+                    valueFormat: 'YYYY-MM-DD HH:mm:ss',
+                    getPopupContainer: getAutoScrollContainer,
+                  },
+                  colProps: {
+                    span: 4,
+                  },
+                },
+                {
+                  field: 'ttime_end',
+                  label: '结束时间',
+                  component: 'DatePicker',
+                  defaultValue: dayjs(),
+                  required: true,
+                  componentProps: {
+                    showTime: true,
+                    valueFormat: 'YYYY-MM-DD HH:mm:ss',
+                    getPopupContainer: getAutoScrollContainer,
+                  },
+                  colProps: {
+                    span: 4,
+                  },
+                },
+                {
+                  label: '查询设备',
+                  field: 'gdeviceid',
+                  component: 'Select',
+                  defaultValue: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '',
+                  required: true,
+                  componentProps: {
+                    options: deviceOptions,
+                    onChange: (e, option) => {
+                      if (option && (option['strinstallpos'] || option['strtype'] || option['devicekind']))
+                        historyType.value = option['strtype'] || option['devicekind'];
+                      if (option['strtype']) deviceTypeStr.value = option['strtype'];
+                      stationType.value = option['stationtype'];
+                    },
+                  },
+                  colProps: {
+                    span: 4,
+                  },
+                },
+                {
+                  label: '间隔时间',
+                  field: 'skip',
+                  component: 'Select',
+                  defaultValue: 5,
+                  componentProps: {
+                    options: [
                       {
-                        field: 'ttime_begin',
-                        label: '开始时间',
-                        component: 'DatePicker',
-                        defaultValue: dayjs().startOf('date'),
-                        required: true,
-                        componentProps: {
-                          showTime: true,
-                          valueFormat: 'YYYY-MM-DD HH:mm:ss',
-                          getPopupContainer: getAutoScrollContainer,
-                        },
-                        colProps: {
-                          span: 4,
-                        },
+                        label: '5秒',
+                        value: '1',
                       },
                       {
-                        field: 'ttime_end',
-                        label: '结束时间',
-                        component: 'DatePicker',
-                        defaultValue: dayjs(),
-                        required: true,
-                        componentProps: {
-                          showTime: true,
-                          valueFormat: 'YYYY-MM-DD HH:mm:ss',
-                          getPopupContainer: getAutoScrollContainer,
-                        },
-                        colProps: {
-                          span: 4,
-                        },
+                        label: '10秒',
+                        value: '2',
                       },
-                      // {
-                      //   label: '时间区间',
-                      //   field: 'tickectDate',
-                      //   component: 'TimeRangePicker',
-                      //   defaultValue: [dayjs().startOf('date').format('HH:mm:ss'), dayjs().format('HH:mm:ss')],
-                      //   componentProps: {
-                      //     placement: 'topLeft',
-                      //     placeholder: ['开始时间', '结束时间'],
-                      //     valueFormat: 'HH:mm:ss',
-                      //   },
-                      //   colProps: {
-                      //     span: 4,
-                      //   },
-                      // },
                       {
-                        label: '查询设备',
-                        field: 'gdeviceid',
-                        component: 'Select',
-                        defaultValue: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '',
-                        required: true,
-                        componentProps: {
-                          options: deviceOptions,
-                          onChange: (e, option) => {
-                            if (option && (option['strinstallpos'] || option['strtype'] || option['devicekind']))
-                              historyType.value = option['strtype'] || option['devicekind'];
-                            if (option['strtype']) deviceTypeStr.value = option['strtype'];
-                          },
-                        },
-                        colProps: {
-                          span: 4,
-                        },
+                        label: '30秒',
+                        value: '3',
                       },
                       {
-                        label: '间隔时间',
-                        field: 'skip',
-                        component: 'Select',
-                        defaultValue: 5,
-                        componentProps: {
-                          options: [
-                            {
-                              label: '5秒',
-                              value: '1',
-                            },
-                            {
-                              label: '10秒',
-                              value: '2',
-                            },
-                            {
-                              label: '30秒',
-                              value: '3',
-                            },
-                            {
-                              label: '1分钟',
-                              value: '4',
-                            },
-                            {
-                              label: '5分钟',
-                              value: '5',
-                            },
-                            {
-                              label: '10分钟',
-                              value: '6',
-                            },
-                            {
-                              label: '30分钟',
-                              value: '7',
-                            },
-                            {
-                              label: '1小时',
-                              value: '8',
-                            },
-                          ],
-                        },
-                        colProps: {
-                          span: 4,
-                        },
+                        label: '1分钟',
+                        value: '4',
                       },
-                    ],
-              // fieldMapToTime: [['tickectDate', ['ttime_begin', 'ttime_end'], '']],
-            },
-            fetchSetting: {
-              listField: 'datalist',
-              totalField: 'datalist.total',
-            },
-            pagination: {
-              current: 1,
-              pageSize: 10,
-              pageSizeOptions: ['10', '30', '50', '100'],
-              showQuickJumper: false,
-            },
-            beforeFetch(params) {
-              params.strtype = deviceTypeStr.value
-                ? deviceTypeStr.value
-                : deviceOptions.value[0]['strtype']
-                ? deviceOptions.value[0]['strtype']
-                : props.deviceType + '*';
-              if (props.sysId) {
-                params.sysId = props.sysId;
-              }
-              return params;
-            },
-            afterFetch(result) {
-              const resultItems = result['records'];
-              resultItems.map((item) => {
-                Object.assign(item, item['readData']);
-              });
-              console.log('result---------------->', result);
-              return resultItems;
-            },
-          },
-          exportConfig: {
-            name: '历史列表',
-            url: getExportXlsUrl(),
-          },
-        }
-      : {
-          tableProps: {
-            api: list,
-            columns: props.columnsType ? columns : (props.columns as any[]),
-            canResize: true,
-            showTableSetting: false,
-            showActionColumn: false,
-            bordered: false,
-            size: 'small',
-            scroll: tableScroll,
-            showIndexColumn: true,
-            formConfig: {
-              labelAlign: 'left',
-              showAdvancedButton: false,
-              // autoAdvancedCol: 2,
-
-              baseColProps: {
-                // offset: 0.5,
-                xs: 24,
-                sm: 24,
-                md: 24,
-                lg: 9,
-                xl: 7,
-                xxl: 4,
-              },
-              schemas:
-                props.formSchemas.length > 0
-                  ? props.formSchemas
-                  : [
                       {
-                        field: 'startTime',
-                        label: '开始时间',
-                        component: 'DatePicker',
-                        defaultValue: dayjs().startOf('date'),
-                        required: true,
-                        componentProps: {
-                          showTime: true,
-                          valueFormat: 'YYYY-MM-DD HH:mm:ss',
-                          getPopupContainer: getAutoScrollContainer,
-                        },
-                        colProps: {
-                          span: 4,
-                        },
+                        label: '5分钟',
+                        value: '5',
                       },
                       {
-                        field: 'endTime',
-                        label: '结束时间',
-                        component: 'DatePicker',
-                        defaultValue: dayjs(),
-                        required: true,
-                        componentProps: {
-                          showTime: true,
-                          valueFormat: 'YYYY-MM-DD HH:mm:ss',
-                          getPopupContainer: getAutoScrollContainer,
-                        },
-                        colProps: {
-                          span: 4,
-                        },
+                        label: '10分钟',
+                        value: '6',
                       },
                       {
-                        label: '查询设备',
-                        field: 'deviceId',
-                        component: 'Select',
-                        defaultValue: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '',
-                        required: true,
-                        componentProps: {
-                          options: deviceOptions,
-                          // api: () => defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType.startsWith('vehicle') ? 'location_normal' : props.deviceType } }),
-                          // // resultField: 'result',
-                          // labelField: 'strinstallpos',
-                          // valueField: 'id',
-                          // numberToString: true,
-                          onChange: (e, option) => {
-                            if (option && (option['strinstallpos'] || option['strtype'] || option['devicekind']))
-                              historyType.value = option['strtype'] || option['devicekind'];
-                          },
-                        },
-                        colProps: {
-                          span: 4,
-                        },
-                        // componentProps: ({ formModel }) => {
-                        //   return {
-                        //     options: deviceOptions.value,
-                        //     // api: () => defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType.startsWith('vehicle') ? 'location_normal' : props.deviceType } }),
-                        //     // resultField: 'result',
-                        //     // labelField: 'strinstallpos',
-                        //     // valueField: 'id',
-                        //     // onChange: (e, option) => {
-                        //     //   if(option && (option['strtype'] || option['devicekind'])) historyType.value = option['strtype'] || option['devicekind']
-                        //     // },
-                        //   }
-                        // },
+                        label: '30分钟',
+                        value: '7',
                       },
                       {
-                        label: '间隔时间',
-                        field: 'interval',
-                        component: 'Select',
-                        defaultValue: '30s',
-                        componentProps: {
-                          options: [
-                            {
-                              label: '1秒',
-                              value: '1s',
-                            },
-                            {
-                              label: '5秒',
-                              value: '5s',
-                            },
-                            {
-                              label: '10秒',
-                              value: '10s',
-                            },
-                            {
-                              label: '30秒',
-                              value: '30s',
-                            },
-                            {
-                              label: '1分钟',
-                              value: '1m',
-                            },
-                            {
-                              label: '10分钟',
-                              value: '10m',
-                            },
-                            {
-                              label: '30分钟',
-                              value: '30m',
-                            },
-                            {
-                              label: '1小时',
-                              value: '1h',
-                            },
-                          ],
-                        },
-                        colProps: {
-                          span: 4,
-                        },
+                        label: '1小时',
+                        value: '8',
                       },
                     ],
-            },
-            pagination: {
-              current: 1,
-              pageSize: 10,
-              pageSizeOptions: ['10', '30', '50', '100'],
-              showQuickJumper: false,
-            },
-            // pagination: false,
-            fetchSetting: {
-              totalField: 'total',
-              // 每页显示多少条
-              sizeField: 'pageSize',
-              // 请求结果列表字段  支持 a.b.c
-              pageField: 'pageNo',
-            },
-            beforeFetch(params) {
-              params.strtype = props.deviceType + '*';
-              if (props.sysId) {
-                params.sysId = props.sysId;
-              }
-              if (params.interval) {
-                params.interval = params.interval;
-              } else {
-                params.interval = '1m';
-              }
-              if (props.deviceType.startsWith('vehicle')) {
-                params['isEmployee'] = false;
-              } else if (props.deviceType.startsWith('location')) {
-                params['isEmployee'] = true;
-              }
-            },
-            afterFetch(result) {
-              return result;
-            },
-          },
-          exportConfig: {
-            name: '历史列表',
-            url: getExportXlsUrl(),
-          },
-        }
-  );
+                  },
+                  colProps: {
+                    span: 4,
+                  },
+                },
+              ],
+        // fieldMapToTime: [['tickectDate', ['ttime_begin', 'ttime_end'], '']],
+      },
+      // fetchSetting: {
+      //   listField: 'datalist',
+      //   totalField: 'datalist.total',
+      // },
+      pagination: {
+        current: 1,
+        pageSize: 10,
+        pageSizeOptions: ['10', '30', '50', '100'],
+        showQuickJumper: false,
+      },
+      // beforeFetch(params) {
+      //   params.strtype = deviceTypeStr.value
+      //     ? deviceTypeStr.value
+      //     : deviceOptions.value[0]['strtype']
+      //     ? deviceOptions.value[0]['strtype']
+      //     : props.deviceType + '*';
+      //   if (props.sysId) {
+      //     params.sysId = props.sysId;
+      //   }
+      //   return params;
+      // },
+      // afterFetch(result) {
+      //   const resultItems = result['records'];
+      //   resultItems.map((item) => {
+      //     Object.assign(item, item['readData']);
+      //   });
+      //   console.log('result---------------->', result);
+      //   return resultItems;
+      // },
+    },
+    exportConfig: {
+      name: '历史列表',
+      url: getExportXlsUrl(),
+    },
+  });
 
   //注册table数据
-  const [registerTable, { getDataSource, reload, setLoading, getForm, setColumns }] = tableContext;
+  const [registerTable, { reload, setLoading, getForm, setColumns, getPaginationRef }] = tableContext;
 
   watchEffect(() => {
-    if (historyTable.value && getDataSource) {
-      const data = getDataSource() || [];
+    if (historyTable.value && dataSource) {
+      const data = dataSource.value || [];
       emit('change', data);
       console.log('[ data ] >', data);
     }
   });
+
   onMounted(async () => {
     await getDeviceList();
-    debugger;
     if (deviceOptions.value[0]) {
+      stationType.value = deviceOptions.value[0]['stationtype'];
       historyType.value = deviceOptions.value[0]['strtype'] || deviceOptions.value[0]['devicekind'];
+      getDataSource();
     }
   });
   defineExpose({ setLoading });

+ 10 - 3
src/views/vent/monitorManager/compressor/components/nitrogenHome_bet.vue

@@ -171,9 +171,8 @@
               <div>设备实时监测曲线</div>
             </template>
             <template #container>
-              <BarAndLine v-if="chartsColumns.length > 0" xAxisPropType="readTime" :dataSource="echartData" height="340px"
+              <BarAndLine v-if="chartsColumns.length > 0" xAxisPropType="readTime" :dataSource="echartData" height="300px"
                 :chartsColumns="chartsColumns" chartsType="listMonitor" :option="echatsOption" />
-              <!-- :option="zhudanOption" -->
             </template>
           </ventBox1>
         </div>
@@ -185,7 +184,7 @@
     @handle-cancel="handleCancel" />
 </template>
 <script lang="ts" setup name="nitrogenHome">
-import { onMounted, onUnmounted, ref, watch, reactive, defineProps, nextTick, inject, computed } from 'vue';
+import { onMounted, onUnmounted, ref, watch, reactive, defineProps, nextTick, inject, onBeforeUnmount } from 'vue';
 import ventBox1 from '/@/components/vent/ventBox1.vue';
 import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
 import { mountedThree, destroy, setModelType, addText } from '../nitrogen.threejs';
@@ -424,6 +423,14 @@ watch([monitorDataGroupNum, loading], ([newMonitorDataGroupNum, newLoading]) =>
   });
 });
 
+watch(() => props.deviceId, async(deviceId) => {
+  if(deviceId){
+    await getCamera(deviceId, playerRef.value);
+  }
+})
+onBeforeUnmount(() => {
+  removeCamera();
+});
 
 onMounted(async () => {
   await getMonitor(true);

+ 2 - 2
src/views/vent/monitorManager/deviceMonitor/components/network/index.vue

@@ -45,8 +45,8 @@
                     <div v-if="data.code !== 'level' && data.code !== 'resistance'" class="item-value">{{ pageData[data.code] }}
                     </div>
                     <div v-if="data.code == 'level'" class="item-value">
-                      <!-- <span class="signal-round signal-round-run" :class="{'signal-round-run': Number(pageData.dTotalArea) <= 2, 'signal-round-red': Number(pageData.dTotalArea) > 2 }"></span> -->
-                      <span class="signal-round signal-round-run"></span>
+                      <!-- <span class="signal-round signal-round-run" :class="{'signal-round-run': Number(pageData.dTotalArea) > 2, 'signal-round-red': Number(pageData.dTotalArea) <= 2 }"></span> -->
+                      <span class="">{{ Number(pageData.dTotalArea) > 2 ? '容易':'难' }}</span>
                     </div>
                     <div v-if="data.code == 'resistance'" class="item-value">{{ totalPa }}</div>
                   </div>

+ 4 - 1
src/views/vent/monitorManager/deviceMonitor/components/network/network.data.ts

@@ -52,7 +52,7 @@ export const sensorColumns: BasicColumn[] = [
     align: 'center',
   },
   {
-    title: '风量(m³)',
+    title: '风量(m³/min)',
     dataIndex: 'm3',
     width: 100,
     align: 'center',
@@ -112,6 +112,9 @@ export const networkColumns: BasicColumn[] = [
     dataIndex: 'fRealQ',
     width: 120,
     align: 'center',
+    customRender: function ({ text }) {
+      return (text * 60).toFixed(2);
+    },
   },
   {
     title: '实时风速(m/s)',

+ 0 - 5
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -464,11 +464,6 @@
         permission: 'btn:ctrlFan2ToFan1',
       },
       {
-        key: 'changeSmoke',
-        value: '一键倒机',
-        permission: 'btn:change',
-      },
-      {
         key: 'Fan1Frequency',
         value: '主机调频',
         permission: 'btn:frequency',

+ 20 - 32
src/views/vent/monitorManager/gasPumpMonitor/components/gasPumpHome.vue

@@ -1,22 +1,18 @@
 <template>
-  <div id="FlowSensor" class="FlowSensor-box" style="position: absolute">
-    <div class="elementContent" v-if="deviceType == 'pump_under'">
-      <fourBorderBg>
-        <template v-for="(item, index) in modelMonitor" :key="index">
-          <!-- <div v-if="selectData[item.code] != undefined" class="gas-monitor-row">
-          <div class="title">{{ item.title }}</div>
-          <div class="value">{{ selectData[item.code] ? selectData[item.code] : '-' }}</div>
-        </div> -->
-          <div class="gas-monitor-row">
-            <div class="title">{{ item.title }}</div>
-            <div class="value">{{ selectData[item.code] ? selectData[item.code] : '-' }}</div>
-          </div>
-        </template>
-      </fourBorderBg>
-      <!-- <p style="color: #50c8fc;"><span class="data-title">抽采泵流量(m³):</span>{{ formatNum(selectData.FlowSensor_InputFlux) }}</p> -->
-    </div>
-  </div>
   <div class="monitor-container">
+    <div id="FlowSensor" class="FlowSensor-box" style="position: absolute; display: none">
+      <div class="elementContent" v-if="deviceType == 'pump_under'">
+        <fourBorderBg>
+          <template v-for="(item, index) in modelMonitor" :key="index">
+            <div class="gas-monitor-row">
+              <div class="title">{{ item.title }}</div>
+              <div class="value">{{ selectData[item.code] ? selectData[item.code] : '-' }}</div>
+            </div>
+          </template>
+        </fourBorderBg>
+        <!-- <p style="color: #50c8fc;"><span class="data-title">抽采泵流量(m³):</span>{{ formatNum(selectData.FlowSensor_InputFlux) }}</p> -->
+      </div>
+    </div>
     <div v-if="selectData['netStatus'] == 0" class="device-state">网络断开</div>
     <div class="lr left-box">
       <div class="left-container">
@@ -211,21 +207,10 @@
 </template>
 
 <script setup lang="ts">
-  import { onBeforeMount, ref, onMounted, onUnmounted, reactive, defineProps, watch, inject, nextTick } from 'vue';
+  import { ref, onMounted, onUnmounted, reactive, defineProps, watch, inject, nextTick, onBeforeUnmount } from 'vue';
   import ventBox1 from '/@/components/vent/ventBox1.vue';
   import { setModelType } from '../gasPump.threejs';
-  import {
-    stateHeader,
-    valveState,
-    pumpMonitorData,
-    waterPumpData,
-    dewateringPumpData,
-    modelMonitor,
-    valveCtrlType,
-    valveCtrl,
-    PumpCtrlItems,
-    pumpCtrl,
-  } from '../gasPump.data';
+  import { stateHeader, valveState, pumpMonitorData, waterPumpData, dewateringPumpData, modelMonitor, valveCtrlType } from '../gasPump.data';
   import { list } from '../gasPump.api';
   import { SvgIcon } from '/@/components/Icon';
   import { formatNum } from '/@/utils/ventutil';
@@ -400,14 +385,16 @@
     }
   );
 
-  onBeforeMount(() => {});
-
   onMounted(async () => {
     timer = null;
     await getMonitor(true);
     if (selectData && selectData['deviceID']) await getCamera(selectData['deviceID'], playerRef.value);
   });
 
+  onBeforeUnmount(() => {
+    removeCamera();
+  });
+
   onUnmounted(() => {
     removeCamera();
     if (timer) {
@@ -518,6 +505,7 @@
     z-index: 9999;
     display: flex;
     align-items: end;
+    bottom: 80px;
     :deep(#LivePlayerBox) {
       display: flex;
       justify-content: end;

+ 102 - 102
src/views/vent/monitorManager/gateMonitor/gate.threejs.qd.ts

@@ -165,7 +165,6 @@ class Fm3 {
         y: 325,
       },
     ];
-
     //
     getTextCanvas(526, 346, textArr, '').then((canvas: HTMLCanvasElement) => {
       const textMap = new THREE.CanvasTexture(canvas); // 关键一步
@@ -329,108 +328,109 @@ class Fm3 {
   // 播放动画
   play(handlerState, timeScale = 0.01) {
     let handler = () => {};
-    switch (handlerState) {
-      case 1: // 打开前门
-        handler = () => {
-          this.clipActionArr.frontDoor.paused = true;
-          this.clipActionArr.frontDoor.reset();
-          this.clipActionArr.frontDoor.time = 1.2;
-          this.clipActionArr.frontDoor.timeScale = timeScale;
-          // this.clipActionArr.frontDoor.clampWhenFinished = true;
-          this.clipActionArr.frontDoor.play();
-          this.fmClock.start();
-
-          // 显示打开前门文字
-          if (this.frontDamperOpenMesh) this.frontDamperOpenMesh.visible = true;
-          if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = false;
-        };
-        break;
-      case 2: // 关闭前门
-        handler = () => {
-          this.clipActionArr.frontDoor.paused = true;
-          this.clipActionArr.frontDoor.reset(); //
-          this.clipActionArr.frontDoor.time = 4;
-          this.clipActionArr.frontDoor.timeScale = -timeScale;
-          // this.clipActionArr.frontDoor.clampWhenFinished = true;
-          this.clipActionArr.frontDoor.play();
-          this.fmClock.start();
-
-          if (this.frontDamperOpenMesh) this.frontDamperOpenMesh.visible = false;
-          if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = true;
-        };
-        break;
-      case 3: // 打开后门
-        handler = () => {
-          this.clipActionArr.backDoor.paused = true;
-          this.clipActionArr.backDoor.reset();
-          this.clipActionArr.backDoor.time = 1.2;
-          this.clipActionArr.backDoor.timeScale = timeScale;
-          // this.clipActionArr.backDoor.clampWhenFinished = true;
-          this.clipActionArr.backDoor.play();
-          this.fmClock.start();
-
-          if (this.backDamperOpenMesh) this.backDamperOpenMesh.visible = true;
-          if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = false;
-        };
-        break;
-      case 4: // 关闭后门
-        handler = () => {
-          this.clipActionArr.backDoor.paused = true;
-          this.clipActionArr.backDoor.reset();
-          this.clipActionArr.backDoor.time = 4;
-          this.clipActionArr.backDoor.timeScale = -timeScale;
-          // this.clipActionArr.backDoor.clampWhenFinished = true;
-          this.clipActionArr.backDoor.play();
-          this.fmClock.start();
-
-          if (this.backDamperOpenMesh) this.backDamperOpenMesh.visible = false;
-          if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = true;
-        };
-        break;
-      // case 5: // 打开前后门
-      //   handler = () => {
-      //     this.clipActionArr.backDoor.paused = true;
-      //     this.clipActionArr.frontDoor.paused = true;
-
-      //     this.clipActionArr.frontDoor.reset();
-      //     this.clipActionArr.frontDoor.time = 0;
-      //     this.clipActionArr.frontDoor.timeScale = 0.01;
-      //     this.clipActionArr.frontDoor.clampWhenFinished = true;
-      //     this.clipActionArr.frontDoor.play();
-
-      //     this.clipActionArr.backDoor.reset();
-      //     this.clipActionArr.backDoor.time = 0;
-      //     this.clipActionArr.backDoor.timeScale = 0.01;
-      //     this.clipActionArr.backDoor.clampWhenFinished = true;
-      //     this.clipActionArr.backDoor.play();
-      //     this.frontClock.start();
-      //     this.backClock.start();
-      //   };
-      //   break;
-      // case 6: // 关闭前后门
-      //   handler = () => {
-      //     debugger;
-      //     this.clipActionArr.backDoor.paused = true;
-      //     this.clipActionArr.frontDoor.paused = true;
-
-      //     this.clipActionArr.frontDoor.reset();
-      //     this.clipActionArr.frontDoor.time = 4;
-      //     this.clipActionArr.frontDoor.timeScale = -0.01;
-      //     this.clipActionArr.frontDoor.clampWhenFinished = true;
-      //     this.clipActionArr.frontDoor.play();
-      //     this.clipActionArr.backDoor.reset();
-      //     this.clipActionArr.backDoor.time = 4;
-      //     this.clipActionArr.backDoor.timeScale = -0.01;
-      //     this.clipActionArr.backDoor.clampWhenFinished = true;
-      //     this.clipActionArr.backDoor.play();
-      //     this.frontClock.start();
-      //     this.backClock.start();
-      //   };
-      //   break;
-      default:
+    if (this.clipActionArr.frontDoor && this.clipActionArr.backDoor) {
+      switch (handlerState) {
+        case 1: // 打开前门
+          handler = () => {
+            this.clipActionArr.frontDoor.paused = true;
+            this.clipActionArr.frontDoor.reset();
+            this.clipActionArr.frontDoor.time = 1.2;
+            this.clipActionArr.frontDoor.timeScale = timeScale;
+            // this.clipActionArr.frontDoor.clampWhenFinished = true;
+            this.clipActionArr.frontDoor.play();
+            this.fmClock.start();
+
+            // 显示打开前门文字
+            if (this.frontDamperOpenMesh) this.frontDamperOpenMesh.visible = true;
+            if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = false;
+          };
+          break;
+        case 2: // 关闭前门
+          handler = () => {
+            this.clipActionArr.frontDoor.paused = true;
+            this.clipActionArr.frontDoor.reset(); //
+            this.clipActionArr.frontDoor.time = 4;
+            this.clipActionArr.frontDoor.timeScale = -timeScale;
+            // this.clipActionArr.frontDoor.clampWhenFinished = true;
+            this.clipActionArr.frontDoor.play();
+            this.fmClock.start();
+
+            if (this.frontDamperOpenMesh) this.frontDamperOpenMesh.visible = false;
+            if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = true;
+          };
+          break;
+        case 3: // 打开后门
+          handler = () => {
+            this.clipActionArr.backDoor.paused = true;
+            this.clipActionArr.backDoor.reset();
+            this.clipActionArr.backDoor.time = 1.2;
+            this.clipActionArr.backDoor.timeScale = timeScale;
+            // this.clipActionArr.backDoor.clampWhenFinished = true;
+            this.clipActionArr.backDoor.play();
+            this.fmClock.start();
+
+            if (this.backDamperOpenMesh) this.backDamperOpenMesh.visible = true;
+            if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = false;
+          };
+          break;
+        case 4: // 关闭后门
+          handler = () => {
+            this.clipActionArr.backDoor.paused = true;
+            this.clipActionArr.backDoor.reset();
+            this.clipActionArr.backDoor.time = 4;
+            this.clipActionArr.backDoor.timeScale = -timeScale;
+            // this.clipActionArr.backDoor.clampWhenFinished = true;
+            this.clipActionArr.backDoor.play();
+            this.fmClock.start();
+
+            if (this.backDamperOpenMesh) this.backDamperOpenMesh.visible = false;
+            if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = true;
+          };
+          break;
+        // case 5: // 打开前后门
+        //   handler = () => {
+        //     this.clipActionArr.backDoor.paused = true;
+        //     this.clipActionArr.frontDoor.paused = true;
+
+        //     this.clipActionArr.frontDoor.reset();
+        //     this.clipActionArr.frontDoor.time = 0;
+        //     this.clipActionArr.frontDoor.timeScale = 0.01;
+        //     this.clipActionArr.frontDoor.clampWhenFinished = true;
+        //     this.clipActionArr.frontDoor.play();
+
+        //     this.clipActionArr.backDoor.reset();
+        //     this.clipActionArr.backDoor.time = 0;
+        //     this.clipActionArr.backDoor.timeScale = 0.01;
+        //     this.clipActionArr.backDoor.clampWhenFinished = true;
+        //     this.clipActionArr.backDoor.play();
+        //     this.frontClock.start();
+        //     this.backClock.start();
+        //   };
+        //   break;
+        // case 6: // 关闭前后门
+        //   handler = () => {
+        //     debugger;
+        //     this.clipActionArr.backDoor.paused = true;
+        //     this.clipActionArr.frontDoor.paused = true;
+
+        //     this.clipActionArr.frontDoor.reset();
+        //     this.clipActionArr.frontDoor.time = 4;
+        //     this.clipActionArr.frontDoor.timeScale = -0.01;
+        //     this.clipActionArr.frontDoor.clampWhenFinished = true;
+        //     this.clipActionArr.frontDoor.play();
+        //     this.clipActionArr.backDoor.reset();
+        //     this.clipActionArr.backDoor.time = 4;
+        //     this.clipActionArr.backDoor.timeScale = -0.01;
+        //     this.clipActionArr.backDoor.clampWhenFinished = true;
+        //     this.clipActionArr.backDoor.play();
+        //     this.frontClock.start();
+        //     this.backClock.start();
+        //   };
+        //   break;
+        default:
+      }
+      handler();
     }
-
-    handler();
     // model.clock.start();
     // const honglvdeng = group.getObjectByName('honglvdeng');
     // const material = honglvdeng.material;

+ 0 - 1
src/views/vent/monitorManager/gateMonitor/index.vue

@@ -200,7 +200,6 @@
   import { deviceControlApi } from '/@/api/vent/index';
   import { message } from 'ant-design-vue';
   import { list, getTableList, cameraList, cameraAddrList } from './gate.api';
-  import { chartsColumns, echartsOption, echartsOption1 } from './gate.data';
   import lodash from 'lodash';
   import { setDivHeight } from '/@/utils/event';
   import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';

+ 4 - 2
src/views/vent/monitorManager/nitrogen/components/nitrogenHome.vue

@@ -140,7 +140,7 @@
   </div>
 </template>
 <script lang="ts" setup name="nitrogenHome">
-  import { onMounted, onUnmounted, ref } from 'vue';
+  import { onMounted, onUnmounted, ref, onBeforeUnmount } from 'vue';
   import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
   import { mountedThree, destroy, setModelType } from '../nitrogen.threejs';
   import { list } from '../nitrogen.api';
@@ -209,7 +209,9 @@
       });
     }, 0);
   });
-
+  onBeforeUnmount(() => {
+    removeCamera();
+  });
   onUnmounted(() => {
     destroy();
     removeCamera();

+ 5 - 1
src/views/vent/monitorManager/nitrogen/components/nitrogenHomeBLT.vue

@@ -175,7 +175,7 @@
   </div>
 </template>
 <script lang="ts" setup name="nitrogenHome">
-  import { onMounted, onUnmounted, ref } from 'vue';
+  import { onMounted, onUnmounted, ref, onBeforeUnmount } from 'vue';
   import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
   import { mountedThree, destroy, setModelType } from '../nitrogen.threejs';
   import { list } from '../nitrogen.api';
@@ -290,6 +290,10 @@
     });
   });
 
+  onBeforeUnmount(() => {
+    removeCamera();
+  });
+
   onUnmounted(() => {
     destroy();
     removeCamera();

+ 1 - 1
src/views/vent/monitorManager/windrectMonitor/duishe.threejs.ts

@@ -394,7 +394,7 @@ class dsWindRect {
   }
 
   destroy() {
-    this.lineLight.kill();
+    if (this.lineLight && this.lineLight.kill) this.lineLight.kill();
     if (this.group) {
       this.model.clearGroup(this.group);
     }

+ 4 - 3
src/views/vent/monitorManager/windrectMonitor/duisheFixed.threejs.ts

@@ -73,7 +73,7 @@ class fixedWindRect {
         font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 311,
+        x: 361,
         y: 140,
       },
       {
@@ -89,7 +89,7 @@ class fixedWindRect {
         font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 310,
+        x: 360,
         y: 202,
       },
       {
@@ -105,7 +105,7 @@ class fixedWindRect {
         font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 310,
+        x: 360,
         y: 272,
       },
       {
@@ -139,6 +139,7 @@ class fixedWindRect {
       }
     });
   }
+
   initAnimation() {
     const line = this.group?.getObjectByName('line_');
 

+ 5 - 2
src/views/vent/monitorManager/windrectMonitor/index.vue

@@ -606,10 +606,13 @@
       if (selectRow.deviceType.startsWith('windrect_ds_four')) {
         type = 'dsWindRect_four';
       }
-      if (selectRow.deviceType.startsWith('windrect_ds_two') || selectRow.deviceType.startsWith('windrect_ds_sut')) {
+      if (
+        selectRow.deviceType.startsWith('windrect_ds_two') ||
+        selectRow.deviceType.startsWith('windrect_ds_sut') ||
+        selectRow.deviceType.startsWith('windrect_muti')
+      ) {
         type = 'duisheFixed';
       }
-
       if (selectRow.deviceType.startsWith('windrect_dd') || selectRow.deviceType == 'windrect_safety' || selectRow.deviceType == 'windrect_sensor') {
         type = 'ddWindSide';
       }

+ 8 - 1
src/views/vent/monitorManager/workFaceMonitor/workFace.data.ts

@@ -762,4 +762,11 @@ function getBezierLine() {
   return curveObject;
 }
 
-function getShape() {}
+function getShape() {
+  const A = { x: 0.417, y: -0.24 };
+  const B = { x: 0.702, y: -0.24 };
+  const C = { x: 0.417, y: 0.018 };
+
+  const A1 = { x: 0.948, y: -0.24 };
+  const B1 = { x: 0.678, y: 0.467 };
+}