Ver código fonte

更改测风、风门模型

hongrunxia 1 ano atrás
pai
commit
02d44d4fc4
35 arquivos alterados com 622 adições e 378 exclusões
  1. BIN
      public/model/glft/cf/fixedCf_2023-11-28.glb
  2. BIN
      public/model/glft/fm/Fm-door_2023-11-28.glb
  3. BIN
      public/model/glft/fm/Fm-wall_2023-11-28.glb
  4. BIN
      public/model/glft/fm/Fm-wire_2023-09-26.glb
  5. BIN
      public/model/glft/fm/Fm-wire_2023-11-28.glb
  6. BIN
      public/video/mainWind.mp4
  7. 6 0
      src/design/vent/index.less
  8. 4 3
      src/utils/threejs/main.worker.ts
  9. 0 1
      src/utils/ventutil.ts
  10. 14 3
      src/views/vent/deviceManager/comment/DeviceModal.vue
  11. 2 2
      src/views/vent/deviceManager/comment/FormModal.vue
  12. 10 6
      src/views/vent/deviceManager/comment/NormalTable.vue
  13. 9 2
      src/views/vent/deviceManager/comment/pointTabel/PointTable.vue
  14. 25 0
      src/views/vent/deviceManager/comment/pointTabel/point.data.ts
  15. 1 0
      src/views/vent/deviceManager/deviceTable/device.data.ts
  16. 4 3
      src/views/vent/deviceManager/deviceTable/index.vue
  17. 80 4
      src/views/vent/deviceManager/workingFace/index.vue
  18. 9 18
      src/views/vent/deviceManager/workingFace/workingFace.data.ts
  19. 27 1
      src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts
  20. 211 155
      src/views/vent/monitorManager/deviceMonitor/components/device/index.vue
  21. 1 2
      src/views/vent/monitorManager/fanLocalMonitor/fanLocal.three.ts
  22. 96 81
      src/views/vent/monitorManager/fanLocalMonitor/index.vue
  23. 2 2
      src/views/vent/monitorManager/gateMonitor/gate.threejs.three.ts
  24. 7 7
      src/views/vent/monitorManager/gateMonitor/gate.threejs.ts
  25. 9 41
      src/views/vent/monitorManager/gateMonitor/gate.threejs.two.ts
  26. 11 3
      src/views/vent/monitorManager/gateMonitor/index.vue
  27. 2 2
      src/views/vent/monitorManager/mainFanMonitor/index.vue
  28. 1 23
      src/views/vent/monitorManager/mainFanMonitor/mainWind.threejs.ts
  29. 5 4
      src/views/vent/monitorManager/windowMonitor/dandaoFc.threejs.ts
  30. 11 4
      src/views/vent/monitorManager/windowMonitor/index.vue
  31. 2 1
      src/views/vent/monitorManager/windowMonitor/shuangdaoFc.threejs.ts
  32. 4 4
      src/views/vent/monitorManager/windowMonitor/window.threejs.ts
  33. 1 1
      src/views/vent/monitorManager/windrectMonitor/duishe.threejs.ts
  34. 9 3
      src/views/vent/monitorManager/windrectMonitor/index.vue
  35. 59 2
      src/views/vent/monitorManager/windrectMonitor/windrect.threejs.ts

BIN
public/model/glft/cf/fixedCf_2023-11-28.glb


BIN
public/model/glft/fm/Fm-door_2023-09-26.glb → public/model/glft/fm/Fm-door_2023-11-28.glb


BIN
public/model/glft/fm/Fm-wall_2023-09-26.glb → public/model/glft/fm/Fm-wall_2023-11-28.glb


BIN
public/model/glft/fm/Fm-wire_2023-09-26.glb


BIN
public/model/glft/fm/Fm-wire_2023-10-05.glb → public/model/glft/fm/Fm-wire_2023-11-28.glb


BIN
public/video/mainWind.mp4


+ 6 - 0
src/design/vent/index.less

@@ -175,6 +175,12 @@
         background-color: #008fc366 !important;
       }
     }
+    .@{ventSpace}-select-disabled {
+      background: #ffffff22;
+      .@{ventSpace}-select-selection-item{
+        color: #dfdfdf !important;
+      } 
+    }
   }
 }
 

+ 4 - 3
src/utils/threejs/main.worker.ts

@@ -12,9 +12,9 @@ export function initModalWorker() {
   };
   const modalUrlArr = [
     'fm/fm_2023-06-02.glb',
-    'fm/Fm-door_2023-09-26.glb',
-    'fm/Fm-wire_2023-10-05.glb',
-    'fm/Fm-wall_2023-09-26.glb',
+    'fm/Fm-door_2023-11-28.glb',
+    'fm/Fm-wire_2023-11-28.glb',
+    'fm/Fm-wall_2023-11-28.glb',
     'fm/fmThree_2023-07-25.glb',
     'fm/fmThreeBase_2023-07-25.glb',
 
@@ -34,6 +34,7 @@ export function initModalWorker() {
     'cf/dsgd_2023-06-02.glb',
     'cf/ddcf_2023-07-13.glb',
     'cf/dsmove_2023-06-02.glb',
+    'cf/fixedCf_2023-11-28.glb',
     'jbfj/jbfj-hd_2023-10-19.glb',
     'jbfj/jbfj-fm_2023-06-02.glb',
     'jbfj/jbfj-fc_2023-06-02.glb',

+ 0 - 1
src/utils/ventutil.ts

@@ -51,7 +51,6 @@ export function cameraInit(dom, rtspUrl) {
 
 // 模型监测加载视频
 export function deviceCameraInit(cameraAddrs, player: HTMLElement, webRtcServerList: any[] = []) {
-  debugger;
   const playerDoms: (HTMLVideoElement | undefined | null)[] = [];
   const webRtcServer: any[] = [];
   let livePlayerDiv: HTMLElement | null = document.getElementById('LivePlayerBox');

+ 14 - 3
src/views/vent/deviceManager/comment/DeviceModal.vue

@@ -19,6 +19,17 @@
           :columns="pointColumns"
           :pointType="deviceData.strtype"
           :deviceId="deviceData.id"
+          :valuetype="9"
+          @save="savePointData"
+          @delete="deletePointById"
+        />
+      </a-tab-pane>
+      <a-tab-pane key="8" tab="虚拟点表配置">
+        <PointTable
+          :columns="simulationColumns"
+          :pointType="deviceData.strtype"
+          :deviceId="deviceData.id"
+          :valuetype="4"
           @save="savePointData"
           @delete="deletePointById"
         />
@@ -65,7 +76,7 @@
   import WorkFacePointTable from './pointTabel/WorkFacePointTable.vue';
   import FormModal from './FormModal.vue';
   import { cloneDeep } from 'lodash-es';
-  import { columns as pointColumns, workFaceColumns } from './pointTabel/point.data';
+  import { columns as pointColumns, workFaceColumns, simulationColumns } from './pointTabel/point.data';
   import { saveOrUpdate as pointSaveOrUpdate, deleteById as pointDeleteById } from './pointTabel/point.api';
   import { columns as cameraColumns } from './cameraTabel/camera.data';
 
@@ -80,7 +91,7 @@
   const isUpdate = inject('isUpdate');
   const deviceData = inject('formData') as any;
   const deviceType = inject('deviceType') as any;
-  const record = reactive({ strtype: '', strname: '' });
+  const record = reactive({});
   const activeKey = ref('1')
   const linkColumns = ref<any[]>([])
   
@@ -88,7 +99,7 @@
   const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
     //重置表单
     setModalProps({ confirmLoading: false });
-    Object.assign(record, data.record);
+    Object.assign(deviceData, data.record);
     // 判断是否是关键阻力路线
     
   });

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

@@ -10,14 +10,14 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { inject, nextTick, watch } from 'vue';
+  import { inject, nextTick, watch, unref } from 'vue';
   import { BasicForm, useForm } from '/@/components/Form/index';
   // 声明Emits
   const emit = defineEmits(['saveOrUpdate']);
   const testData = inject('formData') as any;
   //表单配置
   const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
-    schemas: inject('formSchema'),
+    schemas: unref(inject('formSchema')),
     showActionButtonGroup: false,
   });
 

+ 10 - 6
src/views/vent/deviceManager/comment/NormalTable.vue

@@ -41,8 +41,8 @@
 
 <script lang="ts" setup>
 //ts语法
-import { ref, provide, reactive, toRaw, defineExpose } from 'vue';
-import { BasicTable, TableAction, ActionItem, EditRecordRow, BasicColumn } from '/@/components/Table';
+import { ref, provide, reactive, toRaw, defineExpose, watch } from 'vue';
+import { BasicTable, ActionItem, EditRecordRow, BasicColumn } from '/@/components/Table';
 import { useModal } from '/@/components/Modal';
 import DeviceModal from './DeviceModal.vue';
 // import { getToken } from '/@/utils/auth';
@@ -108,15 +108,19 @@ const props = defineProps({
   },
 });
 
-const emit = defineEmits(['submitSuccess']);
+const emit = defineEmits(['submitSuccess', 'editHandler']);
 
 const isUpdate = ref(false);
 const record = reactive({});
-
+const formSchemaData = ref(props.formSchema)
 const deviceTypeId = ref('')
 const pageType = ref('')
 
-provide('formSchema', props.formSchema);
+watch(() => props.formSchema, (val) => {
+  formSchemaData.value = val
+})
+
+provide('formSchema', formSchemaData);
 provide('isUpdate', isUpdate);
 provide('formData', record);
 provide('deviceType', props.deviceType);
