ソースを参照

Merge branch 'master' of http://182.92.126.35:3000/hrx/mky-vent-base

lxh 1 年間 前
コミット
a2ba50b8d7
100 ファイル変更2710 行追加1637 行削除
  1. 0 0
      @/design/vent/modal.less
  2. 2 2
      public/js/config.js
  3. 0 1
      public/js/webrtcstreamer.js
  4. BIN
      public/model/glft/fire/balancePress_2024-03-14.glb
  5. BIN
      public/model/glft/jbfj/jbfj-hd_2024-03-14.glb
  6. BIN
      src/assets/images/home-container/warn-icon.png
  7. BIN
      src/assets/images/home-container/warn-icon1.png
  8. BIN
      src/assets/images/home-container/warn-icon2.png
  9. BIN
      src/assets/images/home-container/warn-icon3.png
  10. BIN
      src/assets/images/home-container/warning/warn-icon.png
  11. BIN
      src/assets/images/home-container/warning/warn-icon1.png
  12. BIN
      src/assets/images/home-container/warning/warn-icon2.png
  13. BIN
      src/assets/images/home-container/warning/warn-icon3.png
  14. 0 0
      src/assets/images/home-container/warning/warn1.png
  15. 0 0
      src/assets/images/home-container/warning/warn7.png
  16. 0 0
      src/assets/images/home-container/warning/warn8.png
  17. 3 3
      src/components/Form/src/components/FormItem.vue
  18. 6 6
      src/components/Form/src/jeecg/components/modal/PositionSelectModal.vue
  19. 142 147
      src/components/Form/src/jeecg/components/roleSelect/RoleSelectModal.vue
  20. 29 15
      src/components/Icon/src/IconPicker.vue
  21. 60 44
      src/components/jeecg/comment/MyComment.vue
  22. 0 0
      src/components/vent/customHeader.vue
  23. 0 1
      src/hooks/system/useListPage.ts
  24. 70 0
      src/hooks/vent/useSystemSelect.ts
  25. 53 53
      src/layouts/default/header/components/user-dropdown/UpdateHome.vue
  26. 0 1
      src/router/guard/index.ts
  27. 1 0
      src/router/guard/permissionGuard.ts
  28. 3 0
      src/utils/event/index.ts
  29. 2 2
      src/utils/threejs/main.worker.ts
  30. 1 0
      src/utils/threejs/util.ts
  31. 1 1
      src/views/dashboard/Analysis/index.vue
  32. 1 1
      src/views/monitor/datalog/DataLogModal.vue
  33. 61 57
      src/views/vent/comment/EditRowTable.vue
  34. 753 0
      src/views/vent/comment/less/systemMonitor.less
  35. 2 2
      src/views/vent/deviceManager/comment/FormModal.vue
  36. 45 49
      src/views/vent/deviceManager/comment/warningTabel/BaseModal1.vue
  37. 3 4
      src/views/vent/deviceManager/equipManager/component/FormModal.vue
  38. 2 1
      src/views/vent/deviceManager/fanTabel/fan.api.ts
  39. 0 0
      src/views/vent/gas/gasHome/gasHome.api.ts
  40. 18 0
      src/views/vent/gas/gasHome/gasHome.data.ts
  41. 40 0
      src/views/vent/gas/gasHome/index.vue
  42. 47 0
      src/views/vent/gas/gasPumpMonitor/components/monitor.vue
  43. 0 0
      src/views/vent/gas/gasPumpMonitor/gasPumpMonitor.api.ts
  44. 18 0
      src/views/vent/gas/gasPumpMonitor/gasPumpMonitor.data.ts
  45. 64 0
      src/views/vent/gas/gasPumpMonitor/index.vue
  46. 43 36
      src/views/vent/home/clique/components/dialog-modal.vue
  47. 0 1
      src/views/vent/home/colliery/components/device-warn.vue
  48. 4 5
      src/views/vent/home/colliery/components/fan-monitor.vue
  49. 11 3
      src/views/vent/home/colliery/components/main-monitor.vue
  50. 1 1
      src/views/vent/monitorManager/alarmMonitor/index.vue
  51. 2 3
      src/views/vent/monitorManager/balancePressMonitor/balancePress.threejs.base.ts
  52. 0 9
      src/views/vent/monitorManager/balancePressMonitor/components/balancePressHome.vue
  53. 1 1
      src/views/vent/monitorManager/balancePressMonitor/index.vue
  54. 1 1
      src/views/vent/monitorManager/beltTunMonitor/beltTun.data.ts
  55. 0 1
      src/views/vent/monitorManager/beltTunMonitor/beltTun.threejs.base.ts
  56. 1 1
      src/views/vent/monitorManager/beltTunMonitor/index.vue
  57. 1 1
      src/views/vent/monitorManager/chamberMonitor/index.vue
  58. 35 10
      src/views/vent/monitorManager/comment/AlarmHistoryTable.vue
  59. 26 5
      src/views/vent/monitorManager/comment/HandlerHistoryTable.vue
  60. 427 410
      src/views/vent/monitorManager/comment/HistoryTable.vue
  61. 3 3
      src/views/vent/monitorManager/comment/MonitorTable.vue
  62. 0 97
      src/views/vent/monitorManager/comment/MonitorTable1.vue
  63. 30 19
      src/views/vent/monitorManager/comment/WorkFaceAlarmHistoryTable.vue
  64. 43 31
      src/views/vent/monitorManager/comment/WorkFaceHandlerHistoryTable.vue
  65. 1 1
      src/views/vent/monitorManager/comment/components/reportInfo.vue
  66. 1 1
      src/views/vent/monitorManager/compreMonitor/index.vue
  67. 25 17
      src/views/vent/monitorManager/compressor/components/nitrogenHome_bet.vue
  68. 0 1
      src/views/vent/monitorManager/compressor/components/nitrogenHome_dltj.vue
  69. 1 1
      src/views/vent/monitorManager/compressor/index.vue
  70. 0 159
      src/views/vent/monitorManager/compressor/nitrogen.data.new.ts
  71. 7 2
      src/views/vent/monitorManager/compressor/nitrogen.data.ts
  72. 64 0
      src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts
  73. 40 4
      src/views/vent/monitorManager/deviceMonitor/components/device/index.vue
  74. 2 1
      src/views/vent/monitorManager/deviceMonitor/components/network/index.vue
  75. 114 108
      src/views/vent/monitorManager/fanLocalMonitor/components/DetailModal.vue
  76. 7 61
      src/views/vent/monitorManager/fanLocalMonitor/fanLocal.three.ts
  77. 23 18
      src/views/vent/monitorManager/fanLocalMonitor/index.vue
  78. 1 1
      src/views/vent/monitorManager/fiberMonitor/fiber.data.ts
  79. 97 82
      src/views/vent/monitorManager/gasPumpMonitor/components/DetailModal.vue
  80. 49 25
      src/views/vent/monitorManager/gasPumpMonitor/components/gasPumpHome.vue
  81. 0 3
      src/views/vent/monitorManager/gasPumpMonitor/gasPump.data.ts
  82. 0 1
      src/views/vent/monitorManager/gasPumpMonitor/gasPump.threejs.under.ts
  83. 1 1
      src/views/vent/monitorManager/gasPumpMonitor/index.vue
  84. 0 1
      src/views/vent/monitorManager/gateMonitor/gate.threejs.qd.ts
  85. 0 1
      src/views/vent/monitorManager/gateMonitor/gate.threejs.two.ss.ts
  86. 0 1
      src/views/vent/monitorManager/gateMonitor/gate.threejs.xr.ts
  87. 0 1
      src/views/vent/monitorManager/gateMonitor/gate.threejs.yy.ts
  88. 51 35
      src/views/vent/monitorManager/gateMonitor/index.vue
  89. 1 1
      src/views/vent/monitorManager/groutMonitor/index.vue
  90. 6 1
      src/views/vent/monitorManager/mainFanMonitor/index.vue
  91. 4 4
      src/views/vent/monitorManager/nitrogen/components/nitrogenHome.vue
  92. 4 8
      src/views/vent/monitorManager/nitrogen/index.vue
  93. 44 8
      src/views/vent/monitorManager/nitrogen/nitrogen.data.1.ts
  94. 0 38
      src/views/vent/monitorManager/nitrogen/nitrogen.data.ts
  95. 91 0
      src/views/vent/monitorManager/nitrogen/nitrogen.dataHsw.ts
  96. 14 2
      src/views/vent/monitorManager/nitrogen/nitrogen.dishang.threejs.ts
  97. 4 4
      src/views/vent/monitorManager/nitrogen/nitrogen.threejs.ts
  98. 1 1
      src/views/vent/monitorManager/obfurageMonitor/index.vue
  99. 0 9
      src/views/vent/monitorManager/safetyMonitor/safety.data.ts
  100. 1 7
      src/views/vent/monitorManager/sensorMonitor/index.vue

+ 0 - 0
@/design/vent/modal.less


+ 2 - 2
public/js/config.js

@@ -9,7 +9,7 @@ const History_Type = {
 }
 
 const VENT_PARAM = {
-  simulatedPassword: '123456', //(simulatedPassword 为空时有密码输入框弹出,不为空时不弹出密码输入框,无需输入密码)
-  // simulatedPassword: '',
+  // simulatedPassword: '123456', //(simulatedPassword 为空时有密码输入框弹出,不为空时不弹出密码输入框,无需输入密码)
+  simulatedPassword: '',
   showReport: true
 }

+ 0 - 1
public/js/webrtcstreamer.js

@@ -47,7 +47,6 @@ WebRtcStreamer.prototype.connect =async function(videourl, audiourl, options, lo
 				.then((response) => { return response.json() })
 				.then((response) => this.onReceiveGetIceServers(response, videourl, audiourl, options, localstream))
 				.catch((error) => {
-					debugger
 					// new Error('WebRtcStreamer connect error')
 					return this.onError("getIceServers " + error)
 				})

BIN
public/model/glft/fire/balancePress_2024-02-23.glb → public/model/glft/fire/balancePress_2024-03-14.glb


BIN
public/model/glft/jbfj/jbfj-hd_2024-03-10.glb → public/model/glft/jbfj/jbfj-hd_2024-03-14.glb


BIN
src/assets/images/home-container/warn-icon.png


BIN
src/assets/images/home-container/warn-icon1.png


BIN
src/assets/images/home-container/warn-icon2.png


BIN
src/assets/images/home-container/warn-icon3.png


BIN
src/assets/images/home-container/warning/warn-icon.png


BIN
src/assets/images/home-container/warning/warn-icon1.png


BIN
src/assets/images/home-container/warning/warn-icon2.png


BIN
src/assets/images/home-container/warning/warn-icon3.png


+ 0 - 0
src/assets/images/home-container/warn1.png → src/assets/images/home-container/warning/warn1.png


+ 0 - 0
src/assets/images/home-container/warn7.png → src/assets/images/home-container/warning/warn7.png


+ 0 - 0
src/assets/images/home-container/warn8.png → src/assets/images/home-container/warning/warn8.png


+ 3 - 3
src/components/Form/src/components/FormItem.vue

@@ -85,7 +85,7 @@
         }
         if (schema.component === 'Divider') {
           //update-begin---author:wangshuai---date:2023-09-22---for:【QQYUN-6603】分割线标题位置显示不正确---
-          componentProps = Object.assign({ type: 'horizontal',orientation:'left', plain: true, }, componentProps);
+          componentProps = Object.assign({ type: 'horizontal', orientation: 'left', plain: true }, componentProps);
           //update-end---author:wangshuai---date:2023-09-22---for:【QQYUN-6603】分割线标题位置显示不正确---
         }
         return componentProps as Recordable;
@@ -367,14 +367,14 @@
         }
 
         const { baseColProps = {} } = props.formProps;
-        // update-begin--author:liaozhiyang---date:20230803---for:【issues-641】调整表格搜索表单的span配置无效 
+        // update-begin--author:liaozhiyang---date:20230803---for:【issues-641】调整表格搜索表单的span配置无效
         const { getIsMobile } = useAppInject();
         let realColProps;
         if (colProps['span'] && !unref(getIsMobile)) {
           ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].forEach((name) => delete baseColProps[name]);
         }
         realColProps = { ...baseColProps, ...colProps };
-        // update-end--author:liaozhiyang---date:20230803---for:【issues-641】调整表格搜索表单的span配置无效 
+        // update-end--author:liaozhiyang---date:20230803---for:【issues-641】调整表格搜索表单的span配置无效
         const { isIfShow, isShow } = getShow();
         const values = unref(getValues);
 

+ 6 - 6
src/components/Form/src/jeecg/components/modal/PositionSelectModal.vue

@@ -102,12 +102,12 @@
         },
         //update-begin-author:liusq date:2023-10-30 for: [issues/5514]组件页面显示错位
         actionColOptions: {
-            xs: 24,
-            sm: 8,
-            md: 8,
-            lg: 8,
-            xl: 8,
-            xxl: 8,
+          xs: 24,
+          sm: 8,
+          md: 8,
+          lg: 8,
+          xl: 8,
+          xxl: 8,
         },
         //update-end-author:liusq date:2023-10-30 for: [issues/5514]组件页面显示错位
         schemas: [

+ 142 - 147
src/components/Form/src/jeecg/components/roleSelect/RoleSelectModal.vue

@@ -1,44 +1,42 @@
 <template>
-    <BasicModal
-        @register="register"
-        :getContainer="getContainer"
-        :canFullscreen="false"
-        :title="title"
-        :width="500"
-        destroyOnClose
-        @ok="handleOk"
-        wrapClassName="j-user-select-modal2" >
+  <BasicModal
+    @register="register"
+    :getContainer="getContainer"
+    :canFullscreen="false"
+    :title="title"
+    :width="500"
+    destroyOnClose
+    @ok="handleOk"
+    wrapClassName="j-user-select-modal2"
+  >
+    <div style="position: relative; min-height: 350px">
+      <div style="width: 100%">
+        <a-input v-model:value="searchText" allowClear style="width: 100%" placeholder="搜索">
+          <template #prefix>
+            <SearchOutlined style="color: #c0c0c0" />
+          </template>
+        </a-input>
+      </div>
 
-        <div style="position: relative; min-height: 350px">
-            <div style="width: 100%">
-                <a-input v-model:value="searchText" allowClear style="width: 100%" placeholder="搜索">
-                    <template #prefix>
-                        <SearchOutlined style="color: #c0c0c0" />
-                    </template>
-                </a-input>
-            </div>
-
-            <!-- tabs -->
-            <div class="modal-select-list-container">
-                <div class="scroll">
-                    <div class="content" style="right: -10px">
-                        
-                        <label class="item" v-for="item in showDataList" @click="(e)=>onSelect(e, item)">
-                            <a-checkbox v-model:checked="item.checked">
-                                <span class="text">{{ item.name }}</span>
-                            </a-checkbox>
-                        </label>
-                    </div>
-                    
-                </div>
-            </div>
-
-            <!-- 选中用户 -->
-            <div class="selected-users" style="width: 100%; overflow-x: hidden">
-                <SelectedUserItem v-for="item in selectedList" :info="item" @unSelect="unSelect" />
-            </div>
+      <!-- tabs -->
+      <div class="modal-select-list-container">
+        <div class="scroll">
+          <div class="content" style="right: -10px">
+            <label class="item" v-for="item in showDataList" @click="(e) => onSelect(e, item)">
+              <a-checkbox v-model:checked="item.checked">
+                <span class="text">{{ item.name }}</span>
+              </a-checkbox>
+            </label>
+          </div>
         </div>
-    </BasicModal>
+      </div>
+
+      <!-- 选中用户 -->
+      <div class="selected-users" style="width: 100%; overflow-x: hidden">
+        <SelectedUserItem v-for="item in selectedList" :info="item" @unSelect="unSelect" />
+      </div>
+    </div>
+  </BasicModal>
 </template>
 
 <script lang="ts">
@@ -65,7 +63,7 @@
         type: Function,
         default: null,
       },
-      title:{
+      title: {
         type: String,
         default: '',
       },
@@ -76,11 +74,10 @@
       appId: {
         type: String,
         default: '',
-      }
+      },
     },
     emits: ['selected', 'register'],
     setup(props, { emit }) {
-
       const searchText = ref('');
       const selectedIdList = computed(() => {
         let arr = selectedList.value;
@@ -91,23 +88,26 @@
         }
       });
 
