1
0

5 Incheckningar 0b91a4f40c ... f1da2d22a1

Upphovsman SHA1 Meddelande Datum
  hongrunxia f1da2d22a1 Merge branch 'master' of http://182.92.126.35:3000/hrx/mky-vent-base 1 vecka sedan
  hongrunxia 9b2cbbb3a0 1. 优化设备监测曲线模块横轴时间 1 vecka sedan
  hongrunxia 2149e62d65 Merge branch 'master' of http://182.92.126.35:3000/hrx/mky-vent-base 2 veckor sedan
  hongrunxia 9f6e3e52e3 Merge branch 'master' of http://182.92.126.35:3000/hrx/mky-vent-base 2 veckor sedan
  hongrunxia 79c679b96e 1. 优化设备管理中预警设置功能 2 veckor sedan
46 ändrade filer med 916 tillägg och 740 borttagningar
  1. 9 1
      src/components/chart/BarAndLine.vue
  2. 6 4
      src/hooks/system/useCamera.ts
  3. 1 1
      src/hooks/vent/useThree.ts
  4. 2 5
      src/utils/echartsUtil.ts
  5. 71 60
      src/views/vent/comment/EditRowTable.vue
  6. 3 1
      src/views/vent/comment/history/HistoryTable.vue
  7. 1 1
      src/views/vent/deviceManager/comment/DeviceModal.vue
  8. 54 23
      src/views/vent/deviceManager/comment/warningTabel/index.vue
  9. 7 7
      src/views/vent/deviceManager/comment/warningTabel/warning.data.ts
  10. 224 213
      src/views/vent/deviceManager/workingFace/CustomNormalTable.vue
  11. 4 2
      src/views/vent/monitorManager/camera/index.vue
  12. 1 0
      src/views/vent/monitorManager/comment/AlarmHistoryTable.vue
  13. 16 18
      src/views/vent/monitorManager/comment/DeviceEcharts.vue
  14. 1 0
      src/views/vent/monitorManager/comment/HandlerHistoryTable.vue
  15. 1 0
      src/views/vent/monitorManager/comment/WorkFaceAlarmHistoryTable.vue
  16. 1 0
      src/views/vent/monitorManager/comment/WorkFaceHandlerHistoryTable.vue
  17. 1 0
      src/views/vent/monitorManager/deviceMC/AlarmHistoryTable.vue
  18. 1 0
      src/views/vent/monitorManager/deviceMonitorWarn/index.vue
  19. 1 1
      src/views/vent/monitorManager/fanLocalMonitor/fanLocal.three.ts
  20. 26 71
      src/views/vent/monitorManager/fanLocalMonitor/index.vue
  21. 16 25
      src/views/vent/monitorManager/fireDoorMonitor/fireDoor.threejs.fire.ts
  22. 3 4
      src/views/vent/monitorManager/fireDoorMonitor/fireDoor.threejs.ts
  23. 4 6
      src/views/vent/monitorManager/fireDoorMonitor/index.vue
  24. 16 6
      src/views/vent/monitorManager/gateMonitor/gate.threejs.three.ts
  25. 1 1
      src/views/vent/monitorManager/gateMonitor/gate.threejs.two.ss.ts
  26. 1 1
      src/views/vent/monitorManager/gateMonitor/gate.threejs.two.yj.ts
  27. 1 1
      src/views/vent/monitorManager/gateMonitor/gate.threejs.yy.ts
  28. 1 0
      src/views/vent/monitorManager/handlerMonitor/index.vue
  29. 1 0
      src/views/vent/monitorManager/historyMonitor/index.vue
  30. 24 7
      src/views/vent/monitorManager/mainFanMonitor/index.vue
  31. 1 0
      src/views/vent/monitorManager/safetyMonitor/AlarmHistoryTable.vue
  32. 1 1
      src/views/vent/monitorManager/sensorMonitor/index.vue
  33. 1 0
      src/views/vent/monitorManager/warningMonitor/index-mine.vue
  34. 1 0
      src/views/vent/monitorManager/warningMonitor/index.vue
  35. 25 0
      src/views/vent/monitorManager/windowMonitor/dandaoFc.threejs.ts
  36. 16 0
      src/views/vent/monitorManager/windowMonitor/dandaoFcBet.threejs.ts
  37. 15 0
      src/views/vent/monitorManager/windowMonitor/dandaoFcXk.threejs.ts
  38. 23 16
      src/views/vent/monitorManager/windowMonitor/dandaoFcYjl.threejs.ts
  39. 2 0
      src/views/vent/monitorManager/windowMonitor/index.vue
  40. 25 0
      src/views/vent/monitorManager/windowMonitor/shuangdaoFc.threejs.ts
  41. 156 116
      src/views/vent/monitorManager/windowMonitor/shuangdaoFcYjl.threejs.ts
  42. 15 17
      src/views/vent/monitorManager/windowMonitor/window.threejs.ts
  43. 1 0
      src/views/vent/monitorManager/windrectMonitor/components/modalTable.vue
  44. 133 130
      src/views/vent/reportManager/comment/NormalHisTable.vue
  45. 1 0
      src/views/vent/reportManager/comment/NormalTable.vue
  46. 1 1
      src/views/vent/sys/resources/index.vue

+ 9 - 1
src/components/chart/BarAndLine.vue

@@ -70,7 +70,12 @@
           },
         },
         dataZoom: {},
-        legend: {},
+        legend: {
+          textStyle: {
+            color: '#ffffff', // 字体颜色
+          },
+          top: '20',
+        },
         timeline: null,
         xAxis: {},
         yAxis: null,
@@ -105,6 +110,9 @@
         if (option.series && option.series.length === chartsColumns.length) {
           let xAxisData = props.dataSource.map((item) => item[props.xAxisPropType]);
           [...chartsColumns].forEach((propType: any, index) => {
+            if (props.chartsType == 'listMonitor') {
+              option.series[index].type = 'bar';
+            }
             option.series[index].data = props.dataSource.map((item) => item[propType.dataIndex] || 0);
           });
           option.xAxis[0].data = xAxisData;

+ 6 - 4
src/hooks/system/useCamera.ts

@@ -218,12 +218,12 @@ export function useCamera() {
                 playsinline: true,
                 screenShot: true,
                 whitelist: [''],
-                ignores: ['time'],
+                ignores: ['time', 'progress', 'play', 'i18n', 'volume', 'fullscreen', 'screenShot', 'playbackRate'],
                 closeVideoClick: true,
                 customConfig: {
                   isClickPlayBack: false,
                 },
-                controls: false,
+                controlsList: ['nodownload', 'nofullscreen', 'noremoteplayback'],
                 defaultPlaybackRate: videoParent[1].cameraRate || 1,
                 flv: {
                   retryCount: 3, // 重试 3 次,默认值
@@ -255,9 +255,10 @@ export function useCamera() {
                   autoplay: true,
                   autoplayMuted: true,
                   cors: true,
+                  ignores: ['time', 'progress', 'play', 'i18n', 'volume', 'fullscreen', 'screenShot', 'playbackRate'],
                   poster: '/src/assets/images/vent/noSinge.png',
                   defaultPlaybackRate: videoParent[1].cameraRate || 1,
-                  controls: false,
+                  controlsList: ['nodownload', 'nofullscreen', 'noremoteplayback'],
                   hls: {
                     retryCount: 10, // 重试 3 次,默认值
                     retryDelay: 30000, // 每次重试间隔 1 秒,默认值
@@ -283,10 +284,11 @@ export function useCamera() {
                   isLive: true,
                   autoplay: true,
                   autoplayMuted: true,
+                  ignores: ['time', 'progress', 'play', 'i18n', 'volume', 'fullscreen', 'screenShot', 'playbackRate'],
                   plugins: [HlsPlugin], // 第二步
                   poster: '/src/assets/images/vent/noSinge.png',
                   defaultPlaybackRate: videoParent[1].cameraRate || 1,
-                  controls: false,
+                  controlsList: ['nodownload', 'nofullscreen', 'noremoteplayback'],
                   hls: {
                     retryCount: 10, // 重试 3 次,默认值
                     retryDelay: 30000, // 每次重试间隔 1 秒,默认值

+ 1 - 1
src/hooks/vent/useThree.ts

@@ -234,7 +234,7 @@ class UseThree {
                       }
                     });
 
-                    if (isBlender) {
+                    if (object.children.length == 0) {
                       object = object.children[0];
                     }
                     object.animations = gltf.animations;

+ 2 - 5
src/utils/echartsUtil.ts

@@ -69,7 +69,8 @@ export default class echartsUtil {
       if (!this.option['tooltip']) this.option['tooltip'] = {};
       Object.assign(this.option['tooltip'], tooltip);
       // this.option['tooltip'] = tooltip;
-      this.option['grid'] = grid;
+      // this.option['grid'] = grid;
+      Object.assign(grid, this.option['grid']);
       // this.option['legend'] = this.getLegend(legends);
       if (!this.option['legend']) this.option['legend'] = {};
       Object.assign(this.option['legend'], this.getLegend(legends));
@@ -104,11 +105,7 @@ export default class echartsUtil {
 
   getLegend(legend) {
     const legendObj = {
-      textStyle: {
-        color: '#ffffff', // 字体颜色
-      },
       data: legend,
-      top: '20',
     };
     return legendObj;
   }

+ 71 - 60
src/views/vent/comment/EditRowTable.vue

@@ -17,6 +17,7 @@
   import { defineComponent, ref, nextTick, watch } from 'vue';
   import { BasicTable, useTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table';
   import { useMessage } from '/@/hooks/web/useMessage';
+  import { string } from 'vue-types';
   // import { nextTick } from 'process';
 
   export default defineComponent({
@@ -50,6 +51,10 @@
         type: Object,
         default: {},
       },
+      rowKey: {
+        type: String,
+        default: 'id',
+      },
     },
     emits: ['saveOrUpdate', 'deleteById', 'rowChange'],
     setup(props, { emit, expose }) {
@@ -60,66 +65,70 @@
 
       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,
-            pagination: {
-              current: 1,
-              pageSize: 10,
-              pageSizeOptions: ['10', '30', '50', '100', '500'],
-              showQuickJumper: false,
-            },
-            formConfig: {
-              labelWidth: 120,
-              schemas: props.searchFormSchema,
-              autoSubmitOnEnter: true,
-            },
-            actionColumn: {
-              width: 160,
-              title: '操作',
-              dataIndex: 'action',
-              slots: { customRender: 'action' },
-            },
-            beforeFetch(params) {
-              return { ...params, ...props.params };
-            },
-          })
-        : useTable({
-            title: '',
-            api: props.list,
-            rowKey: 'id',
-            clickToRowSelect: false,
-            columns: props.columns as BasicColumn[],
-            showIndexColumn: false,
-            showTableSetting: false,
-            pagination: {
-              current: 1,
-              pageSize: 10,
-              pageSizeOptions: ['10', '30', '50', '100', '500'],
-              showQuickJumper: false,
-            },
-            scroll: tableScroll,
-            rowSelection: !props.isRadio ? undefined : { type: 'radio', onChange: rowChange },
-            tableSetting: { fullScreen: true },
-            actionColumn: {
-              width: 160,
-              title: '操作',
-              dataIndex: 'action',
-              slots: { customRender: 'action' },
-            },
-            beforeFetch(params) {
-              return { ...params, ...props.params };
-            },
-          });
+      const [registerTable, { insertTableDataRecord, reload, getSelectRows, setSelectedRowKeys, getDataSource, setTableData, clearSelectedRowKeys }] =
+        !props.list
+          ? useTable({
+              title: '',
+              dataSource: props.dataSource,
+              rowKey: props.rowKey,
+              clickToRowSelect: false,
+              columns: props.columns as BasicColumn[],
+              showIndexColumn: false,
+              showTableSetting: false,
+              rowSelection: !props.isRadio ? undefined : { type: 'radio', onChange: rowChange },
+              tableSetting: { fullScreen: true },
+              scroll: tableScroll,
+              pagination: {
+                current: 1,
+                pageSize: 10,
+                pageSizeOptions: ['10', '30', '50', '100', '500'],
+                showQuickJumper: false,
+              },
+              formConfig: {
+                labelWidth: 120,
+                schemas: props.searchFormSchema,
+                autoSubmitOnEnter: true,
+              },
+              actionColumn: {
+                width: 160,
+                title: '操作',
+                dataIndex: 'action',
+                slots: { customRender: 'action' },
+              },
+              beforeFetch(params) {
+                return { ...params, ...props.params };
+              },
+              afterFetch(result) {
+                // emit()
+              },
+            })
+          : useTable({
+              title: '',
+              api: props.list,
+              rowKey: props.rowKey,
+              clickToRowSelect: false,
+              columns: props.columns as BasicColumn[],
+              showIndexColumn: false,
+              showTableSetting: false,
+              pagination: {
+                current: 1,
+                pageSize: 10,
+                pageSizeOptions: ['10', '30', '50', '100', '500'],
+                showQuickJumper: false,
+              },
+              scroll: tableScroll,
+              rowSelection: !props.isRadio ? undefined : { type: 'radio', onChange: rowChange },
+              tableSetting: { fullScreen: true },
+              actionColumn: {
+                width: 160,
+                title: '操作',
+                dataIndex: 'action',
+                slots: { customRender: 'action' },
+              },
+              beforeFetch(params) {
+                return { ...params, ...props.params };
+              },
+            });
 
       function rowChange(e) {
         emit('rowChange', e[0], getSelectRows()[0]);
@@ -251,6 +260,8 @@
 
       expose({
         reload,
+        setSelectedRowKeys,
+        getDataSource,
       });
 
       return {

+ 3 - 1
src/views/vent/comment/history/HistoryTable.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="history-table">
-    <BasicTable ref="historyTable" @register="register" :data-source="data">
+    <BasicTable ref="historyTable" @register="register" :data-source="data" :scroll="scroll">
       <template #bodyCell="{ column, record }">
         <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == '0' ? 'green' : 'red'">
           {{ record.warnFlag == '0' ? '正常' : '报警' }}
@@ -74,6 +74,8 @@
       dictCode: string;
       /** 字段编码,该编码用于从设备字段配置中读取默认表头信息,示例:forcFan_history */
       columnsCode: string;
+
+      scroll?: { x: number | boolean; y: number | boolean };
       /** 表格配置,参考BaiscTable,该值会与默认的配置进行浅合并,这里提供的任何配置都是优先的 */
       // tableProps?: BasicTableProps;
       /** 查询表单配置,参考BaiscTable */

+ 1 - 1
src/views/vent/deviceManager/comment/DeviceModal.vue

@@ -47,7 +47,7 @@
       <a-tab-pane v-if="deviceType == 'managesys'" key="4" tab="预警条目管理">
         <ManagerWarningDeviceTable v-if="activeKey == '4'" :deviceId="deviceData.id" />
       </a-tab-pane>
-      <a-tab-pane key="5" :tab="deviceType !== 'managesys' ? '报警配置' : '配置预警设备'">
+      <a-tab-pane key="5" :tab="deviceType !== 'managesys' ? '点位(报警)配置' : '配置预警设备'">
         <template v-if="activeKey == '5'">
           <WarningTable v-if="deviceType !== 'managesys'" :deviceId="deviceData.id" :pointType="deviceData.strtype" />
           <BackWindDeviceTable v-else :deviceId="deviceData.id" />

+ 54 - 23
src/views/vent/deviceManager/comment/warningTabel/index.vue

@@ -2,6 +2,7 @@
   <div>
     <EditRowTableVue
       v-if="refreshParent"
+      ref="ParentRef"
       :columns="warningColumns"
       :list="list"
       :params="{ deviceid: deviceId }"
@@ -13,21 +14,17 @@
       :scroll="{ y: 200 }"
     >
       <template #filterCell="{ column, record }">
-        <template v-if="record.editable && column.dataIndex === 'monitorcode'">
-          <div style="position: relative">
+        <template v-if="column.dataIndex === 'monitorcode'">
+          <div v-if="record.editable" style="position: relative">
             <Select
               :options="options"
-              v-model:value="record.editValueRefs['monitorcode']"
+              v-model:value="record['monitorcode']"
               :fieldNames="{ label: 'valuename', value: 'valuecode' }"
               size="small"
               style="min-width: 100px"
             />
-            <!-- <a-popover placement="monitorcode" :visible="true">
-              <template #content>
-                <p>Content</p>
-              </template>
-            </a-popover> -->
           </div>
+          <div v-else>{{ getLabel(record['monitorcode']) }}</div>
         </template>
       </template>
     </EditRowTableVue>
@@ -54,7 +51,7 @@
   import { warningColumns, levelColumns } from './warning.data';
   import { list, limitList, edit, save, limitSave, limitEdit, deleteById, limitDeleteById } from './warning.api';
   import { list as pointList } from '../pointTabel/point.api';
-  import { defineProps, ref, nextTick, inject, onMounted } from 'vue';
+  import { defineProps, ref, nextTick, inject, onMounted, onBeforeMount } from 'vue';
 
   const props = defineProps({
     deviceId: { type: String },
@@ -63,9 +60,9 @@
       requried: true,
     },
   });
-  // const
+  const ParentRef = ref();
   const options = ref([]);
-  const RefChildComponent = ref(null);
+  const RefChildComponent = ref();
   const warningProId = ref('');
   const currentParent = ref({});
   const refresh = ref(true);
@@ -74,26 +71,45 @@
   async function saveOrUpdateParent(record) {
     try {
       if (record.id) {
+        currentParent.value = record;
         await edit({ ...record });
       } else {
-        await save({ ...record, deviceid: props.deviceId });
+        await save({ ...record, deviceid: props.deviceId, devicetype: props.pointType });
+      }
+      // refreshParent.value = false;
+      if (ParentRef.value) {
+        await ParentRef.value.reload();
+        nextTick(() => {
+          const parentList = ParentRef.value.getDataSource();
+          if (record.id) {
+            ParentRef.value.setSelectedRowKeys([record.id]);
+          } else {
+            ParentRef.value.setSelectedRowKeys([parentList[0]['id']]);
+          }
+        });
       }
-      refreshParent.value = false;
-      nextTick(() => {
-        refreshParent.value = true;
-      });
     } catch (error) {}
   }
   async function saveOrUpdateChild(record) {
     if (record.id) {
       await limitEdit({ ...record });
     } else {
-      await limitSave({ ...record, limitid: warningProId.value, code: currentParent.value['monitorcode'] });
+      await limitSave({
+        ...record.editValueRefs,
+        limitid: warningProId.value,
+        code: currentParent.value['monitorcode'],
+        devicetype: props.pointType,
+        deviceid: props.deviceId,
+      });
+    }
+    // refresh.value = false;
+    if (RefChildComponent.value) {
+      await RefChildComponent.value.reload();
+      nextTick(() => {
+        const childList = RefChildComponent.value.getDataSource();
+        RefChildComponent.value.setSelectedRowKeys([childList[0]['id']]);
+      });
     }
-    refresh.value = false;
-    nextTick(() => {
-      refresh.value = true;
-    });
   }
   function parentDeleteById(id, reload) {
     deleteById({ id: id }, reload);
@@ -109,11 +125,26 @@
       refresh.value = true;
     });
   }
-
-  onMounted(async () => {
+  function getLabel(code) {
+    const obj = options.value.find((item) => item['valuecode'] === code);
+    if (obj) {
+      return obj['valuename'];
+    }
+    return code;
+  }
+  onBeforeMount(async () => {
     const res = await pointList({ devicetype: props.pointType, valuetype_begin: 2 });
     options.value = res && res['records'] ? res['records'] : [];
   });
+  onMounted(async () => {
+    if (ParentRef.value) {
+      await ParentRef.value.reload();
+      nextTick(() => {
+        const parentList = ParentRef.value.getDataSource();
+        ParentRef.value.setSelectedRowKeys([parentList[0]['id']]);
+      });
+    }
+  });
 </script>
 
 <style scoped></style>

+ 7 - 7
src/views/vent/deviceManager/comment/warningTabel/warning.data.ts

@@ -68,6 +68,13 @@ export const warningColumns: BasicColumn[] = [
     },
   },
   {
+    title: '修正参数', // 给点位设置系数,调整点位值
+    dataIndex: 'des',
+    editRow: true,
+    width: 200,
+    editComponent: 'Input',
+  },
+  {
     title: '模拟最小值',
     width: 150,
     dataIndex: 'ftestmin',
@@ -81,13 +88,6 @@ export const warningColumns: BasicColumn[] = [
     width: 150,
     editComponent: 'InputNumber',
   },
-  {
-    title: '备注',
-    dataIndex: 'des',
-    editRow: true,
-    width: 200,
-    editComponent: 'Input',
-  },
 ];
 
 export const deviceColumns: BasicColumn[] = [

+ 224 - 213
src/views/vent/deviceManager/workingFace/CustomNormalTable.vue

@@ -1,8 +1,9 @@
 <template>
-  <div >
+  <div>
     <BasicTable @register="registerTable" :rowSelection="rowSelection">
       <template #tableTitle>
-        <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd">新增</a-button><span style="color: #f00;">(注:新增时请先选择系统类型 <b style="color: rgb(255, 191, 0); font-size: 20px;">↑</b>)</span>
+        <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd">新增</a-button
+        ><span style="color: #f00">(注:新增时请先选择系统类型 <b style="color: rgb(255, 191, 0); font-size: 20px">↑</b>)</span>
         <a-dropdown v-if="selectedRowKeys.length > 0" :getPopupContainer="getPopupContainer">
           <template #overlay>
             <a-menu>
@@ -20,10 +21,7 @@
       </template>
       <template #action="{ record }">
         <a class="table-action-link" @click="handleEdit(record)">编辑</a>
-        <a-popconfirm
-          title="确定删除?"
-          @confirm="handleDelete(record)"
-        >
+        <a-popconfirm title="确定删除?" @confirm="handleDelete(record)">
           <a class="table-action-link">删除</a>
         </a-popconfirm>
         <slot name="action" v-bind="{ record }"></slot>
@@ -38,233 +36,246 @@
 </template>
 
 <script lang="ts" setup>
-//ts语法
-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 '../comment/DeviceModal.vue';
-// import { getToken } from '/@/utils/auth';
-// import { useGlobSetting } from '/@/hooks/setting';
-import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-import { useListPage } from '/@/hooks/system/useListPage';
-import { getPopupContainer } from '/@/utils';
-import { message } from 'ant-design-vue';
+  //ts语法
+  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 '../comment/DeviceModal.vue';
+  // import { getToken } from '/@/utils/auth';
+  // import { useGlobSetting } from '/@/hooks/setting';
+  import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { getPopupContainer } from '/@/utils';
+  import { message } from 'ant-design-vue';
 
-const props = defineProps({
-  columnsType: {
-    type: String,
-    // required: true,
-  },
-  columns: {
-    type: Array,
-    // required: true,
-    default: () => [],
-  },
-  searchFormSchema: {
-    type: Array,
-    default: () => [],
-  },
-  formSchema: {
-    type: Array,
-    required: true,
-  },
-  list: {
-    type: Function,
-    required: true,
-  },
-  getImportUrl: {
-    type: String,
-  },
-  getExportUrl: {
-    type: String,
-  },
-  deleteById: {
-    type: Function,
-    required: true,
-  },
-  batchDelete: {
-    type: Function,
-  },
-  saveOrUpdate: {
-    type: Function,
-    required: true,
-  },
-  pointList: {
-    type: Function,
-  },
-  showTab: {
-    type: Boolean,
-    default: false,
-  },
-  designScope: {
-    type: String,
-  },
-  title: {
-    type: String,
-  },
-  deviceType: {
-    type: String,
-  },
-});
+  const props = defineProps({
+    columnsType: {
+      type: String,
+      // required: true,
+    },
+    columns: {
+      type: Array,
+      // required: true,
+      default: () => [],
+    },
+    searchFormSchema: {
+      type: Array,
+      default: () => [],
+    },
+    formSchema: {
+      type: Array,
+      required: true,
+    },
+    list: {
+      type: Function,
+      required: true,
+    },
+    getImportUrl: {
+      type: String,
+    },
+    getExportUrl: {
+      type: String,
+    },
+    deleteById: {
+      type: Function,
+      required: true,
+    },
+    batchDelete: {
+      type: Function,
+    },
+    saveOrUpdate: {
+      type: Function,
+      required: true,
+    },
+    pointList: {
+      type: Function,
+    },
+    showTab: {
+      type: Boolean,
+      default: false,
+    },
+    designScope: {
+      type: String,
+    },
+    title: {
+      type: String,
+    },
+    deviceType: {
+      type: String,
+    },
+  });
 
-const emit = defineEmits(['submitSuccess', 'editHandler']);
+  const emit = defineEmits(['submitSuccess', 'editHandler']);
 
-const isUpdate = ref(false);
-const record = reactive({});
-const formSchemaData = ref(props.formSchema)
-const deviceTypeId = ref('')
-const pageType = ref('')
+  const isUpdate = ref(false);
+  const record = reactive({});
+  const formSchemaData = ref(props.formSchema);
+  const deviceTypeId = ref('');
+  const pageType = ref('');
 
-watch(() => props.formSchema, (val) => {
-  formSchemaData.value = val
-})
+  watch(
+    () => props.formSchema,
+    (val) => {
+      formSchemaData.value = val;
+    }
+  );
 
-provide('formSchema', formSchemaData);
-provide('isUpdate', isUpdate);
-provide('formData', record);
-provide('deviceType', props.deviceType);
-// const glob = useGlobSetting();
-const [registerModal, { openModal, closeModal }] = useModal();
+  provide('formSchema', formSchemaData);
+  provide('isUpdate', isUpdate);
+  provide('formData', record);
+  provide('deviceType', props.deviceType);
+  // const glob = useGlobSetting();
+  const [registerModal, { openModal, closeModal }] = useModal();
 
-const columnList = getTableHeaderColumns(props.columnsType);
+  const columnList = getTableHeaderColumns(props.columnsType);
 
-// 列表页面公共参数、方法
-const { prefixCls, tableContext, onExportXls, onImportXls, doRequest } = useListPage({
-  designScope: props.designScope,
-  tableProps: {
-    showTableSetting: false,
-    title: props.title,
-    api: props.list,
-    columns: props.columns.length > 0 ? (props.columns as any[]) : columnList,
-    // size: 'small',
-    // bordered: false,
-    formConfig: {
-      showAdvancedButton: true,
-      // labelWidth: 100,
-      labelAlign: 'left',
-      labelCol: {
-        xs: 24,
-        sm: 24,
-        md: 24,
-        lg: 9,
-        xl: 7,
-        xxl: 5,
+  // 列表页面公共参数、方法
+  const { prefixCls, tableContext, onExportXls, onImportXls, doRequest } = useListPage({
+    designScope: props.designScope,
+    tableProps: {
+      showTableSetting: false,
+      title: props.title,
+      api: props.list,
+      columns: props.columns.length > 0 ? (props.columns as any[]) : columnList,
+      // size: 'small',
+      // bordered: false,
+      showIndexColumn: true,
+      formConfig: {
+        showAdvancedButton: true,
+        // labelWidth: 100,
+        labelAlign: 'left',
+        labelCol: {
+          xs: 24,
+          sm: 24,
+          md: 24,
+          lg: 9,
+          xl: 7,
+          xxl: 5,
+        },
+        schemas: props.searchFormSchema as any[],
+      },
+      useSearchForm: props.searchFormSchema.length > 0 ? true : false,
+      striped: true,
+      actionColumn: {
+        width: 180,
+      },
+      beforeFetch: (params) => {
+        return Object.assign(params, { column: 'createTime', devicekind: props.deviceType });
       },
-      schemas: props.searchFormSchema as any[],
-    },
-    useSearchForm: props.searchFormSchema.length > 0 ? true : false,
-    striped: true,
-    actionColumn: {
-      width: 180,
-    },
-    beforeFetch: (params) => {
-      return Object.assign(params, { column: 'createTime', devicekind: props.deviceType });
     },
-  },
-});
-
+  });
 
-//注册table数据
-const [registerTable, { reload, getForm }, { rowSelection, selectedRowKeys }] = tableContext;
+  //注册table数据
+  const [registerTable, { reload, getForm }, { rowSelection, selectedRowKeys }] = tableContext;
 
-const saveOrUpdateHandler = async (params) => {
-  try {
-    await props.saveOrUpdate(params, isUpdate.value);
-    !props.showTab ? closeModal() : '';
-    await doRequest(props.list, { confirm: false });
-    emit('submitSuccess', params)
-  } catch (error) {
-    message.error('保存失败,请联系管理员');
-  }
-};
+  const saveOrUpdateHandler = async (params) => {
+    try {
+      await props.saveOrUpdate(params, isUpdate.value);
+      !props.showTab ? closeModal() : '';
+      await doRequest(props.list, { confirm: false });
+      emit('submitSuccess', params);
+    } catch (error) {
+      message.error('保存失败,请联系管理员');
+    }
+  };
 
-// const closeModalFn = () => {
-//   closeModal()
-// }
-/**
- * 新增事件
- */
-function handleAdd() {
-  const searchFormData = getForm().getFieldsValue()
-  if(searchFormData && searchFormData['strtype']){
-    emit('editHandler', searchFormData)
-    for (let key in record) {
-      if(key == 'strtype'){
-        record[key] = searchFormData['strtype']
-      }else{
-        delete record[key];
+  // const closeModalFn = () => {
+  //   closeModal()
+  // }
+  /**
+   * 新增事件
+   */
+  function handleAdd() {
+    const searchFormData = getForm().getFieldsValue();
+    if (searchFormData && searchFormData['strtype']) {
+      emit('editHandler', searchFormData);
+      for (let key in record) {
+        if (key == 'strtype') {
+          record[key] = searchFormData['strtype'];
+        } else {
+          delete record[key];
+        }
       }
+      isUpdate.value = false;
+      openModal(
+        true,
+        {
+          record: { strtype: searchFormData['strtype'] },
+        },
+        false
+      );
+    } else {
+      message.info('请先选择系统类型!!');
     }
-    isUpdate.value = false;
-    openModal(true, {
-      record: { strtype : searchFormData['strtype'] }
-    }, false);
-  }else{
-    message.info('请先选择系统类型!!')
   }
-}
-
-/**
- * 编辑事件
- */
-function handleEdit(data) {
-  emit('editHandler', data)
-  isUpdate.value = true;
-  Object.assign(record, toRaw(data));
-  openModal(true, {
-    record,
-  }, false);
-}
-
-/**
- * 删除事件
- */
-async function handleDelete(record) {
-  await props.deleteById({ id: record.id }, reload);
-}
 
-/**
- * 批量删除事件
- */
-async function batchHandleDelete() {
-  doRequest(() => props.batchDelete({ ids: selectedRowKeys.value }));
-}
-/**
- * 查看
- */
-// function handleDetail(record) {
-//   iframeUrl.value = `${glob.uploadUrl}/sys/annountCement/show/${record.id}?token=${getToken()}`;
-//   openDetail(true);
-// }
-/**
- * 操作列定义
- * @param record
- */
-function getActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {
-  return [
-    {
-      label: '编辑',
-      onClick: handleEdit.bind(null, record, column),
-    },
-    {
-      label: '删除',
-      popConfirm: {
-        title: '是否确认删除',
-        confirm: handleDelete.bind(null, record, column),
+  /**
+   * 编辑事件
+   */
+  function handleEdit(data) {
+    emit('editHandler', data);
+    isUpdate.value = true;
+    Object.assign(record, toRaw(data));
+    openModal(
+      true,
+      {
+        record,
       },
-    },
-    // {
-    //   label: '查看',
-    //   onClick: handleDetail.bind(null, record),
-    // },
-  ];
-}
+      false
+    );
+  }
 
+  /**
+   * 删除事件
+   */
+  async function handleDelete(record) {
+    await props.deleteById({ id: record.id }, reload);
+  }
 
-defineExpose({
-  doRequest, onExportXls, onImportXls, reload, getForm
-});
+  /**
+   * 批量删除事件
+   */
+  async function batchHandleDelete() {
+    doRequest(() => props.batchDelete({ ids: selectedRowKeys.value }));
+  }
+  /**
+   * 查看
+   */
+  // function handleDetail(record) {
+  //   iframeUrl.value = `${glob.uploadUrl}/sys/annountCement/show/${record.id}?token=${getToken()}`;
+  //   openDetail(true);
+  // }
+  /**
+   * 操作列定义
+   * @param record
+   */
+  function getActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {
+    return [
+      {
+        label: '编辑',
+        onClick: handleEdit.bind(null, record, column),
+      },
+      {
+        label: '删除',
+        popConfirm: {
+          title: '是否确认删除',
+          confirm: handleDelete.bind(null, record, column),
+        },
+      },
+      // {
+      //   label: '查看',
+      //   onClick: handleDetail.bind(null, record),
+      // },
+    ];
+  }
 
+  defineExpose({
+    doRequest,
+    onExportXls,
+    onImportXls,
+    reload,
+    getForm,
+  });
 </script>
 
 <style scoped lang="less">

+ 4 - 2
src/views/vent/monitorManager/camera/index.vue

@@ -308,7 +308,7 @@ function setNoRtspVideo(id, videoAddr, cameraRate) {
       playsinline: true,
       screenShot: true,
       whitelist: [''],
-      ignores: ['time'],
+      ignores: ['time', 'progress', 'play', 'i18n', 'volume', 'fullscreen', 'screenShot', 'playbackRate'],
       closeVideoClick: true,
       customConfig: {
         isClickPlayBack: false
@@ -345,6 +345,7 @@ function setNoRtspVideo(id, videoAddr, cameraRate) {
         autoplay: true,
         autoplayMuted: true,
         cors: true,
+        ignores: ['time', 'progress', 'play', 'i18n', 'volume', 'fullscreen', 'screenShot', 'playbackRate'],
         poster: '/src/assets/images/vent/noSinge.png',
         defaultPlaybackRate: cameraRate || 1,
         controls: false,
@@ -374,7 +375,8 @@ function setNoRtspVideo(id, videoAddr, cameraRate) {
         autoplay: true,
         autoplayMuted: true,
         plugins: [HlsPlugin], // 第二步
-        poster: '/src/assets/images/vent/noSinge.png', 
+        poster: '/src/assets/images/vent/noSinge.png',
+        ignores: ['time', 'progress', 'play', 'i18n', 'volume', 'fullscreen', 'screenShot', 'playbackRate'],
         defaultPlaybackRate: cameraRate || 1,
         controls: false,
         hls: {

+ 1 - 0
src/views/vent/monitorManager/comment/AlarmHistoryTable.vue

@@ -173,6 +173,7 @@
       bordered: false,
       size: 'small',
       scroll: tableScroll,
+      showIndexColumn: true,
       formConfig: {
         labelAlign: 'left',
         showAdvancedButton: false,

+ 16 - 18
src/views/vent/monitorManager/comment/DeviceEcharts.vue

@@ -81,7 +81,7 @@
       </template>
       <template v-else>
         <a-date-picker
-          v-model:value="historyParams.startTime"
+          v-model:value="historyParams.ttime_begin"
           valueFormat="YYYY-MM-DD HH:mm:ss"
           placeholder="开始时间"
           size="small"
@@ -89,7 +89,7 @@
           style="position: absolute; z-index: 99; left: 254px; width: 170px; top: 2px"
         />
         <a-date-picker
-          v-model:value="historyParams.endTime"
+          v-model:value="historyParams.ttime_end"
           valueFormat="YYYY-MM-DD HH:mm:ss"
           placeholder="结束时间"
           size="small"
@@ -186,15 +186,13 @@
       } else {
         historyList = (params) => defHttp.post({ url: '/monitor/history/getHistoryData', params });
       }
-      const chartsType = ref('listMonitor');
+      const chartsType = ref('history');
       const deviceId = ref('');
       const options = ref([]);
       const historyParams = reactive({
-        ttime_begin: dayjs().startOf('date').format('YYYY-MM-DD HH:mm:ss'),
-        ttime_end: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+        ttime_begin: dayjs().startOf('date').format('YYYY-MM-DD HH:mm:ss').toString(),
+        ttime_end: dayjs().format('YYYY-MM-DD HH:mm:ss').toString(),
         skip: '8',
-        startTime: dayjs().startOf('date').format('YYYY-MM-DD HH:mm:ss'),
-        endTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
         interval: '1h',
       });
       const resultXAxisPropType = ref('');
@@ -208,7 +206,7 @@
         grid: {
           top: '60px',
           left: '10px',
-          right: '20px',
+          right: props.chartsColumns.length * 15 + 'px',
           bottom: '5%',
           containLabel: true,
         },
@@ -225,7 +223,7 @@
         grid: {
           top: '70px',
           left: '10px',
-          right: '5px',
+          right: props.chartsColumns.length * 15 + 'px',
           bottom: '45px',
           containLabel: true,
         },
@@ -240,7 +238,7 @@
         grid: {
           top: '70px',
           left: '10px',
-          right: '5px',
+          right: props.chartsColumns.length * 15 + 'px',
           bottom: '2%',
           containLabel: true,
         },
@@ -272,15 +270,15 @@
             const device = options.value.find((device) => device['deviceID'] === newDeviceId);
             if (device) {
               let res;
-              if (globalConfig.History_Type == 'vent') {
-                resultXAxisPropType.value = 'gcreatetime';
+              if (props.dataSource['stationtype'] !== 'redis') {
+                resultXAxisPropType.value = 'ttime';
 
                 const datas = await historyList({
-                  ttime_begin: historyParams.startTime,
-                  ttime_end: historyParams.endTime,
+                  ttime_begin: newHistoryParams.ttime_begin,
+                  ttime_end: newHistoryParams.ttime_end,
                   strtype: device.deviceType,
                   gdeviceid: newDeviceId,
-                  skip: historyParams.skip,
+                  skip: newHistoryParams.skip,
                   pageSize: pageSize.value,
                   pageNo: currentPage.value,
                   column: 'createTime',
@@ -297,11 +295,11 @@
                 res = await historyList({
                   pageSize: pageSize.value,
                   pageNum: currentPage.value,
-                  startTime: historyParams.startTime,
-                  endTime: historyParams.endTime,
+                  startTime: newHistoryParams.ttime_begin,
+                  endTime: newHistoryParams.ttime_end,
                   deviceId: newDeviceId,
                   strtype: device.deviceType,
-                  interval: historyParams.interval,
+                  interval: newHistoryParams.interval,
                   column: 'createTime',
                 });
                 if (res && res.records && res.records.length > 0) {

+ 1 - 0
src/views/vent/monitorManager/comment/HandlerHistoryTable.vue

@@ -94,6 +94,7 @@
       canResize: true,
       showTableSetting: false,
       showActionColumn: false,
+      showIndexColumn: true,
       bordered: false,
       size: 'small',
       scroll: tableScroll,

+ 1 - 0
src/views/vent/monitorManager/comment/WorkFaceAlarmHistoryTable.vue

@@ -122,6 +122,7 @@
       canResize: true,
       showTableSetting: false,
       showActionColumn: false,
+      showIndexColumn: true,
       bordered: false,
       size: 'small',
       scroll: props.scroll,

+ 1 - 0
src/views/vent/monitorManager/comment/WorkFaceHandlerHistoryTable.vue

@@ -77,6 +77,7 @@
       canResize: true,
       showTableSetting: false,
       showActionColumn: false,
+      showIndexColumn: true,
       bordered: false,
       size: 'small',
       scroll: props.scroll,

+ 1 - 0
src/views/vent/monitorManager/deviceMC/AlarmHistoryTable.vue

@@ -143,6 +143,7 @@
       canResize: true,
       showTableSetting: false,
       showActionColumn: false,
+      showIndexColumn: true,
       bordered: false,
       size: 'small',
       scroll: tableScroll,

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

@@ -86,6 +86,7 @@
       canResize: true,
       showTableSetting: false,
       showActionColumn: false,
+      showIndexColumn: true,
       bordered: false,
       size: 'small',
       formConfig: {

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

@@ -340,7 +340,7 @@ export const addCssText = () => {
 // };
 export const playSmoke = (selectData) => {
   // debugger;
-  console.log('selectData[Fan1fHz]------------》', selectData['Fan1fHz'], Number(selectData['Fan1fHz']));
+  // console.log('selectData[Fan1fHz]------------》', selectData['Fan1fHz'], Number(selectData['Fan1fHz']));
   if (selectData['Fan1StartStatus'] == '1') {
     // 主风机打开
     // setSmokeFrequency('top', Number(selectData['Fan1fHz']) || 40);

+ 26 - 71
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -162,72 +162,8 @@
             >
           </div>
           <div class="container-group">
-            <!-- <div class="warning-header">
-              <div class="header-item">
-                <div class="header-title">报警总数</div>
-                <div class="header-value">0</div>
-              </div>
-              <div class="header-item">
-                <div class="header-title">未处理数</div>
-                <div class="header-value">0</div>
-              </div>
-            </div> -->
             <div class="warning-group">
               <template v-if="selectData.deviceType">
-                <!-- <div class="warning-item" v-for="(state, index) in leftColumns" :key="index">
-                <div class="item-name"><div class="icon"></div> {{ state.title }}</div>
-                <div v-if="state.dataIndex.startsWith('Fan')">
-                  <div class="signal-item" v-if="warningMonitorRowIndex == 0">
-                    <div
-                      class="signal-round"
-                      :class="{
-                        'signal-round-run': selectData[state.dataIndex.replace('Fan', 'Fan1')],
-                        'signal-round-warning':
-                          selectData[state.dataIndex.replace('Fan', 'Fan1')] !== undefined && !selectData[state.dataIndex.replace('Fan', 'Fan1')],
-                        'signal-round-gry': selectData[state.dataIndex.replace('Fan', 'Fan1')] === undefined,
-                      }"
-                    ></div>
-                    <div class="vent-margin-l-8">{{
-                      selectData[state.dataIndex.replace('Fan', 'Fan1')] === undefined
-                      ? '无状态'
-                      : selectData[state.dataIndex.replace('Fan', 'Fan1')]
-                        ? '正常'
-                        : '异常'
-                    }}</div>
-                  </div>
-                  <div class="signal-item" v-if="warningMonitorRowIndex == 1">
-                    <div
-                      class="signal-round"
-                      :class="{
-                        'signal-round-run': selectData[state.dataIndex.replace('Fan', 'Fan2')],
-                        'signal-round-warning':
-                          selectData[state.dataIndex.replace('Fan', 'Fan2')] !== undefined && !selectData[state.dataIndex.replace('Fan', 'Fan2')],
-                        'signal-round-gry': selectData[state.dataIndex.replace('Fan', 'Fan2')] === undefined,
-                      }"
-                    ></div>
-                    <div class="vent-margin-l-8">{{
-                      selectData[state.dataIndex.replace('Fan', 'Fan2')] === undefined
-                      ? '无状态'
-                      : selectData[state.dataIndex.replace('Fan', 'Fan2')]
-                        ? '正常'
-                        : '异常'
-                    }}</div>
-                  </div>
-                </div>
-                <div v-else>
-                  <div class="signal-item">
-                    <div
-                      class="signal-round vent-margin-l-8"
-                      :class="{
-                              'signal-round-run': selectData[state.dataIndex],
-                              'signal-round-warning': selectData[state.dataIndex] !== undefined && !selectData[state.dataIndex],
-                              'signal-round-gry': selectData[state.dataIndex] === undefined,
-                            }"
-                    ></div>
-                    <div class="vent-margin-l-8">{{ selectData[state.dataIndex] === undefined ? '无状态' : selectData[state.dataIndex] ? '正常' : '异常' }}</div>
-                  </div>
-                </div>
-              </div> -->
                 <div class="container-item" v-for="(data, index) in leftColumns" :key="index">
                   <div class="item-icon">
                     <!-- <SvgIcon class="icon-style" size="18" name="temperature" /> -->
@@ -292,8 +228,8 @@
               <div class="warning-group" style="max-height: 200px; overflow-y: auto">
                 <div class="warning-header">
                   <div class="header-item">
-                    <div class="header-title">报警数量</div>
-                    <div class="header-value">{{ selectData['warnLogNotOkCount'] }} </div>
+                    <div class="header-title">设备报警</div>
+                    <!-- <div class="header-value">{{ selectData['warnLogNotOkCount'] }} </div> -->
                   </div>
                 </div>
                 <template v-if="deviceType">
@@ -366,7 +302,7 @@
         </div>
       </div>
     </div>
-    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 170, scroll, 180)">
+    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 175, scroll, 0)">
       <dv-border-box8 :dur="5" class="dv_border_8" :style="`bottom: 20px; padding: 5px; height: ${scroll.y + 140}px`">
         <!-- <div class="enter-detail" @click="goDetail()">
           <send-outlined class=""/>风机运行详情
@@ -403,6 +339,21 @@
               </template>
             </div>
           </a-tab-pane>
+          <a-tab-pane key="7" v-if="hasPermission('show:deviceEcharts')" tab="监测曲线图" force-render>
+            <div class="tab-item" v-if="activeKey === '7'">
+              <FanDeviceEcharts
+                chartsColumnsType="fanlocal_chart"
+                xAxisPropType="strname"
+                :dataSource="dataSource"
+                height="100%"
+                width="100%"
+                :fan1ChartsColumns="chartsColumnsFan1"
+                :fan2ChartsColumns="chartsColumnsFan2"
+                :device-list-api="list.bind(null, { devicetype: 'fanlocal', pagetype: 'normal' })"
+                device-type="fanlocal"
+              />
+            </div>
+          </a-tab-pane>
           <a-tab-pane key="4" tab="报警历史">
             <div class="tab-item" v-if="activeKey === '4'">
               <AlarmHistoryTable columns-type="alarm" :device-type="`${devicekide}`" designScope="alarm-history" :scroll="scroll" />
@@ -615,6 +566,7 @@
   import { ExclamationCircleFilled, ArrowRightOutlined } from '@ant-design/icons-vue';
   import { onBeforeMount, ref, watch, onMounted, nextTick, defineAsyncComponent, reactive, onUnmounted, inject, unref } from 'vue';
   // import BarSingle from '../../../../components/chart/BarSingle.vue';
+  import FanDeviceEcharts from '../comment/FanDeviceEcharts.vue';
   import BarAndLine from '../../../../components/chart/BarAndLine.vue';
   import GroupMonitorTable from '../comment/GroupMonitorTable.vue';
   import AlarmHistoryTable from '../comment/AlarmHistoryTable.vue';
@@ -884,17 +836,16 @@
 
   // 这里需要处理主备echartColumns
   if (chartsColumns.length > 0) {
+    console.log(chartsColumns);
     for (let i = 0; i < chartsColumns.length; i++) {
       let itemColumn = chartsColumns[i];
       let dataIndexFan1, dataIndexFan2;
-
       if (itemColumn['dataIndex']) {
         const dataIndex = itemColumn['dataIndex'] as string;
-
         dataIndexFan1 = dataIndex.startsWith('Fan') ? dataIndex.replace('Fan', 'Fan1') : dataIndex.replace('fan', 'fan1');
         dataIndexFan2 = dataIndex.startsWith('Fan') ? dataIndex.replace('Fan', 'Fan2') : dataIndex.replace('fan', 'fan2');
-        chartsColumnsFan1.push({ ...itemColumn, dataIndex: dataIndexFan1 });
-        chartsColumnsFan2.push({ ...itemColumn, dataIndex: dataIndexFan2 });
+        chartsColumnsFan1.push({ ...itemColumn, dataIndex: dataIndexFan1, legend: '主机' + itemColumn['legend'] });
+        chartsColumnsFan2.push({ ...itemColumn, dataIndex: dataIndexFan2, legend: '备机' + itemColumn['legend'] });
       }
     }
   }
@@ -1678,8 +1629,12 @@
             justify-content: center;
             align-items: center;
             .header-title {
+              width: 100%;
+              text-align: center;
+              padding: 1px 0;
               color: #39e7fe;
               margin-top: 10px;
+              background: #1eb0ff22;
             }
             .header-value {
               // width: 133px;

+ 16 - 25
src/views/vent/monitorManager/fireDoorMonitor/fireDoor.threejs.fire.ts

@@ -78,21 +78,14 @@ class FireDoor {
 
   /* 提取风门序列帧,初始化前后门动画 */
   initAnimation() {
-    const fmGroup = this.group?.getObjectByName('fire-door');
-    if (fmGroup) {
-      const tracks = fmGroup.animations[0].tracks;
-      const doorTracks: any[] = [];
-      for (let i = 0; i < tracks.length; i++) {
-        const track = tracks[i];
-        if (track.name.startsWith('qianmen')) {
-          doorTracks.push(track);
-        }
-      }
+    const fireGroup = this.group.children[0]?.getObjectByName('fire-door');
+    if (fireGroup) {
+      const tracks = fireGroup.animations[0].tracks;
 
-      this.mixers = new THREE.AnimationMixer(fmGroup);
+      this.mixers = new THREE.AnimationMixer(fireGroup);
 
-      const door = new THREE.AnimationClip('door', 22, doorTracks);
-      const frontClipAction = this.mixers.clipAction(door, fmGroup);
+      const door = new THREE.AnimationClip('door', 22, tracks);
+      const frontClipAction = this.mixers.clipAction(door, fireGroup);
       frontClipAction.clampWhenFinished = true;
       frontClipAction.loop = THREE.LoopOnce;
       this.clipActionArr.door = frontClipAction;
@@ -145,21 +138,19 @@ class FireDoor {
       if (!this.model) {
         resolve(null);
       }
-      this.model.setGLTFModel('Fire-door').then((gltf) => {
-        const fmModal = gltf[0];
-        fmModal.name = 'Fire-door';
-        this.group?.add(fmModal);
+      this.model.setGLTFModel(['Fire-door'], this.group).then(() => {
         this.setModalPosition();
+        console.log(this.group);
         // 初始化左右摇摆动画;
         this.initAnimation();
-        this.addLight();
-        this.model.animate();
-        resolve(this.model);
-
-        this.damperOpenMesh = this.group.getObjectByName('Damper_Open_2');
-        if (this.damperOpenMesh) this.damperOpenMesh.visible = false;
-        this.damperClosedMesh = this.group.getObjectByName('Damper_Closed_2');
-        if (this.damperClosedMesh) this.damperClosedMesh.visible = true;
+        // this.addLight();
+        // this.model.animate();
+        // resolve(this.model);
+
+        // this.damperOpenMesh = this.group.getObjectByName('Damper_Open_2');
+        // if (this.damperOpenMesh) this.damperOpenMesh.visible = false;
+        // this.damperClosedMesh = this.group.getObjectByName('Damper_Closed_2');
+        // if (this.damperClosedMesh) this.damperClosedMesh.visible = true;
       });
     });
   }

+ 3 - 4
src/views/vent/monitorManager/fireDoorMonitor/fireDoor.threejs.ts

@@ -69,8 +69,8 @@ export const setModelType = (type) => {
         await animateCamera(
           oldCameraPosition,
           { x: 0, y: 0, z: 0 },
-          { x: -621.7019254383079, y: 103.0117761306667, z: -29.92662339085279 },
-          { x: -7.222742181565763, y: 58.55923854292045, z: -28.86454095144525 },
+          { x: -654.2006991449887, y: 103.16181473511944, z: -30.348656073478562 },
+          { x: -7.380506513422206, y: 56.36967052459397, z: -29.230675020846963 },
           model,
           0.8
         );
@@ -86,9 +86,8 @@ export const initCameraCanvas = async (playerVal1) => {
 };
 const setControls = () => {
   if (model && model.orbitControls) {
-    model.orbitControls.maxPolarAngle = (Math.PI / 3) * 2;
+    model.orbitControls.maxPolarAngle = Math.PI / 2;
     model.orbitControls.minPolarAngle = Math.PI / 3;
-    model.orbitControls.enableRotate = false; //禁止旋转
     model.orbitControls.minDistance = 600;
     model.orbitControls.maxDistance = 900;
   }

+ 4 - 6
src/views/vent/monitorManager/fireDoorMonitor/index.vue

@@ -6,8 +6,8 @@
   <div class="scene-box">
     <div class="top-box">
       <div class="top-center row">
-        <div v-if="hasPermission('btn:control')" class="button-box" @click="playAnimation(1)">打开</div>
-        <div v-if="hasPermission('btn:control')" class="button-box" @click="playAnimation(2)">关闭</div>
+        <div v-if="hasPermission('btn:control')" class="button-box" @click="playAnimation(1)">打开防火门</div>
+        <div v-if="hasPermission('btn:control')" class="button-box" @click="playAnimation(2)">关闭防火门</div>
       </div>
       <!-- 控制模式 -->
       <div class="top-right row">
@@ -42,7 +42,7 @@
     <div class="title-text">
       {{ selectData.supplyAirAddr || selectData.strinstallpos || selectData.strname }}
     </div>
-    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 350, scroll)">
+    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 300, scroll)">
       <dv-border-box8 :dur="5" :style="`padding: 5px; height: ${scroll.y + 120}px`">
         <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
           <a-tab-pane key="1" tab="实时监测">
@@ -301,9 +301,7 @@
     Object.assign(selectData, initData, selectRow, baseData);
     isdoorOpenRunning = false; //开关门动作是否在进行
     doorDeviceState = 0; //记录设备状态,为了与下一次监测数据做比较
-    // const type = selectData.nwindownum == 1 ? 'singleWindow' : 'doubleWindow';
     let type = 'fireDoor';
-
     setModelType(type).then(async () => {
       loading.value = false;
     });
@@ -462,7 +460,7 @@
   @import '/@/design/vent/modal.less';
   .scene-box {
     .bottom-tabs-box {
-      height: 350px;
+      height: 300px;
     }
   }
   .button-box {

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

@@ -85,7 +85,7 @@ class Fm2 {
       ? `国能神东煤炭集团监制`
       : '煤炭科学技术研究院有限公司研制';
 
-    const screenDownTextX = 80 - (screenDownText.length - 10) * 6;
+    const screenDownTextX = 80 - (screenDownText.length - 11) * 6;
     const textArr = [
       {
         text: `远程控制自动风门`,
@@ -96,7 +96,7 @@ class Fm2 {
         y: 100,
       },
       {
-        text: `压力(Pa):`,
+        text: `净通行高度(m):`,
         font: 'normal 30px Arial',
         color: '#00FF00',
         strokeStyle: '#007400',
@@ -104,7 +104,7 @@ class Fm2 {
         y: 155,
       },
       {
-        text: `${selectData.frontRearDP}`,
+        text: `${selectData.fclearheight ? selectData.fclearheight : '-'}`,
         font: 'normal 30px Arial',
         color: '#00FF00',
         strokeStyle: '#007400',
@@ -112,7 +112,7 @@ class Fm2 {
         y: 155,
       },
       {
-        text: `动力源压力(MPa): `,
+        text: `净通行宽度(m): `,
         font: 'normal 30px Arial',
         color: '#00FF00',
         strokeStyle: '#007400',
@@ -120,7 +120,7 @@ class Fm2 {
         y: 215,
       },
       {
-        text: ` ${selectData.sourcePressure}`,
+        text: ` ${selectData.fclearwidth ? selectData.fclearwidth : '-'}`,
         font: 'normal 30px Arial',
         color: '#00FF00',
         strokeStyle: '#007400',
@@ -172,7 +172,7 @@ class Fm2 {
         const planeMesh = new THREE.Mesh(planeGeometry, textMaterial);
         planeMesh.name = 'monitorText';
         planeMesh.scale.set(0.002, 0.002, 0.002);
-        planeMesh.position.set(4.155, 0.09, -0.39);
+        planeMesh.position.set(4.205, 0.09, -0.39);
         this.group.add(planeMesh);
       }
     });
@@ -491,6 +491,15 @@ class Fm2 {
       }
     }
   }
+  resetModal() {
+    const fmThreeBase = this.group.getObjectByName('fmThreeBase');
+    if (fmThreeBase) {
+      const screenObj1 = fmThreeBase.getObjectByName('对象192');
+      const screenObj2 = fmThreeBase.getObjectByName('对象231');
+      if (screenObj1) screenObj1.visible = false;
+      if (screenObj2) screenObj2.visible = false;
+    }
+  }
 
   mountedThree(playerDom) {
     this.group = new THREE.Object3D();
@@ -499,6 +508,7 @@ class Fm2 {
       this.model.setGLTFModel(['fmThreeBase', 'fmThree'], this.group).then(() => {
         this.group.name = 'fm2';
         this.setModalPosition();
+        this.resetModal();
         // 初始化左右摇摆动画;
         this.initAnimation();
         // this.drawHots();

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

@@ -104,7 +104,7 @@ class FmTwoSs {
       ? `国能神东煤炭集团监制`
       : '煤炭科学技术研究院有限公司研制';
 
-    const screenDownTextX = 80 - (screenDownText.length - 10) * 6;
+    const screenDownTextX = 80 - (screenDownText.length - 11) * 6;
     const textArr = [
       {
         text: `远程控制自动风门`,

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

@@ -104,7 +104,7 @@ class FmTwoYj {
       ? `国能神东煤炭集团监制`
       : '煤炭科学技术研究院有限公司研制';
 
-    const screenDownTextX = 90 - (screenDownText.length - 10) * 6;
+    const screenDownTextX = 90 - (screenDownText.length - 11) * 6;
     const textArr = [
       {
         text: `远程控制自动风门`,

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

@@ -105,7 +105,7 @@ class Fm1 {
       ? `国能神东煤炭集团监制`
       : '煤炭科学技术研究院有限公司研制';
 
-    const screenDownTextX = 80 - (screenDownText.length - 10) * 6;
+    const screenDownTextX = 80 - (screenDownText.length - 11) * 6;
     const textArr = [
       {
         text: `远程控制自动风门`,

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

@@ -48,6 +48,7 @@
       showActionColumn: false,
       bordered: false,
       size: 'small',
+      showIndexColumn: true,
       // scroll: { y: 600 },
       formConfig: {
         labelAlign: 'left',

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

@@ -79,6 +79,7 @@
       showTableSetting: false,
       showActionColumn: false,
       bordered: false,
+      showIndexColumn: true,
       size: 'small',
       formConfig: {
         labelAlign: 'left',

+ 24 - 7
src/views/vent/monitorManager/mainFanMonitor/index.vue

@@ -249,7 +249,7 @@
         </div>
       </div>
     </div>
-    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll, 170)">
+    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll, 0)">
       <!-- 摄像头显示隐藏图标 -->
       <VideoCameraOutlined class="video-icon" :class="{ 'no-play': !showPlay }" @click="changePlay" />
 
@@ -258,7 +258,7 @@
         <div class="button-box" @click="goOutLink('1')">视频查看</div>
         <div class="button-box" @click="goOutLink('2')">主风机故障智能诊断预警系统</div>
       </div>
-      <dv-border-box8 :dur="5" :style="`padding: 5px; height: ${scroll.y + 120}px`">
+      <dv-border-box8 :dur="5" :style="`padding: 5px; height: ${scroll.y + 128}px`">
         <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
           <a-tab-pane key="1" tab="实时监测">
             <GroupMonitorTable
@@ -294,10 +294,25 @@
                 <HistoryTable device-type="fanmain" designScope="fanmain-history" :scroll="scroll" />
               </template>
               <template v-else>
-                <HistoryTable class="w-100% h-100%" :device-code="deviceType" :scroll="scroll" dict-code="fan_dict" />
+                <HistoryTable :device-code="deviceType" :scroll="{ y: scroll.y - 70 }" dict-code="fan_dict" />
               </template>
             </div>
           </a-tab-pane>
+          <a-tab-pane key="7" v-if="hasPermission('show:deviceEcharts')" tab="监测曲线图" force-render>
+            <div class="tab-item" v-if="activeKey === '7'" style="padding-bottom: 20px">
+              <FanDeviceEcharts
+                chartsColumnsType="fanmain_chart"
+                xAxisPropType="strname"
+                :dataSource="dataSource"
+                height="100%"
+                width="100%"
+                :fan1ChartsColumns="chartsColumnsFan1"
+                :fan2ChartsColumns="chartsColumnsFan2"
+                :device-list-api="list.bind(null, { devicetype: 'fanmain', pagetype: 'normal' })"
+                device-type="fanmain"
+              />
+            </div>
+          </a-tab-pane>
           <a-tab-pane key="4" tab="报警历史">
             <div class="tab-item" v-if="activeKey === '4'">
               <AlarmHistoryTable columns-type="alarm" :device-type="deviceType" designScope="alarm-history" :scroll="scroll" />
@@ -468,6 +483,7 @@
 
 <script setup lang="ts">
   import { ExclamationCircleFilled, VideoCameraOutlined } from '@ant-design/icons-vue';
+  import FanDeviceEcharts from '../comment/FanDeviceEcharts.vue';
   import BarAndLine from '../../../../components/chart/BarAndLine.vue';
   import FanEchrats from '/@/views/vent/monitorManager/mainFanMonitor/fanEchrats.vue';
   import { onBeforeMount, computed, ref, onMounted, inject, onUnmounted, reactive, toRaw, watch, nextTick, defineAsyncComponent } from 'vue';
@@ -503,7 +519,7 @@
     globalConfig.History_Type == 'remote'
       ? defineAsyncComponent(() => import('../comment/HistoryTable.vue'))
       : defineAsyncComponent(() => import('../../../vent/comment/history/HistoryTable.vue'));
-
+  // const HistoryTable = defineAsyncComponent(() => import('../comment/HistoryTable.vue'))
   const { hasPermission } = usePermission();
 
   const [registerModal, { openModal, closeModal }] = useModal();
@@ -574,8 +590,8 @@
 
         dataIndexFan1 = dataIndex.startsWith('Fan') ? dataIndex.replace('Fan', 'Fan1') : dataIndex.replace('fan', 'fan1');
         dataIndexFan2 = dataIndex.startsWith('Fan') ? dataIndex.replace('Fan', 'Fan2') : dataIndex.replace('fan', 'fan2');
-        chartsColumnsFan1.push({ ...itemColumn, dataIndex: dataIndexFan1 });
-        chartsColumnsFan2.push({ ...itemColumn, dataIndex: dataIndexFan2 });
+        chartsColumnsFan1.push({ ...itemColumn, dataIndex: dataIndexFan1, legend: '主机' + itemColumn['legend'] });
+        chartsColumnsFan2.push({ ...itemColumn, dataIndex: dataIndexFan2, legend: '备机' + itemColumn['legend'] });
       }
     }
   }
@@ -1340,7 +1356,8 @@
             padding-top: 2px;
             color: #ffffff99;
             cursor: pointer;
-
+            height: calc(100% - 10px);
+            overflow-y: auto;
             &:hover {
               color: #ffffff;
             }

+ 1 - 0
src/views/vent/monitorManager/safetyMonitor/AlarmHistoryTable.vue

@@ -144,6 +144,7 @@
       showTableSetting: false,
       showActionColumn: false,
       bordered: false,
+      showIndexColumn: true,
       size: 'small',
       scroll: tableScroll,
       formConfig: {

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

@@ -64,7 +64,7 @@
             <div class="charts-box" v-if="chartsColumns.length > 0">
               <BarAndLine
                 :chartsColumnsType="selectData.deviceType"
-                xAxisPropType="gcreatetime"
+                xAxisPropType="ttime"
                 :dataSource="historyDataSource"
                 height="300px"
                 :chartsColumns="chartsColumns"

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

@@ -74,6 +74,7 @@
       canResize: true,
       showTableSetting: false,
       showActionColumn: false,
+      showIndexColumn: true,
       bordered: false,
       size: 'small',
       formConfig: {

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

@@ -74,6 +74,7 @@
       canResize: true,
       showTableSetting: false,
       showActionColumn: false,
+      showIndexColumn: true,
       bordered: false,
       size: 'small',
       formConfig: {

+ 25 - 0
src/views/vent/monitorManager/windowMonitor/dandaoFc.threejs.ts

@@ -27,6 +27,30 @@ class singleWindow {
   //   this.model.camera.updateProjectionMatrix();
   // };
 
+  addLight = () => {
+    if (!this.model) return;
+
+    const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
+    directionalLight.position.set(-110, 150, 647);
+    this.group?.add(directionalLight);
+    // directionalLight.target = group;
+
+    const pointLight2 = new THREE.PointLight(0xffffff, 1, 150);
+    pointLight2.position.set(-101, 34, 16);
+    pointLight2.shadow.bias = 0.05;
+    this.group.add(pointLight2);
+
+    const pointLight3 = new THREE.PointLight(0xffffff, 1, 150);
+    pointLight3.position.set(19, 25, -7);
+    pointLight3.shadow.bias = 0.05;
+    this.group.add(pointLight3);
+
+    const pointLight6 = new THREE.PointLight(0xffffff, 1, 300);
+    pointLight6.position.set(51, 51, 9);
+    pointLight6.shadow.bias = 0.05;
+    this.group.add(pointLight6);
+  };
+
   // 设置模型位置
   setModalPosition() {
     this.group?.scale.set(22, 22, 22);
@@ -309,6 +333,7 @@ class singleWindow {
         this.group?.add(fcModal);
         this.setModalPosition();
         this.initAnimation();
+        this.addLight();
         resolve(null);
       });
     });

+ 16 - 0
src/views/vent/monitorManager/windowMonitor/dandaoFcBet.threejs.ts

@@ -26,7 +26,23 @@ class singleWindowBet {
     const directionalLight = new THREE.DirectionalLight(0xffffff, 2);
     directionalLight.position.set(-437, 61, 559);
     this.group.add(directionalLight);
+
+    const pointLight2 = new THREE.PointLight(0xffffff, 1, 150);
+    pointLight2.position.set(-101, 34, 16);
+    pointLight2.shadow.bias = 0.05;
+    this.group.add(pointLight2);
+
+    const pointLight3 = new THREE.PointLight(0xffffff, 1, 150);
+    pointLight3.position.set(19, 25, -7);
+    pointLight3.shadow.bias = 0.05;
+    this.group.add(pointLight3);
+
+    const pointLight6 = new THREE.PointLight(0xffffff, 1, 300);
+    pointLight6.position.set(51, 51, 9);
+    pointLight6.shadow.bias = 0.05;
+    this.group.add(pointLight6);
   };
+
   // 设置模型位置
   setModalPosition() {
     this.group?.scale.set(22, 22, 22);

+ 15 - 0
src/views/vent/monitorManager/windowMonitor/dandaoFcXk.threejs.ts

@@ -23,6 +23,21 @@ class singleWindowXk {
     const directionalLight = new THREE.DirectionalLight(0xffffff, 1.5);
     directionalLight.position.set(800.0, 120.0, 80.0);
     this.group.add(directionalLight);
+
+    const pointLight2 = new THREE.PointLight(0xffffff, 1, 150);
+    pointLight2.position.set(-101, 34, 16);
+    pointLight2.shadow.bias = 0.05;
+    this.group.add(pointLight2);
+
+    const pointLight3 = new THREE.PointLight(0xffffff, 1, 150);
+    pointLight3.position.set(19, 25, -7);
+    pointLight3.shadow.bias = 0.05;
+    this.group.add(pointLight3);
+
+    const pointLight6 = new THREE.PointLight(0xffffff, 1, 300);
+    pointLight6.position.set(51, 51, 9);
+    pointLight6.shadow.bias = 0.05;
+    this.group.add(pointLight6);
   };
   // 设置模型位置
   setModalPosition() {

+ 23 - 16
src/views/vent/monitorManager/windowMonitor/dandaoFcYjl.threejs.ts

@@ -23,14 +23,14 @@ class singleWindowYjl {
   addLight = () => {
     if (!this.group || !this.group) return;
 
-    const directionalLight = new THREE.DirectionalLight(0xffffff, 2);
-    directionalLight.position.set(-437, 61, 559);
-    this.group.add(directionalLight);
+    // const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
+    // directionalLight.position.set(-437, 61, 559);
+    // this.group.add(directionalLight);
   };
   // 设置模型位置
   setModalPosition() {
-    this.group?.scale.set(22, 22, 22);
-    this.group?.position.set(-35, 25, 15);
+    // this.group?.scale.set(22, 22, 22);
+    // this.group?.position.set(-35, 25, 15);
   }
 
   addMonitorText(selectData) {
@@ -139,8 +139,8 @@ class singleWindowYjl {
         const planeGeometry = new THREE.PlaneGeometry(526, 346); // 平面3维几何体PlaneGeometry
         const planeMesh = new THREE.Mesh(planeGeometry, textMaterial);
         planeMesh.name = 'monitorText';
-        planeMesh.scale.set(0.0038, 0.004, 0.0038);
-        planeMesh.position.set(4.44, -0.165, -0.46);
+        planeMesh.scale.set(0.03, 0.032, 0.03);
+        planeMesh.position.set(42.41, 4.58, -2.67);
         this.group?.add(planeMesh);
       }
     });
@@ -148,14 +148,22 @@ class singleWindowYjl {
 
   /* 提取风门序列帧,初始化前后门动画 */
   initAnimation() {
-    const meshArr01: THREE.Object3D[] = [];
-    this.group?.children.forEach((obj) => {
-      if (obj.type === 'Mesh' && obj.name && obj.name.startsWith('FCshanye')) {
-        obj.rotateOnAxis(new THREE.Vector3(0, 1, 0), 0);
-        meshArr01.push(obj);
-      }
-    });
-    this.windowsActionArr.frontWindow = meshArr01;
+    const sdFcModal = this.group.getObjectByName('ddFc-yjl');
+    if (!sdFcModal) return;
+    // 初始化窗的动画
+    const fengchuang = sdFcModal?.getObjectByName('FengChuang');
+    const meshArr01: THREE.Mesh[] = [];
+    if (fengchuang) {
+      fengchuang.getObjectByName('group4')?.children.forEach((item: THREE.Object3D) => {
+        item.children.forEach((obj: THREE.Mesh) => {
+          if (obj.name && obj.name.startsWith('ted__FCshanye')) {
+            obj.rotateOnAxis(new THREE.Vector3(0, 1, 0), 0);
+            meshArr01.push(obj);
+          }
+        });
+      });
+      this.windowsActionArr.frontWindow = meshArr01;
+    }
   }
 
   play(rotationParam, flag) {
@@ -281,7 +289,6 @@ class singleWindowYjl {
       this.model.setGLTFModel(['ddFc-yjl'], this.group).then(() => {
         this.setModalPosition();
         this.initAnimation();
-        this.addLight();
         resolve(null);
       });
     });

+ 2 - 0
src/views/vent/monitorManager/windowMonitor/index.vue

@@ -21,6 +21,8 @@
         <div class="row" v-if="Number(selectData.nwindownum) > 1">
           <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(1)">设定前窗面积</div>
           <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(2)">设定后窗面积</div>
+          <div v-if="hasPermission('window:gateControl')" class="button-box" @click="playAnimation(1)">打开前门</div>
+          <div v-if="hasPermission('window:gateControl')" class="button-box" @click="playAnimation(2)">关闭前门</div>
           <div v-if="hasPermission('window:fltk')" class="button-box" @click="setArea(7)">前窗自主调控</div>
           <div v-if="hasPermission('window:fltk')" class="button-box" @click="setArea(8)">后窗自主调控</div>
           <!-- 展会功能 -->

+ 25 - 0
src/views/vent/monitorManager/windowMonitor/shuangdaoFc.threejs.ts

@@ -21,6 +21,30 @@ class doubleWindow {
     // this.group.name = this.modelName;
   }
 
+  addLight = () => {
+    if (!this.model) return;
+
+    const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
+    directionalLight.position.set(-110, 150, 647);
+    this.group?.add(directionalLight);
+    // directionalLight.target = group;
+
+    const pointLight2 = new THREE.PointLight(0xffffff, 1, 150);
+    pointLight2.position.set(-101, 34, 16);
+    pointLight2.shadow.bias = 0.05;
+    this.group.add(pointLight2);
+
+    const pointLight3 = new THREE.PointLight(0xffffff, 1, 150);
+    pointLight3.position.set(19, 25, -7);
+    pointLight3.shadow.bias = 0.05;
+    this.group.add(pointLight3);
+
+    const pointLight6 = new THREE.PointLight(0xffffff, 1, 300);
+    pointLight6.position.set(51, 51, 9);
+    pointLight6.shadow.bias = 0.05;
+    this.group.add(pointLight6);
+  };
+
   // 设置模型位置
   setModalPosition() {
     // this.group.getObjectByName(this.modelName)?.scale.set(9, 9, 9);
@@ -340,6 +364,7 @@ class doubleWindow {
         this.setModalPosition();
         this.initAnimation();
         resolve(null);
+        this.addLight();
         // this.initCamera(playerDom);
       });
     });

+ 156 - 116
src/views/vent/monitorManager/windowMonitor/shuangdaoFcYjl.threejs.ts

@@ -15,6 +15,13 @@ class doubleWindowYjl {
   };
   playerStartClickTime1 = new Date().getTime();
   playerStartClickTime2 = new Date().getTime();
+  mixers: THREE.AnimationMixer | undefined;
+  // fmClock = new THREE.Clock();
+
+  clipActionArr = {
+    frontDoor: null as unknown as THREE.AnimationAction,
+    backDoor: null as unknown as THREE.AnimationAction,
+  };
 
   constructor(model) {
     this.model = model;
@@ -157,28 +164,53 @@ class doubleWindowYjl {
         this.group.rotation.y += 0.00002 * 30 * this.direction;
       }
     }
+    // if (this.mixers && this.fmClock.running) {
+    //   this.mixers.update(2);
+    // }
   }
 
   /* 提取风门序列帧,初始化前后门动画 */
   initAnimation() {
-    const meshArr01: THREE.Object3D[] = [];
-    const meshArr02: THREE.Object3D[] = [];
-    const windowGroup = new THREE.Group();
-    windowGroup.name = 'hiddenGroup';
-    this.group.getObjectByName('sdFc')?.children.forEach((obj) => {
-      if (obj.type === 'Mesh' && obj.name && (obj.name.startsWith('shanye') || obj.name.startsWith('FCshanye'))) {
-        if (obj.name.startsWith('FCshanye')) {
-          obj.rotateOnAxis(new THREE.Vector3(0, 1, 0), 0);
-          meshArr01.push(obj);
-        } else if (obj.name.startsWith('shanye')) {
-          obj.rotateOnAxis(new THREE.Vector3(0, 1, 0), 0);
-          meshArr02.push(obj);
-        }
-      }
-    });
-    this.windowsActionArr.frontWindow = meshArr01;
-    this.windowsActionArr.backWindow = meshArr02;
-    this.group?.add(windowGroup);
+    const sdFcModal = this.group.getObjectByName('sdFc-yjl');
+    if (!sdFcModal) return;
+    // 初始化窗的动画
+    const fengchuang1 = sdFcModal?.getObjectByName('FengChuang');
+    const fengchuang2 = sdFcModal?.getObjectByName('FengChuang1');
+    const meshArr01: THREE.Mesh[] = [];
+    const meshArr02: THREE.Mesh[] = [];
+    if (fengchuang1 && fengchuang2) {
+      fengchuang1.getObjectByName('chuang')?.children.forEach((item: THREE.Object3D) => {
+        item.children.forEach((obj: THREE.Mesh) => {
+          if (obj.name && obj.name.startsWith('shanye')) {
+            obj.rotateOnAxis(new THREE.Vector3(0, 1, 0), 0);
+            meshArr01.push(obj);
+          }
+        });
+      });
+      fengchuang2.getObjectByName('chuang001')?.children.forEach((item: THREE.Object3D) => {
+        item.children.forEach((obj: THREE.Mesh) => {
+          if (obj.name && obj.name.startsWith('d__FCshanye')) {
+            obj.rotateOnAxis(new THREE.Vector3(0, 1, 0), 0);
+            meshArr02.push(obj);
+          }
+        });
+      });
+      this.windowsActionArr.frontWindow = meshArr01;
+      this.windowsActionArr.backWindow = meshArr02;
+    }
+
+    // // 初始化门的动画
+    // this.mixers = new THREE.AnimationMixer(sdFcModal);
+    // const frontDoor = sdFcModal?.animations[0];
+    // const frontClipAction = this.mixers.clipAction(frontDoor, sdFcModal);
+    // frontClipAction.clampWhenFinished = true;
+    // frontClipAction.loop = THREE.LoopOnce;
+    // this.clipActionArr.frontDoor = frontClipAction;
+    // const backDoor = sdFcModal?.animations[1];
+    // const backClipAction = this.mixers.clipAction(backDoor, sdFcModal);
+    // backClipAction.clampWhenFinished = true;
+    // backClipAction.loop = THREE.LoopOnce;
+    // this.clipActionArr.backDoor = backClipAction;
   }
 
   /* 点击风窗,风窗全屏 */
@@ -236,119 +268,127 @@ class doubleWindowYjl {
     }
   }
 
-  async initCamera(dom1?, dom2?) {
-    const videoPlayer1 = dom1;
-    const videoPlayer2 = dom2;
-    let monitorPlane: THREE.Mesh | null = null;
-    if (!videoPlayer1 || !videoPlayer2) {
-      const textArr = [
-        {
-          text: `无信号输入`,
-          font: 'normal 40px Arial',
-          color: '#009900',
-          strokeStyle: '#002200',
-          x: 170,
-          y: 40,
-        },
-      ];
-      const canvas = await getTextCanvas(320, 180, '', 'noSinge.png');
-      let textMaterial: THREE.MeshBasicMaterial | null = null;
-      if (canvas) {
-        const textMap = new THREE.CanvasTexture(canvas); // 关键一步
-        textMaterial = new THREE.MeshBasicMaterial({
-          map: textMap, // 设置纹理贴图
-          transparent: true,
-          side: THREE.DoubleSide, // 这里是双面渲染的意思
-        });
-        textMaterial.blending = THREE.CustomBlending;
+  // // 播放动画
+  // doorPlay(handlerState, timeScale = 0.01) {
+  //   if (this.clipActionArr.frontDoor && this.clipActionArr.backDoor) {
+  //     let handler = () => {};
+  //     switch (handlerState) {
+  //       case 1: // 打开前门
+  //         handler = () => {
+  //           this.clipActionArr.frontDoor.paused = true;
+  //           this.clipActionArr.frontDoor.reset();
+  //           this.clipActionArr.frontDoor.time = 1.2;
+  //           this.clipActionArr.frontDoor.timeScale = timeScale;
+  //           // this.clipActionArr.frontDoor.clampWhenFinished = true;
+  //           this.clipActionArr.frontDoor.play();
+  //           this.fmClock.start();
+  //         };
+  //         break;
+  //       case 2: // 关闭前门
+  //         handler = () => {
+  //           this.clipActionArr.frontDoor.paused = true;
+  //           this.clipActionArr.frontDoor.reset(); //
+  //           this.clipActionArr.frontDoor.time = 3;
+  //           this.clipActionArr.frontDoor.timeScale = -timeScale;
+  //           // this.clipActionArr.frontDoor.clampWhenFinished = true;
+  //           this.clipActionArr.frontDoor.play();
+  //           this.fmClock.start();
+  //         };
+  //         break;
+  //       case 3: // 打开后门
+  //         handler = () => {
+  //           this.clipActionArr.backDoor.paused = true;
+  //           this.clipActionArr.backDoor.reset();
+  //           this.clipActionArr.backDoor.time = 1.2;
+  //           this.clipActionArr.backDoor.timeScale = timeScale;
+  //           // this.clipActionArr.backDoor.clampWhenFinished = true;
+  //           this.clipActionArr.backDoor.play();
+  //           this.fmClock.start();
+  //         };
+  //         break;
+  //       case 4: // 关闭后门
+  //         handler = () => {
+  //           this.clipActionArr.backDoor.paused = true;
+  //           this.clipActionArr.backDoor.reset();
+  //           this.clipActionArr.backDoor.time = 3;
+  //           this.clipActionArr.backDoor.timeScale = -timeScale;
+  //           // this.clipActionArr.backDoor.clampWhenFinished = true;
+  //           this.clipActionArr.backDoor.play();
+  //           this.fmClock.start();
+  //         };
+  //         break;
+  //       // case 5: // 打开前后门
+  //       //   handler = () => {
+  //       //     this.clipActionArr.backDoor.paused = true;
+  //       //     this.clipActionArr.frontDoor.paused = true;
 
-        const planeGeometry = new THREE.PlaneGeometry(100, 100); // 平面3维几何体PlaneGeometry
-        monitorPlane = new THREE.Mesh(planeGeometry, textMaterial);
+  //       //     this.clipActionArr.frontDoor.reset();
+  //       //     this.clipActionArr.frontDoor.time = 0;
+  //       //     this.clipActionArr.frontDoor.timeScale = 0.01;
+  //       //     this.clipActionArr.frontDoor.clampWhenFinished = true;
+  //       //     this.clipActionArr.frontDoor.play();
 
-        textMaterial.dispose();
-        planeGeometry.dispose();
-        textMap.dispose();
-      }
-    }
-    const player1 = this.group.getObjectByName('player1');
-    if (player1) {
-      this.model.clearMesh(player1);
-      this.group.remove(player1);
-    }
-    const noPlayer1 = this.group.getObjectByName('noPlayer1');
-    if (noPlayer1) {
-      this.model.clearMesh(noPlayer1);
-      this.group.remove(noPlayer1);
-    }
-    if (!videoPlayer1 && videoPlayer1 === null) {
-      if (monitorPlane && !this.group.getObjectByName('noPlayer1')) {
-        const planeMesh = monitorPlane.clone();
-        planeMesh.name = 'noPlayer1';
-        planeMesh.scale.set(0.011, 0.0053, 0.012);
-        planeMesh.position.set(-4.3, 0.13, -0.23);
-        this.group?.add(planeMesh.clone());
-      }
-    } else if (videoPlayer1) {
-      try {
-        const mesh = renderVideo(this.group, videoPlayer1, 'player1');
-        if (mesh) {
-          mesh?.scale.set(-0.034, 0.024, 1);
-          mesh?.position.set(-3.332, 0.11, -0.23);
-          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.034, 0.024, 1);
-          mesh?.position.set(-3.332, 0.11, -0.23);
-          mesh.rotation.y = -Math.PI;
-          this.group.add(mesh);
-        }
-      } catch (error) {
-        console.log('视频信号异常');
-      }
-    }
-  }
+  //       //     this.clipActionArr.backDoor.reset();
+  //       //     this.clipActionArr.backDoor.time = 0;
+  //       //     this.clipActionArr.backDoor.timeScale = 0.01;
+  //       //     this.clipActionArr.backDoor.clampWhenFinished = true;
+  //       //     this.clipActionArr.backDoor.play();
+  //       //     this.frontClock.start();
+  //       //     this.backClock.start();
+  //       //   };
+  //       //   break;
+  //       // case 6: // 关闭前后门
+  //       //   handler = () => {
+  //       //     debugger;
+  //       //     this.clipActionArr.backDoor.paused = true;
+  //       //     this.clipActionArr.frontDoor.paused = true;
+
+  //       //     this.clipActionArr.frontDoor.reset();
+  //       //     this.clipActionArr.frontDoor.time = 4;
+  //       //     this.clipActionArr.frontDoor.timeScale = -0.01;
+  //       //     this.clipActionArr.frontDoor.clampWhenFinished = true;
+  //       //     this.clipActionArr.frontDoor.play();
+  //       //     this.clipActionArr.backDoor.reset();
+  //       //     this.clipActionArr.backDoor.time = 4;
+  //       //     this.clipActionArr.backDoor.timeScale = -0.01;
+  //       //     this.clipActionArr.backDoor.clampWhenFinished = true;
+  //       //     this.clipActionArr.backDoor.play();
+  //       //     this.frontClock.start();
+  //       //     this.backClock.start();
+  //       //   };
+  //       //   break;
+  //       default:
+  //     }
+
+  //     handler();
+  //     // model.clock.start();
+  //     // const honglvdeng = group.getObjectByName('honglvdeng');
+  //     // const material = honglvdeng.material;
+  //     // setTimeout(() => {
+  //     //   if (handlerState === 2 || handlerState === 4 || handlerState === 6) {
+  //     //     material.color = new THREE.Color(0x00ff00);
+  //     //   } else {
+  //     //     material.color = new THREE.Color(0xff0000);
+  //     //   }
+  //     // }, 1000);
+  //   }
+  // }
 
   mountedThree(playerDom) {
     return new Promise((resolve) => {
       this.model.setGLTFModel(['sdFc-yjl'], this.group).then(() => {
+        console.log(this.group);
         this.setModalPosition();
         this.initAnimation();
         resolve(null);
-        // this.initCamera(playerDom);
       });
     });
   }
 
   destroy() {
     this.model.clearGroup(this.group);
-    this.windowsActionArr.frontWindow = undefined;
-    this.windowsActionArr.backWindow = undefined;
+    this.windowsActionArr.frontWindow = [];
+    this.windowsActionArr.backWindow = [];
     this.model = null;
     this.group = null;
   }

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

@@ -161,14 +161,16 @@ export const setModelType = (type) => {
       model.scene?.remove(group);
       group = doubleWindowObj.group;
       const oldCameraPosition = { x: 100, y: 0, z: 10 };
-      let newP, newT;
-      if (sysOrgCode === 'sdmtjtyjlmk') {
-        newP = { x: 34.294433107431956, y: 19.284123769585108, z: 47.717286013509835 };
-        newT = { x: 12.311816240141978, y: -5.691930035759495, z: -5.57302688985693 };
-      } else {
-        newP = { x: 66.257, y: 57.539, z: 94.313 };
-        newT = { x: 0, y: 0, z: 0 };
-      }
+      // let newP, newT;
+      // if (sysOrgCode === 'sdmtjtyjlmk') {
+      //   newP = { x: 34.294433107431956, y: 19.284123769585108, z: 47.717286013509835 };
+      //   newT = { x: 12.311816240141978, y: -5.691930035759495, z: -5.57302688985693 };
+      // } else {
+      //   newP = { x: 66.257, y: 57.539, z: 94.313 };
+      //   newT = { x: 0, y: 0, z: 0 };
+      // }
+      const newP = { x: 66.257, y: 57.539, z: 94.313 };
+      const newT = { x: 0, y: 0, z: 0 };
       model.scene?.add(doubleWindowObj.group);
       setTimeout(async () => {
         resolve(null);
@@ -182,8 +184,8 @@ export const setModelType = (type) => {
       const oldCameraPosition = { x: 100, y: 0, z: 10 };
       let newP, newT;
       if (sysOrgCode === 'sdmtjtyjlmk') {
-        newP = { x: 66.257, y: 57.539, z: 94.313 };
-        newT = { x: 0, y: 0, z: 0 };
+        newP = { x: 34.294433107431956, y: 19.284123769585108, z: 47.717286013509835 };
+        newT = { x: 12.311816240141978, y: -5.691930035759495, z: -5.57302688985693 };
       } else {
         newP = { x: 66.257, y: 57.539, z: 94.313 };
         newT = { x: 0, y: 0, z: 0 };
@@ -223,27 +225,23 @@ export const mountedThree = (playerDom) => {
     model.setEnvMap('test1');
 
     model.camera.position.set(100, 0, 1000);
-
+    doubleWindowObj = new doubleWindow(model);
     singleWindowXkObj = new singleWindowXk(model);
     if (sysOrgCode === 'sdmtjtbetmk') {
       const singleWindowBet = await import('./dandaoFcBet.threejs');
       if (singleWindowBet) singleWindowObj = new singleWindowBet.default(model);
-      doubleWindowObj = new doubleWindow(model);
     } else if (sysOrgCode === 'sdmtjtyjlmk') {
-      // 单
+      // 单
       const singleWindowYjl = await import('./dandaoFcYjl.threejs');
       if (singleWindowYjl) singleWindowObj = new singleWindowYjl.default(model);
-      const doubleWindowYjl = await import('./shuangdaoFcYjl.threejs');
-      if (doubleWindowYjl) doubleWindowObj = new doubleWindowYjl.default(model);
     } else {
       singleWindowObj = new singleWindow(model);
-      doubleWindowObj = new doubleWindow(model);
     }
     doubleWindowObj.mountedThree(playerDom);
     singleWindowXkObj.mountedThree();
     singleWindowObj.mountedThree(playerDom);
     model.animate();
-    addLight();
+    // addLight();
     startAnimation();
     resolve(null);
   });

+ 1 - 0
src/views/vent/monitorManager/windrectMonitor/components/modalTable.vue

@@ -33,6 +33,7 @@
           pagination: false,
           showActionColumn: false,
           showTableSetting: false,
+          showIndexColumn: true,
           bordered: false,
           useSearchForm: false,
           autoCreateKey: true,

+ 133 - 130
src/views/vent/reportManager/comment/NormalHisTable.vue

@@ -1,190 +1,193 @@
 <template>
-    <div>
-        <BasicTable @register="registerTable" :rowSelection="rowSelection">
-            <template #action="{ record }">
-                <a class="table-action-link" @click="handleEdit(record)">预览</a>
-                <a class="table-action-link" @click="handleDownLoad(record)">下载</a>
-                <slot name="action" v-bind="{ record }"></slot>
-            </template>
-            <template #bodyCell="{ column, record }">
-                <slot name="filterCell" v-bind="{ column, record }"></slot>
-            </template>
-        </BasicTable>
-        <DeviceModal :editID="editID" :reportLogHis="reportLogHis" :fileType="fileType" @register="registerModal" :addOredit="addOredit" />
-    </div>
+  <div>
+    <BasicTable @register="registerTable" :rowSelection="rowSelection">
+      <template #action="{ record }">
+        <a class="table-action-link" @click="handleEdit(record)">预览</a>
+        <a class="table-action-link" @click="handleDownLoad(record)">下载</a>
+        <slot name="action" v-bind="{ record }"></slot>
+      </template>
+      <template #bodyCell="{ column, record }">
+        <slot name="filterCell" v-bind="{ column, record }"></slot>
+      </template>
+    </BasicTable>
+    <DeviceModal :editID="editID" :reportLogHis="reportLogHis" :fileType="fileType" @register="registerModal" :addOredit="addOredit" />
+  </div>
 </template>
-  
+
 <script lang="ts" setup>
-//ts语法
-import { ref, reactive, toRaw, defineExpose, watch } from 'vue';
-import { BasicTable, } from '/@/components/Table';
-import { useModal } from '/@/components/Modal';
-import DeviceModal from './DeviceModal.vue';
-import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-import { useListPage } from '/@/hooks/system/useListPage';
-
-const props = defineProps({
+  //ts语法
+  import { ref, reactive, toRaw, defineExpose, watch } from 'vue';
+  import { BasicTable } from '/@/components/Table';
+  import { useModal } from '/@/components/Modal';
+  import DeviceModal from './DeviceModal.vue';
+  import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
+  import { useListPage } from '/@/hooks/system/useListPage';
+
+  const props = defineProps({
     columns: {
-        type: Array,
-        // required: true,
-        default: () => [],
+      type: Array,
+      // required: true,
+      default: () => [],
     },
     list: {
-        type: Function,
-        required: true,
+      type: Function,
+      required: true,
     },
     //历史记录下载文件接口
     downLoad: {
-        type: Function,
-        required: true,
+      type: Function,
+      required: true,
     },
     designScope: {
-        type: String,
+      type: String,
     },
     title: {
-        type: String,
+      type: String,
     },
-    reportIds:{
-        type:String,
-        default:''
-    }
-});
+    reportIds: {
+      type: String,
+      default: '',
+    },
+  });
 
-//区分打开编辑或新增弹窗
-let addOredit = ref('')
-//文件ID
-let editID = ref(0);
-let fileType = ref(''); //文件类型
+  //区分打开编辑或新增弹窗
+  let addOredit = ref('');
+  //文件ID
+  let editID = ref(0);
+  let fileType = ref(''); //文件类型
 
-let  reportLogHis=ref('')//是否为报表记录编辑
+  let reportLogHis = ref(''); //是否为报表记录编辑
 
-const record = reactive({});
+  const record = reactive({});
 
-const [registerModal, { openModal, closeModal }] = useModal();
+  const [registerModal, { openModal, closeModal }] = useModal();
 
-const columnList = getTableHeaderColumns('');
+  const columnList = getTableHeaderColumns('');
 
-// 列表页面公共参数、方法
-const { prefixCls, tableContext, onExportXls, onImportXls, doRequest } = useListPage({
+  // 列表页面公共参数、方法
+  const { prefixCls, tableContext, onExportXls, onImportXls, doRequest } = useListPage({
     designScope: props.designScope,
     tableProps: {
-        title: props.title,
-        api: props.list,
-        columns: props.columns.length > 0 ? (props.columns as any[]) : columnList,
-        showTableSetting: false,
-        // size: 'small',
-        // bordered: false,
-        formConfig: {
-            showAdvancedButton: true,
-            // labelWidth: 100,
-            labelAlign: 'left',
-            labelCol: {
-                xs: 24,
-                sm: 24,
-                md: 24,
-                lg: 9,
-                xl: 7,
-                xxl: 5,
-            },
-            schemas: [],
-        },
-        useSearchForm: false,
-        striped: true,
-        actionColumn: {
-            width: 180,
-        },
-        beforeFetch: (params) => {
-            return Object.assign(params, { column: 'createTime',reportId:props.reportIds });
+      title: props.title,
+      api: props.list,
+      columns: props.columns.length > 0 ? (props.columns as any[]) : columnList,
+      showTableSetting: false,
+      showIndexColumn: true,
+      // size: 'small',
+      // bordered: false,
+      formConfig: {
+        showAdvancedButton: true,
+        // labelWidth: 100,
+        labelAlign: 'left',
+        labelCol: {
+          xs: 24,
+          sm: 24,
+          md: 24,
+          lg: 9,
+          xl: 7,
+          xxl: 5,
         },
+        schemas: [],
+      },
+      useSearchForm: false,
+      striped: true,
+      actionColumn: {
+        width: 180,
+      },
+      beforeFetch: (params) => {
+        return Object.assign(params, { column: 'createTime', reportId: props.reportIds });
+      },
     },
-});
+  });
 
-//注册table数据
-const [registerTable, { reload, getForm }, { rowSelection, selectedRowKeys }] = tableContext;
+  //注册table数据
+  const [registerTable, { reload, getForm }, { rowSelection, selectedRowKeys }] = tableContext;
 
-/**
- * 编辑事件
- */
-function handleEdit(data) {
-    addOredit.value = 'edit'
-    reportLogHis.value='reportLog'
+  /**
+   * 编辑事件
+   */
+  function handleEdit(data) {
+    addOredit.value = 'edit';
+    reportLogHis.value = 'reportLog';
     Object.assign(record, toRaw(data));
     let index = record.fileName.indexOf('.');
     fileType.value = record.fileName.substring(index + 1);
     editID.value = record.id;
-    console.log(editID.value,'报表历史记录ID')
+    console.log(editID.value, '报表历史记录ID');
     openModal(true, {
-        record,
+      record,
     });
-}
+  }
 
-//下载文件
-function handleDownLoad(record) {
+  //下载文件
+  function handleDownLoad(record) {
     console.log(record, '下载');
     props.downLoad({ id: record.id }).then((res) => {
-        console.log(res, '报表历史记录下载');
-        let filename = `${record.fileName}`;
-        downFilePublic(res, filename);
+      console.log(res, '报表历史记录下载');
+      let filename = `${record.fileName}`;
+      downFilePublic(res, filename);
     });
-}
-// 下载公用方法
-function downFilePublic(content, fileName) {
+  }
+  // 下载公用方法
+  function downFilePublic(content, fileName) {
     const blob = new Blob([content], { type: 'application/xlsx;charset=UTF-8' }); // 构造一个blob对象来处理数据
     // 对于<a>标签,只有 Firefox 和 Chrome(内核) 支持 download 属性
     // IE10以上支持blob但是依然不支持download
     if ('download' in document.createElement('a')) {
-        // 支持a标签download的浏览器
-        const link = document.createElement('a'); // 创建a标签
-        link.download = fileName; // a标签添加属性
-        link.style.display = 'none';
-        link.href = URL.createObjectURL(blob);
-        document.body.appendChild(link);
-        link.click(); // 执行下载
-        URL.revokeObjectURL(link.href); // 释放url
-        document.body.removeChild(link); // 释放标签
+      // 支持a标签download的浏览器
+      const link = document.createElement('a'); // 创建a标签
+      link.download = fileName; // a标签添加属性
+      link.style.display = 'none';
+      link.href = URL.createObjectURL(blob);
+      document.body.appendChild(link);
+      link.click(); // 执行下载
+      URL.revokeObjectURL(link.href); // 释放url
+      document.body.removeChild(link); // 释放标签
     } else {
-        // 其他浏览器
-        navigator.msSaveBlob(blob, fileName);
+      // 其他浏览器
+      navigator.msSaveBlob(blob, fileName);
     }
-}
-
-defineExpose({
-    doRequest, onExportXls, onImportXls, reload, getForm
-});
-
+  }
+
+  defineExpose({
+    doRequest,
+    onExportXls,
+    onImportXls,
+    reload,
+    getForm,
+  });
 </script>
-  
+
 <style scoped lang="less">
-@ventSpace: zxm;
-@vent-table-no-hover: #00bfff10;
+  @ventSpace: zxm;
+  @vent-table-no-hover: #00bfff10;
 
-:deep(.@{ventSpace}-table-cell-row-hover) {
+  :deep(.@{ventSpace}-table-cell-row-hover) {
     background: #264d8833 !important;
-}
+  }
 
-:deep(.@{ventSpace}-table-row-selected) {
+  :deep(.@{ventSpace}-table-row-selected) {
     background: #268bc522 !important;
-}
+  }
 
-:deep(.@{ventSpace}-table-tbody > tr > td) {
+  :deep(.@{ventSpace}-table-tbody > tr > td) {
     background-color: #0dc3ff05;
-}
+  }
 
-:deep(.jeecg-basic-table-row__striped) {
+  :deep(.jeecg-basic-table-row__striped) {
     td {
-        background-color: @vent-table-no-hover !important;
+      background-color: @vent-table-no-hover !important;
     }
-}
-
-:deep(.@{ventSpace}-select-dropdown) {
+  }
 
+  :deep(.@{ventSpace}-select-dropdown) {
     .@{ventSpace}-select-item-option-selected,
     .@{ventSpace}-select-item-option-active {
-        background-color: #ffffff33 !important;
+      background-color: #ffffff33 !important;
     }
 
     .@{ventSpace}-select-item:hover {
-        background-color: #ffffff33 !important;
+      background-color: #ffffff33 !important;
     }
-}</style>
-  
+  }
+</style>

+ 1 - 0
src/views/vent/reportManager/comment/NormalTable.vue

@@ -113,6 +113,7 @@
       api: props.list,
       columns: props.columns.length > 0 ? (props.columns as any[]) : columnList,
       showTableSetting: false,
+      showIndexColumn: true,
       // size: 'small',
       // bordered: false,
       scroll: { y: 650 },

+ 1 - 1
src/views/vent/sys/resources/index.vue

@@ -42,7 +42,7 @@
       columns,
       // dataSource: dataSource,
       api: getList,
-      showIndexColumn: false,
+      showIndexColumn: true,
       bordered: true,
       showActionColumn: true,
       formConfig: {