@@ -261,7 +265,7 @@ function getActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {
 
 
 defineExpose({
-  doRequest, onExportXls, onImportXls, reload
+  doRequest, onExportXls, onImportXls, reload, getForm
 });
 
 </script>

+ 9 - 2
src/views/vent/deviceManager/comment/pointTabel/PointTable.vue

@@ -42,7 +42,7 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, nextTick, inject, onMounted, watch } from 'vue';
+  import { defineComponent, ref, nextTick, inject, onMounted } from 'vue';
   import { BasicTable, useTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table';
   import { Select } from 'ant-design-vue';
   import { ApiTreeSelect } from '/@/components/Form';
@@ -60,6 +60,10 @@
         type: String || Number,
         requried: true,
       },
+      valuetype:{
+        type: Number,
+         requried: true,
+      },
       pointType: {
         type: String,
         requried: true,
@@ -219,7 +223,7 @@
 
       async function getDataSource(pointType) {
         debugger
-        const result = await list({ devicetype: pointType, valuetype: 9, deviceid: props.deviceId });
+        const result = await list({ devicetype: pointType, valuetype: props.valuetype, deviceid: props.deviceId });
         dataSource.value = result.records;
       }
       onMounted(async () => {
@@ -251,4 +255,7 @@
   :deep(.@{ventSpace}-table-body) {
     height: auto !important;
   }
+  .@{ventSpace}-dropdown-menu-item {
+    color: black;
+  }
 </style>

+ 25 - 0
src/views/vent/deviceManager/comment/pointTabel/point.data.ts

@@ -100,6 +100,31 @@ export const columns: BasicColumn[] = [
   },
 ];
 
+export const simulationColumns: BasicColumn[] = [
+  {
+    title: '值名称',
+    dataIndex: 'valuename',
+    width: 100,
+  },
+  {
+    title: '值code',
+    width: 100,
+    dataIndex: 'valuecode',
+  },
+  {
+    title: '模拟最小值',
+    dataIndex: 'testlow',
+    editRow: true,
+    editComponent: 'InputNumber',
+  },
+  {
+    title: '模拟最大值',
+    dataIndex: 'testup',
+    editRow: true,
+    editComponent: 'InputNumber',
+  },
+];
+
 export const warningColumns: BasicColumn[] = [
   {
     title: '监测参数',

+ 1 - 0
src/views/vent/deviceManager/deviceTable/device.data.ts

@@ -129,6 +129,7 @@ export const formSchema: FormSchema[] = [
     label: '点表',
     field: 'strtype',
     component: 'JDictSelectTag',
+    required: true,
     componentProps: {
       dictCode: 'fanlocalkind',
       placeholder: '请选择状态',

+ 4 - 3
src/views/vent/deviceManager/deviceTable/index.vue

@@ -20,12 +20,13 @@
 <script lang="ts" name="system-user" setup>
   //ts语法
   import { ref, onMounted, unref } from 'vue'
-  import { FormSchema } from '/@/components/Table';
   import NormalTable from '../comment/NormalTable.vue';
-  import { searchFormSchema } from './device.data';
   import { list, deleteById, batchDeleteById, saveOrUpdate } from './device.api';
-  import { getFormSchemaColumns, getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
   import { list as substationList } from '../substationTabel/substation.api';
+  
+  import { searchFormSchema } from './device.data';
+  import { FormSchema } from '/@/components/Table';
+  import { getFormSchemaColumns, getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
   import { useRouter } from 'vue-router';
 
   const { currentRoute } = useRouter()

+ 80 - 4
src/views/vent/deviceManager/workingFace/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="device-manager-box">
-    <NormalTable
+    <CustomNormalTable
       :columns="[]"
       :searchFormSchema="searchFormSchema"
       :list="list"
@@ -8,6 +8,7 @@
       :deleteById="deleteById"
       :batchDelete="batchDeleteById"
       :saveOrUpdate="saveOrUpdate"
+      @edit-handler="changeFormItems"
       designScope="workingFace-tabel"
       title="智能管控"
       :showTab="true"
@@ -19,9 +20,84 @@
 
 <script lang="ts" name="system-user" setup>
   //ts语法
-  import NormalTable from '../comment/NormalTable.vue';
-  import { columns, searchFormSchema, formSchema } from './workingFace.data';
-  import { list, getImportUrl, getExportUrl, deleteById, batchDeleteById, saveOrUpdate } from './workingFace.api';
+  import { ref, onMounted } from 'vue'
+  import CustomNormalTable from './CustomNormalTable.vue';
+  import { searchFormSchema, commentFormSchema } from './workingFace.data';
+  import { list, deleteById, batchDeleteById, saveOrUpdate } from './workingFace.api';
+
+  import { FormSchema } from '/@/components/Table';
+  import { getFormSchemaColumns } from '/@/hooks/web/useWebColumns';
+  
+  const formSchema = ref<FormSchema[]>([])
+  const isRefresh = ref(false)
+
+  const arrToFormColumns = (tableHeaderColumns = []) => {
+    const columnList: any[] = [];
+    if(tableHeaderColumns.length > 0){
+      tableHeaderColumns.forEach((item: any) => {
+        let columnsItem;
+        if (item.type == 1 || item.type == 10) {
+          columnsItem = {
+            label: item.unit ? `${item.des}(${item.unit})` : item.des, //_dictText
+            field: item.monitorcode,
+            component: item.type == 1 ? 'Input' : item.type == 10 ? 'InputTextArea' : '',
+          };
+        } else {
+          if (item.type == 3) {
+            columnsItem = {
+              label: item.unit ? `${item.des}(${item.unit})` : item.des, //_dictText
+              field: item.monitorcode,
+              component: 'RadioGroup',
+              defaultValue: 1,
+              componentProps: () => {
+                return {
+                  options: [
+                    { label: '是', value: 1, key: '1' },
+                    { label: '否', value: 0, key: '2' },
+                  ],
+                  stringToNumber: true,
+                };
+              },
+            };
+          }
+          if (item.type == 4) {
+            columnsItem = {
+              label: item.unit ? `${item.des}(${item.unit})` : item.des, //_dictText
+              field: item.monitorcode,
+              component: 'JDictSelectTag',
+              componentProps: {
+                dictCode: item.dict,
+                placeholder: '请选择',
+                stringToNumber: true,
+              },
+            };
+          }
+        }
+        columnList.push(columnsItem);
+        formSchema.value = [...commentFormSchema, ...columnList]
+      });
+    }else{
+      formSchema.value = commentFormSchema as any[]
+    }
+  };
+
+  const changeFormItems = (data) => {
+    if(data && data['strtype']){
+      const formSchemaColumns = getFormSchemaColumns(`${data['strtype']}_edit`) || []
+      arrToFormColumns(formSchemaColumns)
+      isRefresh.value = true
+    }else{
+
+      formSchema.value = commentFormSchema as any[]
+      isRefresh.value = true
+    }
+  }
+
+  onMounted(() => {
+    
+  })
+
+
 </script>
 
 <style scoped></style>

+ 9 - 18
src/views/vent/deviceManager/workingFace/workingFace.data.ts

@@ -55,12 +55,6 @@ export const recycleColumns: BasicColumn[] = [
 
 export const searchFormSchema: FormSchema[] = [
   {
-    label: '系统名称',
-    field: 'systemname',
-    component: 'Input',
-    colProps: { span: 6 },
-  },
-  {
     label: '系统类型',
     field: 'strtype',
     component: 'JDictSelectTag',
@@ -70,9 +64,15 @@ export const searchFormSchema: FormSchema[] = [
       placeholder: '请选择系统型号',
     },
   },
+  {
+    label: '系统名称',
+    field: 'systemname',
+    component: 'Input',
+    colProps: { span: 6 },
+  }
 ];
 
-export const formSchema: FormSchema[] = [
+export const commentFormSchema: FormSchema[] = [
   {
     label: '',
     field: 'id',
@@ -93,7 +93,9 @@ export const formSchema: FormSchema[] = [
     label: '系统类型',
     field: 'strtype',
     component: 'JDictSelectTag',
+    required: true,
     componentProps: {
+      disabled: true,
       dictCode: 'syskind',
       placeholder: '请选择系统型号',
     },
@@ -122,17 +124,6 @@ export const formSchema: FormSchema[] = [
     },
   },
   {
-    label: '点表',
-    field: 'strtype',
-    component: 'JDictSelectTag',
-    componentProps: () => {
-      return {
-        dictCode: 'syskind',
-        placeholder: '请选择状态',
-      };
-    },
-  },
-  {
     label: '监测类型',
     field: 'monitorflag_dictText',
     component: 'JDictSelectTag',

+ 27 - 1
src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts

@@ -219,7 +219,32 @@ export const majorColumns: BasicColumn[] = [
     width: 127,
   },
 ];
-
+export const surfaceChartsColumns = [
+  {
+    legend: '进风',
+    seriesName: '(m³/min)',
+    ymax: 5000,
+    yname: 'm³/min',
+    linetype: 'line',
+    yaxispos: 'left',
+    color: '#00FFA8',
+    sort: 1,
+    xRotate: 0,
+    dataIndex: 'jin',
+  },
+  {
+    legend: '回风',
+    seriesName: '',
+    ymax: 5000,
+    yname: 'm³/min',
+    linetype: 'line',
+    yaxispos: 'left',
+    color: '#F07070',
+    sort: 1,
+    xRotate: 0,
+    dataIndex: 'hui',
+  },
+];
 export const noDetailArr = ['nitrogen', 'forcFan']; // 前端详情的,
 export const haveDetailArr = [
   'windrect',
@@ -237,3 +262,4 @@ export const haveDetailArr = [
 export const haveHandlerArr = ['windrect', 'window', 'gate', 'fanlocal', 'fanmain', 'pump', 'obfurage', 'nitrogen', 'pulping', 'spray', 'dustdev']; // table无操作
 export const noWarningArr = ['location', 'vehicle', 'cheliang']; // 无预警详情的
 export const haveSysDetailArr = ['']; //有场景详情的
+export const noHistoryArr = () => History_Type['type'] == 'remote' ? ['surface_history'] : [];

+ 211 - 155
src/views/vent/monitorManager/deviceMonitor/components/device/index.vue

@@ -50,10 +50,10 @@
       <!-- <dv-border-box8 :dur="5"  :style="`padding: 5px; height: ${scroll.y + 100}px`" > -->
       <div :style="`padding: 5px; height: ${scroll.y + 100}px`">
         <div class="to-small" @click="toHome"></div>
-        <div class="device-button-group" v-if="deviceList.length > 0 && haveSysDetailArr.find((item) => deviceType.startsWith(item))">
-          <div class="device-button" :class="{ 'device-active': deviceActive == device.deviceType }"
+        <div class="device-button-group" v-if="deviceList.length > 0">
+          <div class="device-button"  :class="{ 'device-active': deviceActive == device.deviceType }"
             v-for="(device, index) in deviceList" :key="index" @click="monitorChange(index)">{{ device.deviceName }}</div>
-          <div class="enter-detail" @click="goDetail()">
+          <div v-if="haveSysDetailArr.find((item) => deviceType.startsWith(item))" class="enter-detail" @click="goDetail()">
             <send-outlined />
             {{ treeNodeTitle }}详情
           </div>
@@ -67,11 +67,43 @@
           </div>
         </div>
         <div style="color: #fff;">{{ deviceType }}</div>
-        <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange" id="tabsBox" v-if="isRefresh">
+        <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange" id="tabsBox">
           <a-tab-pane key="1" tab="实时监测">
             <template v-if="(deviceType.startsWith('fanlocal') || deviceType.startsWith('fanmain')) && activeKey == '1'">
-              <GroupMonitorTable  ref="MonitorDataTable" :dataSource="dataSource" :columnsType="`${deviceType}_monitor`" :scroll="scroll" :isAction="true" :isShowSelect="false">
-                <template #action="{ record }">
+              <a-spin :spinning="isRefresh" >
+                <GroupMonitorTable  ref="MonitorDataTable" :dataSource="dataSource" :columnsType="`${deviceType}_monitor`" :scroll="scroll" :isAction="true" :isShowSelect="false">
+                  <template #action="{ record }">
+                      <TableAction :actions="haveDetailArr.find((item) => deviceType.startsWith(item)) ? [
+                        {
+                          label: '详情',
+                          onClick: goDetail.bind(null, record),
+                        },
+                        {
+                          label: '定位',
+                          onClick: goLocation.bind(null, record),
+                        },
+                      ] : [
+                        {
+                          label: '定位',
+                          onClick: goLocation.bind(null, record),
+                        },
+                      ]" />
+                    </template>
+                </GroupMonitorTable>
+              </a-spin>
+            </template>
+            <template v-else-if="deviceType == 'majorpath' && activeKey == '1'">
+              <a-spin :spinning="isRefresh">
+                <a-table :columns="majorColumns" :data-source="dataSource" bordered :scroll="scroll" :pagination="false">
+                </a-table>
+              </a-spin>
+            </template>
+            <template v-else-if="deviceType.startsWith('safetymonitor') && activeKey == '1'">
+              <a-spin :spinning="isRefresh">
+                <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :dataSource="dataSource"
+                  design-scope="device_monitor" :isShowActionColumn="true" :isShowSelect="false" title="设备监测" 
+                  :form-config="formConfig" :scroll="{ y: scroll.y - 110 }">
+                  <template #action="{ record }">
                     <TableAction :actions="haveDetailArr.find((item) => deviceType.startsWith(item)) ? [
                       {
                         label: '详情',
@@ -88,151 +120,138 @@
                       },
                     ]" />
                   </template>
-              </GroupMonitorTable>
-            </template>
-            <template v-else-if="deviceType == 'majorpath' && activeKey == '1'">
-              <a-table :columns="majorColumns" :data-source="dataSource" bordered :scroll="scroll" :pagination="false">
-              </a-table>
-            </template>
-            <template v-else-if="deviceType.startsWith('safetymonitor') && activeKey == '1'">
-              <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :dataSource="dataSource"
-                design-scope="device_monitor" :isShowActionColumn="true" :isShowSelect="false" title="设备监测" 
-                :form-config="deviceType.startsWith('safetymonitor') ? formConfig : undefined"
-                :scroll="{y: scroll.y - 110}">
-                <template #action="{ record }">
-                  <TableAction :actions="haveDetailArr.find((item) => deviceType.startsWith(item)) ? [
-                    {
-                      label: '详情',
-                      onClick: goDetail.bind(null, record),
-                    },
-                    {
-                      label: '定位',
-                      onClick: goLocation.bind(null, record),
-                    },
-                  ]: [
-                    {
-                      label: '定位',
-                      onClick: goLocation.bind(null, record),
-                    },
-                  ] " />
-                </template>
-                <template #filterCell="{ column, record }">
-                  <div v-if="!record.devicename && column.dataIndex === 'devicename'">-</div>
-                  <div v-if="!record.V && column.dataIndex === 'V'">-</div>
-                  <div v-if="!record.PointUnit && column.dataIndex === 'PointUnit'">-</div>
-                  <div v-if="!record.highRange && column.dataIndex === 'highRange'">-</div>
-                  <div v-if="!record.lowRange && column.dataIndex === 'lowRange'">-</div>
-                  <div v-if="!record.dataTypeName && column.dataIndex === 'dataTypeName'">-</div>
-                  <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == 0 ? 'default' : 'green'">{{
-                    record.netStatus == 0 ? '断开' : '连接'
-                  }}</a-tag>
-                </template>
-              </MonitorTable>
-            </template>
-            <template v-else>
-              <MonitorTable v-if="activeKey == '1'" ref="monitorTable" :columnsType="`${deviceType}_monitor`" :dataSource="dataSource"
-                design-scope="device_monitor" :isShowActionColumn="true" :isShowSelect="false" title="设备监测"
-                :scroll="{ y: scroll.y - 30 }">
-                <template #action="{ record }">
-                  <TableAction :actions="haveDetailArr.find((item) => deviceType.startsWith(item)) ? [
-                    {
-                      label: '详情',
-                      onClick: goDetail.bind(null, record),
-                    },
-                    {
-                      label: '定位',
-                      onClick: goLocation.bind(null, record),
-                    },
-                  ] : [
-                    {
-                      label: '定位',
-                      onClick: goLocation.bind(null, record),
-                    },
-                  ]" />
-                </template>
-                <template #filterCell="{ column, record }">
-                  <template v-if="deviceType.startsWith('gate')">
-                    <template v-if="record.frontGateOpenCtrl == 1 || record.frontGateOpenCtrl === true">
-                      <a-tag
-                        v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0"
-                        color="red">正在打开</a-tag>
-                      <a-tag v-else-if="column.dataIndex === 'frontGateOpen'" color="processing">打开</a-tag>
-                    </template>
-                    <template v-else-if="record.frontGateOpenCtrl == 0 || record.frontGateOpenCtrl === false">
-                      <a-tag
-                        v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0"
-                        color="red">正在关闭</a-tag>
-                      <a-tag
-                        v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 1"
-                        color="default">关闭</a-tag>
-                      <a-tag
-                        v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 1 && record.frontGateClose == 0"
-                        color="default">打开</a-tag>
-                    </template>
-                    <template v-if="record.rearGateOpenCtrl == 1 || record.rearGateOpenCtrl === true">
-                      <a-tag
-                        v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0"
-                        color="red">正在打开</a-tag>
-                      <a-tag v-else-if="column.dataIndex === 'rearGateOpen'" color="processing">打开</a-tag>
-                    </template>
-                    <template v-else-if="record.rearGateOpenCtrl == 0 || record.rearGateOpenCtrl === false">
-                      <a-tag
-                        v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0"
-                        color="red">正在关闭</a-tag>
-                      <a-tag
-                        v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 1"
-                        color="default">关闭</a-tag>
-                      <a-tag
-                        v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 1 && record.rearGateClose == 0"
-                        color="default">打开</a-tag>
-                    </template>
-                  </template>
-                  <template v-else-if="deviceType.startsWith('windrect')">
-                    <a-tag v-if="column.dataIndex === 'sign'"
-                      :color="record.sign == 0 ? '#95CF65' : record.sign == 1 ? '#4590EA' : '#9876AA'"> {{
-                        record.sign == 0 ? '高位' : record.sign == 1 ? '中位' : '低位'
-                      }}</a-tag>
-                    <template v-if="record && column && column.dataIndex === 'isRun' && record.isRun">
-                      <a-tag v-if="record.isRun == -2 || record.isRun == -1"
-                        :color="record.isRun == -2 ? '#95CF65' : '#ED5700'">{{
-                          record.isRun == -2 ? '空闲' : '等待'
-                        }}</a-tag>
-                      <a-tag v-else-if="record.isRun == 100" color="#4693FF">完成</a-tag>
-                      <Progress v-else :percent="Number(record.isRun)" size="small" status="active" />
-                    </template>
-                  </template>
-                  <template v-else-if="deviceType.startsWith('safetymonitor')">
+                  <template #filterCell="{ column, record }">
                     <div v-if="!record.devicename && column.dataIndex === 'devicename'">-</div>
                     <div v-if="!record.V && column.dataIndex === 'V'">-</div>
                     <div v-if="!record.PointUnit && column.dataIndex === 'PointUnit'">-</div>
                     <div v-if="!record.highRange && column.dataIndex === 'highRange'">-</div>
                     <div v-if="!record.lowRange && column.dataIndex === 'lowRange'">-</div>
                     <div v-if="!record.dataTypeName && column.dataIndex === 'dataTypeName'">-</div>
+                    <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == 0 ? 'default' : 'green'">{{
+                      record.netStatus == 0 ? '断开' : '连接'
+                    }}</a-tag>
                   </template>
-                  <a-tag v-if="column.dataIndex === 'warnFlag'"
-                    :color="record.warnFlag == 0 ? 'green' : record.warnFlag == 1 ? '#FF5812' : 'gray'"> {{
-                      record.warnFlag == 0 ? '正常' : record.warnFlag == 1 ? '报警' : record.warnFlag == 2 ? '断开' : '未监测'
+                </MonitorTable>
+              </a-spin>
+            </template>
+            <template v-else>
+              <!-- 工作面echarts图标 -->
+              <a-spin :spinning="isRefresh">
+                <BarAndLine
+                    v-if="activeKey == '1' && deviceType == 'surface_history'"
+                    class="echarts-line"
+                    xAxisPropType="time"
+                    :dataSource="surfaceEchartsData"
+                    height="300px"
+                    :chartsColumns="surfaceChartsColumns"
+                    :option="echatsOption"
+                    chartsType="listMonitor" />
+                <MonitorTable v-else-if="activeKey == '1'" ref="monitorTable" :columnsType="`${deviceType}_monitor`" :dataSource="dataSource"
+                  design-scope="device_monitor" :isShowActionColumn="true" :isShowSelect="false" title="设备监测"
+                  :scroll="{ y: scroll.y - 30 }">
+                  <template #action="{ record }">
+                    <TableAction :actions="haveDetailArr.find((item) => deviceType.startsWith(item)) ? [
+                      {
+                        label: '详情',
+                        onClick: goDetail.bind(null, record),
+                      },
+                      {
+                        label: '定位',
+                        onClick: goLocation.bind(null, record),
+                      },
+                    ] : [
+                      {
+                        label: '定位',
+                        onClick: goLocation.bind(null, record),
+                      },
+                    ]" />
+                  
+                  </template>
+                  
+                  <template #filterCell="{ column, record }">
+                    <template v-if="deviceType.startsWith('gate')">
+                      <template v-if="record.frontGateOpenCtrl == 1 || record.frontGateOpenCtrl === true">
+                        <a-tag
+                          v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0"
+                          color="red">正在打开</a-tag>
+                        <a-tag v-else-if="column.dataIndex === 'frontGateOpen'" color="processing">打开</a-tag>
+                      </template>
+                      <template v-else-if="record.frontGateOpenCtrl == 0 || record.frontGateOpenCtrl === false">
+                        <a-tag
+                          v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0"
+                          color="red">正在关闭</a-tag>
+                        <a-tag
+                          v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 1"
+                          color="default">关闭</a-tag>
+                        <a-tag
+                          v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 1 && record.frontGateClose == 0"
+                          color="default">打开</a-tag>
+                      </template>
+                      <template v-if="record.rearGateOpenCtrl == 1 || record.rearGateOpenCtrl === true">
+                        <a-tag
+                          v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0"
+                          color="red">正在打开</a-tag>
+                        <a-tag v-else-if="column.dataIndex === 'rearGateOpen'" color="processing">打开</a-tag>
+                      </template>
+                      <template v-else-if="record.rearGateOpenCtrl == 0 || record.rearGateOpenCtrl === false">
+                        <a-tag
+                          v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0"
+                          color="red">正在关闭</a-tag>
+                        <a-tag
+                          v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 1"
+                          color="default">关闭</a-tag>
+                        <a-tag
+                          v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 1 && record.rearGateClose == 0"
+                          color="default">打开</a-tag>
+                      </template>
+                    </template>
+                    <template v-else-if="deviceType.startsWith('windrect')">
+                      <a-tag v-if="column.dataIndex === 'sign'"
+                        :color="record.sign == 0 ? '#95CF65' : record.sign == 1 ? '#4590EA' : '#9876AA'"> {{
+                          record.sign == 0 ? '高位' : record.sign == 1 ? '中位' : '低位'
+                        }}</a-tag>
+                      <template v-if="record && column && column.dataIndex === 'isRun' && record.isRun">
+                        <a-tag v-if="record.isRun == -2 || record.isRun == -1"
+                          :color="record.isRun == -2 ? '#95CF65' : '#ED5700'">{{
+                            record.isRun == -2 ? '空闲' : '等待'
+                          }}</a-tag>
+                        <a-tag v-else-if="record.isRun == 100" color="#4693FF">完成</a-tag>
+                        <Progress v-else :percent="Number(record.isRun)" size="small" status="active" />
+                      </template>
+                    </template>
+                    <template v-else-if="deviceType.startsWith('safetymonitor')">
+                      <div v-if="!record.devicename && column.dataIndex === 'devicename'">-</div>
+                      <div v-if="!record.V && column.dataIndex === 'V'">-</div>
+                      <div v-if="!record.PointUnit && column.dataIndex === 'PointUnit'">-</div>
+                      <div v-if="!record.highRange && column.dataIndex === 'highRange'">-</div>
+                      <div v-if="!record.lowRange && column.dataIndex === 'lowRange'">-</div>
+                      <div v-if="!record.dataTypeName && column.dataIndex === 'dataTypeName'">-</div>
+                    </template>
+                    <a-tag v-if="column.dataIndex === 'warnFlag'"
+                      :color="record.warnFlag == 0 ? 'green' : record.warnFlag == 1 ? '#FF5812' : 'gray'"> {{
+                        record.warnFlag == 0 ? '正常' : record.warnFlag == 1 ? '报警' : record.warnFlag == 2 ? '断开' : '未监测'
+                      }}</a-tag>
+                    <template v-else-if="column.dataIndex === 'warnLevel'">
+                      <a-tag v-if="record.warnLevel == '101'" color="green">蓝色预警</a-tag>
+                      <a-tag v-else-if="record.warnLevel == '102'" color="#FF5812">黄色预警</a-tag>
+                      <a-tag v-else-if="record.warnLevel == '103'" color="#FF5812">橙色预警</a-tag>
+                      <a-tag v-else-if="record.warnLevel == '104'" color="#FF5812">红色预警</a-tag>
+                      <a-tag v-else-if="record.warnLevel == '201'" color="#FF0000">报警</a-tag>
+                      <a-tag v-else-if="record.warnLevel == '10000'" color="#FF5812">数据超限</a-tag>
+                      <a-tag v-else-if="record.warnLevel == '1001'" color="default">网络中断</a-tag>
+                      <a-tag v-else color="green">正常</a-tag>
+                    </template>
+                    <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == 0 ? 'default' : 'green'">{{
+                      record.netStatus == 0 ? '断开' : '连接'
                     }}</a-tag>
-                  <template v-else-if="column.dataIndex === 'warnLevel'">
-                    <a-tag v-if="record.warnLevel == '101'" color="green">蓝色预警</a-tag>
-                    <a-tag v-else-if="record.warnLevel == '102'" color="#FF5812">黄色预警</a-tag>
-                    <a-tag v-else-if="record.warnLevel == '103'" color="#FF5812">橙色预警</a-tag>
-                    <a-tag v-else-if="record.warnLevel == '104'" color="#FF5812">红色预警</a-tag>
-                    <a-tag v-else-if="record.warnLevel == '201'" color="#FF0000">报警</a-tag>
-                    <a-tag v-else-if="record.warnLevel == '10000'" color="#FF5812">数据超限</a-tag>
-                    <a-tag v-else-if="record.warnLevel == '1001'" color="default">网络中断</a-tag>
-                    <a-tag v-else color="green">正常</a-tag>
                   </template>
-                  <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == 0 ? 'default' : 'green'">{{
-                    record.netStatus == 0 ? '断开' : '连接'
-                  }}</a-tag>
-                </template>
-              </MonitorTable>
+                </MonitorTable>
+              </a-spin>
             </template>
           </a-tab-pane>
-          <a-tab-pane key="2" tab="历史数据">
-            <div class="tab-item">
-              <HistoryTable ref="historyTable" v-if="activeKey == '2'" :sysId="systemID" :columns-type="`${deviceType}`"
+          <a-tab-pane key="2" tab="历史数据" v-if="!(noHistoryArr()).find((item) => deviceType.startsWith(item))">
+            <div class="tab-item" :sysId="systemID" :columns-type="`${deviceType}`">
+              <HistoryTable ref="historyTable" v-if="activeKey == '2'"
                 :device-type="deviceType"
                 :device-list-api="getDeviceList.bind(null, { devicekind: deviceType, sysId: systemID })"
                 designScope="device-history" :scroll="scroll" />
@@ -282,10 +301,11 @@ 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 } from  './device.data'
+import { majorColumns, haveSysDetailArr, haveDetailArr, haveHandlerArr, noWarningArr, surfaceChartsColumns, noHistoryArr } from  './device.data'
 import mainPath from './modal/mainPath.vue'
 import { formConfig } from '../../../safetyMonitor/safety.data'
 import { getDictItemsByCode } from '/@/utils/dict';
+import BarAndLine from '/@/components/chart/BarAndLine.vue';
 // import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';
 
 
@@ -297,7 +317,18 @@ const props = defineProps({
     default: () => { }
   }
 })
-
+const echatsOption = {
+  grid: {
+    top: '35',
+    left: '30',
+    right: '45',
+    bottom: '25',
+    containLabel: true
+  },
+  toolbox: {
+    feature: {}
+  },
+}
 const router = useRouter()
 
 const actions = getActions();
@@ -309,7 +340,7 @@ const alarmHistoryTable = ref()
 const handlerHistoryTable = ref()
 
 // const routerParam = ref('home') // 默认进来时首页
-const isRefresh = ref(true)
+const isRefresh = ref(false)
 // 模态框
 const currentModal = shallowRef<Nullable<ComponentOptions>>(null); //模态框
 const modalVisible = ref<Boolean>(false); // 模态框是否可见
@@ -324,7 +355,8 @@ const deviceList = ref<DeviceType[]>([]) //关联设备列表
 const deviceActive = ref('')
 const activeKey = ref('1'); // tab key
 const dataSource = shallowRef([]) // 实时监测数据
-const majorPathEchartsData = ref({})
+const majorPathEchartsData = ref({}) // 关键路线echarts数据
+const surfaceEchartsData = ref<any[]>() // 工作面历史记录,echarts数据
 const activeID = ref('') // 打开详情modal时监测的设备id
 const deviceType = ref('') // 监测设备类型
 const systemType = ref('')
@@ -352,10 +384,24 @@ const onSelect: TreeProps['onSelect'] = (keys, e) => {
     deviceType.value = e.node.type
     actions.setGlobalState({ locationObj: { pageType: deviceType.value }, pageObj: null });
   }
-  selectedKeys.value = keys
-  treeNodeTitle.value = e.node.title
-  dataSource.value = []
-  activeKey.value = '1'
+  if(timer == null){
+    timer = undefined
+  }
+  if(timer){
+    clearTimeout(timer)
+    timer = undefined
+  }
+
+  isRefresh.value = true
+  setTimeout(() => {
+    isRefresh.value = false
+    selectedKeys.value = keys
+    treeNodeTitle.value = e.node.title
+    dataSource.value = []
+    activeKey.value = '1'
+    timer = null
+    getMonitor()
+  }, 200)
 };
 
 function tabChange(activeKeyVal) {
@@ -431,7 +477,10 @@ async function getDataSource() {
         if(item.type === 'majorpath'){
           deviceArr.unshift({ deviceType: item.type, deviceName: item['typeName'], datalist: item['datalist'][0]['paths'] })
           majorPathEchartsData.value = item['datalist'][0]
-        }else {
+        }else if(item.type.startsWith('surface_history')) {
+          surfaceEchartsData.value = item['datalist'][0]
+          deviceArr.unshift({ deviceType: item.type, deviceName: item['typeName'] ? item['typeName'] : item['datalist'][0]['typeName'], datalist: data })
+        } else{
           deviceArr.unshift({ deviceType: item.type, deviceName: item['typeName'] ? item['typeName'] : item['datalist'][0]['typeName'], datalist: data })
         }
       }
@@ -452,6 +501,7 @@ async function getDataSource() {
   } else {
     let res = null
     if(systemID.value){
+
       res = await list({ devicetype: 'sys', types: deviceType.value, systemID: systemID.value })
       if (res && res.msgTxt) {
         const result = res.msgTxt;
@@ -465,16 +515,22 @@ async function getDataSource() {
               dataSource.value = item['datalist'][0]['paths']
                majorPathEchartsData.value = item['datalist'][0]
               return
-            } else if(item.type == deviceType.value) {
-              dataSource.value = data
-              console.log('关联设备数据--------------->', data)
+            }else if(item.type == deviceType.value) {
+              if( item.type == 'surface_history') { // 工作面图标数据
+                surfaceEchartsData.value = item['datalist'][0]
+              }else{
+                dataSource.value = data
+                console.log('关联设备数据--------------->', data)
+              }
               return
             }
           }
         })
       }
     }else{
-      res = await list({ devicetype: deviceType.value, pagetype: 'normal' })
+      const formData = monitorTable.value.getForm()
+      const searchForm = formData.getFieldsValue()
+      res = await list({ devicetype: deviceType.value, pagetype: 'normal', filterParams: { ...searchForm } })
       if (res && res.msgTxt) {
         const result = res.msgTxt[0];
         if(result){
@@ -485,9 +541,8 @@ async function getDataSource() {
           if (deviceType.value.startsWith('safetymonitor')) {
             const resultData = <any[]>[]
             // 如果是安全监控的数据时需要过滤常见设备数据,根据设定的常用安全监控字典去匹配
-            const formData = monitorTable.value.getForm()
             const dictCodes = getDictItemsByCode('safetynormal')
-            const searchForm = formData.getFieldsValue()
+           
             if (!searchForm['dataTypeName'] && dictCodes && dictCodes.length) {
               for (let i = 0; i < dictCodes.length; i++) {
                 const dict = dictCodes[i]
@@ -607,6 +662,7 @@ function toHome() {
 }
 
 async function findTreeDataValue(obj) {
+  debugger
   const findDeviceType = (data: [], obj) => {
     let type = ''
     if (obj.deviceid) {

+ 1 - 2
src/views/vent/monitorManager/fanLocalMonitor/fanLocal.three.ts

@@ -511,8 +511,7 @@ const mousemove = () => {
 export const mountedThree = (playerVal1) => {
   player1 = playerVal1;
   return new Promise((resolve) => {
-    // model = new UseThree('#fanLocal3D', '#fanLocal3DCSS');
-    model = new UseThree('#fanLocal3D');
+    model = VENT_PARAM['simulatedPassword'] ? new UseThree('#fanLocal3D', '#fanLocal3DCSS') : new UseThree('#fanLocal3D');
     model.setEnvMap('test1');
     model.renderer.toneMappingExposure = 1.0;
     if (model.renderer) {

+ 96 - 81
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -3,7 +3,7 @@
     <a-spin :spinning="loading" >
     </a-spin>
     <div id="fanLocal3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"> </div>
-    <!-- <div id="fanLocal3DCSS" class="threejs-Object-CSS" style="width: 100%; height: 100%; position: absolute; overflow: hidden; pointer-events: none;">
+    <div v-if="globalConfig?.simulatedPassword" id="fanLocal3DCSS" class="threejs-Object-CSS" style="width: 100%; height: 100%; position: absolute; overflow: hidden; pointer-events: none;">
       <div style="z-index: -1; position: relative">
         <div class="elementTag" id="inputBox">
           <div class="elementContent">
@@ -22,7 +22,7 @@
             <p>回风流瓦斯浓度:{{ selectData.gas3 ? selectData.gas3 : '-' }}</p>
           </div>
         </div>
-        <div class="elementTag" id="gateBox">
+        <!-- <div class="elementTag" id="gateBox">
           <div class="elementContent">
             <p>风门状态:关</p>
             <p>风门过风面积:{{ selectData.gas1 ? selectData.gas1 : '-' }}</p>
@@ -32,15 +32,15 @@
           <div class="elementContent">
             <p>风窗全风压回风流:0</p>
           </div>
-        </div>
+        </div> -->
       </div>
-    </div> -->
+    </div>
   </div>
   
   <div class="scene-box">
     <div class="top-box" v-if="!loading">
       <div class="top-center row">
-        <div class="vent-flex-row" id="fanLocalSelectDom" v-if="getDictItemsByCode('fanlocaltype')">
+        <div class="vent-flex-row" id="fanLocalSelectDom" v-if="getDictItemsByCode('fanlocaltype') && !globalConfig?.simulatedPassword">
           <span style="color: #00f5fe; margin-left: 5px;">风机类型:</span>
           <JDictSelectTag v-model:value="devicekide" dictCode="fanlocaltype" :showChooseOption="false" :getPopupContainer="getPopupContainer" @change="changeDeviceKind" />
         </div>
@@ -350,82 +350,97 @@
   const [registerModal, { openModal, closeModal }] = useModal();
   const { currentRoute } = useRouter();
 
-  const modalTypeArr = reactive({
-    leftBtnArr: [
-      {
-        key: 'startSmoke',
-        value: '启动风机',
-      },
-      {
-        key: 'changeSmoke',
-        value: '一键倒机',
-      },
-      // {
-      //   key: 'Fan1Frequency',
-      //   value: '主机调频',
-      // },
-      // {
-      //   key: 'Fan2Frequency',
-      //   value: '备机调频',
-      // },
-      // {
-      //   key: 'windPower',
-      //   value: '风电闭锁',
-      // },
-      // {
-      //   key: 'gasPower',
-      //   value: '瓦斯电闭锁',
-      // },
-      // {
-      //   key: 'needAir',
-      //   value: '需风量',
-      // },
-      // {
-      //   key: 'diameter',
-      //   value: '风筒直径',
-      // },
-      // {
-      //   key: 'len',
-      //   value: '风筒长度',
-      // },
-    ],
-    rightBtnArr: [
-      // {
-      //   key: 'fanlocal',
-      //   value: '变频风机',
-      // },
-      // {
-      //   key: 'fanlocaldp',
-      //   value: '定频风机',
-      // },
-      // {
-      //   key: 'frequency',
-      //   value: '调频',
-      // },
-      // {
-      //   key: 'windPowerLimit',
-      //   value: '风电闭锁限值',
-      // },
-      // {
-      //   key: 'gasPowerLimit',
-      //   value: '瓦斯电闭锁限值',
-      // },
-      // {
-      //   key: 'airVolumeAlarm',
-      //   value: '风量报警',
-      //   min: 0,
-      //   max: 100,
-      // },
-      // {
-      //   key: 'disAirAlarm',
-      //   value: '漏风率报警',
-      // },
-      // {
-      //   key: 'gasAlarm',
-      //   value: '瓦斯报警',
-      // },
-    ],
-  });
+  const modalTypeArr = reactive(
+    VENT_PARAM['simulatedPassword'] ? 
+    {
+      leftBtnArr: [
+        {
+          key: 'startSmoke',
+          value: '启动风机',
+        },
+        {
+          key: 'changeSmoke',
+          value: '一键倒机',
+        },
+        // {
+        //   key: 'Fan1Frequency',
+        //   value: '主机调频',
+        // },
+        // {
+        //   key: 'Fan2Frequency',
+        //   value: '备机调频',
+        // },
+        {
+          key: 'windPower',
+          value: '风电闭锁',
+        },
+        {
+          key: 'gasPower',
+          value: '瓦斯电闭锁',
+        },
+        {
+          key: 'needAir',
+          value: '需风量',
+        },
+        {
+          key: 'diameter',
+          value: '风筒直径',
+        },
+        {
+          key: 'len',
+          value: '风筒长度',
+        },
+      ],
+      rightBtnArr: [
+        // {
+        //   key: 'fanlocal',
+        //   value: '变频风机',
+        // },
+        // {
+        //   key: 'fanlocaldp',
+        //   value: '定频风机',
+        // },
+        {
+          key: 'frequency',
+          value: '调频',
+        },
+        {
+          key: 'windPowerLimit',
+          value: '风电闭锁限值',
+        },
+        {
+          key: 'gasPowerLimit',
+          value: '瓦斯电闭锁限值',
+        },
+        {
+          key: 'airVolumeAlarm',
+          value: '风量报警',
+          min: 0,
+          max: 100,
+        },
+        {
+          key: 'disAirAlarm',
+          value: '漏风率报警',
+        },
+        {
+          key: 'gasAlarm',
+          value: '瓦斯报警',
+        },
+      ],
+    }: {
+      leftBtnArr: [
+        {
+          key: 'startSmoke',
+          value: '启动风机',
+        },
+        {
+          key: 'changeSmoke',
+          value: '一键倒机',
+        },
+      ],
+      rightBtnArr: [
+      ],
+    });
   const sensorList = ref<any[]>([
     {
       value: '1',

+ 2 - 2
src/views/vent/monitorManager/gateMonitor/gate.threejs.three.ts

@@ -462,7 +462,7 @@ class Fm2 {
     }
   }
 
-  mountedThree() {
+  mountedThree(playerDom) {
     this.group = new THREE.Object3D();
     this.group.name = this.modelName;
     return new Promise((resolve) => {
@@ -476,8 +476,8 @@ class Fm2 {
         // this.deviceDetailCard();
         this.model.animate();
         if (this.model.camera && this.model.camera.layers.mask == -1) this.model.camera.layers.toggle(1);
-        this.initCamera();
         resolve(null);
+        this.initCamera(playerDom);
       });
     });
   }

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

@@ -106,7 +106,6 @@ export const setModelType = (type) => {
         );
       }, 300);
     } else if (fmType === 'fm2' && fm2 && fm2.group) {
-      
       fm2.clipActionArr.frontDoor.reset();
       fm2.clipActionArr.frontDoor.time = 0.5;
       fm2.clipActionArr.backDoor.reset();
@@ -141,16 +140,17 @@ export const setModelType = (type) => {
   });
 };
 
-export const initCameraCanvas = async (playerVal1?, playerVal2?) => {
+export const initCameraCanvas = async (playerVal1) => {
+  debugger;
   if (fmType === 'fm1' && fm1) {
-    return await fm1.initCamera.call(fm1, playerVal1, playerVal2);
+    return await fm1.initCamera.call(fm1, playerVal1);
   } else if (fmType === 'fm2' && fm2) {
-    console.log('fm2-------',playerVal1);
+    console.log('fm2-------', playerVal1);
     return fm2.initCamera.call(fm2, playerVal1);
   }
 };
 
-export const mountedThree = () => {
+export const mountedThree = (playerDom) => {
   return new Promise(async (resolve) => {
     model = new UseThree('#damper3D', '', '#deviceDetail');
     model.setEnvMap('test1');
@@ -158,9 +158,9 @@ export const mountedThree = () => {
     model.camera.position.set(100, 0, 1000);
     // 单道、 双道
     fm1 = new Fm1(model);
-    await fm1.mountedThree();
+    await fm1.mountedThree(playerDom);
     fm2 = new Fm2(model);
-    await fm2.mountedThree();
+    await fm2.mountedThree(playerDom);
 
     model.animate();
     resolve(null);

+ 9 - 41
src/views/vent/monitorManager/gateMonitor/gate.threejs.two.ts

@@ -185,7 +185,7 @@ class Fm1 {
         const planeMesh = new THREE.Mesh(planeGeometry, textMaterial);
         planeMesh.name = 'monitorText';
         planeMesh.scale.set(0.002, 0.002, 0.002);
-        planeMesh.position.set(-1.255, 0.09, -0.41);
+        planeMesh.position.set(3.685, 0.09, -0.41);
         this.group.add(planeMesh);
       }
       textMap.dispose();
@@ -443,13 +443,11 @@ class Fm1 {
     // }, 1000);
   }
 
-  async initCamera(dom1?, dom2?) {
+  async initCamera(dom1) {
     const videoPlayer1 = dom1;
-    const videoPlayer2 = dom2;
     this.player1 = dom1;
-    this.player2 = dom2;
     let monitorPlane: THREE.Mesh | null = null;
-    if (!videoPlayer1 || !videoPlayer2) {
+    if (!videoPlayer1) {
       const textArr = [
         {
           text: `无信号输入`,
@@ -494,47 +492,16 @@ class Fm1 {
       if (monitorPlane && !this.group.getObjectByName('noPlayer1')) {
         const planeMesh = monitorPlane.clone();
         planeMesh.name = 'noPlayer1';
-        planeMesh.scale.set(0.0085, 0.0056, 0.012);
-        planeMesh.position.set(-4.23, 0.02, -0.39);
+        planeMesh.scale.set(0.0085, 0.0055, 0.012);
+        planeMesh.position.set(-3.64, 0.01, -0.41);
         this.group?.add(planeMesh.clone());
       }
     } else if (videoPlayer1) {
       try {
         const mesh = renderVideo(this.group, videoPlayer1, 'player1');
         if (mesh) {
-          mesh?.scale.set(-0.028, 0.0285, 1);
-          mesh?.position.set(-4.262, 0.02, -0.4);
-          mesh.rotation.y = -Math.PI;
-          this.group.add(mesh);
-        }
-      } catch (error) {
-        console.log('视频信号异常');
-      }
-    }
-    const player2 = this.group.getObjectByName('player2');
-    if (player2) {
-      this.model.clearMesh(player2);
-      this.group.remove(player2);
-    }
-    const noPlayer2 = this.group.getObjectByName('noPlayer2');
-    if (noPlayer2) {
-      this.model.clearMesh(noPlayer2);
-      this.group.remove(noPlayer2);
-    }
-    if (!videoPlayer2 && videoPlayer2 === null) {
-      if (monitorPlane && !this.group.getObjectByName('noPlayer2')) {
-        const planeMesh = monitorPlane.clone();
-        planeMesh.name = 'noPlayer2';
-        planeMesh.scale.set(0.0085, 0.0056, 0.012);
-        planeMesh.position.set(4.29, 0.02, -0.41);
-        this.group?.add(planeMesh.clone());
-      }
-    } else if (videoPlayer2) {
-      try {
-        const mesh = renderVideo(this.group, videoPlayer2, 'player2');
-        if (mesh) {
-          mesh?.scale.set(-0.028, 0.0285, 1);
-          mesh?.position.set(4.298, 0.02, -0.4);
+          mesh?.scale.set(-0.0275, 0.028, 1);
+          mesh?.position.set(-3.643, 0.02, -0.4);
           mesh.rotation.y = -Math.PI;
           this.group.add(mesh);
         }
@@ -544,7 +511,7 @@ class Fm1 {
     }
   }
 
-  mountedThree() {
+  mountedThree(playerDom) {
     this.group = new THREE.Object3D();
     this.group.name = this.modelName;
     return new Promise((resolve) => {
@@ -568,6 +535,7 @@ class Fm1 {
         if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = true;
 
         resolve(this.model);
+        this.initCamera(playerDom);
       });
     });
   }

+ 11 - 3
src/views/vent/monitorManager/gateMonitor/index.vue

@@ -150,6 +150,7 @@
   </div>
   <div ref="playerRef" style="z-index: 999; position: absolute; top: 100px; right: 15px; width: 300px; height: 280px; margin: auto">
   </div>
+  <LivePlayer id="fm-player1" style="height: 220px; width: 300px; position: absolute; top: 0px; z-index: -1;" ref="player1" :videoUrl="flvURL1()" muted live loading controls />
   <HandleModal v-if="!globalConfig?.simulatedPassword" :modal-is-show="modalIsShow" :modal-title="modalTitle" :modal-type="modalType" @handle-ok="handleOK"
     @handle-cancel="handleCancel" />
 </template>
@@ -172,6 +173,8 @@ import { setDivHeight } from '/@/utils/event';
 import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';
 import { useRouter } from 'vue-router';
 import { deviceCameraInit } from '/@/utils/ventutil.ts'
+import LivePlayer from '@liveqing/liveplayer-v3';
+
 const globalConfig = inject('globalConfig');
 
 const { currentRoute } = useRouter();
@@ -232,6 +235,10 @@ const initData = {
 // 监测数据
 const selectData = reactive(lodash.cloneDeep(initData));
 
+const flvURL1 = () => {
+  return `/video/mainWind.mp4`;
+};
+
 // 获取设备基本信息列表
 function getDeviceBaseList() {
   getTableList({ pageSize: 1000 }).then((res) => {
@@ -295,7 +302,6 @@ async function getCamera() {
   webRtcServer = obj.webRtcServerList
   const playerDoms = obj.playerDoms
   // 注意前后门适应需要对应 //[0] 后门 [1]前门
-  await initCameraCanvas(...playerDoms)
 }
 
 // 切换检测数据
@@ -322,7 +328,7 @@ async function getSelectRow(selectRow, index) {
   setModelType(type).then(async() => {
     addMonitorText(selectData);
     loading.value = false;
-    
+
   });
   await getCamera()
 };
@@ -615,9 +621,11 @@ function changeType() {
 
 onMounted(async () => {
   loading.value = true;
-  mountedThree().then(async () => {
+  const playerDom = document.getElementById('fm-player1')?.getElementsByClassName('vjs-tech')[0]
+  mountedThree(playerDom).then(async () => {
     await getMonitor(true);
     loading.value = false;
+    
   });
 });
 

+ 2 - 2
src/views/vent/monitorManager/mainFanMonitor/index.vue

@@ -22,7 +22,7 @@
             <div class="element-item"><span class="data-title">风机风量(m³/s):</span><span>{{ selectData.Fan1m3 ? selectData.Fan1m3 : '-' }}</span></div>
           </div>
         </div>
-        <!-- <div class="elementTag" id="fbm">
+        <div v-if="globalConfig?.simulatedPassword" class="elementTag" id="fbm">
           <div class="elementContent elementContent-r fbm-box">
             <div class="fbm-video">
               <LivePlayer id="main-player2" ref="player2" :videoUrl="flvURL2()" muted live/>
@@ -66,7 +66,7 @@
               </div>
             </div>
           </div>
-        </div> -->
+        </div>
       </div>
     </div>
     <div id="main3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"> </div>

+ 1 - 23
src/views/vent/monitorManager/mainFanMonitor/mainWind.threejs.ts

@@ -721,7 +721,7 @@ class mainWindRect {
   mountedThree() {
     this.group = new THREE.Group();
     return new Promise(async (resolve) => {
-      this.model.setGLTFModel(['bg1', 'dzp', 'fbm', 'ztfj', 'ztfj-fc'], this.group).then(async () => {
+      this.model.setGLTFModel(['bg1', 'fbm', 'ztfj', 'ztfj-fc'], this.group).then(async () => {
         // this.group = gltf[0];
         this.group?.position.set(-0.44, 19.88, 22.37);
         this.initSmokeMass();
@@ -730,11 +730,9 @@ class mainWindRect {
         const ztfjGroup = this.group?.getObjectByName('ztfj') as THREE.Group;
         const fbmGroup = this.group?.getObjectByName('fbm') as THREE.Group;
         const fcGroup = this.group?.getObjectByName('ztfj-fc') as THREE.Group;
-        const dzpGroup = this.group?.getObjectByName('dzp') as THREE.Group;
         if (ztfjGroup) ztfjGroup.position.z = ztfjGroup.position.z + 5;
         if (fbmGroup) fbmGroup.position.z = fbmGroup.position.z + 5;
         if (fcGroup) fcGroup.position.z = fcGroup.position.z + 5;
-        if (dzpGroup) dzpGroup.position.set(68.6, 4.2, 0);
 
         const mesh1 = ztfjGroup?.getObjectByName('TWO00'); //前
         const mesh2 = ztfjGroup?.getObjectByName('ONE00'); //后
@@ -748,26 +746,6 @@ class mainWindRect {
         resolve(null);
         this.initWindow();
         this.initFbmAnimation();
-
-        console.log('主风机模型组----------->', this.group);
-        setTimeout(async () => {
-          const videoPlayer1 = document.getElementById('main-player1')?.getElementsByClassName('vjs-tech')[0];
-          if (videoPlayer1) {
-            const mesh = renderVideo(this.group, videoPlayer1, 'player1');
-            if (mesh) {
-              mesh.scale.set(0.615, 0.57, 0.8);
-              mesh.position.set(24.783, 13.448, -21.78);
-              this.group?.add(mesh);
-            }
-            videoPlayer1.addEventListener('fullscreen', (isFullscreen) => {
-              if (isFullscreen) {
-                this.model.orbitControls.enabled = false;
-              } else {
-                this.model.orbitControls.enabled = true;
-              }
-            });
-          }
-        }, 0);
       });
     });
   }

+ 5 - 4
src/views/vent/monitorManager/windowMonitor/dandaoFc.threejs.ts

@@ -55,7 +55,7 @@ class singleWindow {
         y: 145,
       },
       {
-        text: selectData.forntm3 ? Number(`${selectData.forntm3}`).toFixed(0) : '-',
+        text: selectData.fWindowM3 ? Number(`${selectData.fWindowM3}`).toFixed(0) : '-',
         font: 'normal 30px Arial',
         color: '#009900',
         strokeStyle: '#002200',
@@ -87,7 +87,7 @@ class singleWindow {
         y: 256,
       },
       {
-        text: `${selectData.frontRearDifference ? selectData.frontRearDifference : '-'}`,
+        text: `${selectData.frontRearDP ? selectData.frontRearDP : '-'}`,
         font: 'normal 30px Arial',
         color: '#009900',
         strokeStyle: '#002200',
@@ -120,7 +120,7 @@ class singleWindow {
         y: 200,
       },
       {
-        text: selectData.maxarea ? `0~${selectData.maxarea}` : '-',
+        text: selectData.maxarea && selectData.maxarea !== '-' ? `0~${selectData.maxarea}` : '-',
         font: 'normal 30px Arial',
         color: '#009900',
         strokeStyle: '#002200',
@@ -290,13 +290,14 @@ class singleWindow {
     }
   }
 
-  mountedThree() {
+  mountedThree(playerDom) {
     return new Promise((resolve) => {
       this.model.setGLTFModel(['ddFc']).then((gltf) => {
         this.group = gltf[0];
         this.setModalPosition();
         this.initAnimation();
         resolve(null);
+        this.initCamera(playerDom);
       });
     });
   }

+ 11 - 4
src/views/vent/monitorManager/windowMonitor/index.vue

@@ -115,6 +115,7 @@
     </div>
   </div>
   <div ref="playerRef" style="z-index: 999; position: absolute; top: 100px; right: 10px; width: 300px; height: 280px; margin: auto"></div>
+  <LivePlayer id="fc-player1" style="height: 220px; width: 300px; position: absolute; top: 0px; z-index: -1;" ref="player1" :videoUrl="flvURL1()" muted live loading controls />
   <HandleModal :modal-is-show="modalIsShow" :modal-title="modalTitle" :modal-type="modalType" @handle-ok="handleOK" @handle-cancel="handleCancel" />
 </template>
 
@@ -137,6 +138,8 @@
   import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';
   import { useRouter } from 'vue-router';
   import { deviceCameraInit } from '/@/utils/ventutil.ts'
+  import LivePlayer from '@liveqing/liveplayer-v3';
+
   const globalConfig = inject('globalConfig');
 
   const { currentRoute } = useRouter();
@@ -172,6 +175,10 @@
   // 设备数据
   const controlType = ref(1);
 
+  const flvURL1 = () => {
+    return `/video/mainWind.mp4`;
+  };
+
   const tabChange = (activeKeyVal) => {
     activeKey.value = activeKeyVal;
     if(activeKeyVal == 1){
@@ -268,9 +275,9 @@
     }
     const obj = await deviceCameraInit(cameraAddrs, playerRef.value, webRtcServer)
     webRtcServer = obj.webRtcServerList
-    const playerDoms = obj.playerDoms
+    // const playerDoms = obj.playerDoms
     // 注意前后门适应需要对应 //[0] 后门 [1]前门
-    await initCameraCanvas(...playerDoms)
+    // await initCameraCanvas(...playerDoms)
   }
 
   // 切换检测数据
@@ -370,8 +377,8 @@
 
   onMounted(() => {
     loading.value = true;
-    
-    mountedThree().then(async () => {
+    const playerDom = document.getElementById('fc-player1')?.getElementsByClassName('vjs-tech')[0]
+    mountedThree(playerDom).then(async () => {
       // await setModelType('singleWindow');
       getMonitor(true);
       loading.value = false;

+ 2 - 1
src/views/vent/monitorManager/windowMonitor/shuangdaoFc.threejs.ts

@@ -347,13 +347,14 @@ class doubleWindow {
     }
   }
 
-  mountedThree() {
+  mountedThree(playerDom) {
     return new Promise((resolve) => {
       this.model.setGLTFModel(['sdFc']).then((gltf) => {
         this.group = gltf[0];
         this.setModalPosition();
         this.initAnimation();
         resolve(null);
+        this.initCamera(playerDom);
       });
     });
   }

+ 4 - 4
src/views/vent/monitorManager/windowMonitor/window.threejs.ts

@@ -117,7 +117,7 @@ export const play = (rotationParam, flag) => {
 };
 
 export const initCameraCanvas = async (playerVal1?, playerVal2?) => {
-  debugger
+  debugger;
   if (windowType === 'singleWindow' && singleWindowObj) {
     return await singleWindowObj.initCamera.call(singleWindowObj, playerVal1);
   } else if (windowType === 'doubleWindow' && doubleWindowObj) {
@@ -161,7 +161,7 @@ export const setModelType = (type) => {
   });
 };
 
-export const mountedThree = () => {
+export const mountedThree = (playerDom) => {
   return new Promise(async (resolve) => {
     model = new UseThree('#window3D');
     if (!model || !model.renderer || !model.camera) return;
@@ -170,8 +170,8 @@ export const mountedThree = () => {
     // 单道、 双道
     doubleWindowObj = new doubleWindow(model);
     singleWindowObj = new singleWindow(model);
-    await doubleWindowObj.mountedThree();
-    await singleWindowObj.mountedThree();
+    await doubleWindowObj.mountedThree(playerDom);
+    await singleWindowObj.mountedThree(playerDom);
 
     model.animate();
     resolve(null);

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

@@ -186,7 +186,7 @@ class dsWindRect {
     }
   }
 
-  /* 提取风门序列帧,初始化前后门动画 */
+
   initAnimation() {
     const dsmove = this.group.getObjectByName('dsmove');
     const dsmoveLine = dsmove?.getObjectByName('probe');

+ 9 - 3
src/views/vent/monitorManager/windrectMonitor/index.vue

@@ -120,7 +120,7 @@
     </div>
   </div>
   <div ref="playerRef" style="z-index: 999; position: absolute; top: 100px; right: 10px; width: 300px; height: 280px; margin: auto"></div>
-
+  <LivePlayer id="cf-player1" style="height: 220px; width: 300px; position: absolute; top: 0px; z-index: -1;" ref="player1" :videoUrl="flvURL1()" muted live loading controls />
   <BasicModal v-bind="$attrs" @register="registerModal" title="一键测风" width="900px" @ok="handleOk" @cancel="handleCancel">
     <div class="head-line">
       <div class="vent-flex-row">
@@ -162,6 +162,7 @@
   import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';
   import { useRouter } from 'vue-router';
   import { deviceCameraInit } from '/@/utils/ventutil.ts'
+  import LivePlayer from '@liveqing/liveplayer-v3';
 
   const globalConfig = inject('globalConfig');
 
@@ -209,6 +210,9 @@
   // });
 
   const dataSource = ref([]);
+  const flvURL1 = () => {
+    return `/video/mainWind.mp4`;
+  };
 
   const tabChange = (activeKeyVal) => {
     activeKey.value = activeKeyVal;
@@ -608,7 +612,8 @@
         type = 'dsWindRect_four'
       }
       if (selectRow.deviceType == 'windrect_ds_two') {
-        type = 'dsWindRect_two'
+        // type = 'dsWindRect_two'
+        type = 'duisheFixed'
       }
       
       if (selectRow.deviceType == 'windrect_dd' || selectRow.deviceType == 'windrect_safety') {
@@ -712,8 +717,9 @@
   });
 
   onMounted(() => {
+    const playerDom = document.getElementById('cf-player1')?.getElementsByClassName('vjs-tech')[0]
     loading.value = true;
-    mountedThree().then(async () => {
+    mountedThree(playerDom).then(async () => {
       getMonitor(true);
       // loading.value = false;
     });

+ 59 - 2
src/views/vent/monitorManager/windrectMonitor/windrect.threejs.ts

@@ -6,6 +6,7 @@ import zdWindRect from './zhedie.threejs';
 import dsWindRect from './duishe.threejs';
 import ddWindRect from './dantou.threejs';
 import lmWindRectSide from './longmenSide.threejs';
+import fixedWindRect from './duisheFixed.threejs';
 import useEvent from '../../../../utils/threejs/useEvent';
 import gsap from 'gsap';
 // import * as dat from 'dat.gui';
@@ -20,6 +21,7 @@ let model: UseThree, //
   dsWindRectObj: dsWindRect,
   lmWindRectSideObj: lmWindRectSide,
   ddWindRectObj: ddWindRect,
+  fixedWindRectObj: fixedWindRect,
   windRectType = 'lmWindRect';
 
 const { mouseDownFn } = useEvent();
@@ -41,6 +43,8 @@ const startAnimation = () => {
       lmWindRectSideObj.mouseUpModel.call(lmWindRectSideObj);
     } else if (windRectType === 'ddWindSide' && ddWindRectObj) {
       ddWindRectObj.mouseUpModel.call(ddWindRectObj);
+    } else if (windRectType === 'duisheFixed' && fixedWindRectObj) {
+      fixedWindRectObj.mouseUpModel.call(fixedWindRectObj);
     }
   });
 };
@@ -59,6 +63,8 @@ const mouseEvent = (event) => {
         lmWindRectSideObj.mousedownModel.call(lmWindRectSideObj, intersects);
       } else if (windRectType === 'ddWindSide' && ddWindRectObj) {
         ddWindRectObj.mousedownModel.call(ddWindRectObj, intersects);
+      } else if (windRectType === 'duisheFixed' && fixedWindRectObj) {
+        fixedWindRectObj.mousedownModel.call(fixedWindRectObj, intersects);
       }
     });
     console.log('摄像头控制信息', model.orbitControls, model.camera);
@@ -67,7 +73,6 @@ const mouseEvent = (event) => {
 
 /* 添加监控数据 */
 export const addMonitorText = (selectData) => {
-
   if (windRectType === 'lmWindRect' && lmWindRectObj) {
     return lmWindRectObj.addMonitorText.call(lmWindRectObj, selectData);
   } else if (windRectType === 'zdWindRect' && zdWindRectObj) {
@@ -78,6 +83,8 @@ export const addMonitorText = (selectData) => {
     return lmWindRectSideObj.addMonitorText.call(lmWindRectSideObj, selectData);
   } else if (windRectType === 'ddWindSide' && ddWindRectObj) {
     return ddWindRectObj.addMonitorText.call(ddWindRectObj, selectData);
+  } else if (windRectType === 'duisheFixed' && fixedWindRectObj) {
+    fixedWindRectObj.addMonitorText.call(fixedWindRectObj, selectData);
   }
 };
 
@@ -150,6 +157,9 @@ export const setModelType = (type) => {
       if (model.scene?.getObjectByName('ddcf')) {
         model.scene.remove(ddWindRectObj.group);
       }
+      if (model.scene?.getObjectByName('fixedCf')) {
+        model.scene.remove(fixedWindRectObj.group);
+      }
       const oldCameraPosition = { x: -1000, y: 100, z: 500 };
       model.scene?.add(lmWindRectObj.group);
       setTimeout(async () => {
@@ -182,6 +192,9 @@ export const setModelType = (type) => {
       if (model.scene?.getObjectByName('ddcf')) {
         model.scene.remove(ddWindRectObj.group);
       }
+      if (model.scene?.getObjectByName('fixedCf')) {
+        model.scene.remove(fixedWindRectObj.group);
+      }
       model.scene?.add(zdWindRectObj.group);
       const oldCameraPosition = { x: -1000, y: 100, z: 500 };
       setTimeout(async () => {
@@ -219,6 +232,9 @@ export const setModelType = (type) => {
       if (model.scene?.getObjectByName('ddcf')) {
         model.scene.remove(ddWindRectObj.group);
       }
+      if (model.scene?.getObjectByName('fixedCf')) {
+        model.scene.remove(fixedWindRectObj.group);
+      }
       model.scene?.add(dsWindRectObj.group);
       setTimeout(async () => {
         resolve(null);
@@ -250,6 +266,9 @@ export const setModelType = (type) => {
       if (model.scene?.getObjectByName('ddcf')) {
         model.scene.remove(ddWindRectObj.group);
       }
+      if (model.scene?.getObjectByName('fixedCf')) {
+        model.scene.remove(fixedWindRectObj.group);
+      }
       const oldCameraPosition = { x: -1000, y: 100, z: 500 };
       model.scene?.add(lmWindRectSideObj.group);
       setTimeout(async () => {
@@ -283,6 +302,9 @@ export const setModelType = (type) => {
       if (model.scene?.getObjectByName('dscf')) {
         model.scene.remove(dsWindRectObj.group);
       }
+      if (model.scene?.getObjectByName('fixedCf')) {
+        model.scene.remove(fixedWindRectObj.group);
+      }
       model.scene?.add(ddWindRectObj.group);
       setTimeout(async () => {
         resolve(null);
@@ -296,11 +318,43 @@ export const setModelType = (type) => {
           0.8
         );
       }, 300);
+    } else if (windRectType === 'duisheFixed' && fixedWindRectObj && fixedWindRectObj.group) {
+      model.startAnimation = fixedWindRectObj.render.bind(fixedWindRectObj);
+      group = fixedWindRectObj.group;
+
+      if (model.scene?.getObjectByName('lmcf')) {
+        model.scene.remove(lmWindRectObj.group);
+      }
+      if (model.scene?.getObjectByName('zdcf')) {
+        model.scene.remove(zdWindRectObj.group);
+      }
+      if (model.scene?.getObjectByName('lmcfSide')) {
+        model.scene.remove(lmWindRectSideObj.group);
+      }
+      if (model.scene?.getObjectByName('dscf')) {
+        model.scene.remove(dsWindRectObj.group);
+      }
+      if (model.scene?.getObjectByName('ddcf')) {
+        model.scene.remove(ddWindRectObj.group);
+      }
+      model.scene?.add(fixedWindRectObj.group);
+      setTimeout(async () => {
+        resolve(null);
+        const oldCameraPosition = { x: -1020, y: 100, z: 500 };
+        await animateCamera(
+          oldCameraPosition,
+          { x: 0, y: 0, z: 0 },
+          { x: 22.839308656135486, y: 56.930433490209, z: 103.22614933268565 },
+          { x: -4.4575304696469304, y: 0.26828436264018835, z: -0.7214855106998845 },
+          model,
+          0.8
+        );
+      }, 300);
     }
   });
 };
 
-export const mountedThree = () => {
+export const mountedThree = (playerDom) => {
   return new Promise(async (resolve) => {
     model = new UseThree('#window3D');
     model.setEnvMap('test1');
@@ -320,6 +374,9 @@ export const mountedThree = () => {
     ddWindRectObj = new ddWindRect(model);
     await ddWindRectObj.mountedThree();
 
+    fixedWindRectObj = new fixedWindRect(model);
+    await fixedWindRectObj.mountedThree(playerDom);
+
     resolve(null);
     model.animate();
     startAnimation();