-      watch(()=>props.appId, async (val)=>{
-        if(val){
-          await loadDataList();
-        }
-      }, {immediate: true});
-      
-      
+      watch(
+        () => props.appId,
+        async (val) => {
+          if (val) {
+            await loadDataList();
+          }
+        },
+        { immediate: true }
+      );
+
       // 弹窗事件
       const [register] = useModalInner((data) => {
         let list = dataList.value;
-        if(!list || list.length ==0 ){
-        }else{
+        if (!list || list.length == 0) {
+        } else {
           let selectedIdList = data.list || [];
-          for(let item of list){
-            if(selectedIdList.indexOf(item.id)>=0){
+          for (let item of list) {
+            if (selectedIdList.indexOf(item.id) >= 0) {
               item.checked = true;
-            }else{
+            } else {
               item.checked = false;
             }
           }
@@ -119,58 +119,58 @@
         let arr = toRaw(selectedIdList.value);
         emit('selected', arr, toRaw(selectedList.value));
       }
-      
+
       const dataList = ref<any[]>([]);
-      const showDataList = computed(()=>{
+      const showDataList = computed(() => {
         let list = dataList.value;
-        if(!list || list.length ==0 ){
-          return []
+        if (!list || list.length == 0) {
+          return [];
         }
         let text = searchText.value;
-        if(!text){
-          return list
+        if (!text) {
+          return list;
         }
-        return list.filter(item=>item.name.indexOf(text)>=0)
+        return list.filter((item) => item.name.indexOf(text) >= 0);
       });
-  
-      const selectedList = computed(()=>{
+
+      const selectedList = computed(() => {
         let list = dataList.value;
-        if(!list || list.length ==0 ){
-          return []
+        if (!list || list.length == 0) {
+          return [];
         }
-        return list.filter(item=>item.checked)
+        return list.filter((item) => item.checked);
       });
 
       function unSelect(id) {
         let list = dataList.value;
-        if(!list || list.length ==0 ){
+        if (!list || list.length == 0) {
           return;
         }
-        let arr = list.filter(item=>item.id == id);
+        let arr = list.filter((item) => item.id == id);
         arr[0].checked = false;
       }
-      
+
       async function loadDataList() {
         let params = {
           pageNo: 1,
           pageSize: 200,
           column: 'createTime',
-          order: 'desc'
+          order: 'desc',
         };
         const url = '/sys/role/listByTenant';
         const data = await defHttp.get({ url, params }, { isTransformResponse: false });
         if (data.success) {
           const { records } = data.result;
-          let arr:any[] = [];
-          if(records && records.length>0){
-            for(let item of records){
+          let arr: any[] = [];
+          if (records && records.length > 0) {
+            for (let item of records) {
               arr.push({
                 id: item.id,
                 name: item.name || item.roleName,
                 code: item.roleCode,
                 selectType: props.type,
-                checked: false
-              })
+                checked: false,
+              });
             }
           }
           dataList.value = arr;
@@ -180,14 +180,13 @@
         console.log('loadDataList', data);
       }
 
-
       function onSelect(e, item) {
         prevent(e);
         console.log('onselect');
         // 单选判断 只能选中一条数据 其余数据置false
-        if(props.multi === false){
+        if (props.multi === false) {
           let list = dataList.value;
-          for(let item of list){
+          for (let item of list) {
             item.checked = false;
           }
         }
@@ -207,90 +206,86 @@
         selectedList,
         selectedIdList,
         unSelect,
-        onSelect
-      
+        onSelect,
       };
     },
   };
 </script>
 <style scoped lang="less">
-    .modal-select-list-container{
-        height: 352px;
-        margin-top: 12px;
-        overflow: auto;
-        .scroll{
-            height: 100%;
-            position: relative;
-            width: 100%;
-            overflow: hidden;
-            .content{
-                bottom: 0;
-                left: 0;
-                overflow: scroll;
-                overflow-x: hidden;
-                position: absolute;
-                right: 0;
-                top: 0;
-                .item{
-                    padding: 7px 5px;
-                    cursor: pointer;
-                    display: block;
-                    &:hover{
-                        background-color: #f5f5f5;
-                    }
-                }
-               
-            }
+  .modal-select-list-container {
+    height: 352px;
+    margin-top: 12px;
+    overflow: auto;
+    .scroll {
+      height: 100%;
+      position: relative;
+      width: 100%;
+      overflow: hidden;
+      .content {
+        bottom: 0;
+        left: 0;
+        overflow: scroll;
+        overflow-x: hidden;
+        position: absolute;
+        right: 0;
+        top: 0;
+        .item {
+          padding: 7px 5px;
+          cursor: pointer;
+          display: block;
+          &:hover {
+            background-color: #f5f5f5;
+          }
         }
-
-       
+      }
     }
+  }
 </style>
 
 <style lang="less">
-    .j-user-select-modal2 {
-        .depart-select {
-            .ant-select-selector {
-                color: #fff !important;
-                background-color: #409eff !important;
-                border-radius: 5px !important;
-            }
-            .ant-select-selection-item,
-            .ant-select-arrow {
-                color: #fff !important;
-            }
-        }
-        .my-search {
-            position: absolute;
-            top: 14px;
-            z-index: 1;
-            &.all-width {
-                width: 100%;
-            }
+  .j-user-select-modal2 {
+    .depart-select {
+      .ant-select-selector {
+        color: #fff !important;
+        background-color: #409eff !important;
+        border-radius: 5px !important;
+      }
+      .ant-select-selection-item,
+      .ant-select-arrow {
+        color: #fff !important;
+      }
+    }
+    .my-search {
+      position: absolute;
+      top: 14px;
+      z-index: 1;
+      &.all-width {
+        width: 100%;
+      }
 
-            .anticon {
-                cursor: pointer;
-                &:hover {
-                    color: #0a8fe9 !important;
-                }
-            }
-            .hidden {
-                display: none;
-            }
+      .anticon {
+        cursor: pointer;
+        &:hover {
+          color: #0a8fe9 !important;
         }
+      }
+      .hidden {
+        display: none;
+      }
+    }
 
-        .my-tabs {
-        }
+    .my-tabs {
+    }
 
-        .selected-users {
-            display: flex;
-            flex-wrap: wrap;
-            flex-direction: row;
-            padding-top: 15px;
-        }
+    .selected-users {
+      display: flex;
+      flex-wrap: wrap;
+      flex-direction: row;
+      padding-top: 15px;
+    }
 
-        .scroll-container {
-            padding-bottom: 0 !important;
-        }
+    .scroll-container {
+      padding-bottom: 0 !important;
     }
+  }
 </style>

+ 29 - 15
src/components/Icon/src/IconPicker.vue

@@ -1,10 +1,17 @@
 <template>
-  <a-input :disabled="disabled" :style="{ width }" readOnly :placeholder="t('component.icon.placeholder')" :class="prefixCls" v-model:value="currentSelect">
+  <a-input
+    :disabled="disabled"
+    :style="{ width }"
+    readOnly
+    :placeholder="t('component.icon.placeholder')"
+    :class="prefixCls"
+    v-model:value="currentSelect"
+  >
     <template #addonAfter>
       <a-popover placement="bottomLeft" trigger="click" v-model="visible" :overlayClassName="`${prefixCls}-popover`">
         <template #title>
           <div class="flex justify-between">
-            <a-input :placeholder="t('component.icon.search')" v-model:value="searchIconValue"  @change="debounceHandleSearchChange" allowClear />
+            <a-input :placeholder="t('component.icon.search')" v-model:value="searchIconValue" @change="debounceHandleSearchChange" allowClear />
           </div>
         </template>
 
@@ -27,7 +34,15 @@
               </ul>
             </ScrollContainer>
             <div class="flex py-2 items-center justify-center" v-if="getTotal >= pageSize">
-              <a-pagination showLessItems v-model:current="current" :page-size-options="pageSizeOptions" size="small" v-model:pageSize="pageSize" v-model:total="getTotal" @change="handlePageChange" />
+              <a-pagination
+                showLessItems
+                v-model:current="current"
+                :page-size-options="pageSizeOptions"
+                size="small"
+                v-model:pageSize="pageSize"
+                v-model:total="getTotal"
+                @change="handlePageChange"
+              />
             </div>
           </div>
           <template v-else
@@ -36,9 +51,9 @@
         </template>
 
         <span class="cursor-pointer px-2 py-1 flex items-center" v-if="isSvgMode && currentSelect">
-          <SvgIcon :name="currentSelect" @click="currentSelectClick"/>
+          <SvgIcon :name="currentSelect" @click="currentSelectClick" />
         </span>
-        <Icon :icon="currentSelect || 'ion:apps-outline'" class="cursor-pointer px-2 py-1" v-else @click="currentSelectClick"/>
+        <Icon :icon="currentSelect || 'ion:apps-outline'" class="cursor-pointer px-2 py-1" v-else @click="currentSelectClick" />
       </a-popover>
     </template>
   </a-input>
@@ -88,7 +103,7 @@
     copy: propTypes.bool.def(false),
     mode: propTypes.oneOf<('svg' | 'iconify')[]>(['svg', 'iconify']).def('iconify'),
     disabled: propTypes.bool.def(true),
-    clearSelect: propTypes.bool.def(false)
+    clearSelect: propTypes.bool.def(false),
   });
 
   const emit = defineEmits(['change', 'update:value']);
@@ -111,7 +126,7 @@
   //每页条数
   const pageSize = ref<number>(140);
   //下拉分页显示
-  const pageSizeOptions = ref<any>(['10', '20', '50', '100', '140'])
+  const pageSizeOptions = ref<any>(['10', '20', '50', '100', '140']);
   //下拉搜索值
   const searchIconValue = ref<string>('');
 
@@ -129,7 +144,7 @@
     }
   );
 
-  function handlePageChange(page: number,size: number) {
+  function handlePageChange(page: number, size: number) {
     //update-begin---author:wangshuai ---date:20230522  for:【issues/4947】菜单编辑页面菜单图标选择模板,每页显示数量切换无效------------
     current.value = page;
     pageSize.value = size;
@@ -139,13 +154,13 @@
   }
 
   function handleClick(icon: string) {
-    if(props.clearSelect === true){
-      if(currentSelect.value===icon){
-        currentSelect.value = ''
-      }else{
+    if (props.clearSelect === true) {
+      if (currentSelect.value === icon) {
+        currentSelect.value = '';
+      } else {
         currentSelect.value = icon;
       }
-    }else{
+    } else {
       currentSelect.value = icon;
       if (props.copy) {
         clipboardRef.value = icon;
@@ -154,7 +169,6 @@
         }
       }
     }
-    
   }
 
   function handleSearchChange(e: ChangeEvent) {
@@ -169,7 +183,7 @@
     }
     currentList.value = icons.filter((item) => item.includes(value));
   }
-  
+
   //update-begin---author:wangshuai ---date:20230522  for:【issues/4947】菜单编辑页面菜单图标选择模板,每页显示数量切换无效,输入框后面的图标点击之后清空数据------------
   /**
    * 图标点击重置页数

+ 60 - 44
src/components/jeecg/comment/MyComment.vue

@@ -1,7 +1,21 @@
 <template>
-  <div :class="{'comment-active': commentActive}" style="border: 1px solid #eee; margin: 0; position: relative" @click="handleClickBlank">
-    <textarea ref="commentRef" v-model="myComment" @keyup.enter="sendComment" @input="handleCommentChange" @blur="handleBlur" class="comment-content" :rows="3" placeholder="请输入你的评论,可以@成员" />
-    <div class="comment-content comment-html-shower" :class="{'no-content':noConent, 'top-div': showHtml, 'bottom-div': showHtml == false }" v-html="commentHtml" @click="handleClickHtmlShower"></div>
+  <div :class="{ 'comment-active': commentActive }" style="border: 1px solid #eee; margin: 0; position: relative" @click="handleClickBlank">
+    <textarea
+      ref="commentRef"
+      v-model="myComment"
+      @keyup.enter="sendComment"
+      @input="handleCommentChange"
+      @blur="handleBlur"
+      class="comment-content"
+      :rows="3"
+      placeholder="请输入你的评论,可以@成员"
+    ></textarea>
+    <div
+      class="comment-content comment-html-shower"
+      :class="{ 'no-content': noConent, 'top-div': showHtml, 'bottom-div': showHtml == false }"
+      v-html="commentHtml"
+      @click="handleClickHtmlShower"
+    ></div>
     <div class="comment-buttons" v-if="commentActive">
       <div style="cursor: pointer">
         <Tooltip title="选择@用户">
@@ -22,30 +36,30 @@
         <a-button type="primary" @click="sendComment" :loading="buttonLoading" :disabled="disabledButton">发 送</a-button>
       </div>
     </div>
-    <upload-chunk ref="uploadRef" :visible="uploadVisible" @select="selectFirstFile"></upload-chunk>
+    <upload-chunk ref="uploadRef" :visible="uploadVisible" @select="selectFirstFile" />
   </div>
-  <UserSelectModal labelKey="realname" rowKey="username" @register="registerModal" @getSelectResult="setValue" isRadioSelection></UserSelectModal>
+  <UserSelectModal labelKey="realname" rowKey="username" @register="registerModal" @getSelectResult="setValue" isRadioSelection />
   <a-modal v-model:visible="visibleEmoji" :footer="null" wrapClassName="emoji-modal" :closable="false" :width="490">
     <template #title>
       <span></span>
     </template>
     <Picker
-      :pickerStyles="pickerStyles" 
-      :i18n="optionsName" 
+      :pickerStyles="pickerStyles"
+      :i18n="optionsName"
       :data="emojiIndex"
       emoji="grinning"
-      :showPreview="false" 
-      :infiniteScroll="false" 
-      :showSearch="false" 
-      :showSkinTones="false" 
-      set="apple" 
-      @select="showEmoji">
-    </Picker>
+      :showPreview="false"
+      :infiniteScroll="false"
+      :showSearch="false"
+      :showSkinTones="false"
+      set="apple"
+      @select="showEmoji"
+    />
   </a-modal>
 </template>
 
 <script lang="ts">
-  import {ref, watch, computed, inject} from 'vue';
+  import { ref, watch, computed, inject } from 'vue';
   import { propTypes } from '/@/utils/propTypes';
   import { UserAddOutlined, PaperClipOutlined, SmileOutlined } from '@ant-design/icons-vue';
   import { Tooltip } from 'ant-design-vue';
@@ -53,7 +67,7 @@
   import { useModal } from '/@/components/Modal';
   import UploadChunk from './UploadChunk.vue';
   import 'emoji-mart-vue-fast/css/emoji-mart.css';
-  import {getGloablEmojiIndex, useEmojiHtml} from './useComment';
+  import { getGloablEmojiIndex, useEmojiHtml } from './useComment';
 
   const optionsName = {
     categories: {
@@ -185,7 +199,7 @@
         myComment.value = temp;
         emojiButton.value.click();
       }
-      
+
       const visibleEmoji = ref(false);
       function showEmoji(e) {
         let temp = myComment.value || '';
@@ -199,7 +213,7 @@
       }
 
       const pickerStyles = {
-        width: '490px'
+        width: '490px',
         /* height: '350px',
         top: '0px',
         left: '-75px',
@@ -219,9 +233,9 @@
         e.stopPropagation();
         visibleEmoji.value = !visibleEmoji.value;
       }
-      
+
       //const emojiIndex = inject('$globalEmojiIndex')
-      const emojiIndex = getGloablEmojiIndex()
+      const emojiIndex = getGloablEmojiIndex();
       const { getHtml } = useEmojiHtml(emojiIndex);
 
       const commentHtml = computed(() => {
@@ -244,27 +258,27 @@
       function handleBlur() {
         showHtml.value = true;
       }
-      
+
       const commentActive = ref(false);
-      const noConent = computed(()=>{
-        if(myComment.value.length>0){
+      const noConent = computed(() => {
+        if (myComment.value.length > 0) {
           return false;
         }
         return true;
       });
-      function changeActive(){
-        if(myComment.value.length==0){
-          commentActive.value = false
+      function changeActive() {
+        if (myComment.value.length == 0) {
+          commentActive.value = false;
           uploadVisible.value = false;
         }
       }
-      
-      function selectFirstFile(fileName){
-        if(myComment.value.length==0){
+
+      function selectFirstFile(fileName) {
+        if (myComment.value.length == 0) {
           myComment.value = fileName;
         }
       }
-      
+
       return {
         myComment,
         sendComment,
@@ -294,7 +308,7 @@
         commentActive,
         noConent,
         changeActive,
-        selectFirstFile
+        selectFirstFile,
       };
     },
   };
@@ -353,33 +367,35 @@
     }
   }
 
-  .emoji-modal  {
-   > .@{ventSpace}-modal{
+  .emoji-modal {
+    > .@{ventSpace}-modal {
       right: 25% !important;
       margin-right: 16px !important;
     }
-    .@{ventSpace}-modal-header{
+    .@{ventSpace}-modal-header {
       padding: 0 !important;
     }
-    .emoji-mart-bar{
+    .emoji-mart-bar {
       display: none;
     }
-    h3.emoji-mart-category-label{
-    /*  display: none;*/
+    h3.emoji-mart-category-label {
+      /*  display: none;*/
       border-bottom: 1px solid #eee;
     }
   }
-  
-  .comment-active{
+
+  .comment-active {
     border-color: #1e88e5 !important;
-    box-shadow: 0 1px 1px 0 #90caf9, 0 1px 6px 0 #90caf9;
+    box-shadow:
+      0 1px 1px 0 #90caf9,
+      0 1px 6px 0 #90caf9;
   }
-  .no-content{
-    color: #a1a1a1
+  .no-content {
+    color: #a1a1a1;
   }
-  
+
   /**聊天表情本地化*/
   .emoji-type-image.emoji-set-apple {
-    background-image: url("./image/emoji.png");
+    background-image: url('./image/emoji.png');
   }
 </style>

+ 0 - 0
src/views/vent/comment/components/customHeader.vue → src/components/vent/customHeader.vue


+ 0 - 1
src/hooks/system/useListPage.ts

@@ -63,7 +63,6 @@ export function useListPage(options: ListPageOptions) {
 
   // 导出 excel
   async function onExportXls(selectForm?) {
-    debugger;
     //update-begin---author:wangshuai ---date:20220411  for:导出新增自定义参数------------
     const { url, name, params } = options?.exportConfig ?? {};
     const realUrl = typeof url === 'function' ? url() : url;

+ 70 - 0
src/hooks/vent/useSystemSelect.ts

@@ -0,0 +1,70 @@
+import { ref, nextTick } from 'vue';
+import { defHttp } from '/@/utils/http/axios';
+
+type DeviceType = { deviceType: string; deviceName: string; datalist: any[] };
+type OptionType = { id: string; strsystype: string; systemname: string };
+const getTableList = (params) => defHttp.get({ url: '/safety/ventanalyManageSystem/list', params });
+const systemList = (params) => defHttp.post({ url: '/ventanaly-device/monitor/device', params });
+
+export function useSystemSelect(sysType: string, changeModalType?: (param) => {}) {
+  const options = ref<OptionType[]>([]);
+  const optionValue = ref('');
+  const deviceList = ref<DeviceType[]>([]);
+  const deviceActive = ref('');
+  const deviceType = ref('');
+  const isRefresh = ref(true);
+
+  async function getDeviceList() {
+    const res = await systemList({ devicetype: 'sys', systemID: optionValue.value });
+    const result = res.msgTxt;
+    const deviceArr = <DeviceType[]>[];
+    result.forEach((item) => {
+      const data = item['datalist'].filter((data: any) => {
+        const readData = data.readData;
+        return Object.assign(data, readData);
+      });
+      if (item.type != 'sys') {
+        deviceArr.unshift({
+          deviceType: item.type,
+          deviceName: item['typeName'] ? item['typeName'] : item['datalist'][0]['typeName'],
+          datalist: data,
+        });
+      }
+    });
+    deviceList.value = deviceArr;
+    deviceActive.value = deviceArr[0].deviceType;
+    deviceChange(0);
+  }
+
+  async function getSysDataSource() {
+    const res = await getTableList({ strtype: sysType, pagetype: 'normal' });
+    if (options.value.length == 0) {
+      // 初始时选择第一条数据
+      options.value = res.records || [];
+      if (!optionValue.value) {
+        optionValue.value = options.value[0]['id'];
+        getDeviceList();
+        if (changeModalType) changeModalType(options.value[0]);
+      }
+    }
+  }
+
+  function deviceChange(index) {
+    deviceActive.value = deviceType.value = deviceList.value[index]['deviceType'];
+    isRefresh.value = false;
+    nextTick(() => {
+      isRefresh.value = true;
+    });
+  }
+
+  async function getSelectRow(deviceID) {
+    const currentData = options.value.find((item: any) => {
+      return item.id == deviceID;
+    });
+    optionValue.value = deviceID;
+    if (changeModalType) changeModalType(currentData);
+    getDeviceList();
+  }
+
+  return { options, optionValue, deviceList, deviceActive, deviceType, isRefresh, getSysDataSource, getSelectRow, deviceChange };
+}

+ 53 - 53
src/layouts/default/header/components/user-dropdown/UpdateHome.vue

@@ -4,63 +4,63 @@
   </BasicModal>
 </template>
 <script lang="ts" setup>
-import { ref, unref, defineExpose } from 'vue';
-import { BasicModal, useModalInner } from '/@/components/Modal';
-import { BasicForm, useForm } from '/@/components/Form/index';
-import { useMessage } from '/@/hooks/web/useMessage';
-// 声明Emits
-const emit = defineEmits(['register']);
-const $message = useMessage();
-const formRef = ref();
-//表单配置
-const [registerForm, { validate }] = useForm({
-  schemas: [
-    {
-      label: '页面风格',
-      field: 'pageType',
-      component: 'RadioGroup',
-      defaultValue: 1,
-      componentProps: {
-        options: [
-          {
-            label: '6.0',
-            value: 1,
-          },
-          {
-            label: '5.5',
-            value: 0,
-          },
-        ],
+  import { ref, unref, defineExpose } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  // 声明Emits
+  const emit = defineEmits(['register']);
+  const $message = useMessage();
+  const formRef = ref();
+  //表单配置
+  const [registerForm, { validate }] = useForm({
+    schemas: [
+      {
+        label: '页面风格',
+        field: 'pageType',
+        component: 'RadioGroup',
+        defaultValue: 1,
+        componentProps: {
+          options: [
+            {
+              label: '6.0',
+              value: 1,
+            },
+            {
+              label: '5.5',
+              value: 0,
+            },
+          ],
+        },
       },
-    },
-  ],
-  showActionButtonGroup: false,
-});
-//表单赋值
-const [registerModal, { setModalProps, closeModal }] = useModalInner();
+    ],
+    showActionButtonGroup: false,
+  });
+  //表单赋值
+  const [registerModal, { setModalProps, closeModal }] = useModalInner();
 
-//表单提交事件
-async function handleSubmit() {
-  try {
-    const values = await validate();
-    setModalProps({ confirmLoading: true });
-    //设置页面风格
-    if(values['pageType'] == 1){
-      // 6.0页面
-    }else if(values['pageType'] == 0) {
-      // 5.5页面
+  //表单提交事件
+  async function handleSubmit() {
+    try {
+      const values = await validate();
+      setModalProps({ confirmLoading: true });
+      //设置页面风格
+      if (values['pageType'] == 1) {
+        // 6.0页面
+      } else if (values['pageType'] == 0) {
+        // 5.5页面
+      }
+      closeModal();
+    } finally {
+      setModalProps({ confirmLoading: false });
     }
-    closeModal();
-  } finally {
-    setModalProps({ confirmLoading: false });
   }
-}
 
-async function show() {
-  await setModalProps({ visible: true });
-}
+  async function show() {
+    await setModalProps({ visible: true });
+  }
 
-defineExpose({
-  show,
-});
+  defineExpose({
+    show,
+  });
 </script>

+ 0 - 1
src/router/guard/index.ts

@@ -65,7 +65,6 @@ function createPageLoadingGuard(router: Router) {
   const appStore = useAppStoreWithOut();
   const { getOpenPageLoading } = useTransitionSetting();
   router.beforeEach(async (to, from) => {
-    
     if (!userStore.getToken) {
       return true;
     }

+ 1 - 0
src/router/guard/permissionGuard.ts

@@ -54,6 +54,7 @@ export function createPermissionGuard(router: Router) {
     ) {
       // mountMicroApp(userStore.getUserInfo.homePath);
       next(userStore.getUserInfo.homePath);
+      document.title = '首页';
       return;
     }
 

+ 3 - 0
src/utils/event/index.ts

@@ -42,6 +42,9 @@ export function triggerWindowResize() {
 }
 
 export function setDivHeight(e: MouseEvent, minHeight, scroll, scrollClientMaxHeight = 175, scrollClientHeight = 100) {
+  if (e && e.target && e.target['className'].includes('input')) {
+    return;
+  }
   e.preventDefault();
   e.stopPropagation();
   const divObject = e.currentTarget as HTMLElement;

+ 2 - 2
src/utils/threejs/main.worker.ts

@@ -43,7 +43,7 @@ export function initModalWorker() {
     // 'cf/dsmove_2023-06-02.glb',
     // 'cf/fixedCf_2023-11-29.glb',
 
-    'jbfj/jbfj-hd_2024-03-10.glb',
+    'jbfj/jbfj-hd_2024-03-14.glb',
     'jbfj/jbfj-fm_2023-06-02.glb',
     'jbfj/jbfj-fc_2023-06-02.glb',
     'ztfj/dj1_2023-06-02.glb',
@@ -62,7 +62,7 @@ export function initModalWorker() {
     'fire/nitrogenUnderground_2023-09-15.glb',
     'fire/grout_2023-06-02.glb',
     'fire/Bertai_2023-11-29.glb', //lxh
-    'fire/balancePress_2024-02-23.glb',
+    'fire/balancePress_2024-03-14.glb',
     'yafeng/compressor_2023-07-10.glb',
     'gas/gasPump_2024-03-04.glb',
     'gas/gasPumpUnder_2023-10-05.glb',

+ 1 - 0
src/utils/threejs/util.ts

@@ -29,6 +29,7 @@ export const setModalCenter = (group, modal?) => {
   group.position.x = group.position.x - center.x;
   group.position.y = group.position.y - center.y;
   group.position.z = group.position.z - center.z;
+  debugger;
 };
 
 // 获取一个canvas 图文纹理

+ 1 - 1
src/views/dashboard/Analysis/index.vue

@@ -30,7 +30,7 @@
   import { bottomBtnList } from './home.data';
   import workerFace from './homePage/workerFace.vue';
   import netWork from './homePage/network.vue';
-  import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+  import customHeader from '/@/components/vent/customHeader.vue';
 
   const activeColors = [];
   const noActiveColors = ['#aaa', '#aaa'];

+ 1 - 1
src/views/monitor/datalog/DataLogModal.vue

@@ -40,7 +40,7 @@
         </a-form>
       </a-spin>
     </BasicModal>
-    <DataLogCompareModal @register="registerDataLogCompareModal"></DataLogCompareModal>
+    <DataLogCompareModal @register="registerDataLogCompareModal" />
   </div>
 </template>
 <script lang="ts" setup>

+ 61 - 57
src/views/vent/comment/EditRowTable.vue

@@ -6,7 +6,6 @@
         <div class="vent-flex-row">
           <TableAction :actions="createActions(record, column)" />
         </div>
-        
       </template>
       <template #bodyCell="{ column, record }">
         <slot name="filterCell" v-bind="{ column, record }"> </slot>
@@ -15,7 +14,7 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, nextTick, watch} from 'vue';
+  import { defineComponent, ref, nextTick, watch } from 'vue';
   import { BasicTable, useTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table';
   import { useMessage } from '/@/hooks/web/useMessage';
   // import { nextTick } from 'process';
@@ -32,7 +31,7 @@
       },
       searchFormSchema: {
         type: Array,
-        default: () => []
+        default: () => [],
       },
       list: {
         type: Function,
@@ -45,58 +44,60 @@
       },
       scroll: {
         type: Object,
-        default: {}
+        default: {},
       },
     },
     emits: ['saveOrUpdate', 'deleteById', 'rowChange'],
     setup(props, { emit, expose }) {
       const { createMessage: msg } = useMessage();
       const currentEditKeyRef = ref('');
-      const dataList = ref<any[]>([])
-      const refresh = ref(true)
+      const dataList = ref<any[]>([]);
+      const refresh = ref(true);
 
-      const tableScroll = props.scroll.y ? ref({ y: props.scroll.y }) : ref({})
+      const tableScroll = props.scroll.y ? ref({ y: props.scroll.y }) : ref({});
 
-      const [registerTable, { insertTableDataRecord, reload, getSelectRows, getDataSource, setTableData, clearSelectedRowKeys }] = !props.list ?  useTable({
-        title: '',
-        dataSource: props.dataSource,
-        rowKey: 'id',
-        clickToRowSelect: false,
-        columns: props.columns as BasicColumn[],
-        showIndexColumn: false,
-        showTableSetting: false,
-        rowSelection: !props.isRadio ? undefined : { type: 'radio', onChange: rowChange },
-        tableSetting: { fullScreen: true },
-        scroll: tableScroll,
-        formConfig: {
-          labelWidth: 120,
-          schemas: props.searchFormSchema,
-          autoSubmitOnEnter: true,
-        },
-        actionColumn: {
-          width: 160,
-          title: '操作',
-          dataIndex: 'action',
-          slots: { customRender: 'action' },
-        },
-        }) : useTable({
-          title: '',
-          api: props.list,
-          rowKey: 'id',
-          clickToRowSelect: false,
-          columns: props.columns as BasicColumn[],
-          showIndexColumn: false,
-          showTableSetting: false,
-          scroll: tableScroll,
-          rowSelection: !props.isRadio ? undefined : { type: 'radio', onChange: rowChange },
-          tableSetting: { fullScreen: true },
-          actionColumn: {
-            width: 160,
-            title: '操作',
-            dataIndex: 'action',
-            slots: { customRender: 'action' },
-          },
-      });
+      const [registerTable, { insertTableDataRecord, reload, getSelectRows, getDataSource, setTableData, clearSelectedRowKeys }] = !props.list
+        ? useTable({
+            title: '',
+            dataSource: props.dataSource,
+            rowKey: 'id',
+            clickToRowSelect: false,
+            columns: props.columns as BasicColumn[],
+            showIndexColumn: false,
+            showTableSetting: false,
+            rowSelection: !props.isRadio ? undefined : { type: 'radio', onChange: rowChange },
+            tableSetting: { fullScreen: true },
+            scroll: tableScroll,
+            formConfig: {
+              labelWidth: 120,
+              schemas: props.searchFormSchema,
+              autoSubmitOnEnter: true,
+            },
+            actionColumn: {
+              width: 160,
+              title: '操作',
+              dataIndex: 'action',
+              slots: { customRender: 'action' },
+            },
+          })
+        : useTable({
+            title: '',
+            api: props.list,
+            rowKey: 'id',
+            clickToRowSelect: false,
+            columns: props.columns as BasicColumn[],
+            showIndexColumn: false,
+            showTableSetting: false,
+            scroll: tableScroll,
+            rowSelection: !props.isRadio ? undefined : { type: 'radio', onChange: rowChange },
+            tableSetting: { fullScreen: true },
+            actionColumn: {
+              width: 160,
+              title: '操作',
+              dataIndex: 'action',
+              slots: { customRender: 'action' },
+            },
+          });
 
       function rowChange(e) {
         emit('rowChange', e[0], getSelectRows()[0]);
@@ -139,7 +140,7 @@
           try {
             //TODO 此处将数据提交给服务器保存
             emit('saveOrUpdate', Object.assign(record, record.editValueRefs), reload);
-            refresh.value = false
+            refresh.value = false;
             // 保存之后提交编辑状态
             const pass = await record.onEdit?.(false, true);
             if (pass) {
@@ -153,9 +154,9 @@
           msg.error({ content: '请填写正确的数据', key: 'saving' });
         }
         nextTick(() => {
-          refresh.value = true
-          clearSelectedRowKeys()
-        })
+          refresh.value = true;
+          clearSelectedRowKeys();
+        });
       }
 
       function createActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {
@@ -219,12 +220,15 @@
         // console.log(column, value, record);
       }
 
-      watch(() => props.dataSource, (newVal:any[]) => {
-        setTableData(newVal)
-      })
+      watch(
+        () => props.dataSource,
+        (newVal: any[]) => {
+          setTableData(newVal);
+        }
+      );
 
       expose({
-        reload
+        reload,
       });
 
       return {
@@ -236,7 +240,7 @@
         addRow,
         reload,
         getDataSource,
-        dataList
+        dataList,
       };
     },
   });
@@ -244,7 +248,7 @@
 <style scoped lang="less">
   @ventSpace: zxm;
   @vent-table-no-hover: #00bfff10;
-  
+
   :deep(.@{ventSpace}-table-body) {
     height: auto !important;
   }

+ 753 - 0
src/views/vent/comment/less/systemMonitor.less

@@ -0,0 +1,753 @@
+
+
+.monitor-container {
+  width: 100%;
+  height: 100%;
+  margin-top: 40px;
+  display: flex;
+  justify-content: space-between;
+  position: relative;
+
+  .lr {
+    width: 380px;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    margin-top: 10px;
+    pointer-events: auto;
+  }
+
+  .right-box {
+    width: 340px;
+    .disaster-btn {
+      padding: 4px 10px !important;
+      margin-right: 8px;
+    }
+  }
+
+  .left-box {
+    margin-top: 30px;
+  }
+
+  .warning-monitor {  
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+
+    .warning-item {
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      .title {
+        cursor: pointer;
+      }
+    
+      .active-title {
+        color: aqua;
+      }
+    }
+
+    .state-box {
+      width: 79px;
+      height: 47px;
+      background: url('/@/assets/images/vent/param-bg.png');
+      display: flex;
+      justify-content: center;
+      align-items: center;
+
+      .title {
+        text-align: center;
+        color: #73e8fe;
+      }
+
+      span {
+        display: inline-block;
+      }
+
+      .value {
+        width: 20px;
+      }
+    }
+  }
+
+  .vent-param {
+    width: 100%;
+    margin-top: 10px;
+
+    .light-group {
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      position: relative;
+
+      .param-item {
+        width: 120px;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        position: reactive;
+
+        .icon {
+          display: block;
+          position: absolute;
+          top: -5px;
+        }
+
+        .param {
+          display: flex;
+          flex-direction: column;
+          justify-content: center;
+          align-items: center;
+
+          .param-icon {
+            width: 79px;
+            height: 48px;
+            background: url('/@/assets/images/vent/workFace-param-bg.png');
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            align-items: center;
+            position: relative;
+            top: -20px;
+            margin-top: 10px;
+
+            .param-title {
+              position: relative;
+              top: -4px;
+            }
+
+            .param-unit {
+              position: relative;
+              top: -2px;
+              font-size: 12px;
+            }
+          }
+
+          .param-val-box {
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            align-items: center;
+            position: relative;
+            top: -20px;
+
+            .param-val-icon {
+              width: 2px;
+              height: 15px;
+              background: #00d8ff;
+              position: relative;
+
+              &::after {
+                content: '';
+                display: block;
+                position: absolute;
+                width: 6px;
+                height: 6px;
+                border-radius: 3px;
+                background: #00d8ff;
+                bottom: -2px;
+                left: -2px;
+              }
+
+            }
+
+            .param-val {
+              position: relative;
+              font-family: 'douyuFont';
+              // color: #20dbfd;
+              text-shadow: 0 0 25px #00d8ff;
+              font-size: 13px;
+              border: 1px solid #40B7F3;
+              padding: 5px 8px 2px 8px;
+              top: 2px;
+              text-align: center;
+              min-width: 80px;
+
+              &::after {
+                width: calc(100% - 4px);
+                height: calc(100% - 4px);
+                content: '';
+                position: absolute;
+                top: 2px;
+                left: 2px;
+                display: block;
+                border: 1px solid #006EA6;
+              }
+            }
+          }
+
+        }
+      }
+    }
+  }
+
+  .data-group {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    padding-bottom: 8px;
+
+    .data-item {
+      width: calc(50% - 10px);
+      display: flex;
+      justify-content: space-between;
+      line-height: 24px;
+      background-image: linear-gradient(to right, #39A3FF00, #39A3FF10, #39A3FF02);
+      margin: 4px 0;
+    }
+
+    .value {
+      color: #00eefffe;
+    }
+
+    .data-item1 {
+      width: 100%;
+      line-height: 24px;
+      background-image: linear-gradient(to right, #39A3FF00, #39A3FF10, #39A3FF02);
+      margin: 4px 0;
+    }
+  }
+
+  .input-box {
+    display: flex;
+    flex-direction: column;
+    padding: 0 5px;
+  }
+  .input-item {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 2px 0px;
+    margin: 4px 0;
+    background-image: linear-gradient(to right, #39deff15, #3977e500);
+
+    .title {
+      width: 200px;
+    }
+
+    .title-auto {
+      width: auto;
+    }
+
+    .input-value {
+      width: 80px;
+      height: 28px;
+      line-height: 28px !important;
+      background: transparent !important;
+      border-color: #228DA2 !important;
+      color: #fff !important;
+    }
+
+    .value {
+      width: 80px;
+      color: #00d8ff;
+      padding-right: 20px;
+    }
+
+    .unit {
+      width: 80px;
+    }
+  }
+
+  .warning-state-detail {
+    position: relative;
+    padding-left: 10px;
+    font-size: 13px;
+    margin-bottom: 15px;
+    margin-top: 5px;
+    margin-left: 8px;
+
+    &::before {
+      content: '';
+      position: absolute;
+      width: 6px;
+      height: 6px;
+      border: 1px solid #1bf5fd;
+      background: #00d8ff;
+      border-radius: 3px;
+      left: -1px;
+      top: 8px;
+    }
+
+    .state-color {
+      color: #4afffdbf;
+    }
+  }
+
+  .temperature-group {
+    width: 100%;
+    margin-top: 20px;
+
+    .light-group {
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      position: relative;
+
+      .light-bg {
+        width: 331px;
+        height: 42px;
+        background: url('/@/assets/images/vent/plane-bg.png') no-repeat;
+        background-size: contain;
+        position: absolute;
+        z-index: -1;
+        top: 44px;
+        opacity: 0.6;
+      }
+
+      .light-item {
+        width: 120px;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        position: reactive;
+
+        .icon {
+          display: block;
+          position: absolute;
+          top: -5px;
+        }
+
+        .light {
+          display: flex;
+          flex-direction: column;
+          justify-content: center;
+          align-items: center;
+
+          .light-icon {
+            width: 90px;
+            height: 58px;
+            background: url('/@/assets/images/vent/ligth-q.png');
+            opacity: 0.8;
+          }
+
+          .light-title {
+            position: relative;
+            top: -15px;
+          }
+
+          .light-val-box {
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            align-items: center;
+            position: relative;
+            top: -10px;
+
+            .light-val-icon {
+              width: 2px;
+              height: 18px;
+              background: #00d8ff;
+              position: relative;
+
+              &::after {
+                content: '';
+                display: block;
+                position: absolute;
+                width: 6px;
+                height: 6px;
+                border-radius: 3px;
+                background: #00d8ff;
+                bottom: -2px;
+                left: -2px;
+              }
+
+            }
+
+            .light-val {
+              position: relative;
+              font-family: 'douyuFont';
+              // color: #20dbfd;
+              text-shadow: 0 0 25px #00d8ff;
+              font-size: 13px;
+              border: 1px solid #40B7F3;
+              padding: 5px 8px 2px 8px;
+              top: 2px;
+
+              &::after {
+                width: calc(100% - 4px);
+                height: calc(100% - 4px);
+                content: '';
+                position: absolute;
+                top: 2px;
+                left: 2px;
+                display: block;
+                border: 1px solid #006EA6;
+              }
+            }
+          }
+
+        }
+      }
+    }
+  }
+
+  .state-item {
+    display: flex;
+    flex-direction: row;
+    padding: 4px;
+
+    .item-col {
+      width: calc(50% - 5px);
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      padding-right: 4px;
+      background-image: linear-gradient(to right, #39f5ff00, #39f5ff08);
+
+      &:first-child {
+        margin-right: 10px;
+      }
+
+      .state-title {
+        color: #ffffffcc;
+        flex: 9;
+        font-size: 14px;
+      }
+
+      .state-val {
+        flex: 1;
+        color: #00eefffe;
+        margin-right: 5px;
+        text-align: right;
+        font-size: 14px;
+      }
+    }
+  }
+
+  .co-param {
+    width: 100%;
+    margin-top: 20px;
+
+    .light-group {
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      position: relative;
+
+      .param-item {
+        width: 120px;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        position: reactive;
+
+        .icon {
+          display: block;
+          position: absolute;
+          top: -5px;
+        }
+
+        .param {
+          display: flex;
+          flex-direction: column;
+          justify-content: center;
+          align-items: center;
+
+          .param-icon {
+            width: 79px;
+            height: 48px;
+            background: url('/@/assets/images/vent/workFace-param-bg.png');
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            align-items: center;
+            position: relative;
+            top: -20px;
+            margin-top: 10px;
+
+            .icon {
+              position: relative;
+              top: -3px;
+            }
+
+            .param-unit {
+              position: relative;
+              top: -3px;
+              font-size: 13px;
+            }
+          }
+
+          .param-val-box {
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            align-items: center;
+            position: relative;
+            top: -20px;
+
+            .param-val-icon {
+              width: 2px;
+              height: 18px;
+              background: #00d8ff;
+              position: relative;
+
+              &::after {
+                content: '';
+                display: block;
+                position: absolute;
+                width: 6px;
+                height: 6px;
+                border-radius: 3px;
+                background: #00d8ff;
+                bottom: -2px;
+                left: -2px;
+              }
+
+            }
+
+            .param-val {
+              position: relative;
+              font-family: 'douyuFont';
+              // color: #20dbfd;
+              text-shadow: 0 0 25px #00d8ff;
+              font-size: 13px;
+              border: 1px solid #40B7F3;
+              padding: 5px 8px 2px 8px;
+              top: 2px;
+
+              &::after {
+                width: calc(100% - 4px);
+                height: calc(100% - 4px);
+                content: '';
+                position: absolute;
+                top: 2px;
+                left: 2px;
+                display: block;
+                border: 1px solid #006EA6;
+              }
+            }
+          }
+
+        }
+      }
+    }
+  }
+
+  .btn {
+    padding: 2px 12px;
+    position: relative;
+    border-radius: 2px;
+    color: #fff;
+    cursor: pointer;
+
+    &::before {
+      position: absolute;
+      display: block;
+      content: '';
+      width: calc(100% - 4px);
+      height: calc(100% - 4px);
+      top: 2px;
+      left: 2px;
+      border-radius: 2px;
+      z-index: -1;
+    }
+  }
+
+  .btn1 {
+    border: 1px solid #5cfaff;
+
+    &::before {
+      background-image: linear-gradient(#2effee92, #0cb1d592);
+    }
+
+    &:hover {
+      border: 1px solid #5cfaffaa;
+
+      &::before {
+        background-image: linear-gradient(#2effee72, #0cb1d572);
+      }
+    }
+  }
+
+  .btn2 {
+    border: 1px solid #e91927;
+    margin-left: 10px;
+
+    &::before {
+      background-image: linear-gradient(#b02533, #a31f2e);
+    }
+
+    &:hover {
+      &::before {
+        background-image: linear-gradient(#bd2e3ccc, #a31f2ecc);
+      }
+    }
+  }
+}
+
+.history-group{
+  padding: 0 20px;
+  margin-top: 90px;
+  .history-container{
+    position: relative;
+    background: #6195af1a;
+    width: calc(100% + 10px);
+    left: -10px;
+    border: 1px solid #00fffd22;
+    padding: 10px 0;
+    box-shadow: 0 0 20px #44b4ff33 inset;
+  }
+}
+.device-button-group{
+  // margin: 0 20px;
+  display: flex;
+  pointer-events: auto;
+  position: relative;
+  &::after{
+    position:absolute;
+    content: '';
+    width: calc(100% + 10px);
+    height: 2px;
+    top: 30px;
+    left: -10px;
+    border-bottom: 1px solid #0efcff;
+  }
+  .device-button{
+    padding: 4px 15px;
+    position: relative;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    font-size: 14px;
+    
+    color: #fff;
+    cursor: pointer;
+    margin: 0 3px;
+
+    &::before{
+      content: '';
+      position: absolute;
+      top: 0;
+      right: 0;
+      bottom: 0;
+      left: 0;
+      border: 1px solid #6176AF;
+      transform: skewX(-38deg);
+      background-color: rgba(0, 77, 103,85%);
+      z-index: -1;
+    }
+  }
+  .device-active{
+    // color: #0efcff;
+    &::before{
+      border-color: #0efcff;
+      box-shadow: 1px 1px 3px 1px #0efcff inset;
+    }
+  }
+}
+
+.parameter-title {
+  position: relative;
+  width: 100%;
+  height: 16px;
+  margin-top: 10px;
+  margin-bottom: 5px;
+  display: flex;
+  align-items: center;
+  top: -2px;
+  .icon,
+  span {
+    position: absolute;
+  }
+}
+
+.group-parameter-title {
+  background-image: linear-gradient(to right, #39a3ff50, #39a3ff00);
+  .icon {
+    left: 0px;
+    top: -4px;
+  }
+  span {
+    left: 20px;
+    top: -8px;
+  }
+  &::before{
+    position: absolute;
+    content: '';
+    width: 100%;
+    height: 100%;
+    top: 4px;
+    background-image: linear-gradient(to right, #3df6ff40, #3df6ff00);
+  }
+}
+
+.detail {
+  align-self: flex-end;
+  color: #66e8fc;
+  cursor: pointer;
+  &:hover {
+    color: #1bf5fddd;
+  }
+}
+
+.a-detail{
+  font-size: 12px;
+  padding-left: 5px;
+  cursor: pointer;
+}
+
+.fire-analysis1 {
+  display: flex;
+  justify-content: center;
+
+  .analysis-item {
+    width: 321px;
+    height: 104px;
+    text-align: center;
+    background: url('/@/assets/images/vent/alarm/1.png');
+    color: #ffffffdd;
+    margin: 0 4px;
+
+    .title {
+      margin-top: 46px;
+    }
+
+    .value {
+      margin-top: 7px;
+    }
+  }
+
+  .warning1 {
+    background: url('/@/assets/images/vent/alarm/21.png');
+  }
+
+  .warning2 {
+    background: url('/@/assets/images/vent/alarm/31.png');
+  }
+
+  .warning3 {
+    background: url('/@/assets/images/vent/alarm/41.png');
+  }
+}
+
+:deep(.@{ventSpace}-tabs-tabpane-active) {
+  overflow: auto;
+}
+
+:deep(.zxm-select) {
+  width: 300px;
+
+  .@{ventSpace}-select-selector {
+    background: transparent !important;
+    border: none !important;
+    box-shadow: none !important;
+
+    .zxm-select-selection-item {
+      color: #fff !important;
+    }
+  }
+
+  .@{ventSpace}-select-arrow {
+    color: #fff !important;
+  }
+}
+
+:deep(.zxm-select-dropdown) {
+  background: #ffffff !important;
+  color: #fff !important;
+}

+ 2 - 2
src/views/vent/deviceManager/comment/FormModal.vue

@@ -57,9 +57,9 @@
   }
   .vent-form {
     // width: 100%;
-    max-height: 700px; 
+    max-height: 700px;
     overflow-y: auto;
-    
+
     .@{ventSpace}-select-selection-item {
       color: rgba(255, 255, 255, 1) !important;
     }

+ 45 - 49
src/views/vent/deviceManager/comment/warningTabel/BaseModal1.vue

@@ -1,10 +1,12 @@
 <template>
   <BasicModal @register="register" :title="title" :width="800" :min-height="400" v-bind="$attrs" @ok="onSubmit">
-    <BasicForm @register="registerForm" >
-      <template #monitor="{ model, field }" >
+    <BasicForm @register="registerForm">
+      <template #monitor="{ model, field }">
         <div class="vent-flex-row-between">
-          <Select ref="selectRef" disabled v-model:value="pointData" :options="option" style="width: calc(100% - 65px);" />
-          <a-button class="vent-margin-b-5" type="primary" @click="selectPoint(model['strtype'])" style="position: absolute; right: 0; top: 1px;">选择</a-button>
+          <Select ref="selectRef" disabled v-model:value="pointData" :options="option" style="width: calc(100% - 65px)" />
+          <a-button class="vent-margin-b-5" type="primary" @click="selectPoint(model['strtype'])" style="position: absolute; right: 0; top: 1px"
+            >选择</a-button
+          >
         </div>
       </template>
     </BasicForm>
@@ -13,44 +15,44 @@
 </template>
 <script lang="ts" setup>
   import { onMounted, ref, defineEmits, unref, nextTick } from 'vue';
-import { BasicForm, useForm } from '/@/components/Form/index';
-import { BasicModal, useModalInner, useModal } from '/@/components/Modal';
-import type { FormSchema } from '/@/components/Form/src/types/form';
-import { Select, message } from 'ant-design-vue';
-import DevicePointTable from './DevicePointTable.vue';
-import { workFacePointList } from './warning.api'
+  import { BasicForm, useForm } from '/@/components/Form/index';
+  import { BasicModal, useModalInner, useModal } from '/@/components/Modal';
+  import type { FormSchema } from '/@/components/Form/src/types/form';
+  import { Select, message } from 'ant-design-vue';
+  import DevicePointTable from './DevicePointTable.vue';
+  import { workFacePointList } from './warning.api';
 
   const props = defineProps({
     formSchemas: {
       type: Array as PropType<FormSchema[]>,
-      default: () => ([]),
+      default: () => [],
     },
     deviceId: { type: String },
     monitorType: {
       type: String,
-      default: '2'
-    }
-  })
-  const emit = defineEmits(['add', 'update', 'register'])
-  const option = ref<any[]>([])
-  const devicePointList = ref<any[]>([])
-  const pointData = ref<String[]>([])
-  const title = ref('')
-  const isUpdate = ref(false)
+      default: '2',
+    },
+  });
+  const emit = defineEmits(['add', 'update', 'register']);
+  const option = ref<any[]>([]);
+  const devicePointList = ref<any[]>([]);
+  const pointData = ref<String[]>([]);
+  const title = ref('');
+  const isUpdate = ref(false);
   // 注册 form
   const [registerForm, { resetFields, setFieldsValue, validate, getFieldsValue }] = useForm({
     schemas: props.formSchemas,
     showActionButtonGroup: false,
   });
-  
+
   // 注册 modal
   const [register, { setModalProps }] = useModalInner(async (data) => {
     isUpdate.value = unref(data.isUpdate);
     title.value = unref(data.title);
     await resetFields();
-    if(data.isUpdate){
+    if (data.isUpdate) {
       await setFieldsValue({ ...data.record });
-      pointData.value = [data.record['monitorId']]
+      pointData.value = [data.record['monitorId']];
 
       // debugger
       // 初始打开有数据时候要查点表
@@ -60,9 +62,7 @@ import { workFacePointList } from './warning.api'
       //     setPoint([item])
       //   }
       // })
-      
-
-    }else if(data.record){
+    } else if (data.record) {
       await setFieldsValue({ relId: data.record['relId'] || data.record['id'], monitorId: '' });
     }
   });
@@ -72,23 +72,23 @@ import { workFacePointList } from './warning.api'
   async function getDevicePointList(strtype) {
     try {
       const result = await workFacePointList({ deviceType: strtype, valueType: props.monitorType });
-      devicePointList.value = result
+      devicePointList.value = result;
     } catch (error) {
-      devicePointList.value = []
+      devicePointList.value = [];
     }
-  };
+  }
 
   async function onSubmit() {
     try {
-      const data = await getFieldsValue()
-      await setFieldsValue({...data, monitorId: pointData.value[0] })
+      const data = await getFieldsValue();
+      await setFieldsValue({ ...data, monitorId: pointData.value[0] });
       const values = await validate();
       setModalProps({ confirmLoading: true });
       // 提交表单
       if (!isUpdate.value) {
-        emit('add', 'add', values)
+        emit('add', 'add', values);
       } else {
-        emit('update', 'update',values)
+        emit('update', 'update', values);
       }
       // //关闭弹窗
       // closeModal();
@@ -100,31 +100,27 @@ import { workFacePointList } from './warning.api'
   }
 
   async function selectPoint(strtype) {
-    if(strtype){
-
-      await getDevicePointList(strtype)
-      openModal()
-    }else{
-      message.info('请先选择设备!')
+    if (strtype) {
+      await getDevicePointList(strtype);
+      openModal();
+    } else {
+      message.info('请先选择设备!');
     }
   }
 
   function setPoint(value) {
-    const data = value[0]
+    const data = value[0];
     option.value = [
       {
         value: data.id,
-        label: data.valuename
-      }
-    ]
+        label: data.valuename,
+      },
+    ];
     nextTick(() => {
-      pointData.value = [data.id]
-    })
+      pointData.value = [data.id];
+    });
   }
 
-  onMounted(async () => {
-    
-  });
-
+  onMounted(async () => {});
 </script>
 <style scoped lang="less"></style>

+ 3 - 4
src/views/vent/deviceManager/equipManager/component/FormModal.vue

@@ -15,7 +15,7 @@
   // 声明Emits
   const props = defineProps({
     formSchema: { type: Array },
-    record: {type: Object}
+    record: { type: Object },
   });
 
   const emit = defineEmits(['saveOrUpdate']);
@@ -50,7 +50,6 @@
       // setModalProps({ confirmLoading: false });
     }
   }
-
 </script>
 <style lang="less" scoped>
   @ventSpace: zxm;
@@ -62,9 +61,9 @@
     bottom: 0px !important;
   }
   .vent-form {
-    max-height: 700px; 
+    max-height: 700px;
     overflow-y: auto;
-    
+
     .@{ventSpace}-select-selection-item {
       color: rgba(255, 255, 255, 1) !important;
     }

+ 2 - 1
src/views/vent/deviceManager/fanTabel/fan.api.ts

@@ -2,7 +2,8 @@ import { defHttp } from '/@/utils/http/axios';
 import { Modal } from 'ant-design-vue';
 
 enum Api {
-  list = '/safety/ventanalyFan/list',
+  // list = '/safety/ventanalyFan/list',
+  list = '/safety/ventanalyDeviceInfo/list',
   save = '/safety/ventanalyFan/add',
   edit = '/safety/ventanalyFan/edit',
   deleteById = '/safety/ventanalyFan/delete',

+ 0 - 0
src/views/vent/gas/gasHome/gasHome.api.ts


+ 18 - 0
src/views/vent/gas/gasHome/gasHome.data.ts

@@ -0,0 +1,18 @@
+import { ref } from 'vue';
+export const navList = ref([
+  {
+    title: '智能监测管控',
+    pathName: 'gasHome',
+    isHover: false,
+  },
+  {
+    title: '抽采泵站管控',
+    pathName: 'gasPump',
+    isHover: false,
+  },
+  {
+    title: '抽采达标评判',
+    pathName: 'gasStandard',
+    isHover: false,
+  },
+]);

+ 40 - 0
src/views/vent/gas/gasHome/index.vue

@@ -0,0 +1,40 @@
+<template>
+  <div class="scene-box">
+    <customHeader
+      :fieldNames="{ label: 'systemname', value: 'id', options: 'children' }"
+      :options="options"
+      @change="getSelectRow"
+      :optionValue="optionValue"
+      >瓦斯抽采综合管控系统</customHeader
+    >
+    <div class="center-container"> </div>
+    <BottomMenu :navList="navList" @change="changeActive" />
+  </div>
+</template>
+<script lang="ts" setup>
+  import { ref, onMounted } from 'vue';
+  import customHeader from '/@/components/vent/customHeader.vue';
+  import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';
+  import { useSystemSelect } from '/@/hooks/vent/useSystemSelect';
+  import { navList } from './gasHome.data';
+
+  const activeKey = ref('gasHome');
+  const { options, optionValue, getSelectRow, getSysDataSource } = useSystemSelect('sys_surface_caimei'); // 参数为场景类型(设备类型管理中可以查询到)
+
+  function changeActive(activeValue) {
+    activeKey.value = activeValue;
+  }
+
+  onMounted(async () => {
+    await getSysDataSource();
+  });
+</script>
+
+<style lang="less" scoped>
+  .main-container {
+    .left-box {
+    }
+    .right-box {
+    }
+  }
+</style>

+ 47 - 0
src/views/vent/gas/gasPumpMonitor/components/monitor.vue

@@ -0,0 +1,47 @@
+<template>
+  <div class="monitor-container">
+    <div class="lr left-box">
+      <ventBox1>
+        <template #title>
+          <div>抽采泵信息</div>
+        </template>
+        <template #container> </template>
+      </ventBox1>
+      <ventBox1 class="vent-margin-t-10">
+        <template #title>
+          <div>泵站环境</div>
+        </template>
+        <template #container> </template>
+      </ventBox1>
+    </div>
+    <div class="lr right-box">
+      <div class="item-box sensor-container">
+        <ventBox1>
+          <template #title>
+            <div>自动模式</div>
+          </template>
+          <template #container> </template>
+        </ventBox1>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts" name="gas-pump-monitor">
+  import { ref, onMounted, defineProps } from 'vue';
+  import ventBox1 from '/@/components/vent/ventBox1.vue';
+
+  const props = defineProps({
+    deviceId: {
+      type: String,
+      require: true,
+    },
+  });
+
+  onMounted(async () => {});
+</script>
+
+<style lang="less" scoped>
+  @import '@/views/vent/monitorManager/comment/less/workFace.less';
+  @ventSpace: zxm;
+</style>

+ 0 - 0
src/views/vent/gas/gasPumpMonitor/gasPumpMonitor.api.ts


+ 18 - 0
src/views/vent/gas/gasPumpMonitor/gasPumpMonitor.data.ts

@@ -0,0 +1,18 @@
+import { ref } from 'vue';
+export const navList = ref([
+  {
+    title: '设备监测',
+    pathName: 'deviceMonitor',
+    isHover: false,
+  },
+  {
+    title: '历史查询',
+    pathName: 'history',
+    isHover: false,
+  },
+  {
+    title: '视频监测',
+    pathName: 'cameraMonitor',
+    isHover: false,
+  },
+]);

+ 64 - 0
src/views/vent/gas/gasPumpMonitor/index.vue

@@ -0,0 +1,64 @@
+<template>
+  <div class="scene-box">
+    <customHeader
+      :fieldNames="{ label: 'systemname', value: 'id', options: 'children' }"
+      :options="options"
+      @change="getSelectRow"
+      :optionValue="optionValue"
+      >瓦斯抽采泵监测系统</customHeader
+    >
+    <div class="center-container">
+      <template v-if="activeKey == 'deviceMonitor'">
+        <GasPumpMonitor :deviceId="optionValue" />
+      </template>
+      <div v-else class="history-group">
+        <div class="device-button-group" v-if="deviceList.length > 0 && activeKey !== 'faultRecord'">
+          <div
+            class="device-button"
+            :class="{ 'device-active': deviceActive == device.deviceType }"
+            v-for="(device, index) in deviceList"
+            :key="index"
+            @click="deviceChange(index)"
+            >{{ device.deviceName }}</div
+          >
+        </div>
+        <div class="history-container">
+          <HistoryTable
+            v-if="activeKey == 'history' && isRefresh"
+            ref="historyTable"
+            class="vent-margin-t-20"
+            :deviceId="optionValue"
+            :device-type="deviceType"
+          />
+        </div>
+      </div>
+    </div>
+    <BottomMenu :navList="navList" @change="changeActive" />
+  </div>
+</template>
+<script lang="ts" setup>
+  import { ref, onMounted } from 'vue';
+  import customHeader from '/@/components/vent/customHeader.vue';
+  import { useSystemSelect } from '/@/hooks/vent/useSystemSelect';
+  import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';
+  import HistoryTable from '../../monitorManager/comment/HistoryTable.vue';
+  import { navList } from './gasPumpMonitor.data';
+  import GasPumpMonitor from './components/monitor.vue';
+
+  const activeKey = ref('deviceMonitor');
+
+  const { options, optionValue, deviceType, isRefresh, deviceActive, deviceList, getSelectRow, getSysDataSource, deviceChange } =
+    useSystemSelect('sys_surface_caimei');
+
+  function changeActive(activeValue) {
+    activeKey.value = activeValue;
+  }
+  onMounted(async () => {
+    await getSysDataSource();
+  });
+</script>
+
+<style lang="less" scoped>
+  @import '../../comment/less/systemMonitor.less';
+  @ventSpace: zxm;
+</style>

+ 43 - 36
src/views/vent/home/clique/components/dialog-modal.vue

@@ -77,18 +77,18 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { ref, reactive,defineProps,watch } from 'vue';
+  import { ref, reactive, defineProps, watch } from 'vue';
   import { SvgIcon } from '/@/components/Icon';
   import { getAssetURL } from '/@/utils/ui';
 
-  let props=defineProps({
-    centerDetail:{
-      type:Object,
-      default:()=>{
-        return {}
-      }
-    }
-  })
+  let props = defineProps({
+    centerDetail: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  });
 
   // let modalTitle = ref('榆家梁矿');
   let modalTitle = ref('yjl');
@@ -157,33 +157,40 @@
     emit('closeDialog', false);
   }
 
-  watch(()=>props.centerDetail,(newC,oldC)=>{
-    console.log(newC,'地图区域详情数据-------')
-   if(JSON.stringify(newC)!='{}'){
-    modalCard[0]['value']=newC.sys_data.totallength
-    modalCard[1]['value']=0
-    modalCard[2]['value']=0
-    
-    labelM.value=newC.majorpath_data[0].deviceName
-    valueM.value=newC.majorpath_data[0].majorpath.drag_total
-    zlList[0]['value']=newC.majorpath_data[0].majorpath.drag_1
-    zlList[1]['value']=newC.majorpath_data[0].majorpath.drag_2
-    zlList[2]['value']=newC.majorpath_data[0].majorpath.drag_3
-    zlList[0]['percent']=(( zlList[0]['value'] / valueM.value )*100).toFixed(2)
-    zlList[1]['percent']=(( zlList[1]['value'] / valueM.value )*100).toFixed(2)
-    zlList[2]['percent']=(( zlList[2]['value'] / valueM.value )*100).toFixed(2)
-
-    windLfList[0].value=(newC.sys_data.xufengliang / parseFloat(newC.sys_data.zongfengliang) * 100).toFixed(2)
-    windLfList[1].value=((parseFloat(newC.sys_data.zongfengliang) - parseFloat(newC.sys_data.zonghuifeng)) / parseFloat(newC.sys_data.zonghuifeng) * 100 ).toFixed(2)
-
-    vent.value = newC.majorpath_data[0].majorpath.drag_total
-    gas.value = newC.majorpath_data[0].majorpath.m3_total
-    fire.value = Math.round(((1.19 *  gas.value) / 60 / Math.sqrt(vent.value)) * 100) / 100
-   }
-  },{
-    immediate:true,
-    deep:true
-  })
+  watch(
+    () => props.centerDetail,
+    (newC, oldC) => {
+      console.log(newC, '地图区域详情数据-------');
+      if (JSON.stringify(newC) != '{}') {
+        modalCard[0]['value'] = newC.sys_data.totallength;
+        modalCard[1]['value'] = 0;
+        modalCard[2]['value'] = 0;
+
+        labelM.value = newC.majorpath_data[0].deviceName;
+        valueM.value = newC.majorpath_data[0].majorpath.drag_total;
+        zlList[0]['value'] = newC.majorpath_data[0].majorpath.drag_1;
+        zlList[1]['value'] = newC.majorpath_data[0].majorpath.drag_2;
+        zlList[2]['value'] = newC.majorpath_data[0].majorpath.drag_3;
+        zlList[0]['percent'] = ((zlList[0]['value'] / valueM.value) * 100).toFixed(2);
+        zlList[1]['percent'] = ((zlList[1]['value'] / valueM.value) * 100).toFixed(2);
+        zlList[2]['percent'] = ((zlList[2]['value'] / valueM.value) * 100).toFixed(2);
+
+        windLfList[0].value = ((newC.sys_data.xufengliang / parseFloat(newC.sys_data.zongfengliang)) * 100).toFixed(2);
+        windLfList[1].value = (
+          ((parseFloat(newC.sys_data.zongfengliang) - parseFloat(newC.sys_data.zonghuifeng)) / parseFloat(newC.sys_data.zonghuifeng)) *
+          100
+        ).toFixed(2);
+
+        vent.value = newC.majorpath_data[0].majorpath.drag_total;
+        gas.value = newC.majorpath_data[0].majorpath.m3_total;
+        fire.value = Math.round(((1.19 * gas.value) / 60 / Math.sqrt(vent.value)) * 100) / 100;
+      }
+    },
+    {
+      immediate: true,
+      deep: true,
+    }
+  );
 </script>
 <style lang="less" scoped>
   @font-face {

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

@@ -35,7 +35,6 @@
   import { ref, reactive, defineProps, watch } from 'vue';
   import { SvgIcon } from '/@/components/Icon';
   import { getAssetURL } from '/@/utils/ui';
-  const modules = await import.meta.glob('/src/assets/images/home-container/warning/*', { eager: true });
   let props = defineProps({
     warnData: Array,
   });

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

@@ -35,7 +35,6 @@
 </template>
 
 <script lang="ts" setup>
-
   import { ref, reactive, onMounted, nextTick, defineProps, watch } from 'vue';
   import { SvgIcon } from '/@/components/Icon';
   import * as echarts from 'echarts';
@@ -72,15 +71,15 @@
           : selectData.readData.Fan2StartStatus && selectData.readData.Fan2StartStatus == '1'
           ? '2号风机'
           : '断开';
-      echartData.xdata = selectData.readData.windQuantity1;
-      echartData.ydata = selectData.readData.windQuantity2;
+      echartData.xdata = selectData.readData.windQuantity1 || selectData.readData.windQuantity1_merge;
+      echartData.ydata = selectData.readData.windQuantity2 || selectData.readData.windQuantity2_merge;
       getOption();
       // if (echartData.xdata && echartData.ydata) {
       //   getOption();
       // } else {
       //   isShowGif.value = true;
       // }
-    }else {
+    } else {
       isShowGif.value = true;
     }
   }
@@ -291,7 +290,7 @@
   watch(
     () => props.fandata,
     (val) => {
-      console.log('000999',val)
+      console.log('000999', val);
       fanList = val[0];
       fanTypeList.length = 0;
       fanList.forEach((el) => {

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

@@ -27,7 +27,7 @@
       <div class="point-des-box">
         <div>工况点</div>
         <div>负压: {{ selectDataObj.dataH }}</div>
-        <div>风量: {{ selectDataObj.dataQ }}</div>
+        <div>风量: {{ selectDataObj.dataQ * 60 }}</div>
       </div>
       <div class="main" ref="main"></div>
     </div>
@@ -57,6 +57,7 @@
   let main = ref<any>();
   //echart图表数据
   let echartData = reactive<any>({
+    xdata: [],
     ydata: [],
     ydata1: [],
   });
@@ -157,7 +158,7 @@
         color: ['#00bb00', '#ffbb00', '#ff0000', '#0000ff'],
         xAxis: [
           {
-            name: '风量\r\n(m³/s)\r\n',
+            name: '风量\r\n(m³/min)\r\n',
             nameTextStyle: {
               color: '#3df6ff',
               fontSize: 12,
@@ -182,6 +183,9 @@
                 color: '#b3b8cc',
                 fontSize: 14,
               },
+              formatter: function (value) {
+                return value * 60 + '';
+              },
             },
             type: 'value',
             min: 0,
@@ -219,7 +223,8 @@
             },
             type: 'value',
             min: 0,
-            max: 400,
+            // max: 400,
+            data: echartData.xdata,
           },
         ],
         yAxis: [
@@ -320,6 +325,7 @@
     let data = [];
     // 风压特性曲线2
     let data2 = [];
+    let datax = [];
 
     for (let i = 30; i <= 400; i++) {
       let x = i;
@@ -330,7 +336,9 @@
       let x = i;
       let y = (H1 / Q1 / Q1) * x * x;
       data.push([x, y]);
+      datax.push(x * 60);
     }
+    echartData.xdata = datax;
     echartData.ydata = data;
     echartData.ydata1 = data2;
     echartData.ydata2 = [[Q1, H1]];

+ 1 - 1
src/views/vent/monitorManager/alarmMonitor/index.vue

@@ -333,7 +333,7 @@
 
 <script setup lang="ts">
   import { ref, onMounted, onUnmounted, reactive } from 'vue';
-  import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+  import customHeader from '/@/components/vent/customHeader.vue';
   import DetailModal from './DetailModal.vue';
   import DetailModalFire from './DetailModalFire.vue'; //火灾监测弹窗
   import { getTotalList } from './alarm.api';

+ 2 - 3
src/views/vent/monitorManager/balancePressMonitor/balancePress.threejs.base.ts

@@ -226,8 +226,8 @@ class balancePressBase {
 
     const outCurve = [
       {
-        path0: new THREE.Vector3(-7555.818, -23.02, -54190.152).applyMatrix4(mesh.matrix),
-        path1: new THREE.Vector3(-7555.818, -23.02, -74165.96).applyMatrix4(mesh.matrix),
+        path0: new THREE.Vector3(-7555.818, -23.02, 11190.152).applyMatrix4(mesh.matrix),
+        path1: new THREE.Vector3(-7555.818, -23.02, 165.96).applyMatrix4(mesh.matrix),
         isSpread: true,
         spreadDirection: 1, // 1是由小变大,-1是由大变小
       },
@@ -314,7 +314,6 @@ class balancePressBase {
           setModalCenter(this.group);
           resolve(null);
           this.addLight();
-          this.addVideo();
         }
       });
     });

+ 0 - 9
src/views/vent/monitorManager/balancePressMonitor/components/balancePressHome.vue

@@ -74,9 +74,6 @@
             </template>
           </ventBox1>
         </div>
-        <div class="item-box vent-margin-t-10">
-          <LivePlayer id="fm-player1" style="height: 250px" ref="player1" :videoUrl="flvURL1()" muted live loading controls />
-        </div>
       </div>
     </div>
   </a-spin>
@@ -88,7 +85,6 @@
   import { mountedThree, destroy, setModelType, updateText, play } from '../balancePress.threejs';
   import { settingParam1, settingParam2, settingParam3, windowParam, localFanParam } from '../balancePress.data';
   import { list } from '../balancePress.api';
-  import LivePlayer from '@liveqing/liveplayer-v3';
 
   const props = defineProps({
     deviceId: {
@@ -114,11 +110,6 @@
     //
   };
 
-  const flvURL1 = () => {
-    return `https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv`;
-    // return ''
-  };
-
   // https获取监测数据
   let timer: null | NodeJS.Timeout = null;
   function getMonitor(flag?) {

+ 1 - 1
src/views/vent/monitorManager/balancePressMonitor/index.vue

@@ -37,7 +37,7 @@
 </template>
 
 <script setup lang="ts">
-import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+import customHeader from '/@/components/vent/customHeader.vue';
 import { onBeforeMount, ref, onMounted, onUnmounted, reactive, toRaw } from 'vue';
 import { list, getTableList } from './balancePress.api';
 import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';

+ 1 - 1
src/views/vent/monitorManager/beltTunMonitor/beltTun.data.ts

@@ -241,7 +241,7 @@ export const windColumns: BasicColumn[] = [
   },
   {
     title: '风量',
-    dataIndex: 'm³',
+    dataIndex: 'm3',
     width: 80,
     align: 'center',
   },

+ 0 - 1
src/views/vent/monitorManager/beltTunMonitor/beltTun.threejs.base.ts

@@ -269,7 +269,6 @@ class BeltFace {
 
   /* 点击 */
   mousedownModel(rayCaster: THREE.Raycaster) {
-    debugger;
     // const outlinePass = this.outlinePass;
     // const selectedObjects = [];
     // outlinePass.selectedObjects = selectedObjects;

+ 1 - 1
src/views/vent/monitorManager/beltTunMonitor/index.vue

@@ -49,7 +49,7 @@ import { onBeforeMount, ref, onMounted, onUnmounted, reactive, toRaw } from 'vue
 import { mountedThree, destroy, setModelType } from './beltTun.threejs';
 import { list, systemList, getTableList } from './beltTun.api';
 import { monitorNav } from './beltTun.data'
-import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+import customHeader from '/@/components/vent/customHeader.vue';
 import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';
 import beltTunVentHome from './components/beltTunVentHome.vue';
 import beltTunHome from './components/beltTunHome.vue';

+ 1 - 1
src/views/vent/monitorManager/chamberMonitor/index.vue

@@ -37,7 +37,7 @@
 </template>
 
 <script setup lang="ts">
-import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+import customHeader from '/@/components/vent/customHeader.vue';
 import { onBeforeMount, ref, onMounted, onUnmounted, reactive, toRaw } from 'vue';
 import { list } from './chamber.api';
 import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';

+ 35 - 10
src/views/vent/monitorManager/comment/AlarmHistoryTable.vue

@@ -16,6 +16,7 @@
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
   import { defHttp } from '/@/utils/http/axios';
   import dayjs from 'dayjs';
+  import { getAutoScrollContainer } from '/@/utils/common/compUtils';
 
   const props = defineProps({
     columnsType: {
@@ -75,8 +76,8 @@
         params: { sysId: props.sysId, deviceType: props.deviceType.startsWith('vehicle') ? 'location_normal' : props.deviceType },
       });
     }
+    deviceOptions.value = [];
     if (result) {
-      deviceOptions.value = [];
       deviceOptions.value = result.map((item) => {
         return {
           label: item['strinstallpos'],
@@ -87,10 +88,11 @@
         };
         // return { label: item['strname'], value: item['id']}
       });
-      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'] : '' });
     }
+    deviceOptions.value.unshift({ label: '--请选择设备--', value: '*', strtype: '', strinstallpos: '', devicekind: '' });
+    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'] : '' });
   }
 
   watch(
@@ -157,12 +159,33 @@
         // autoAdvancedCol: 2,
         schemas: [
           {
-            label: '时间范围',
-            field: 'createTime',
-            component: 'RangePicker',
-            defaultValue: [dayjs().subtract(1, 'day'), dayjs()],
+            field: 'createTime_begin',
+            label: '开始时间',
+            component: 'DatePicker',
+            defaultValue: dayjs().add(-30, 'day').format('YYYY-MM-DD HH:mm:ss'),
+            required: true,
             componentProps: {
+              showTime: true,
               valueFormat: 'YYYY-MM-DD HH:mm:ss',
+              getPopupContainer: getAutoScrollContainer,
+            },
+            colProps: {
+              span: 4,
+            },
+          },
+          {
+            field: 'createTime_end',
+            label: '结束时间',
+            component: 'DatePicker',
+            defaultValue: dayjs(),
+            required: true,
+            componentProps: {
+              showTime: true,
+              valueFormat: 'YYYY-MM-DD HH:mm:ss',
+              getPopupContainer: getAutoScrollContainer,
+            },
+            colProps: {
+              span: 4,
             },
           },
           {
@@ -170,13 +193,15 @@
             field: 'gdeviceid',
             component: 'Select',
             defaultValue: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '',
-            required: true,
             componentProps: {
               options: deviceOptions,
             },
+            colProps: {
+              span: 4,
+            },
           },
         ],
-        fieldMapToTime: [['createTime', ['createTime_begin', 'createTime_end'], '']],
+        // fieldMapToTime: [['createTime', ['createTime_begin', 'createTime_end'], '']],
       },
       fetchSetting: {
         listField: 'records',

+ 26 - 5
src/views/vent/monitorManager/comment/HandlerHistoryTable.vue

@@ -12,6 +12,7 @@
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
   import { defHttp } from '/@/utils/http/axios';
   import dayjs from 'dayjs';
+  import { getAutoScrollContainer } from '/@/utils/common/compUtils';
 
   const list = (params) => defHttp.get({ url: '/safety/ventanalyDevicesetLog/list', params });
 
@@ -106,12 +107,33 @@
         },
         schemas: [
           {
-            label: '时间范围',
-            field: 'createTime',
-            component: 'RangePicker',
-            defaultValue: [dayjs().subtract(1, 'day'), dayjs()],
+            field: 'createTime_begin',
+            label: '开始时间',
+            component: 'DatePicker',
+            defaultValue: dayjs().add(-30, 'day').format('YYYY-MM-DD HH:mm:ss'),
+            required: true,
             componentProps: {
+              showTime: true,
               valueFormat: 'YYYY-MM-DD HH:mm:ss',
+              getPopupContainer: getAutoScrollContainer,
+            },
+            colProps: {
+              span: 4,
+            },
+          },
+          {
+            field: 'createTime_end',
+            label: '结束时间',
+            component: 'DatePicker',
+            defaultValue: dayjs(),
+            required: true,
+            componentProps: {
+              showTime: true,
+              valueFormat: 'YYYY-MM-DD HH:mm:ss',
+              getPopupContainer: getAutoScrollContainer,
+            },
+            colProps: {
+              span: 4,
             },
           },
           // {
@@ -126,7 +148,6 @@
           //   },
           // },
         ],
-        fieldMapToTime: [['createTime', ['createTime_begin', 'createTime_end'], '']],
       },
       fetchSetting: {
         listField: 'records',

+ 427 - 410
src/views/vent/monitorManager/comment/HistoryTable.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="history-table" v-if="loading">
-    <BasicTable ref="historyTable" @register="registerTable" >
+    <BasicTable ref="historyTable" @register="registerTable">
       <template #bodyCell="{ column, record }">
         <slot name="filterCell" v-bind="{ column, record }"></slot>
       </template>
@@ -24,25 +24,25 @@
   import { onMounted } from 'vue';
 
   const globalConfig = inject('globalConfig');
-  
+
   const historyTable = ref();
-  const dataSource = ref([])
-  const loading = ref(false)
+  const loading = ref(false);
   const list = (params) => {
-    if(globalConfig.History_Type == 'vent') {
+    if (globalConfig.History_Type == 'vent') {
+      debugger;
       // return defHttp.get({ url: '/safety/ventanalyMonitorData/list', params })
-      return defHttp.get({ url: '/safety/ventanalyMonitorData/listdays', params })
+      return defHttp.get({ url: '/safety/ventanalyMonitorData/listdays', params });
     } else {
-      return defHttp.post({ url: '/ventanaly-device/history/getHistoryData', params })
+      return defHttp.post({ url: '/ventanaly-device/history/getHistoryData', params });
     }
   };
   const getExportXlsUrl = () => {
-    if(globalConfig.History_Type == 'vent') {
-      return '/safety/ventanalyMonitorData/exportXls'
+    if (globalConfig.History_Type == 'vent') {
+      return '/safety/ventanalyMonitorData/exportXls';
     } else {
-      return '/ventanaly-device/history/getHistoryData/exportXls'
+      return '/ventanaly-device/history/getHistoryData/exportXls';
     }
-  }
+  };
   const emit = defineEmits(['change']);
   const props = defineProps({
     columnsType: {
@@ -73,442 +73,458 @@
     },
     scroll: {
       type: Object,
-      default: { y: 0 }
+      default: { y: 0 },
     },
     formSchemas: {
       type: Array<FormSchema>,
-      default: () => []
-    }
+      default: () => [],
+    },
   });
-  const historyType = ref('')
-  const columns = ref([])
-  const tableScroll = props.scroll.y ? ref({ y: props.scroll.y - 100 }) : ref({})
-  let deviceOptions = ref([])
-  let deviceList = <any[]>[]
-  const deviceTypeStr = ref('')
+  const historyType = ref('');
+  const columns = ref([]);
+  const tableScroll = props.scroll.y ? ref({ y: props.scroll.y - 100 }) : ref({});
+  let deviceOptions = ref([]);
+  const deviceTypeStr = ref('');
 
   watch(
     () => {
       return props.columnsType;
     },
-    async(newVal) => {
-      if (!newVal) return
-      if(historyTable.value) getForm().resetFields()
-      await getDeviceList()
-      const column = getTableHeaderColumns(newVal.includes('_history') ? newVal : newVal + '_history')
+    async (newVal) => {
+      if (!newVal) return;
+      if (historyTable.value) getForm().resetFields();
+      await getDeviceList();
+      const column = getTableHeaderColumns(newVal.includes('_history') ? newVal : newVal + '_history');
       if (column && column.length < 1) {
-        const arr = newVal.split('_')
-        console.log('历史记录列表表头------------>', arr[0] + '_monitor')
+        const arr = newVal.split('_');
+        console.log('历史记录列表表头------------>', arr[0] + '_monitor');
         columns.value = getTableHeaderColumns(arr[0] + '_history');
       } else {
-        columns.value = column
+        columns.value = column;
       }
-      if(historyTable.value) reload()
+      if (historyTable.value) reload();
     },
     {
-      immediate: true
+      immediate: true,
     }
   );
 
   watch(historyType, (type) => {
-    if (!type) return
+    if (!type) return;
     // if (historyTable.value) getForm().resetFields()
-    const column = getTableHeaderColumns(type.includes('_history') ? type : type + '_history')
+    const column = getTableHeaderColumns(type.includes('_history') ? type : type + '_history');
     if (column && column.length < 1) {
-      const arr = type.split('_')
+      const arr = type.split('_');
       columns.value = getTableHeaderColumns(arr[0] + '_history');
     } else {
-      columns.value = column
+      columns.value = column;
     }
-    setColumns(columns.value)
-  })
+    setColumns(columns.value);
+  });
 
-  watch(() => props.scroll.y, (newVal) => {
-    if(newVal){
-      tableScroll.value = {y: newVal - 100 }
-    }else{
-      tableScroll.value = {}
+  watch(
+    () => props.scroll.y,
+    (newVal) => {
+      if (newVal) {
+        tableScroll.value = { y: newVal - 100 };
+      } else {
+        tableScroll.value = {};
+      }
     }
-  })
+  );
 
   async function getDeviceList() {
-    if( props.deviceType.split('_')[1] && props.deviceType.split('_')[1] === 'history') return
+    if (props.deviceType.split('_')[1] && props.deviceType.split('_')[1] === 'history') return;
     let result;
-    if(globalConfig.History_Type == 'vent'){
-      if(props.deviceListApi && !props.sysId){
-        const res = await props.deviceListApi()
-        if (res['records'] && res['records'].length > 0) result = res['records']
-      }else{
-        result = await defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType, pageSize: 9999 } })
+    if (globalConfig.History_Type == 'vent') {
+      if (props.deviceListApi && !props.sysId) {
+        const res = await props.deviceListApi();
+        if (res['records'] && res['records'].length > 0) result = res['records'];
+      } else {
+        result = await defHttp.get({
+          url: '/safety/ventanalyManageSystem/linkdevicelist',
+          params: { sysId: props.sysId, deviceType: props.deviceType, pageSize: 9999 },
+        });
       }
-    }else {
-      result = await defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType.startsWith('vehicle') ? 'location_normal' : props.deviceType } })
+    } else {
+      result = await defHttp.get({
+        url: '/safety/ventanalyManageSystem/linkdevicelist',
+        params: { sysId: props.sysId, deviceType: props.deviceType.startsWith('vehicle') ? 'location_normal' : props.deviceType },
+      });
     }
-    if(result){
-      deviceOptions.value = []
+    if (result) {
+      deviceOptions.value = [];
       deviceOptions.value = result.map((item) => {
-        return {label: item['strinstallpos'], value: item['id'], strtype: item['strtype'], strinstallpos: item['strinstallpos'],  devicekind: item['devicekind'] }
+        return {
+          label: item['strinstallpos'],
+          value: item['id'],
+          strtype: item['strtype'],
+          strinstallpos: item['strinstallpos'],
+          devicekind: item['devicekind'],
+        };
         // return { label: item['strname'], value: item['id']}
-      })
+      });
     }
-    (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'] : ''})
+    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
+
+  loading.value = true;
   // 列表页面公共参数、方法
   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 : [
-            // {
-            //   label: '查询日期',
-            //   field: 'tData',
-            //   component: 'DatePicker',
-            //   defaultValue: dayjs(),
-            //   colProps: {
-            //     span: 4,
-            //   },
-            //   componentProps: {
-            //     valueFormat: 'YYYY-MM-DD',
-            //   },
-            // },
-            {
-            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: '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: '间隔时间',
-              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,
+    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
+                  : [
+                      {
+                        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: '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: '间隔时间',
+                        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,
+                        },
+                      },
+                    ],
+              // fieldMapToTime: [['tickectDate', ['ttime_begin', 'ttime_end'], '']],
             },
-          ],
-          // 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 : props.deviceType + '*';
-          if(props.sysId){
-            params.sysId = props.sysId;
-          }
-        },
-        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,
+            fetchSetting: {
+              listField: 'datalist',
+              totalField: 'datalist.total',
             },
-            colProps: {
-              span: 4,
+            pagination: {
+              current: 1,
+              pageSize: 10,
+              pageSizeOptions: ['10', '30', '50', '100'],
+              showQuickJumper: false,
             },
-          },
-          {
-            field: 'endTime',
-            label: '结束时间',
-            component: 'DatePicker',
-            defaultValue: dayjs(),
-            required: true,
-            componentProps: {
-              showTime: true,
-              valueFormat: 'YYYY-MM-DD HH:mm:ss',
-              getPopupContainer: getAutoScrollContainer,
+            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;
             },
-            colProps: {
-              span: 4,
+            afterFetch(result) {
+              const resultItems = result['records'];
+              resultItems.map((item) => {
+                Object.assign(item, item['readData']);
+              });
+              console.log('result---------------->', result);
+              return resultItems;
             },
           },
-          {
-            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']
+          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,
+                        },
+                      },
+                      {
+                        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,
+                          // 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: '间隔时间',
+                        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,
+                        },
+                      },
+                    ],
             },
-            colProps: {
-              span: 4,
+            pagination: {
+              current: 1,
+              pageSize: 10,
+              pageSizeOptions: ['10', '30', '50', '100'],
+              showQuickJumper: false,
             },
-            // 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',
-                },
-              ],
+            // 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;
+              }
             },
-            colProps: {
-              span: 4,
+            afterFetch(result) {
+              return result;
             },
           },
-        ],
-      },
-      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
+          exportConfig: {
+            name: '历史列表',
+            url: getExportXlsUrl(),
+          },
         }
-      },
-      afterFetch(result) {
-        return result;
-      },
-      
-      },
-      exportConfig: {
-        name: '历史列表',
-        url: getExportXlsUrl(),
-      },
-    },
-    
   );
 
   //注册table数据
@@ -521,23 +537,24 @@
       console.log('[ data ] >', data);
     }
   });
-  onMounted(async() => {
-    if (!props.columnsType) {
-      await getDeviceList()
-      if(deviceOptions.value[0]) historyType.value = deviceOptions.value[0]['strtype'] || deviceOptions.value[0]['devicekind']
+  onMounted(async () => {
+    await getDeviceList();
+    debugger;
+    if (deviceOptions.value[0]) {
+      historyType.value = deviceOptions.value[0]['strtype'] || deviceOptions.value[0]['devicekind'];
     }
-  })
-  defineExpose({ setLoading })
+  });
+  defineExpose({ setLoading });
 </script>
 
 <style scoped lang="less">
   @import '/@/design/vent/color.less';
-  
+
   :deep(.@{ventSpace}-table-body) {
     height: auto !important;
   }
-  :deep(.zxm-picker){
-      height: 30px !important;
+  :deep(.zxm-picker) {
+    height: 30px !important;
   }
   .history-table {
     width: 100%;
@@ -566,17 +583,17 @@
         min-height: 0 !important;
       }
     }
-    .pagination-box{
+    .pagination-box {
       display: flex;
       justify-content: flex-end;
       align-items: center;
-      .page-num{
-        border: 1px solid #0090D8;
+      .page-num {
+        border: 1px solid #0090d8;
         padding: 4px 8px;
         margin-right: 5px;
-        color: #0090D8;
+        color: #0090d8;
       }
-      .btn{
+      .btn {
         margin-right: 10px;
       }
     }

+ 3 - 3
src/views/vent/monitorManager/comment/MonitorTable.vue

@@ -164,13 +164,13 @@
       },
       pagination: props.isShowPagination ? {
         current: 1,
-        pageSize: 10,
-        pageSizeOptions: ['10', '30', '50', '100'],
+        pageSize: 50,
+        pageSizeOptions: ['10', '30', '50', '100', '500'],
         showQuickJumper: false
       } : false,
       beforeFetch: (params) => {
         if(props.deviceType?.startsWith('safetymonitor')){
-          return Object.assign(params, { filterParams: {'dataTypeName': params['dataTypeName'], strinstallpos: params['strinstallpos'] } });
+          return Object.assign(params, { filterParams: {'dataTypeName': params['dataTypeName'], strinstallpos: '*'+params['strinstallpos']+'*' } });
         }else{
           return Object.assign(params, { column: 'createTime' });
         }

+ 0 - 97
src/views/vent/monitorManager/comment/MonitorTable1.vue

@@ -1,97 +0,0 @@
-<template>
-  <div class="monitor-table">
-    <!-- <BasicTable @register="registerTable" :rowSelection="rowSelection">
-      <template #action="{ record }">
-        <TableAction :actions="getActions(record)" :dropDownActions="getDropDownAction(record)" />
-      </template>
-    </BasicTable> -->
-    <!-- <a-table :row-selection="rowSelection" :columns="columns.value" :data-source="dataTableSource" row-key="dataIndex">
-      <template #name="{ text }">
-        <a>{{ text }}</a>
-      </template>
-    </a-table> -->
-  </div>
-</template>
-
-<script lang="ts" name="system-user" setup>
-  //ts语法
-  import { computed } from '@vue/reactivity';
-  import { debug } from 'console';
-  import { defineExpose, toRaw, watch, ref } from 'vue';
-  import { BasicColumn } from '/@/components/Table';
-  import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-
-  const props = defineProps({
-    columnsType: {
-      type: String,
-      required: true,
-    },
-    dataSource: {
-      type: Array,
-      required: true,
-    },
-    searchFormSchema: {
-      type: Array,
-      default: () => [],
-    },
-    list: {
-      type: Function,
-      // required: true,
-    },
-    designScope: {
-      type: String,
-    },
-    title: {
-      type: String,
-    },
-  });
-  const dataTableSource = ref([]);
-  watch(
-    () => props.dataSource,
-    (newVal) => {
-      const list = [];
-      newVal.forEach((item) => {
-        list.push(toRaw(item));
-      });
-      dataTableSource.value = list;
-    }
-  );
-  const columns = getTableHeaderColumns(props.columnsType);
-
-  /**
-   * 操作列定义
-   * @param record
-   */
-  function getActions(record) {
-    return [
-      {
-        label: '详情',
-        onClick: openDetail.bind(null, record),
-      },
-    ];
-  }
-
-  const rowSelection = {
-    onChange: (selectedRowKeys: [], selectedRows: BasicColumn[]) => {
-      console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
-    },
-    // getCheckboxProps: (record: BasicColumn) => ({
-    //   disabled: record.name === 'Disabled User', // Column configuration not to be checked
-    //   name: record.name,
-    // }),
-  };
-
-  function openDetail(record) {
-    record;
-  }
-</script>
-
-<style scoped lang="less">
-  @ventSpace: zxm;
-  :deep(.@{ventSpace}-table-body) {
-    height: auto !important;
-  }
-  .monitor-table {
-    width: 100%;
-  }
-</style>

+ 30 - 19
src/views/vent/monitorManager/comment/WorkFaceAlarmHistoryTable.vue

@@ -16,6 +16,7 @@
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
   import { defHttp } from '/@/utils/http/axios';
   import dayjs from 'dayjs';
+  import { getAutoScrollContainer } from '/@/utils/common/compUtils';
 
   const globalConfig = inject('globalConfig');
 
@@ -79,7 +80,6 @@
 
   async function getDeviceList() {
     let result;
-    debugger;
     if (globalConfig.History_Type == 'vent') {
       if (props.deviceListApi) {
         result = await props.deviceListApi();
@@ -131,37 +131,48 @@
         // autoAdvancedCol: 2,
         schemas: [
           {
-            label: '时间范围',
-            field: 'createTime',
-            component: 'RangePicker',
-            defaultValue: [dayjs().subtract(1, 'day'), dayjs()],
+            field: 'createTime_begin',
+            label: '开始时间',
+            component: 'DatePicker',
+            defaultValue: dayjs().add(-30, 'day').format('YYYY-MM-DD HH:mm:ss'),
+            required: true,
             componentProps: {
+              showTime: true,
               valueFormat: 'YYYY-MM-DD HH:mm:ss',
+              getPopupContainer: getAutoScrollContainer,
+            },
+            colProps: {
+              span: 4,
+            },
+          },
+          {
+            field: 'createTime_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: 'deviceId',
+            field: 'gdeviceid',
             component: 'Select',
             defaultValue: deviceOptions.value[0] ? deviceOptions.value[0]['value'] : '',
-            required: true,
             componentProps: {
               options: deviceOptions,
             },
+            colProps: {
+              span: 4,
+            },
           },
-          // {
-          //   label: '查询设备',
-          //   field: 'deviceId',
-          //   component: 'ApiSelect',
-          //   componentProps: {
-          //     api: props.deviceListApi,
-          //     resultField: 'records',
-          //     labelField: 'strname',
-          //     valueField: 'id',
-          //   },
-          // },
         ],
-        fieldMapToTime: [['createTime', ['starttime', 'endtime'], '']],
       },
       fetchSetting: {
         listField: 'records',

+ 43 - 31
src/views/vent/monitorManager/comment/WorkFaceHandlerHistoryTable.vue

@@ -11,7 +11,8 @@
   import { useListPage } from '/@/hooks/system/useListPage';
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
   import { defHttp } from '/@/utils/http/axios';
-
+  import { getAutoScrollContainer } from '/@/utils/common/compUtils';
+  import dayjs from 'dayjs';
 
   const list = (params) => defHttp.get({ url: '/safety/ventanalyDevicesetLog/list', params });
 
@@ -35,36 +36,36 @@
     },
     scroll: {
       type: Object,
-      default: () => {}
-    }
+      default: () => {},
+    },
   });
-  
-  const handlerHistory = ref()
-  const columns = ref([])
+
+  const handlerHistory = ref();
+  const columns = ref([]);
 
   watch(
     () => {
       return props.columnsType;
     },
     (newVal) => {
-      const column = getTableHeaderColumns(newVal)
+      const column = getTableHeaderColumns(newVal);
       if (column && column.length < 1) {
-        const arr = newVal.split('_')
+        const arr = newVal.split('_');
         const columnKey = arr.reduce((prev, cur, index) => {
           if (index !== arr.length - 2) {
-            return prev + '_' + cur
+            return prev + '_' + cur;
           } else {
-            return prev
+            return prev;
           }
-        })
+        });
         columns.value = getTableHeaderColumns(arr[0] + '_history');
       } else {
-        columns.value = column
+        columns.value = column;
       }
-      if (handlerHistory.value) reload()
+      if (handlerHistory.value) reload();
     },
     {
-      immediate: true
+      immediate: true,
     }
   );
 
@@ -93,24 +94,35 @@
         },
         schemas: [
           {
-            label: '时间范围',
-            field: 'createTime',
-            component: 'RangePicker',
+            field: 'createTime_begin',
+            label: '开始时间',
+            component: 'DatePicker',
+            defaultValue: dayjs().add(-30, 'day').format('YYYY-MM-DD HH:mm:ss'),
+            required: true,
             componentProps: {
+              showTime: true,
               valueFormat: 'YYYY-MM-DD HH:mm:ss',
+              getPopupContainer: getAutoScrollContainer,
+            },
+            colProps: {
+              span: 4,
+            },
+          },
+          {
+            field: 'createTime_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: 'ApiSelect',
-          //   componentProps: {
-          //     api: props.deviceListApi,
-          //     resultField: 'records',
-          //     labelField: 'strname',
-          //     valueField: 'id',
-          //   },
-          // },
         ],
         fieldMapToTime: [['createTime', ['createTime_begin', 'createTime_end'], '']],
       },
@@ -132,7 +144,7 @@
   });
   //注册table数据
   const [registerTable, { reload, setLoading }] = tableContext;
-  defineExpose({ setLoading })
+  defineExpose({ setLoading });
 </script>
 
 <style scoped lang="less">
@@ -141,8 +153,8 @@
   // :deep(.@{ventSpace}-table-body) {
   //   height: auto !important;
   // }
-  :deep(.zxm-picker){
-      height: 30px !important;
+  :deep(.zxm-picker) {
+    height: 30px !important;
   }
   .handler-history-table {
     width: 100%;

+ 1 - 1
src/views/vent/monitorManager/comment/components/reportInfo.vue

@@ -84,4 +84,4 @@ watch(() => props.editID, (newV, oldV) => {
 
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped></style>

+ 1 - 1
src/views/vent/monitorManager/compreMonitor/index.vue

@@ -45,7 +45,7 @@
 
 <script setup lang="ts">
 import { ref, onMounted, onUnmounted } from 'vue';
-import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+import customHeader from '/@/components/vent/customHeader.vue';
 import { param, httpParam, result1, result2 } from './compre.data'
 import { list } from './compre.api'
 import { formatNum } from '/@/utils/ventutil'

+ 25 - 17
src/views/vent/monitorManager/compressor/components/nitrogenHome_bet.vue

@@ -177,6 +177,7 @@
             </template>
           </ventBox1>
         </div>
+        <div ref="playerRef" class="player-box"></div>
       </div>
     </div>
   </div>
@@ -196,6 +197,8 @@ import { deviceControlApi } from '/@/api/vent/index';
 import { groupParameterData, deviceParameterData, downWindData } from '../nitrogen.data'
 import { message } from 'ant-design-vue';
 import lodash from 'lodash';
+import { useCamera } from '/@/hooks/system/useCamera';
+
 const globalConfig = inject('globalConfig');
 
 const props = defineProps({
@@ -208,6 +211,7 @@ const props = defineProps({
     require: true,
   },
 });
+const playerRef = ref();
 const refresh = ref(false)
 const modalTitle = ref(''); // 模态框标题显示内容,根据设备操作类型决定
 const modalType = ref(''); // 模态框内容显示类型,设备操作类型
@@ -243,6 +247,7 @@ let airCompressorState = reactive<any[]>([]);
 
 const propTypeArr = ref([])
 const chartsColumns = ref([])
+
 watch(monitorDataGroupNum, () => {
 
   const arr = <any[]>[]
@@ -270,33 +275,20 @@ watch(monitorDataGroupNum, () => {
 
 })
 
-
-
 const monitorData = ref(
   new Array(3).fill({
     // strName: '空压机',
     // cumulativeFlow: '-',
     // centerTemperature: '-',
     // outletTemperature: '-',
-    // Ia: '-',
-    // Ib: '-',
-    // Ic: '-',
-    // Vab: '-',
-    // Vac: '-',
-    // Vbc: '-',
-    // compressGroupName: '',
-    // compressExhaustPressF1: '-',
-    // compressSeparatePressF1: '-',
-    // compressHostTempF1: '-',
-    // compressCrewTempF1: '-',
-    // compressRunTimeF1: '-',
-    // controlModel: 'LOC'
   })
 );
 
 //图表数据
 let echartData = ref<any>([]);
 
+const { getCamera, removeCamera } = useCamera();
+
 // https获取监测数据
 let timer: null | NodeJS.Timeout = null;
 async function getMonitor(flag?) {
@@ -417,6 +409,7 @@ function handleOK(passWord, handlerState) {
     }
   });
 }
+
 function handleCancel() {
   modalIsShow.value = false;
   modalTitle.value = '';
@@ -437,10 +430,12 @@ onMounted(async () => {
   await mountedThree().then(() => {
     loading.value = false;
   });
+  await getCamera(props.deviceId, playerRef.value);
 });
 
 onUnmounted(() => {
   destroy();
+  removeCamera()
   if (timer) {
     clearTimeout(timer);
     timer = undefined;
@@ -505,6 +500,7 @@ onUnmounted(() => {
       overflow: hidden;
       display: flex;
       justify-content: space-between;
+      position: relative;
       // margin-top: 40px;
       .lr-box {
         height: 100%;
@@ -691,7 +687,7 @@ onUnmounted(() => {
       }
 
       .right-box {
-        width: 330px;
+        width: 310px;
         margin-top: 50px;
 
         .control-group {
@@ -752,7 +748,19 @@ onUnmounted(() => {
         margin-top: 80px;
       }
     }
-
+    .player-box {
+      position: absolute;
+      height: 100%;
+      width: 100%;
+      padding: 0 20px 0 20px;
+      z-index: 9999;
+      display: flex;
+      align-items: end;
+      :deep(#LivePlayerBox) {
+        display: flex;
+        justify-content: end;
+      }
+    }
     &:deep(.win) {
       width: 100%;
       margin: 0 !important;

+ 0 - 1
src/views/vent/monitorManager/compressor/components/nitrogenHome_dltj.vue

@@ -845,7 +845,6 @@
           }
         }
       }
-
       &:deep(.win) {
         width: 100%;
         margin: 0 !important;

+ 1 - 1
src/views/vent/monitorManager/compressor/index.vue

@@ -11,7 +11,7 @@
 </template>
 <script lang="ts" setup>
 import { ref, onMounted, onUnmounted, nextTick } from 'vue'
-import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+import customHeader from '/@/components/vent/customHeader.vue';
 import nitrogenEcharts from './components/nitrogenEcharts.vue'
 import nitrogenHistory from './components/nitrogenHistory.vue'
 import nitrogenHandleHistory from './components/nitrogenHandleHistory.vue'

+ 0 - 159
src/views/vent/monitorManager/compressor/nitrogen.data.new.ts

@@ -1,159 +0,0 @@
-
-  
-  export const nitrogenMonitorData = [
-    {
-      title: '管道温度',
-      code: 'pipe_temperature',
-      unit: '℃',
-    },
-    {
-      title: '管道压力',
-      code: 'pipe_pressure',
-      unit: 'MPa',
-    },
-    {
-      title: '氮气流量',
-      code: 'nitrogen_flow_rate',
-      unit: 'm³',
-    },
-    {
-      title: '氮气浓度',
-      code: 'nitrogen_concentration',
-      unit: '%',
-    },
-    {
-        title: '电动排氮阀开度',
-        code: 'nitrogen_discharge_opening',
-        unit: '--',
-      },
-  ];
-
-  export const preMonitorList = [
-    {
-      title: `主机温度`,
-      code: `host_temperature`,
-      unit: '℃',
-      child: [],
-    },
-    {
-      title: `排气压力`,
-      code: `exhaust_pressure`,
-      unit: 'MPa',
-      child: [],
-    },
-    {
-        title: `管道温度`,
-        code: `pipe_temperature`,
-        unit: '℃',
-        child: [],
-      },
-      {
-        title: `管道压力`,
-        code: `pipe_pressure`,
-        unit: 'MPa',
-        child: [],
-      },
-    {
-      title: `电机定子温度`,
-      code: `stator_temperature`,
-      unit: '℃',
-      child: [],
-    },
-    {
-      title: `电机前端轴承温度`,
-      code: `front_axle_temperature`,
-      unit: '℃',
-      child: [],
-    },
-    {
-        title: `电机后端轴承温度`,
-        code: `rear_axle_temperature`,
-        unit: '℃',
-        child: [],
-      },
-     
-    // {
-    //   code: 'signal',
-    //   child: [
-    //     {
-    //       title: `加载/卸载:`,
-    //       code: `LoadorUnload`,
-    //       isFault: -1,
-    //     },
-    //     {
-    //       title: `控制方式:`,
-    //       code: `CtrlMode`,
-    //       isFault: -2,
-    //     },
-    //   ],
-    // },
-    // {
-    //   code: 'signal',
-    //   child: [
-    //     {
-    //       title: `运行信号:`,
-    //       code: `Status`,
-    //       isFault: false,
-    //     },
-    //     {
-    //       title: `排气压力过高:`,
-    //       code: `ExhaustPreHighFault`,
-    //       isFault: true,
-    //     },
-    //   ],
-    // },
-  ];
-  export const preFanMonitorData = [
-    {
-      title: '运行状态',
-      code: 'operation_shutdown',
-      unit: '',
-    },
-    {
-        title: '运行时间',
-        code: 'operation_hours',
-        unit: 'h',
-      },
-    {
-      title: '油压未建立故障',
-      code: 'oil_pressure_not_established',
-      unit: 'signal',
-    },
-    {
-      title: '排气压力超限故障',
-      code: 'exhaust_pressure_exceeding_limit',
-      unit: 'signal',
-    },
-    {
-      title: '相序故障',
-      code: 'phase-sequence_protection',
-      unit: 'signal',
-    },
-    {
-        title: '风机1过载故障',
-        code: 'fan1_overload',
-        unit: 'signal',
-      },
-      {
-        title: '风机2过载故障',
-        code: 'fan2_overload',
-        unit: 'signal',
-      },
-      {
-        title: '风机3过载故障',
-        code: 'fan3_overload',
-        unit: 'signal',
-      },
-      {
-        title: '风机4过载故障',
-        code: 'fan4_overload',
-        unit: 'signal',
-      },
-      {
-        title: '高压柜故障',
-        code: 'hvc_malfunction',
-        unit: 'signal',
-      },
-  
-  ];
-  

+ 7 - 2
src/views/vent/monitorManager/compressor/nitrogen.data.ts

@@ -201,7 +201,8 @@ export const zhudanOption = reactive({
 
 export function getMonitorComponent() {
   const { sysOrgCode } = useGlobSetting();
-  console.log(sysOrgCode,'sysOrgCode----------------------')
+  debugger;
+  console.log(sysOrgCode, 'sysOrgCode----------------------');
   let nitrogenHome;
   switch (sysOrgCode) {
     case 'sdmtjtdltmk': //大柳塔井
@@ -216,9 +217,13 @@ export function getMonitorComponent() {
     case 'sdmtjtbltmk': // 补连塔
       nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_blt.vue'));
       return nitrogenHome;
+    case 'lahgjtlnmy': // 潞宁
+      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_ln.vue'));
+      return nitrogenHome;
     default:
       // nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_dltj.vue'));
-      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_new.vue'));
+      // nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_new.vue'));
+      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome_bet.vue'));
       return nitrogenHome;
   }
 }

+ 64 - 0
src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts

@@ -325,6 +325,70 @@ export const haveDetailArr = [
   'safetymonitor',
   'nitrogen',
 ];
+
+export const locationFormConfig = {
+  labelAlign: 'left',
+  showAdvancedButton: false,
+  showResetButton: true,
+  showSubmitButton: false,
+  size: 'small',
+  // baseColProps: {
+  //   // offset: 0.5,
+  //   xs: 24,
+  //   sm: 24,
+  //   md: 24,
+  //   lg: 9,
+  //   xl: 7,
+  //   xxl: 4,
+  // },
+  schemas: [
+    {
+      label: '人员名称',
+      field: 'strname',
+      component: 'Input',
+    },
+    {
+      label: '分站名称',
+      field: 'stationname',
+      component: 'Input',
+    },
+  ],
+  colProps: {
+    span: 4,
+  },
+};
+
+export const vehicleFormConfig = {
+  labelAlign: 'left',
+  showAdvancedButton: false,
+  showResetButton: true,
+  showSubmitButton: false,
+  // size: 'small',
+  // baseColProps: {
+  //   // offset: 0.5,
+  //   xs: 24,
+  //   sm: 24,
+  //   md: 24,
+  //   lg: 9,
+  //   xl: 7,
+  //   xxl: 4,
+  // },
+  schemas: [
+    {
+      label: '车辆名称',
+      field: 'strname',
+      component: 'Input',
+    },
+    {
+      label: '分站名称',
+      field: 'stationname',
+      component: 'Input',
+    },
+  ],
+  colProps: {
+    span: 4,
+  },
+};
 export const haveHandlerArr = ['windrect', 'window', 'gate', 'fanlocal', 'fanmain', 'pump', 'obfurage', 'nitrogen', 'pulping', 'spray', 'dustdev']; // table无操作
 export const noWarningArr = ['location', 'vehicle', 'cheliang']; // 无预警详情的
 export const haveSysDetailArr = ['']; //有场景详情的

+ 40 - 4
src/views/vent/monitorManager/deviceMonitor/components/device/index.vue

@@ -45,7 +45,7 @@
         </div>
       </div>
     </div>
-
+    
     <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 230, scroll, 125)" id="monitorBox">
       <!-- <dv-border-box8 :dur="5"  :style="`padding: 5px; height: ${scroll.y + 100}px`" > -->
       <div :style="`padding: 5px; height: ${scroll.y + 100}px`">
@@ -94,7 +94,7 @@
               <a-table :columns="majorColumns" :data-source="dataSource" bordered :scroll="{ y: scroll.y - 30 }" :pagination="false"></a-table>
             </template>
             <template v-else-if="deviceType.startsWith('safetymonitor') && activeKey == '1'">
-              <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :dataSource="dataSource"
+              <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :deviceType="deviceType" :dataSource="dataSource"
                 design-scope="device_monitor" :isShowActionColumn="true" :isShowSelect="false" title="设备监测" 
                 :form-config="formConfig" :scroll="{ y: scroll.y - 110 }">
                 <template #action="{ record }">
@@ -127,6 +127,34 @@
                 </template>
               </MonitorTable>
             </template>
+            <template v-else-if="deviceType.startsWith('location') && activeKey == '1'">
+              <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :deviceType="deviceType" :dataSource="dataSource"
+                design-scope="device_monitor" :isShowActionColumn="true" :isShowSelect="false" title="设备监测" 
+                :form-config="locationFormConfig" :scroll="{ y: scroll.y - 110 }">
+                <template #action="{ record }">
+                  <TableAction :actions=" [
+                    {
+                      label: '定位',
+                      onClick: goLocation.bind(null, record),
+                    },
+                  ]" />
+                </template>
+              </MonitorTable>
+            </template>
+            <template v-else-if="deviceType.startsWith('vehicle') && activeKey == '1'">
+              <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :deviceType="deviceType" :dataSource="dataSource"
+                design-scope="device_monitor" :isShowActionColumn="true" :isShowSelect="false" title="设备监测" 
+                :form-config="vehicleFormConfig" :scroll="{ y: scroll.y - 110 }">
+                <template #action="{ record }">
+                  <TableAction :actions=" [
+                    {
+                      label: '定位',
+                      onClick: goLocation.bind(null, record),
+                    },
+                  ]" />
+                </template>
+              </MonitorTable>
+            </template>
             <template v-else>
               <!-- 工作面echarts图标 -->
               <BarAndLine
@@ -298,7 +326,7 @@ import { SvgIcon } from '/@/components/Icon';
 import { getActions } from '/@/qiankun/state';
 import { useRouter } from 'vue-router';
 import { setDivHeight } from '/@/utils/event';
-import { majorColumns, haveSysDetailArr, haveDetailArr, haveHandlerArr, noWarningArr, surfaceChartsColumns, noHistoryArr, getMonitorComponent } from  './device.data'
+import { majorColumns, haveSysDetailArr, haveDetailArr, haveHandlerArr, noWarningArr, surfaceChartsColumns, noHistoryArr, getMonitorComponent, locationFormConfig, vehicleFormConfig } from  './device.data'
 import mainPath from './modal/mainPath.vue'
 import { formConfig } from '../../../safetyMonitor/safety.data'
 import { getDictItemsByCode } from '/@/utils/dict';
@@ -530,7 +558,15 @@ async function getDataSource() {
         // 安全监控
         const formData = monitorTable.value.getForm()
         searchForm = formData.getFieldsValue()
-        resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', filterParams: { ...searchForm } })
+        if(deviceType.value.startsWith('safetymonitor')){
+          resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', filterParams: { ...searchForm } })
+        }else if(deviceType.value.startsWith('location') || deviceType.value.startsWith('vehicle')) {
+          const {strname, stationname} = searchForm
+          // resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', strname: strname? '*'+strname+'*':'', stationname: stationname? '*'+stationname+'*':''  })
+          resultData = await list({ devicetype: deviceType.value, pagetype: 'normal', ...searchForm})
+        }else{
+          resultData = await list({ devicetype: deviceType.value, pagetype: 'normal'})
+        }
       }else{
         // 非安全监控
         resultData = await list({ devicetype: deviceType.value, pagetype: 'normal'})

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

@@ -45,7 +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" :class="{'signal-round-run': Number(pageData.dTotalArea) <= 2, 'signal-round-red': Number(pageData.dTotalArea) > 2 }"></span> -->
+                      <span class="signal-round signal-round-run"></span>
                     </div>
                     <div v-if="data.code == 'resistance'" class="item-value">{{ totalPa }}</div>
                   </div>

+ 114 - 108
src/views/vent/monitorManager/fanLocalMonitor/components/DetailModal.vue

@@ -1,8 +1,8 @@
 <template>
-  <BasicModal @register="register"  title="风机详情" width="1600px" v-bind="$attrs" @ok="onSubmit" @cancel="onSubmit" :defaultFullscreen="true">
+  <BasicModal @register="register" title="风机详情" width="1600px" v-bind="$attrs" @ok="onSubmit" @cancel="onSubmit" :defaultFullscreen="true">
     <div class="detail-box">
       <div class="left-box">
-        <SvgPreview :data-model="data_model" :canvas-drag="false"/>
+        <SvgPreview :data-model="data_model" :canvas-drag="false" />
       </div>
       <div class="right-box" v-if="activeBox == 1">
         <div class="right-title">二部胶带机移变移动变电站控制详情</div>
@@ -16,7 +16,7 @@
           <div class="right-detail-box">
             <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
               <a-tab-pane key="1" tab="运行状态">
-                <div class=" detail-state">
+                <div class="detail-state">
                   <div class="detail-item">
                     <div class="item-title">高压侧</div>
                     <div class="vent-flex-row-between detail-item-row">
@@ -59,34 +59,33 @@
               </a-tab-pane>
               <a-tab-pane key="2" tab="保护使能">
                 <div class="detail-state">
-                    <div class="detail-item">
-                      <div class="item-title">高压侧</div>
-                      <div class="vent-flex-row-between detail-item-row">
-                        <div>运行状态</div>
-                        <div>正常</div>
-                      </div>
-                      <div v-for="(item, key) in protectionEnableH" :key="key" class="vent-flex-row-between detail-item-row">
-                        <div>{{ item.title }}</div>
-                        <div>-</div>
-                      </div>
+                  <div class="detail-item">
+                    <div class="item-title">高压侧</div>
+                    <div class="vent-flex-row-between detail-item-row">
+                      <div>运行状态</div>
+                      <div>正常</div>
                     </div>
-                    <div class="detail-item">
-                      <div class="item-title">低压侧</div>
-                      <div class="vent-flex-row-between detail-item-row">
-                        <div>运行状态</div>
-                        <div>正常</div>
-                      </div>
-                      <div v-for="(item, key) in protectionEnableL" :key="key" class="vent-flex-row-between detail-item-row">
-                        <div>{{ item.title }}</div>
-                        <div>-</div>
-                      </div>
+                    <div v-for="(item, key) in protectionEnableH" :key="key" class="vent-flex-row-between detail-item-row">
+                      <div>{{ item.title }}</div>
+                      <div>-</div>
                     </div>
                   </div>
+                  <div class="detail-item">
+                    <div class="item-title">低压侧</div>
+                    <div class="vent-flex-row-between detail-item-row">
+                      <div>运行状态</div>
+                      <div>正常</div>
+                    </div>
+                    <div v-for="(item, key) in protectionEnableL" :key="key" class="vent-flex-row-between detail-item-row">
+                      <div>{{ item.title }}</div>
+                      <div>-</div>
+                    </div>
+                  </div>
+                </div>
               </a-tab-pane>
             </a-tabs>
           </div>
         </div>
-        
       </div>
       <div class="right-box" v-if="activeBox == 2">
         <div class="right-title">电光馈电</div>
@@ -99,9 +98,11 @@
           <div class="right-detail-box">
             <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
               <a-tab-pane key="1" tab="运行状态">
-                <template v-for="(electric, key) in electricMonitor " :key="index">
+                <template v-for="(electric, key) in electricMonitor" :key="index">
                   <div class="padding-20">
-                    <a-divider style="border-color: #1580CC; color: #49b3ff; font-weight: 600; font-size: 14px;"  orientation="left">{{ key }}</a-divider>
+                    <a-divider style="border-color: #1580cc; color: #49b3ff; font-weight: 600; font-size: 14px" orientation="left">{{
+                      key
+                    }}</a-divider>
                     <div class="data-group">
                       <div class="data-item" v-for="(item, index) in electric" :key="index">
                         <div class="title">{{ item.title }}</div>
@@ -116,7 +117,7 @@
               </a-tab-pane>
               <a-tab-pane key="2" tab="定值设定">
                 <div class="padding-20">
-                  <a-divider style="border-color: #1580CC; color: #49b3ff; font-weight: 600; font-size: 14px;"  orientation="left">保护状态</a-divider>
+                  <a-divider style="border-color: #1580cc; color: #49b3ff; font-weight: 600; font-size: 14px" orientation="left">保护状态</a-divider>
                   <div class="data-group">
                     <div class="data-item" v-for="(item, index) in electricState" :key="index">
                       <div class="title">{{ item.title }}</div>
@@ -140,26 +141,30 @@
           <div class="right-detail-box">
             <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
               <a-tab-pane key="1" tab="运行状态">
-                <div class=" detail-state">
+                <div class="detail-state">
                   <div class="detail-item">
                     <div class="item-title">备风机</div>
-                    <template v-for="(fanState, key) in fanControlState1 " :key="index">
-                    <div class="padding-20">
-                      <a-divider style="border-color: #1580CC; color: #49b3ff; font-weight: 600; font-size: 14px;"  orientation="left">{{ key }}</a-divider>
-                      <div class="data-group data-group1">
-                        <div class="data-item" v-for="(item, key1) in fanState" :key="key1">
-                          <div class="title">{{ key1 }}</div>
-                          <div class="value" v-for="(obj, key2) in item" :key="key2">{{ obj.value }}</div>
+                    <template v-for="(fanState, key) in fanControlState1" :key="index">
+                      <div class="padding-20">
+                        <a-divider style="border-color: #1580cc; color: #49b3ff; font-weight: 600; font-size: 14px" orientation="left">{{
+                          key
+                        }}</a-divider>
+                        <div class="data-group data-group1">
+                          <div class="data-item" v-for="(item, key1) in fanState" :key="key1">
+                            <div class="title">{{ key1 }}</div>
+                            <div class="value" v-for="(obj, key2) in item" :key="key2">{{ obj.value }}</div>
+                          </div>
                         </div>
                       </div>
-                    </div>
-                  </template>
+                    </template>
                   </div>
                   <div class="detail-item">
                     <div class="item-title">主风机</div>
-                    <template v-for="(fanState, key) in fanControlState2 " :key="index">
+                    <template v-for="(fanState, key) in fanControlState2" :key="index">
                       <div class="padding-20">
-                        <a-divider style="border-color: #1580CC; color: #49b3ff; font-weight: 600; font-size: 14px;"  orientation="left">{{ key }}</a-divider>
+                        <a-divider style="border-color: #1580cc; color: #49b3ff; font-weight: 600; font-size: 14px" orientation="left">{{
+                          key
+                        }}</a-divider>
                         <div class="data-group data-group1">
                           <div class="data-item" v-for="(item, key1) in fanState" :key="key1">
                             <div class="title">{{ key1 }}</div>
@@ -173,77 +178,80 @@
               </a-tab-pane>
               <a-tab-pane key="2" tab="保护使能">
                 <div class="detail-state">
-                    <div class="detail-item">
-                      <div class="item-title">主风机</div>
-                      <div v-for="(item, key) in fanSetting1" :key="key" class="vent-flex-row-between detail-item-row">
-                        <div>{{ item.title }}</div>
-                        <div class="value">{{ item.value }}</div>
-                      </div>
+                  <div class="detail-item">
+                    <div class="item-title">主风机</div>
+                    <div v-for="(item, key) in fanSetting1" :key="key" class="vent-flex-row-between detail-item-row">
+                      <div>{{ item.title }}</div>
+                      <div class="value">{{ item.value }}</div>
                     </div>
-                    <div class="detail-item">
-                      <div class="item-title">备风机</div>
-                      <div v-for="(item, key) in fanSetting2" :key="key" class="vent-flex-row-between detail-item-row">
-                        <div>{{ item.title }}</div>
-                        <div class="value">{{ item.value }}</div>
-                      </div>
+                  </div>
+                  <div class="detail-item">
+                    <div class="item-title">备风机</div>
+                    <div v-for="(item, key) in fanSetting2" :key="key" class="vent-flex-row-between detail-item-row">
+                      <div>{{ item.title }}</div>
+                      <div class="value">{{ item.value }}</div>
                     </div>
                   </div>
+                </div>
               </a-tab-pane>
             </a-tabs>
           </div>
         </div>
-      
       </div>
     </div>
   </BasicModal>
 </template>
 <script lang="ts" setup>
+  import { onMounted, ref, defineEmits, onUnmounted, watch } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import {
+    transformMobileH,
+    transformMobileL,
+    protectionEnableH,
+    protectionEnableL,
+    electricMonitor,
+    electricState,
+    fanControlState1,
+    fanControlState2,
+    fanSetting1,
+    fanSetting2,
+    data_model,
+  } from '../fanLocal.data.ts';
+  import { SvgPreview } from 'mky-svg';
 
-import { onMounted, ref, defineEmits, onUnmounted, watch } from 'vue';
-import { BasicModal, useModalInner } from '/@/components/Modal';
-import { transformMobileH, transformMobileL, protectionEnableH, protectionEnableL, electricMonitor, electricState, fanControlState1, fanControlState2, fanSetting1, fanSetting2, data_model } from '../fanLocal.data.ts'
-import { SvgPreview } from 'mky-svg'
-
-const emit = defineEmits(['close', 'register'])
-const props = defineProps({
-  
-})
-const activeKey = ref('1')
-const activeBox = ref(3)
-// 注册 modal
-const [register, { closeModal }] = useModalInner();
-
-const tabChange = (key) => {
-  activeKey.value = key
-}
-
-async function onSubmit() {
-  emit('close')
-  closeModal();
-}
+  const emit = defineEmits(['close', 'register']);
+  const props = defineProps({});
+  const activeKey = ref('1');
+  const activeBox = ref(3);
+  // 注册 modal
+  const [register, { closeModal }] = useModalInner();
 
-onMounted(async () => {
+  const tabChange = (key) => {
+    activeKey.value = key;
+  };
 
-});
-onUnmounted(() => {
+  async function onSubmit() {
+    emit('close');
+    closeModal();
+  }
 
-});
+  onMounted(async () => {});
+  onUnmounted(() => {});
 </script>
 <style scoped lang="less">
-
   @import '/@/design/vent/color.less';
   @import '/@/design/vent/modal.less';
   @import 'mky-svg/style.css';
-  
+
   @ventSpace: zxm;
-  .detail-box{
+  .detail-box {
     width: 100%;
     height: 100%;
     padding: 10px;
     display: flex;
     justify-content: space-between;
-    
-    .left-box{
+
+    .left-box {
       width: 800px;
       height: 100%;
       // height: initial;
@@ -254,10 +262,10 @@ onUnmounted(() => {
       font-size: 30px;
       margin-right: 10px;
     }
-    .right-box{
+    .right-box {
       flex: 1;
       height: 100%;
-      .right-title{
+      .right-title {
         line-height: 60px;
         background: #ffffff11;
         margin-bottom: 2px;
@@ -266,12 +274,12 @@ onUnmounted(() => {
         letter-spacing: 2px;
         color: #f0f0f0;
       }
-      .detail-container{
+      .detail-container {
         height: calc(100% - 60px);
         display: flex;
         justify-content: space-between;
-        
-        .detail-control{
+
+        .detail-control {
           width: 300px;
           height: initial;
           display: flex;
@@ -279,77 +287,75 @@ onUnmounted(() => {
           background: #ffffff11;
           margin-right: 10px;
           padding: 10px;
-          .control-item{
-
+          .control-item {
           }
         }
-        .right-detail-box{
+        .right-detail-box {
           flex: 1;
           background: #ffffff11;
           padding-bottom: 40px;
-          .detail-state{
+          .detail-state {
             width: 100%;
             display: flex;
             justify-content: space-between;
           }
-          .detail-item{
+          .detail-item {
             flex: 1;
             padding: 0 40px;
             color: #fff;
-            .item-title{
+            .item-title {
               line-height: 60px;
               font-size: 24px;
               text-align: center;
             }
-            .detail-item-row{
+            .detail-item-row {
               padding: 10px 0;
             }
           }
-          
         }
       }
-      .value{
+      .value {
         color: #00eefffe;
       }
     }
   }
 
-  .data-group{
+  .data-group {
     display: flex;
     flex-wrap: wrap;
     justify-content: space-between;
     padding: 0 20px 8px 20px;
     color: #fff;
-    .data-item{
+    .data-item {
       width: calc(50% - 20px);
       display: flex;
       justify-content: space-between;
       line-height: 24px;
-      background-image: linear-gradient(to right, #39A3FF00, #39A3FF10, #39A3FF02);
+      background-image: linear-gradient(to right, #39a3ff00, #39a3ff10, #39a3ff02);
       margin: 4px 0;
     }
-    .value{
+    .value {
       color: #00eefffe;
     }
-    .data-item1{
+    .data-item1 {
       width: 100%;
       line-height: 24px;
-      background-image: linear-gradient(to right, #39A3FF00, #39A3FF10, #39A3FF02);
+      background-image: linear-gradient(to right, #39a3ff00, #39a3ff10, #39a3ff02);
       margin: 4px 0;
     }
   }
-  .data-group1{
-    .data-item{
+  .data-group1 {
+    .data-item {
       width: calc(100% - 20px);
-      .title{
+      .title {
         width: 80px;
       }
     }
   }
-  .padding-20{
+  .padding-20 {
     padding: 20px;
   }
-  .tabs-box{
+  .tabs-box {
     width: 100%;
   }
   :deep(.@{ventSpace}-tabs-nav) {

+ 7 - 61
src/views/vent/monitorManager/fanLocalMonitor/fanLocal.three.ts

@@ -420,23 +420,23 @@ const initFly = async () => {
     {
       path0: new THREE.Vector3(93.164, 0.85, -12.962),
       path1: new THREE.Vector3(86.39, 0.827, -12.962),
-      isSpread: true,
-      spreadDirection: 1,
+      isSpread: false,
+      spreadDirection: 0,
     },
     {
       path0: new THREE.Vector3(86.39, 0.827, -12.962),
-      path1: new THREE.Vector3(83.341, 0.847, -16.281),
+      path1: new THREE.Vector3(83.341, 0.847, -17.658),
       isSpread: false,
       spreadDirection: 0,
     },
     {
-      path0: new THREE.Vector3(83.341, 0.847, -16.858),
-      path1: new THREE.Vector3(-29.077, 0.847, -16.227),
+      path0: new THREE.Vector3(83.341, 0.847, -17.658),
+      path1: new THREE.Vector3(-29.077, 0.847, -17.658),
       isSpread: false,
       spreadDirection: 0,
     },
     {
-      path0: new THREE.Vector3(-29.077, 0.847, -16.227),
+      path0: new THREE.Vector3(-29.077, 0.847, -17.658),
       path1: new THREE.Vector3(-29.64, 0.827, -39.047),
       isSpread: false,
       spreadDirection: 0,
@@ -457,7 +457,7 @@ const initFly = async () => {
   }
 
   if (!returnSmoke) {
-    returnSmoke = new Smoke('/model/img/texture-smoke.png', '#777777', 0, 0.8, 0.5, 200);
+    returnSmoke = new Smoke('/model/img/texture-smoke.png', '#777777', 0, 0.5, 1.5, 200);
     returnSmoke.setPath(returnCurve);
     await returnSmoke.setPoints();
     group?.add(returnSmoke.points);
@@ -550,16 +550,6 @@ const mouseEvent = (event) => {
     mouseDownFn(<UseThree>model, <THREE.Object3D>group, event, (intersects) => {
       intersects.find((intersect) => {
         const mesh = intersect.object;
-        if (mesh.name === 'player1') {
-          if (new Date().getTime() - playerStartClickTime1 < 400) {
-            // 双击,视频放大
-            if (player1) {
-              player1.requestFullscreen();
-            }
-          }
-          playerStartClickTime1 = new Date().getTime();
-          return true;
-        }
       });
     });
     console.log('摄像头控制信息', model?.orbitControls, model?.camera);
@@ -613,50 +603,6 @@ export const mountedThree = (playerVal1) => {
       // fmFanObj = new fmFan(model);
       // await fmFanObj.mountedThree();
 
-      const videoPlayer1 = document.getElementById('jb-player1')?.getElementsByClassName('vjs-tech')[0];
-      if (videoPlayer1) {
-        const mesh = renderVideo(group, videoPlayer1, 'player1');
-        if (mesh) {
-          mesh.scale.set(0.222, 0.19, 0.2);
-          mesh.position.set(-84.87, 0.298, 24.76);
-          mesh.rotation.y = -Math.PI / 2;
-          group.add(mesh);
-        }
-      } else {
-        const textArr = [
-          {
-            text: `无信号输入`,
-            font: 'normal 40px Arial',
-            color: '#009900',
-            strokeStyle: '#002200',
-            x: 170,
-            y: 40,
-          },
-        ];
-        getTextCanvas(560, 346, textArr, '').then((canvas: HTMLCanvasElement) => {
-          const textMap = new THREE.CanvasTexture(canvas); // 关键一步
-          const textMaterial = new THREE.MeshBasicMaterial({
-            map: textMap, // 设置纹理贴图
-            transparent: true,
-            side: THREE.DoubleSide, // 这里是双面渲染的意思
-          });
-          textMaterial.blending = THREE.CustomBlending;
-          const monitorPlane = group?.getObjectByName('noPlayer');
-          if (monitorPlane) {
-            monitorPlane.material = textMaterial;
-          } else {
-            const planeGeometry = new THREE.PlaneGeometry(100, 100); // 平面3维几何体PlaneGeometry
-            const planeMesh = new THREE.Mesh(planeGeometry, textMaterial);
-            if (!videoPlayer1) {
-              planeMesh.name = 'noPlayer';
-              planeMesh.scale.set(0.07, 0.05, 0.07);
-              planeMesh.position.set(-84.82, -1.53, 24.94);
-              planeMesh.rotation.y = -Math.PI / 2;
-              group?.add(planeMesh.clone());
-            }
-          }
-        });
-      }
       startAnimation();
       resolve(model);
     });

+ 23 - 18
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -292,7 +292,14 @@
             </div>
           </a-tab-pane>
         </a-tabs>
-        <a-button type="primary" size="small" preIcon="ant-design:download-outlined" style="position: absolute;right:15px;top:10px" @click="reportDown">
+        <a-button
+          v-if="globalConfig.showReport"
+          type="primary"
+          size="small"
+          preIcon="ant-design:download-outlined"
+          style="position: absolute; right: 15px; top: 10px"
+          @click="reportDown"
+        >
           报表导出
         </a-button>
       </dv-border-box8>
@@ -393,8 +400,8 @@
       </div>
     </div>
   </a-modal>
-  <DeviceBaseInfo @register="registerModal"  :device-type="selectData['deviceType']" />
- <reportInfo @register="registerModal1" :editID="editID" :fileType="fileType"></reportInfo>
+  <DeviceBaseInfo @register="registerModal" :device-type="selectData['deviceType']" />
+  <reportInfo @register="registerModal1" :editID="editID" :fileType="fileType" />
 </template>
 
 <script setup lang="ts">
@@ -412,11 +419,9 @@
   import { list as baseList } from '../../deviceManager/fanTabel/fan.api';
   import { chartsColumns, chartsColumns1 } from './fanLocal.data';
   import { deviceControlApi } from '/@/api/vent/index';
-  import LivePlayer from '@liveqing/liveplayer-v3';
   import { setDivHeight } from '/@/utils/event';
   import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-  import { SvgIcon } from '/@/components/Icon';
   import { useRouter } from 'vue-router';
   import { useModal } from '/@/components/Modal';
   import type { BasicColumn } from '/@/components/Table/src/types/table';
@@ -429,11 +434,11 @@
   import { usePermission } from '/@/hooks/web/usePermission';
   import { DownloadOutlined } from '@ant-design/icons-vue';
   import reportInfo from '../comment/components/reportInfo.vue';
-  import {save,reportList} from '../../reportManager/reportManager.api'
+  import { save, reportList } from '../../reportManager/reportManager.api';
   const { hasPermission } = usePermission();
   const globalConfig = inject('globalConfig');
   const [registerModal, { openModal, closeModal }] = useModal();
-  const [registerModal1, { openModal:openModal1, closeModal: closeModal1}] = useModal();
+  const [registerModal1, { openModal: openModal1, closeModal: closeModal1 }] = useModal();
   const { currentRoute } = useRouter();
 
   const modalTypeArr = reactive({
@@ -605,8 +610,8 @@
   let btnClick = ref(true); // 判断按钮是否可点
 
   //报表导出
-  let editID=ref<any>('')
-  let fileType=ref('')
+  let editID = ref<any>('');
+  let fileType = ref('');
 
   const { getCamera, removeCamera } = useCamera();
 
@@ -660,16 +665,16 @@
   };
 
   //报表导出点击
-  async function reportDown(){
+  async function reportDown() {
+    openModal1();
+    let res = await save({ reportType: 'fanlocal' });
+    console.log(res, 'res-----------');
+    let list = await reportList({ id: res.id });
+    console.log(list, 'list-----------');
+    let index = list.records[0].fileName.indexOf('.');
+    fileType.value = list.records[0].fileName.substring(index + 1);
+    editID.value = list.records[0].id;
     openModal1();
-   let res=await save({reportType:'fanlocal'})
-   console.log(res,'res-----------')
-   let list=await reportList({id:res.id})
-   console.log(list,'list-----------')
-   let index = list.records[0].fileName.indexOf('.');
-  fileType.value = list.records[0].fileName.substring(index + 1);
-   editID.value=list.records[0].id
-   openModal1();
   }
 
   //详情

+ 1 - 1
src/views/vent/monitorManager/fiberMonitor/fiber.data.ts

@@ -122,7 +122,7 @@ export const innerResultColumns: BasicColumn[] = [
   },
   {
     title: '风量',
-    dataIndex: 'm³',
+    dataIndex: 'm3',
     align: 'center',
     width: 100,
   },

+ 97 - 82
src/views/vent/monitorManager/gasPumpMonitor/components/DetailModal.vue

@@ -12,13 +12,20 @@
         </div>
       </div>
       <div class="">
-         <a-divider class="divider">公共设备控制</a-divider>
+        <a-divider class="divider">公共设备控制</a-divider>
         <div>
           <div v-for="(pumpType, index) in publicPumpCtrlType" :key="index">
-            <div class="device-group"  v-for="key in 2" :key="key">
+            <div class="device-group" v-for="key in 2" :key="key">
               <div class="title">#{{ key }}{{ pumpType.title }}:</div>
               <div class="btn-group">
-                <a-button class="btn" v-for="(pump, i) in PumpCtrlItems" :key="i" type="primary" @click="handlerFn(`${pumpType.code}${key}${pump.code}`)">#{{ key }}{{ pumpType.title }}{{ pump.title }}</a-button>
+                <a-button
+                  class="btn"
+                  v-for="(pump, i) in PumpCtrlItems"
+                  :key="i"
+                  type="primary"
+                  @click="handlerFn(`${pumpType.code}${key}${pump.code}`)"
+                  >#{{ key }}{{ pumpType.title }}{{ pump.title }}</a-button
+                >
               </div>
             </div>
           </div>
@@ -26,23 +33,37 @@
       </div>
       <div class="">
         <a-divider class="divider">单动控制</a-divider>
-        <div class="parameter-title group-parameter-title"><SvgIcon class="icon" size="14" name="pulp-title"/><span>泵站控制</span></div>
+        <div class="parameter-title group-parameter-title"><SvgIcon class="icon" size="14" name="pulp-title" /><span>泵站控制</span></div>
         <div class="vent-margin-b-10">
           <div v-for="(pumpType, index) in pumpCtrlType" :key="index">
-            <div class="device-group"  v-for="key in 2" :key="key">
+            <div class="device-group" v-for="key in 2" :key="key">
               <div class="title">#{{ key }}{{ pumpType.title }}:</div>
               <div class="btn-group">
-                <a-button class="btn" v-for="(pump, i) in PumpCtrlItems" :key="i" type="primary" @click="handlerFn(`${pumpType.code}${key}${pump.code}`)">#{{ key }}{{ pumpType.title }}{{ pump.title }}</a-button>
+                <a-button
+                  class="btn"
+                  v-for="(pump, i) in PumpCtrlItems"
+                  :key="i"
+                  type="primary"
+                  @click="handlerFn(`${pumpType.code}${key}${pump.code}`)"
+                  >#{{ key }}{{ pumpType.title }}{{ pump.title }}</a-button
+                >
               </div>
             </div>
           </div>
         </div>
-        <div class="parameter-title group-parameter-title"><SvgIcon class="icon" size="14" name="pulp-title"/><span>阀门控制</span></div>
-        <div  v-for="key in 2" :key="key">
+        <div class="parameter-title group-parameter-title"><SvgIcon class="icon" size="14" name="pulp-title" /><span>阀门控制</span></div>
+        <div v-for="key in 2" :key="key">
           <div class="device-group" v-for="(valveType, index) in valveCtrlType" :key="index">
             <div class="title">#{{ key }}{{ valveType.title }}:</div>
             <div class="btn-group">
-              <a-button class="btn" v-for="(valve, i) in valveCtrl" :key="i" type="primary" @click="handlerFn(`CentrifugalPump${key}_${valveType.code}${valve.code}`)">#{{ key }}{{ valveType.title }}{{ valve.title }}</a-button>
+              <a-button
+                class="btn"
+                v-for="(valve, i) in valveCtrl"
+                :key="i"
+                type="primary"
+                @click="handlerFn(`CentrifugalPump${key}_${valveType.code}${valve.code}`)"
+                >#{{ key }}{{ valveType.title }}{{ valve.title }}</a-button
+              >
             </div>
           </div>
         </div>
@@ -51,86 +72,81 @@
   </BasicModal>
 </template>
 <script lang="ts" setup>
+  import { onMounted, ref, defineEmits, onUnmounted, inject } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { pumpCtrlType, valveCtrlType, valveCtrl, PumpCtrlItems, publicPumpCtrlType } from '../gasPump.data';
+  import { SvgIcon } from '/@/components/Icon';
+  import { message } from 'ant-design-vue';
+  import { ExclamationCircleFilled } from '@ant-design/icons-vue';
+  import { deviceControlApi } from '/@/api/vent/index';
+  const globalConfig = inject('globalConfig');
 
-import { onMounted, ref, defineEmits, onUnmounted, inject } from 'vue';
-import { BasicModal, useModalInner } from '/@/components/Modal';
-import { pumpCtrlType, valveCtrlType, valveCtrl, PumpCtrlItems, publicPumpCtrlType } from '../gasPump.data'
-import { SvgIcon } from '/@/components/Icon'
-import { message } from 'ant-design-vue';
-import { ExclamationCircleFilled } from '@ant-design/icons-vue';
-import { deviceControlApi } from '/@/api/vent/index';
-const globalConfig = inject('globalConfig');
-
-const emit = defineEmits(['close', 'register'])
-const props = defineProps({
-  deviceType: {
-    type: String,
-    required: true,
-  },
-  deviceId: {
-    type: String,
-    required: true,
-  }
-})
-
-const passWord = ref('')
-// 注册 modal
-const [register, { closeModal }] = useModalInner(() => {
-  passWord.value = ''
-});
-
-async function onSubmit() {
-  emit('close')
-  closeModal();
-}
+  const emit = defineEmits(['close', 'register']);
+  const props = defineProps({
+    deviceType: {
+      type: String,
+      required: true,
+    },
+    deviceId: {
+      type: String,
+      required: true,
+    },
+  });
 
-function handlerFn(paramcode) {
-  if (!passWord.value) {
-    message.warning('请先输入密码!!!');
-    return;
-  }
-  let value = null
-  const data = {
-    deviceid: props.deviceId,
-    devicetype: props.deviceType,
-    paramcode: paramcode,
-    password: passWord.value,
-    value: value,
-  };
-  deviceControlApi(data).then((res) => {
-    if (globalConfig.History_Type == 'remote') {
-      message.success('指令已下发至生产管控平台成功!')
-    } else {
-      message.success('指令已下发成功!')
-    }
-  }).catch((err) => {
-    // message.success('控制异常');
+  const passWord = ref('');
+  // 注册 modal
+  const [register, { closeModal }] = useModalInner(() => {
+    passWord.value = '';
   });
-}
 
-onMounted(async () => {
+  async function onSubmit() {
+    emit('close');
+    closeModal();
+  }
 
-});
-onUnmounted(() => {
+  function handlerFn(paramcode) {
+    if (!passWord.value) {
+      message.warning('请先输入密码!!!');
+      return;
+    }
+    let value = null;
+    const data = {
+      deviceid: props.deviceId,
+      devicetype: props.deviceType,
+      paramcode: paramcode,
+      password: passWord.value,
+      value: value,
+    };
+    deviceControlApi(data)
+      .then((res) => {
+        if (globalConfig.History_Type == 'remote') {
+          message.success('指令已下发至生产管控平台成功!');
+        } else {
+          message.success('指令已下发成功!');
+        }
+      })
+      .catch((err) => {
+        // message.success('控制异常');
+      });
+  }
 
-});
+  onMounted(async () => {});
+  onUnmounted(() => {});
 </script>
 <style scoped lang="less">
-
   @import '/@/design/vent/modal.less';
   @import '../../comment/less/workFace.less';
-   @ventSpace: zxm;
-  
-  
+  @ventSpace: zxm;
+
   .@{ventSpace}-input {
     width: 150px;
   }
-  .password-box{
-    .warning-text{
+  .password-box {
+    .warning-text {
       font-size: 24px;
       margin-left: 8px;
     }
-    .input-box{
+    .input-box {
       margin-top: 10px;
       margin-left: 40px;
       .label {
@@ -138,31 +154,30 @@ onUnmounted(() => {
         color: #73e8fe;
       }
     }
-    
   }
-  
-  .btn-group{
+
+  .btn-group {
     margin-bottom: 8px;
-    .btn-item{
+    .btn-item {
       width: calc(50% - 16px);
       margin: 0 4px;
     }
   }
-  .divider{
+  .divider {
     color: #fff;
     border-color: #73e8fe;
   }
-  .parameter-title{
+  .parameter-title {
     margin-bottom: 15px;
   }
-  .device-group{
+  .device-group {
     display: flex;
     align-items: center;
-    .title{
+    .title {
       width: 100px;
       color: #73e8fe;
     }
-    .btn{
+    .btn {
       margin: 0 5px;
     }
   }

+ 49 - 25
src/views/vent/monitorManager/gasPumpMonitor/components/gasPumpHome.vue

@@ -198,6 +198,7 @@
       <LivePlayer id="fm-player1" style="height: 250px;" ref="player1" :videoUrl="flvURL1()" muted live loading controls />
     </div> -->
     </div>
+    <div ref="playerRef" class="player-box"></div>
   </div>
   <DetailModal @register="register" :device-type="deviceType" :device-id="deviceId" />
   <PasswordModal
@@ -234,6 +235,7 @@
   import PasswordModal from '../../comment/components/PasswordModal.vue';
   import { message } from 'ant-design-vue';
   import fourBorderBg from '/@/components/vent/fourBorderBg.vue';
+  import { useCamera } from '/@/hooks/system/useCamera';
 
   const globalConfig = inject('globalConfig');
 
@@ -252,7 +254,7 @@
   const tabActiveKey = ref(1);
   const passwordModalIsShow = ref(false);
   const handlerType = ref('');
-  // 默认初始是第一行
+  const playerRef = ref();
 
   // 监测数据
   const selectData = reactive({
@@ -277,29 +279,29 @@
     FlowSensor_InputFlux: '-',
   });
 
-  const flvURL1 = () => {
-    return `https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv`;
-    // return ''
-  };
+  const { getCamera, removeCamera } = useCamera();
 
   // https获取监测数据
   let timer: null | NodeJS.Timeout = null;
   function getMonitor(flag?) {
     if (Object.prototype.toString.call(timer) === '[object Null]') {
-      timer = setTimeout(
-        async () => {
-          if (props.deviceId) {
-            const data = await getDataSource(props.deviceId);
-            Object.assign(selectData, data);
-          }
-          if (timer) {
-            timer = null;
-          }
-          await getMonitor();
-          loading.value = false;
-        },
-        flag ? 0 : 1000
-      );
+      return new Promise((resolve) => {
+        timer = setTimeout(
+          async () => {
+            if (props.deviceId) {
+              const data = await getDataSource(props.deviceId);
+              Object.assign(selectData, data);
+            }
+            if (timer) {
+              timer = null;
+            }
+            resolve(null);
+            await getMonitor();
+            loading.value = false;
+          },
+          flag ? 0 : 1000
+        );
+      });
     }
   }
 
@@ -311,7 +313,7 @@
   }
 
   function handler(passWord, paramcode) {
-    let value = null;
+    let value = '';
     if (paramcode == 'ykjdqh') {
       value = selectData['ykjdqh'] == '1' ? '2' : '1';
     }
@@ -319,8 +321,8 @@
       value = selectData['jxmsqh'] == '1' ? '2' : '1';
     }
     const data = {
-      deviceid: selectData.deviceID,
-      devicetype: selectData.deviceType,
+      deviceid: selectData['deviceID'],
+      devicetype: selectData['deviceType'],
       paramcode: paramcode,
       password: passWord,
       value: value,
@@ -382,7 +384,7 @@
   watch(
     () => props.deviceType,
     () => {
-      nextTick(() => {
+      nextTick(async () => {
         if (props.deviceType == 'pump_over') {
           setModelType('gasPump');
         } else if (props.deviceType == 'pump_under') {
@@ -391,15 +393,23 @@
       });
     }
   );
+  watch(
+    () => selectData['deviceID'],
+    async (deviceID) => {
+      if (deviceID) await getCamera(deviceID, playerRef.value);
+    }
+  );
 
   onBeforeMount(() => {});
 
   onMounted(async () => {
     timer = null;
     await getMonitor(true);
+    if (selectData && selectData['deviceID']) await getCamera(selectData['deviceID'], playerRef.value);
   });
 
   onUnmounted(() => {
+    removeCamera();
     if (timer) {
       clearTimeout(timer);
       timer = undefined;
@@ -416,9 +426,10 @@
       flex-wrap: wrap;
       width: 690px;
       padding: 10px 12px 10px 15px;
-      border: 1px solid #d3e1ff55;
+      border: 1px solid #d3e1ff33;
       background-color: #061c2a55;
-      box-shadow: 0 0 10px #c3c7cd;
+      box-shadow: 0 0 15px #3b567f55;
+      background-color: #38383833;
       .gas-monitor-row {
         display: flex;
         flex-direction: row;
@@ -499,6 +510,19 @@
       }
     }
   }
+  .player-box {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    padding: 0 20px 0 20px;
+    z-index: 9999;
+    display: flex;
+    align-items: end;
+    :deep(#LivePlayerBox) {
+      display: flex;
+      justify-content: end;
+    }
+  }
   .control-group {
     display: flex;
     // justify-content: space-around;

+ 0 - 3
src/views/vent/monitorManager/gasPumpMonitor/gasPump.data.ts

@@ -231,6 +231,3 @@ export const modelMonitor = [
     code: 'pipeTemp',
   },
 ];
-
-
-

+ 0 - 1
src/views/vent/monitorManager/gasPumpMonitor/gasPump.threejs.under.ts

@@ -35,7 +35,6 @@ class gasPumpUnder {
   }
 
   addCssText = () => {
-    debugger;
     if (!this.group) return;
     if (!this.group.getObjectByName('text1')) {
       const element = document.getElementById('FlowSensor') as HTMLElement;

+ 1 - 1
src/views/vent/monitorManager/gasPumpMonitor/index.vue

@@ -26,7 +26,7 @@
 </template>
 
 <script setup lang="ts">
-import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+import customHeader from '/@/components/vent/customHeader.vue';
 import { onBeforeMount, ref, onMounted, onUnmounted, reactive, toRaw } from 'vue';
 import { list } from './gasPump.api';
 import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';

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

@@ -535,7 +535,6 @@ class Fm3 {
         if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = true;
 
         resolve(this.model);
-        this.initCamera(playerDom);
       });
     });
   }

+ 0 - 1
src/views/vent/monitorManager/gateMonitor/gate.threejs.two.ss.ts

@@ -526,7 +526,6 @@ class FmTwoSs {
         this.model.animate();
 
         resolve(this.model);
-        this.initCamera(playerDom);
       });
     });
   }

+ 0 - 1
src/views/vent/monitorManager/gateMonitor/gate.threejs.xr.ts

@@ -527,7 +527,6 @@ class FmXR {
         this.model.animate();
 
         resolve(this.model);
-        this.initCamera(playerDom);
       });
     });
   }

+ 0 - 1
src/views/vent/monitorManager/gateMonitor/gate.threejs.yy.ts

@@ -537,7 +537,6 @@ class Fm1 {
         if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = true;
 
         resolve(this.model);
-        this.initCamera(playerDom);
       });
     });
   }

+ 51 - 35
src/views/vent/monitorManager/gateMonitor/index.vue

@@ -594,33 +594,25 @@
   // let isRearCloseRunning = false; //开关门动作是否在进行
   let isMidOpenRunning = false; //中间门动作是否在进行
   // let isMidCloseRunning = false; //中间门动作是否在进行
+  // 0 关闭 1 正在打开 2 打开 3正在关闭
   let frontDeviceState = 0; //记录设备状态,为了与下一次监测数据做比较
   let rearDeviceState = 0; //记录设备状态,为了与下一次监测数据做比较
   let midDeviceState = 0; //记录设备状态,为了与下一次监测数据做比较
   function monitorAnimation(selectData) {
     const timeScale = 0.005;
 
-    // if (selectData.frontGateOpen == '0' && selectData.frontGateClose == '0') {
-    //   //正在运行
-    //   // if (!isFrontOpenRunning) {
-    //   //   frontDoorIsOpen.value = true;
-    //   //   backDoorIsOpen.value = true;
-    //   //   isFrontOpenRunning = true;
-    //   //   play(1, timeScale);
-    //   //   frontDeviceState = 1;
-    //   // }
-    // }
-
-    if (
-      (selectData.frontGateOpen == '0' && selectData.frontGateClose == '0') ||
-      (selectData.rearGateOpen == '0' && selectData.rearGateClose == '0') ||
-      (selectData.midGateOpen == '0' && selectData.midGateClose == '0')
-    ) {
-      isOpenRunning = true;
-    } else {
-      isOpenRunning = false;
+    if (selectData.frontGateOpen == '1' && selectData.frontGateClose == '0' && !isFrontOpenRunning) {
+      isFrontOpenRunning = true;
+      if (frontDeviceState != 1) {
+        // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(1, timeScale) : play(1);
+        play(1, timeScale);
+        frontDeviceState = 1;
+        frontDoorIsOpen.value = false;
+        backDoorIsOpen.value = true;
+      }
     }
-    if (selectData.frontGateOpen == 1 && selectData.frontGateClose == '0' && !isFrontOpenRunning) {
+
+    if (selectData.frontGateOpen == '0' && selectData.frontGateClose == '0' && !isFrontOpenRunning) {
       isFrontOpenRunning = true;
       if (frontDeviceState != 1) {
         // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(1, timeScale) : play(1);
@@ -630,21 +622,33 @@
         backDoorIsOpen.value = true;
       }
     }
-    if (selectData.frontGateClose == 1 && selectData.frontGateOpen == '0' && isFrontOpenRunning) {
+
+    if (selectData.frontGateClose == '1' && selectData.frontGateOpen == '0' && isFrontOpenRunning) {
       isFrontOpenRunning = false;
-      if (frontDeviceState != 2) {
+      if (frontDeviceState != 0) {
         // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(2, timeScale) : play(2);
         play(2, timeScale);
-        frontDeviceState = 2;
+        frontDeviceState = 0;
         frontDoorIsOpen.value = false;
         // backDoorIsOpen.value = false
       }
     }
-    if (selectData.rearGateOpen == 1 && selectData.rearGateClose == '0' && !isRearOpenRunning) {
+    if (selectData.rearGateOpen == '1' && selectData.rearGateClose == '0' && !isRearOpenRunning) {
+      isRearOpenRunning = true;
+
+      if (rearDeviceState != 1) {
+        rearDeviceState = 1;
+        // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(3, timeScale) : play(3);
+        play(3, timeScale);
+        backDoorIsOpen.value = false;
+        frontDoorIsOpen.value = true;
+      }
+    }
+    if (selectData.rearGateOpen == '0' && selectData.rearGateClose == '0' && !isRearOpenRunning) {
       isRearOpenRunning = true;
 
-      if (rearDeviceState != 3) {
-        rearDeviceState = 3;
+      if (rearDeviceState != 1) {
+        rearDeviceState = 1;
         // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(3, timeScale) : play(3);
         play(3, timeScale);
         backDoorIsOpen.value = false;
@@ -652,21 +656,33 @@
       }
     }
 
-    if (selectData.rearGateClose == 1 && selectData.rearGateOpen == '0' && isRearOpenRunning) {
+    if (selectData.rearGateClose == '1' && selectData.rearGateOpen == '0' && isRearOpenRunning) {
       isRearOpenRunning = false;
-      if (rearDeviceState != 4) {
-        rearDeviceState = 4;
+      if (rearDeviceState != 0) {
+        rearDeviceState = 0;
         // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(4, timeScale) : play(4);
         play(4, timeScale);
         backDoorIsOpen.value = false;
       }
     }
 
-    if (selectData.midGateOpen == 1 && selectData.midGateClose == '0' && !isMidOpenRunning) {
+    if (selectData.midGateOpen == '1' && selectData.midGateClose == '0' && !isMidOpenRunning) {
+      isMidOpenRunning = true;
+
+      if (midDeviceState != 1) {
+        midDeviceState = 1;
+        // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(3, timeScale) : play(3);
+        play(8, timeScale);
+        backDoorIsOpen.value = false;
+        frontDoorIsOpen.value = true;
+      }
+    }
+
+    if (selectData.midGateOpen == '0' && selectData.midGateClose == '0' && !isMidOpenRunning) {
       isMidOpenRunning = true;
 
-      if (midDeviceState != 8) {
-        midDeviceState = 8;
+      if (midDeviceState != 1) {
+        midDeviceState = 1;
         // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(3, timeScale) : play(3);
         play(8, timeScale);
         backDoorIsOpen.value = false;
@@ -674,10 +690,10 @@
       }
     }
 
-    if (selectData.midGateClose == 1 && selectData.midGateOpen == '0' && isMidOpenRunning) {
+    if (selectData.midGateClose == '1' && selectData.midGateOpen == '0' && isMidOpenRunning) {
       isMidOpenRunning = false;
-      if (midDeviceState != 9) {
-        midDeviceState = 9;
+      if (midDeviceState != 0) {
+        midDeviceState = 0;
         // import.meta.env.VITE_GLOB_IS_SIMULATE ? play(4, timeScale) : play(4);
         play(9, timeScale);
         backDoorIsOpen.value = false;

+ 1 - 1
src/views/vent/monitorManager/groutMonitor/index.vue

@@ -34,7 +34,7 @@
 </template>
 
 <script setup lang="ts">
-import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+import customHeader from '/@/components/vent/customHeader.vue';
 import { ref, onMounted, onUnmounted, reactive, toRaw } from 'vue';
 import { systemList, getTableList } from './grout.api';
 import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';

+ 6 - 1
src/views/vent/monitorManager/mainFanMonitor/index.vue

@@ -280,7 +280,12 @@
           </a-tab-pane> -->
           <a-tab-pane key="3" tab="历史数据">
             <div class="tab-item" v-if="activeKey === '3'">
-              <HistoryTable device-type="fanmain" :device-list-api="baseList" designScope="fanmain-history" :scroll="scroll" />
+              <HistoryTable
+                device-type="fanmain"
+                :device-list-api="baseList.bind(null, { devicekind: 'fanmain' })"
+                designScope="fanmain-history"
+                :scroll="scroll"
+              />
             </div>
           </a-tab-pane>
           <a-tab-pane key="4" tab="报警历史">

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

@@ -12,7 +12,7 @@
     <div v-show="monitorDataGroupFlag == sysIndex + 1" :id="`nitrogenMonitorBox${sysIndex}`">
       <div v-for="(groupNum, index) in sysItem" :key="index" class="modal-monitor">
         <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
-          <div class="title">{{ kyjs[index] }} </div>
+          <div class="title">{{ `空压机${groupNum}` }} </div>
           <template v-for="(preMonitor, preMonitorIndex) in preMonitorList" :key="preMonitorIndex">
             <div v-if="preMonitor.code !== 'signal'" class="monitor-item">
               <span class="monitor-title">{{ preMonitor.title }}:</span>
@@ -42,7 +42,7 @@
           </template>
         </fourBorderBg>
         <fourBorderBg :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`">
-          <div class="title">{{ cqgs[index] }}</div>
+          <div class="title">{{ `风包${groupNum}` }}</div>
           <template v-for="(cqgMonitor, cqgMonitorIndex) in cqgMonitorList" :key="cqgMonitorIndex">
             <div class="monitor-item">
               <span class="monitor-title">{{ cqgMonitor.title }}:</span>
@@ -62,7 +62,7 @@
   </div>
 
   <div class="nitrogen-home">
-    <div style="position: absolute; color: #fff; top: 30px; pointer-events: auto; display: flex">
+    <div style="position: absolute; color: #fff; top: 30px; pointer-events: auto; display: flex" v-if="monitorDataGroupArr.length > 1">
       <div
         v-for="(sysItem, sysIndex) in monitorDataGroupArr"
         :key="sysIndex"
@@ -102,7 +102,7 @@
       <div class="top-box">
         <!-- 左边监测数据 -->
         <div class="lr-box left-box">
-          <div class="left-container">
+          <div class="left-container" v-if="preFanMonitorData.length > 0">
             <div class="item item-l" v-for="(groupNum, index) in monitorDataGroup" :key="index">
               <div class="monitor-box">
                 <ventBox1>

+ 4 - 8
src/views/vent/monitorManager/nitrogen/index.vue

@@ -2,9 +2,6 @@
   <div class="nitrogen-box">
     <customHeader>智能压风管控系统</customHeader>
     <template v-if="btnActive == 'nitrogen_page'">
-      <!-- 补连塔(两套点表) -->
-      <nitrogenHomeBLT v-if="sysOrgCode === 'sdmtjtbltmk'" />
-      <!-- 一个系统一套点表的 -->
       <nitrogenHome />
     </template>
     <nitrogenEcharts v-if="btnActive == 'yfj_monitor_echarts'" />
@@ -16,16 +13,15 @@
 </template>
 <script lang="ts" setup>
   import { ref } from 'vue';
-  import nitrogenHome from './components/nitrogenHome.vue';
-  import nitrogenHomeBLT from './components/nitrogenHomeBLT.vue';
   import nitrogenEcharts from './components/nitrogenEcharts.vue';
   import nitrogenHistory from './components/nitrogenHistory.vue';
   import nitrogenHandleHistory from './components/nitrogenHandleHistory.vue';
   import nitrogenAlarmHistory from './components/nitrogenAlarmHistory.vue';
-  import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+  import customHeader from '/@/components/vent/customHeader.vue';
   import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';
-  import { useGlobSetting } from '/@/hooks/setting';
-  const { sysOrgCode } = useGlobSetting();
+  import { getNitrogenHome } from './nitrogen.data.1';
+
+  const nitrogenHome = getNitrogenHome();
   const btnActive = ref('nitrogen_page');
   const navList = ref([
     {

+ 44 - 8
src/views/vent/monitorManager/nitrogen/nitrogen.data.1.ts

@@ -1,4 +1,4 @@
-import { ref } from 'vue';
+import { ref, defineAsyncComponent } from 'vue';
 import { useGlobSetting } from '/@/hooks/setting';
 import {
   monitorDataGroupArr as monitorDataGroupArr_Jj,
@@ -31,6 +31,16 @@ import {
 } from './nitrogen.dataDlt'; // 大柳塔
 
 import {
+  monitorDataGroupArr as monitorDataGroupArr_Hsw,
+  preFanMonitorData as preFanMonitorData_Hsw,
+  preMonitorList as preMonitorList_Hsw,
+  cqgMonitorList as cqgMonitorList_Hsw,
+  prefix as prefix_Hsw,
+  getSysState as getSysState_Hsw,
+  totalData as totalData_Hsw,
+} from './nitrogen.dataHsw'; // 大柳塔
+
+import {
   monitorDataGroupArr as monitorDataGroupArr_Hjt,
   preFanMonitorData as preFanMonitorData_Hjt,
   preMonitorList as preMonitorList_Hjt,
@@ -50,10 +60,26 @@ import {
   totalData as totalData_YJ,
 } from './nitrogen.dataYJ'; // 窑街
 
+export function getNitrogenHome() {
+  const { sysOrgCode } = useGlobSetting();
+  debugger;
+  console.log(sysOrgCode, 'sysOrgCode----------------------');
+  let nitrogenHome;
+  switch (sysOrgCode) {
+    case 'sdmtjtbltmk': //补连塔
+      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHomeBLT.vue'));
+      return nitrogenHome;
+    default:
+      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome.vue'));
+      return nitrogenHome;
+  }
+}
+
 export type State = {
   isRun: boolean;
   fault: boolean;
 };
+
 export const bottomBtnList = ref([
   {
     text: '监控界面',
@@ -140,6 +166,16 @@ export function getMonitorData() {
         getSysState: getSysState_Jj,
         totalData: totalData_Ji,
       };
+    case 'yjmdhswmk': // 锦界
+      return {
+        monitorDataGroupArr: monitorDataGroupArr_Hsw,
+        preFanMonitorData: preFanMonitorData_Hsw,
+        preMonitorList: preMonitorList_Hsw,
+        cqgMonitorList: cqgMonitorList_Hsw,
+        prefix: prefix_Hsw,
+        getSysState: getSysState_Hsw,
+        totalData: totalData_Hsw,
+      };
     default: //默认锦界
       // return {
       //   monitorDataGroupArr: monitorDataGroupArr_Bet,
@@ -151,13 +187,13 @@ export function getMonitorData() {
       //   totalData: totalData_Bet,
       // };
       return {
-        monitorDataGroupArr: monitorDataGroupArr_Dlt,
-        preFanMonitorData: preFanMonitorData_Dlt,
-        preMonitorList: preMonitorList_Dlt,
-        cqgMonitorList: cqgMonitorList_Dlt,
-        prefix: prefix_Dlt,
-        getSysState: getSysState_Dlt,
-        totalData: totalData_Dlt,
+        monitorDataGroupArr: monitorDataGroupArr_Hsw,
+        preFanMonitorData: preFanMonitorData_Hsw,
+        preMonitorList: preMonitorList_Hsw,
+        cqgMonitorList: cqgMonitorList_Hsw,
+        prefix: prefix_Hsw,
+        getSysState: getSysState_Hsw,
+        totalData: totalData_Hsw,
       };
   }
 }

+ 0 - 38
src/views/vent/monitorManager/nitrogen/nitrogen.data.ts

@@ -79,41 +79,3 @@ export const monitorData = ref(
     controlModel: 'LOC',
   })
 );
-
-// dataInfo: {
-//   controlModel: false
-// };
-// videoUrl: '',
-// isDestroyVideo: false,
-// navList: [
-//   {
-//     title: '监控界面',
-//     pathName: 'nitrogen_page_lh'
-//   },
-//   // {
-//   //   title: '关键节点监测',
-//   //   pathName: 'critical_node'
-//   // },
-//   {
-//     title: '实时曲线',
-//     pathName: 'yfj_monitor_echarts_cy'
-//   },
-//   {
-//     title: '压风机历史记录',
-//     pathName: 'yfj_history'
-//   },
-//   {
-//     title: '操作历史记录',
-//     pathName: 'yfj_handler_history'
-//   },
-//   {
-//     title: '故障诊断历史记录',
-//     pathName: 'yfj_faultRecord'
-//   }
-// ],
-// kyjMonitorDataKey: new Map(
-//   [
-//     ['压力', 'pressure'],
-//     ['温度', 'temp'],
-//   ]
-// ),

+ 91 - 0
src/views/vent/monitorManager/nitrogen/nitrogen.dataHsw.ts

@@ -0,0 +1,91 @@
+export const monitorDataGroupArr = [[1, 2, 3, 4, 5]];
+export const prefix = ['Compressor', 'Compressor', 'PreFan'];
+export const preMonitorList = [
+  {
+    title: `供气压力`,
+    code: `CompressorGasSupplyPressure`,
+    unit: 'bar',
+    child: [],
+  },
+  {
+    title: `排气温度`,
+    code: `CompressorExhaustTemp`,
+    unit: '℃',
+    child: [],
+  },
+  {
+    title: `加载时间`,
+    code: `CompressorLoadTime`,
+    unit: 'h',
+    child: [],
+  },
+  {
+    title: `运行时间`,
+    code: `CompressorRunTime`,
+    unit: 'h',
+    child: [],
+  },
+  {
+    title: `主机A相电流`,
+    code: `CompressorCurrentA`,
+    unit: 'A',
+    child: [],
+  },
+  {
+    code: 'signal',
+    child: [
+      {
+        title: `运行信号`,
+        code: `CompressorWorking`,
+        isWaring: false,
+      },
+      {
+        title: `故障信号`,
+        code: `PreFanFault`,
+        isWaring: true,
+      },
+    ],
+  },
+];
+export const cqgMonitorList = [
+  {
+    title: `风包压力`,
+    code: `CompressorWindBagPressure`,
+    unit: 'bar',
+    child: [],
+  },
+  {
+    title: `风包温度`,
+    code: `CompressorWindBagTemp`,
+    unit: '℃',
+    child: [],
+  },
+];
+
+export const preFanMonitorData = [];
+export const totalData = [
+  {
+    title: '总压力',
+    code: 'MainPipePressure',
+    unit: 'bar',
+  },
+];
+export type State = {
+  isRun: boolean;
+  fault: boolean;
+};
+export function getSysState(monitorData) {
+  const stateArr = <State[]>[];
+  monitorDataGroupArr.forEach((group) => {
+    const stateObj = { isRun: false, fault: false };
+    group.forEach((item) => {
+      if (monitorData['PRE_Status'.replace('PRE', 'PRE' + item)]) {
+        stateObj.isRun = monitorData['PRE_Status'.replace('PRE', 'PRE' + item)] == '1';
+      }
+      monitorData['PRE_AlamSignal'.replace('PRE', 'PRE' + item)] === undefined ? '-' : monitorData['PRE_AlamSignal'.replace('PRE', 'PRE' + item)];
+      stateObj.fault = monitorData['PRE_AlamSignal'.replace('PRE', 'PRE' + item)] == '1';
+    });
+    stateArr.push(stateObj);
+  });
+  return stateArr;
+}

+ 14 - 2
src/views/vent/monitorManager/nitrogen/nitrogen.dishang.threejs.ts

@@ -148,11 +148,17 @@ class Nitrogen {
             compressorElement.style.left = '0px';
             const compressorMonitorCSS3D = new CSS3DSprite(compressorElement);
             compressorMonitorCSS3D.name = 'monitorNitrogenText' + n;
-            compressorMonitorCSS3D.scale.set(0.003, 0.003, 0.003);
+            if (monitorDataGroup.length > 4) {
+              compressorMonitorCSS3D.scale.set(0.0035, 0.0035, 0.0035);
+            } else {
+              compressorMonitorCSS3D.scale.set(0.003, 0.003, 0.003);
+            }
             if (i == 0) compressorMonitorCSS3D.position.set(-0.89, 0.31, 0);
             if (i == 1) compressorMonitorCSS3D.position.set(-0.89, 0.31, 0.04);
             if (i == 2) compressorMonitorCSS3D.position.set(-0.89, 0.31, 0.08);
             if (i == 3) compressorMonitorCSS3D.position.set(-0.89, 0.31, 0.12);
+            if (i == 4) compressorMonitorCSS3D.position.set(-0.89, 0.31, 0.16);
+
             cssGroup.add(compressorMonitorCSS3D);
           }
           const cqgElement = document.getElementById('cqgMonitor' + n) as HTMLElement;
@@ -161,11 +167,17 @@ class Nitrogen {
             cqgElement.style.left = '0px';
             const cqgMonitorCSS3D = new CSS3DSprite(cqgElement);
             cqgMonitorCSS3D.name = 'cqgMonitorText' + n;
-            cqgMonitorCSS3D.scale.set(0.003, 0.003, 0.003);
+
             if (i == 0) cqgMonitorCSS3D.position.set(1.24, 0.31, 0.0);
             if (i == 1) cqgMonitorCSS3D.position.set(1.24, 0.31, 0.04);
             if (i == 2) cqgMonitorCSS3D.position.set(1.24, 0.31, 0.08);
             if (i == 3) cqgMonitorCSS3D.position.set(1.24, 0.31, 0.12);
+            if (i == 4) cqgMonitorCSS3D.position.set(1.24, 0.31, 0.16);
+            if (monitorDataGroup.length > 4) {
+              cqgMonitorCSS3D.scale.set(0.0035, 0.0035, 0.0035);
+            } else {
+              cqgMonitorCSS3D.scale.set(0.003, 0.003, 0.003);
+            }
             cssGroup.add(cqgMonitorCSS3D);
           }
           this.cssGroupParent.add(cssGroup);

+ 4 - 4
src/views/vent/monitorManager/nitrogen/nitrogen.threejs.ts

@@ -89,11 +89,11 @@ export const setModelType = (modalTypeName) => {
     let newCameraPosition = { x: 0, y: 0, z: 0 },
       newControlsPosition = { x: 0, y: 0, z: 0 };
     if (group?.children.length == 6) {
-      newCameraPosition = { x: -1.7434040517387115, y: 46.41089142470955, z: 114.33388865672832 };
-      newControlsPosition = { x: -1.6994314417499141, y: -12.38981035037152, z: 10.110013648346193 };
+      newCameraPosition = { x: -107.33215442283758, y: 44.57609039633937, z: 2.0459979417299334 };
+      newControlsPosition = { x: -4.615459422837561, y: -16.819491603660634, z: 1.9862299417299336 };
     } else if (group?.children.length == 5) {
-      newCameraPosition = { x: -0.4773363503066604, y: 48.162643926217974, z: 115.96473651982045 };
-      newControlsPosition = { x: -0.973402832301181, y: -19.990725369597676, z: 2.8781944582956025 };
+      newCameraPosition = { x: -107.33215442283758, y: 44.57609039633937, z: 2.0459979417299334 };
+      newControlsPosition = { x: -4.615459422837561, y: -16.819491603660634, z: 1.9862299417299336 };
     } else if (group?.children.length == 4) {
       newCameraPosition = { x: -2.0540155219473597, y: 40.869414434737195, z: 97.8637568969557 };
       newControlsPosition = { x: -2.01631417107236, y: -9.544836585137801, z: 8.50481206883075 };

+ 1 - 1
src/views/vent/monitorManager/obfurageMonitor/index.vue

@@ -37,7 +37,7 @@
 </template>
 
 <script setup lang="ts">
-import customHeader from '/@/views/vent/comment/components/customHeader.vue';
+import customHeader from '/@/components/vent/customHeader.vue';
 import { onBeforeMount, ref, onMounted, onUnmounted, reactive, toRaw } from 'vue';
 import { list } from './obfurage.api';
 import BottomMenu from '/@/views/vent/comment/components/bottomMenu.vue';

+ 0 - 9
src/views/vent/monitorManager/safetyMonitor/safety.data.ts

@@ -12,15 +12,6 @@ export const formConfig = {
   labelAlign: 'left',
   showAdvancedButton: false,
   showResetButton: false,
-  baseColProps: {
-    // offset: 0.5,
-    // xs: 24,
-    // sm: 24,
-    // md: 24,
-    // lg: 9,
-    // xl: 7,
-    // xxl: 4,
-  },
   schemas: [
     {
       label: '设备类型',

+ 1 - 7
src/views/vent/monitorManager/sensorMonitor/index.vue

@@ -52,13 +52,7 @@
         </a-tab-pane>
         <a-tab-pane key="2" tab="历史数据">
           <div class="tab-item table-box box-bg padding-0">
-            <HistoryTable
-              columns-type="modelsensor"
-              device-type="modelsensor"
-              :device-list-api="baseList"
-              @change="historyDataSourceChange"
-              designScope="modelsensor-history"
-            />
+            <HistoryTable :columns-type="deviceKind" :device-type="deviceKind" @change="historyDataSourceChange" designScope="modelsensor-history" />
             <div class="charts-box" v-if="chartsColumns.length > 0">
               <BarAndLine
                 :chartsColumnsType="selectData.deviceType"

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません