Browse Source

1. 安全监控添加同步分站功能
2. 设备历史记录添加导出功能
3. 分站添加是设备类型过滤功能
4. 风窗添加角度设备
5. 主扇、局扇详情页面在历史中添加主机、备机过滤查询功能

hongrunxia 7 months ago
parent
commit
ed798e45c3

+ 5 - 0
src/views/vent/comment/history/HistoryTable.vue

@@ -241,6 +241,11 @@
   :deep(.zxm-picker) {
     height: 30px !important;
   }
+  :deep(.zxm-table) {
+    .zxm-table-title {
+      display: none !important;
+    }
+  }
   .history-table {
     width: 100%;
     :deep(.jeecg-basic-table-form-container) {

+ 1 - 1
src/views/vent/comment/history/history.data.ts

@@ -95,7 +95,7 @@ export const getDefaultSchemas: (dictCode: any[], deviceOptions: any[]) => FormS
     label: '间隔时间',
     field: 'skip',
     component: 'Select',
-    defaultValue: '8',
+    defaultValue: '1h',
     componentProps: {
       options: [
         {

+ 26 - 6
src/views/vent/deviceManager/substationTabel/index.vue

@@ -1,16 +1,36 @@
 <template>
   <div class="device-manager-box">
-    <NormalTable ref="normalTabel" :columns="columns" :searchFormSchema="searchFormSchema" :list="list"
-      :formSchema="formSchema" :deleteById="deleteById" :batchDelete="batchDeleteById" :saveOrUpdate="saveOrUpdate"
-      designScope="substation-tabel" title="分站列表" :showTab="false">
+    <NormalTable
+      ref="normalTabel"
+      :columns="columns"
+      :searchFormSchema="searchFormSchema"
+      :list="list"
+      :formSchema="formSchema"
+      :deleteById="deleteById"
+      :batchDelete="batchDeleteById"
+      :saveOrUpdate="saveOrUpdate"
+      designScope="substation-tabel"
+      title="分站列表"
+      :showTab="false"
+    >
       <template #filterCell="{ column, record }">
         <a-tag v-if="column.dataIndex === 'linkstatus'" :color="record.linkstatus == 0 ? '#999' : '#87d068'">{{
           record.linkstatus == 1 ? '链接' : '断开'
-          }}</a-tag>
+        }}</a-tag>
       </template>
       <template #action="{ record }">
-        <a v-if="record['strtype'] == 'http' || record['strtype'] == 'kafka' || record['strtype'] == 'ftp' || record['strtype'] == 'database' || record['strtype'] == 'txt'"
-          class="table-action-link" @click="addDevices(record)">同步设备</a>
+        <a
+          v-if="
+            record['strtype'] == 'http' ||
+            record['strtype'] == 'kafka' ||
+            record['strtype'] == 'ftp' ||
+            record['strtype'] == 'database' ||
+            record['strtype'] == 'txt'
+          "
+          class="table-action-link"
+          @click="addDevices(record)"
+          >同步设备</a
+        >
       </template>
     </NormalTable>
   </div>

+ 6 - 3
src/views/vent/deviceManager/substationTabel/substation.data.ts

@@ -56,9 +56,12 @@ export const recycleColumns: BasicColumn[] = [
 
 export const searchFormSchema: FormSchema[] = [
   {
-    label: '名称',
-    field: 'strname',
-    component: 'Input',
+    label: '监测类型',
+    field: 'monitorparam',
+    component: 'MTreeSelect',
+    componentProps: {
+      virtual: false,
+    },
     colProps: { span: 6 },
   },
   {

+ 1 - 1
src/views/vent/monitorManager/comment/GroupMonitorTable.vue

@@ -130,7 +130,7 @@
       },
     };
     const runDevice = {
-      title: '运行风机',
+      title: '风机',
       dataIndex: 'runDevice',
       width: 80,
       align: 'center',

+ 8 - 5
src/views/vent/monitorManager/comment/HistoryTable.vue

@@ -13,6 +13,7 @@
 
       <template #form-submitBefore>
         <a-button type="primary" preIcon="ant-design:search-outlined" @click="getDataSource">查询</a-button>
+        <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXlsFn"> 导出</a-button>
       </template>
     </BasicTable>
   </div>
@@ -88,7 +89,7 @@
 
   const getExportXlsUrl = () => {
     if (stationType.value !== 'redis') {
-      return '/safety/ventanalyMonitorData/exportXls';
+      return '/ventanaly-device/safety/ventanalyMonitorData/export/historydata';
     } else {
       return '/ventanaly-device/history/getHistoryData/exportXls';
     }
@@ -437,7 +438,7 @@
       // },
     },
     exportConfig: {
-      name: '历史列表',
+      name: '设备历史列表',
       url: getExportXlsUrl(),
     },
   });
@@ -445,6 +446,11 @@
   //注册table数据
   const [registerTable, { reload, setLoading, getForm, setColumns, getPaginationRef, setPagination }] = tableContext;
 
+  function onExportXlsFn() {
+    // 判断时间间隔和查询时间区间,数据量下载大时进行提示
+    onExportXls();
+  }
+
   watchEffect(() => {
     if (historyTable.value && dataSource) {
       const data = dataSource.value || [];
@@ -524,7 +530,4 @@
       }
     }
   }
-  // :deep(.zxm-select-selector){
-  //   height: 42px !important;
-  // }
 </style>

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

@@ -211,8 +211,8 @@ export const zhudanOption = reactive({
 });
 
 export function getMonitorComponent() {
-  // const { sysOrgCode } = useGlobSetting();
-  const sysOrgCode = 'sdmtjtbdmk';
+  const { sysOrgCode } = useGlobSetting();
+  // const sysOrgCode = 'sdmtjtbdmk';
   let nitrogenHome;
   switch (sysOrgCode) {
     case 'sdmtjtdltmk': //dltj

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

@@ -379,6 +379,7 @@ export const ballvalveColumns: BasicColumn[] = [
 ];
 
 export const noDetailArr = ['nitrogen', 'forcFan']; // 前端详情的,
+// 棋盘井球阀监测数据只有温度
 export const haveDetailArr = [
   'windrect',
   'window',
@@ -389,7 +390,7 @@ export const haveDetailArr = [
   'bundletube',
   'gaspatrol',
   'dusting',
-  'ballvalve',
+  // 'ballvalve',
   'pump',
   'safetymonitor',
   'nitrogen',

+ 27 - 20
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -4,7 +4,7 @@
     <div id="fanLocal3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"> </div>
     <div id="fanLocal3DCSS" class="threejs-Object-CSS" style="width: 100%; height: 100%; position: absolute; overflow: hidden; pointer-events: none">
       <div style="z-index: -1; position: relative" v-if="hasPermission('show:sensorMonitor')">
-        <div class="elementTag" id="inputBox">
+        <div class="elementTag" id="inputBox1">
           <div class="elementContent" v-if="selectData.windSpeed1 || selectData.gas3 || selectData.windSpeed_merge">
             <p v-if="selectData.windSpeed1 || selectData.windSpeed_merge"
               >风筒入口风速:<span class="value">{{
@@ -12,6 +12,12 @@
               }}</span>
               <span class="unit"> m/s</span></p
             >
+            <p v-if="selectData.windInputSpeed1 || selectData.windInputSpeed_merge"
+              >风筒入口风速:<span class="value">{{
+                selectData.windInputSpeed1 ? selectData.windInputSpeed1 : selectData.windInputSpeed_merge ? selectData.windInputSpeed_merge : '-'
+              }}</span>
+              <span class="unit"> m/s</span></p
+            >
             <p v-if="selectData.windQuantity1 || selectData.inletAirVolume_merge"
               >风筒入口风量:<span class="value">{{
                 selectData.windQuantity1 ? selectData.windQuantity1 : selectData.inletAirVolume_merge ? selectData.inletAirVolume_merge : '-'
@@ -88,7 +94,7 @@
             >
           </div>
         </div>
-        <div class="elementTag" id="inputBox1">
+        <!-- <div class="elementTag" id="inputBox1">
           <div class="elementContent" v-if="selectData.windInputSpeed1 || selectData.windInputSpeed_merge">
             <p v-if="selectData.windInputSpeed1 || selectData.windInputSpeed_merge"
               >风筒入口风速:<span class="value">{{
@@ -97,7 +103,7 @@
               <span class="unit"> m/s</span></p
             >
           </div>
-        </div>
+        </div> -->
       </div>
     </div>
   </div>
@@ -330,18 +336,17 @@
           </a-tab-pane>
           <a-tab-pane key="3" tab="历史数据">
             <div class="tab-item" v-if="activeKey === '3'">
-              <HistoryTable :columns-type="`${selectData.deviceType}`" :device-type="`${devicekide}`" designScope="fanlocal-history" :scroll="scroll">
-                <template #filterCell="{ column, record }">
-                  <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == '0' ? 'green' : 'red'">{{
-                    record.warnFlag == '0' ? '正常' : '报警'
-                  }}</a-tag>
-                  <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == '0' ? 'default' : 'green'">{{
-                    record.netStatus == '0' ? '断开' : '连接'
-                  }}</a-tag>
-                  <div v-if="record.nwindownum == 1 && column.dataIndex === 'rearArea'">/</div>
-                </template>
-              </HistoryTable>
-              <!-- <HistoryTable class="w-100% h-100% mt-100px" :device-code="`${devicekide}`" :scroll="scroll" dict-code="fanlocal_dict" /> -->
+              <template v-if="globalConfig.History_Type == 'remote'">
+                <HistoryTable
+                  :columns-type="`${selectData.deviceType}`"
+                  :device-type="`${devicekide}`"
+                  designScope="fanlocal-history"
+                  :scroll="scroll"
+                />
+              </template>
+              <template v-else>
+                <HistoryTable class="w-100% h-100%" :device-code="`${devicekide}`" :scroll="scroll" dict-code="fanlocal_dict" />
+              </template>
             </div>
           </a-tab-pane>
           <a-tab-pane key="4" tab="报警历史">
@@ -502,11 +507,9 @@
 
 <script setup lang="ts">
   import { ExclamationCircleFilled, ArrowRightOutlined } from '@ant-design/icons-vue';
-  import { onBeforeMount, ref, watch, onMounted, nextTick, toRaw, reactive, onUnmounted, inject, unref } from 'vue';
+  import { onBeforeMount, ref, watch, onMounted, nextTick, defineAsyncComponent, reactive, onUnmounted, inject, unref } from 'vue';
   import BarSingle from '../../../../components/chart/BarSingle.vue';
   import GroupMonitorTable from '../comment/GroupMonitorTable.vue';
-  import HistoryTable from '../comment/HistoryTable.vue';
-  // import HistoryTable from '/@/views/vent/comment/history/HistoryTable.vue';
   import AlarmHistoryTable from '../comment/AlarmHistoryTable.vue';
   import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue';
   import DeviceBaseInfo from '../comment/components/DeviceBaseInfo.vue';
@@ -534,9 +537,13 @@
   import { usePermission } from '/@/hooks/web/usePermission';
   import { useGlobSetting } from '/@/hooks/setting';
   import { useMessage } from '/@/hooks/web/useMessage';
-
-  const { hasPermission } = usePermission();
   const globalConfig = inject('globalConfig');
+  const HistoryTable =
+    globalConfig.History_Type == 'remote'
+      ? defineAsyncComponent(() => import('../comment/HistoryTable.vue'))
+      : defineAsyncComponent(() => import('../../../vent/comment/history/HistoryTable.vue'));
+  const { hasPermission } = usePermission();
+
   const [registerModal, { openModal, closeModal }] = useModal();
   const [registerModal1, { openModal: openModal1, closeModal: closeModal1 }] = useModal();
   const [registerModalAssistance, { openModal: openAssistance, closeModal: closeAssistance }] = useModal();

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

@@ -104,6 +104,7 @@ export const play = (handlerState, flag?) => {
 
 // 切换风门类型
 export const setModelType = (type) => {
+  debugger;
   fmType = type;
   return new Promise((resolve) => {
     // 暂停风门1动画
@@ -288,7 +289,7 @@ export const initCameraCanvas = async (playerVal1) => {
 
 export const mountedThree = (playerDom) => {
   const { sysOrgCode } = useGlobSetting();
-  // const sysOrgCode = 'yjmdsankuang';
+  // const sysOrgCode = 'zmjthjg';
   return new Promise(async (resolve) => {
     model = new UseThree('#damper3D', '', '#deviceDetail');
     model.setEnvMap('test1');
@@ -305,9 +306,11 @@ export const mountedThree = (playerDom) => {
         const FmTwoYj = await import('./gate.threejs.two.yj');
         if (FmTwoYj) fmTwoSs = new FmTwoYj.default(model);
         fmTwoSs.mountedThree(playerDom);
-
-        // if (FmTwoYj) fm2 = new FmTwoYj.default(model);
-        // fm2.mountedThree(playerDom);
+        break;
+      case 'zmjthjg':
+        const FmNoSubStation = await import('./gate.threejs.noStation');
+        if (FmNoSubStation) fm3 = new FmNoSubStation.default(model);
+        if (fm3) fm3.mountedThree(playerDom);
         break;
       default:
         fm3 = new Fm3(model);
@@ -323,7 +326,6 @@ export const mountedThree = (playerDom) => {
     fmXr.mountedThree(playerDom);
     fm1 = new Fm1(model);
     fm1.mountedThree(playerDom);
-
     resolve(null);
 
     model.animate();

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

@@ -339,7 +339,7 @@
     activeKey.value = activeKeyVal;
     if (activeKeyVal == 1) {
       nextTick(() => {
-        MonitorDataTable.value.setSelectedRowKeys([selectData.deviceID]);
+        if (MonitorDataTable.value) MonitorDataTable.value.setSelectedRowKeys([selectData.deviceID]);
       });
     }
   };
@@ -401,7 +401,7 @@
               const readData = data.readData;
               data = Object.assign(data, readData);
             });
-            if (dataSource.value.length > 0 && selectRowIndex.value == -1) {
+            if (dataSource.value.length > 0 && selectRowIndex.value == -1 && MonitorDataTable.value) {
               // 初始打开页面
               if (currentRoute.value && currentRoute.value['query'] && currentRoute.value['query']['id']) {
                 MonitorDataTable.value.setSelectedRowKeys([currentRoute.value['query']['id']]);

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

@@ -289,17 +289,12 @@
           </a-tab-pane> -->
           <a-tab-pane key="3" tab="历史数据">
             <div class="tab-item" v-if="activeKey === '3'">
-              <HistoryTable device-type="fanmain" designScope="fanmain-history" :scroll="scroll">
-                <template #filterCell="{ column, record }">
-                  <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == '0' ? 'green' : 'red'">{{
-                    record.warnFlag == '0' ? '正常' : '报警'
-                  }}</a-tag>
-                  <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == '0' ? 'default' : 'green'">{{
-                    record.netStatus == '0' ? '断开' : '连接'
-                  }}</a-tag>
-                  <div v-if="record.nwindownum == 1 && column.dataIndex === 'rearArea'">/</div>
-                </template>
-              </HistoryTable>
+              <template v-if="globalConfig?.History_Type == 'remote'">
+                <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" />
+              </template>
             </div>
           </a-tab-pane>
           <a-tab-pane key="4" tab="报警历史">
@@ -440,9 +435,10 @@
 <script setup lang="ts">
   import { ExclamationCircleFilled } from '@ant-design/icons-vue';
   import FanEchrats from '/@/views/vent/monitorManager/mainFanMonitor/fanEchrats.vue';
-  import { onBeforeMount, computed, ref, onMounted, inject, onUnmounted, reactive, toRaw, watch, nextTick } from 'vue';
+  import { onBeforeMount, computed, ref, onMounted, inject, onUnmounted, reactive, toRaw, watch, nextTick, defineAsyncComponent } from 'vue';
   import GroupMonitorTable from '../comment/GroupMonitorTable.vue';
-  import HistoryTable from '../comment/HistoryTable.vue';
+  // // import HistoryTable from '../comment/HistoryTable.vue';
+  // import HistoryTable from '../../../vent/comment/history/HistoryTable.vue';
   import AlarmHistoryTable from '../comment/AlarmHistoryTable.vue';
   import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue';
   import { modalTypeArr, fbmControlData } from './main.data';
@@ -465,9 +461,13 @@
   import DeviceBaseInfo from '../comment/components/DeviceBaseInfo.vue';
   import { useGlobSetting } from '/@/hooks/setting';
   import { usePermission } from '/@/hooks/web/usePermission';
-  const { hasPermission } = usePermission();
-
   const globalConfig = inject('globalConfig');
+  const HistoryTable =
+    globalConfig.History_Type == 'remote'
+      ? defineAsyncComponent(() => import('../comment/HistoryTable.vue'))
+      : defineAsyncComponent(() => import('../../../vent/comment/history/HistoryTable.vue'));
+
+  const { hasPermission } = usePermission();
 
   const [registerModal, { openModal, closeModal }] = useModal();
   const [registerModalDeviceEdit, { openModal: openModalDeviceEdit }] = useModal();

+ 4 - 3
src/views/vent/monitorManager/nitrogen/nitrogen.data.1.ts

@@ -16,9 +16,11 @@ export function getNitrogenHome() {
     case 'hnqymdktymk': //核桃峪
       nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome1.vue'));
       return nitrogenHome;
+    case 'sdmtjtjjmk':
+      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome.vue'));
+      return nitrogenHome;
     default:
-      // nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome.vue'));
-      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome1.vue'));
+      nitrogenHome = defineAsyncComponent(() => import('./components/nitrogenHome.vue')); //测试完,请置于该组件
       return nitrogenHome;
   }
 }
@@ -63,7 +65,6 @@ export const bottomBtnList = ref([
 
 export async function getMonitorData() {
   const { sysOrgCode } = useGlobSetting();
-  // const sysOrgCode = 'sdmtjtdltmk';
   switch (sysOrgCode) {
     case 'yjmdsankuang': // 窑街三矿
       return await import('./nitrogen.dataYJ');

+ 47 - 55
src/views/vent/monitorManager/safetyMonitor/index.vue

@@ -50,54 +50,6 @@
               :scroll="{ y: 650 }"
             >
               <template #filterCell="{ column, record }">
-                <template v-if="deviceType.startsWith('gate')">
-                  <template v-if="record.frontGateOpenCtrl == 1 || record.frontGateOpenCtrl === true">
-                    <a-tag v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0" color="red"
-                      >正在打开</a-tag
-                    >
-                    <a-tag v-else-if="column.dataIndex === 'frontGateOpen'" color="processing">打开</a-tag>
-                  </template>
-                  <template v-else-if="record.frontGateOpenCtrl == 0 || record.frontGateOpenCtrl === false">
-                    <a-tag v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0" color="red"
-                      >正在关闭</a-tag
-                    >
-                    <a-tag v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 1" color="default"
-                      >关闭</a-tag
-                    >
-                    <a-tag v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 1 && record.frontGateClose == 0" color="default"
-                      >打开</a-tag
-                    >
-                  </template>
-                  <template v-if="record.rearGateOpenCtrl == 1 || record.rearGateOpenCtrl === true">
-                    <a-tag v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0" color="red"
-                      >正在打开</a-tag
-                    >
-                    <a-tag v-else-if="column.dataIndex === 'rearGateOpen'" color="processing">打开</a-tag>
-                  </template>
-                  <template v-else-if="record.rearGateOpenCtrl == 0 || record.rearGateOpenCtrl === false">
-                    <a-tag v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0" color="red"
-                      >正在关闭</a-tag
-                    >
-                    <a-tag v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 1" color="default"
-                      >关闭</a-tag
-                    >
-                    <a-tag v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 1 && record.rearGateClose == 0" color="default"
-                      >打开</a-tag
-                    >
-                  </template>
-                </template>
-                <template v-if="deviceType.startsWith('windrect')">
-                  <a-tag v-if="column.dataIndex === 'sign'" :color="record.sign == '0' ? '#95CF65' : record.sign == 1 ? '#4590EA' : '#9876AA'">
-                    {{ record.sign == '0' ? '高位' : record.sign == 1 ? '中位' : '低位' }}</a-tag
-                  >
-                  <template v-if="record && column && column.dataIndex === 'isRun' && record.isRun">
-                    <a-tag v-if="record.isRun == -2 || record.isRun == -1" :color="record.isRun == -2 ? '#95CF65' : '#ED5700'">{{
-                      record.isRun == -2 ? '空闲' : '等待'
-                    }}</a-tag>
-                    <a-tag v-else-if="record.isRun == 100" color="#4693FF">完成</a-tag>
-                    <Progress v-else :percent="Number(record.isRun)" size="small" status="active" />
-                  </template>
-                </template>
                 <template v-if="deviceType.startsWith('safetymonitor')">
                   <div v-if="!record.devicename && column.dataIndex === 'devicename'">-</div>
                   <div v-if="!record.V && column.dataIndex === 'V'">-</div>
@@ -210,27 +162,40 @@
         </div>
       </a-tab-pane>
     </a-tabs>
-    <div class="export-btn"><div class="btn btn1" @click="exportData">一键导出</div></div>
+    <div class="right-btn-group">
+      <div class="update-btn">
+        <span>同步分站:</span>
+        <a-select
+          v-model:value="subStation"
+          :options="subStationOptions"
+          placeholder="同步分站"
+          size="large"
+          :fieldNames="{ label: 'strinstallpos', value: 'id' }"
+          style="width: 150px"
+        />
+        <div class="btn btn1" @click="updateSubstation">确定</div>
+      </div>
+      <div class="export-btn"><div class="btn btn1" @click="exportData">一键导出</div></div>
+    </div>
   </div>
 </template>
 
 <script setup lang="ts">
   import { ref, onMounted, onUnmounted, shallowRef, defineProps, watch, inject, unref } from 'vue';
-  import BarAndLine from '/@/components/chart/BarAndLine.vue';
-  import { list, getDeviceList, safetyList, getExportUrl } from './safety.api';
+  import { list, getDeviceList, safetyList, getExportUrl, subStationList, initSubStation } from './safety.api';
   import AlarmHistoryCommentTable from '../comment/AlarmHistoryTable.vue';
   import AlarmHistoryTable from './AlarmHistoryTable.vue';
   import HistoryTable from './HistoryTable.vue';
   import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue';
   import MonitorTable from '../comment/MonitorTable.vue';
   import GroupMonitorTable from '../comment/GroupMonitorTable.vue';
-  import { Progress } from 'ant-design-vue';
   import { useRouter } from 'vue-router';
   import { formConfig, isHaveNoAction } from './safety.data';
   import { getDictItemsByCode } from '/@/utils/dict';
   import { usePermission } from '/@/hooks/web/usePermission';
   import { useGlobSetting } from '/@/hooks/setting';
   import { useMethods } from '/@/hooks/system/useMethods';
+  import { message } from 'ant-design-vue';
 
   const { sysOrgCode } = useGlobSetting();
   const { hasPermission } = usePermission();
@@ -276,7 +241,8 @@
   const activeKey = ref('1'); // tab key
   const dataSource = shallowRef([]); // 实时监测数据
   const deviceType = ref(''); // 监测设备类型
-
+  const subStation = ref('');
+  const subStationOptions = ref([]);
   // let dataSourceHis = shallowRef([])//历史数据
 
   //历史数据
@@ -367,11 +333,25 @@
       dataSource.value = [];
     }
   }
-
+  async function getSubstation() {
+    const list: [] = await subStationList({ strtype: 'kafka', monitorparam: 'safetymonitor*' });
+    subStationOptions.value = list;
+    if (list.length > 0) {
+      subStation.value = list[0]['id'];
+    }
+  }
   function exportData() {
     handleExportXls('安全监控导出', getExportUrl);
   }
 
+  function updateSubstation() {
+    if (subStation.value) {
+      initSubStation({ substationID: subStation.value });
+    } else {
+      message.warning('请选择分站!');
+    }
+  }
+
   onMounted(async () => {
     const { currentRoute } = useRouter();
     if (unref(currentRoute)) {
@@ -380,6 +360,7 @@
         deviceType.value = path.substring(path.lastIndexOf('/') + 1);
       }
       await getMonitor(true);
+      await getSubstation();
     }
   });
 
@@ -542,10 +523,21 @@
       }
     }
   }
-  .export-btn {
+  .right-btn-group {
     position: absolute;
     color: #fff;
     right: 20px;
+    display: flex;
+    .export-btn {
+    }
+    .update-btn {
+      margin-right: 10px;
+      display: flex;
+      align-items: center;
+      .btn {
+        background: linear-gradient(#2cd1ff55, #1eb0ff55);
+      }
+    }
     .btn {
       padding: 8px 20px;
       position: relative;

+ 7 - 0
src/views/vent/monitorManager/safetyMonitor/safety.api.ts

@@ -8,6 +8,8 @@ enum Api {
   safetyDeviceList = '/ventanaly-device/monitor/codeDict',
   safetyList = '/ventanaly-device/history/getAlarmHistoryData',
   export = '/ventanaly-device/safety/reportInfo/expComReport?tempName=aqjk',
+  subStationList = '/safety/ventanalySubStation/alllist',
+  initSubStation = '/ventanaly-device/monitor/initSafetyMonitorDeviceInfo',
 }
 /**
  * 列表接口
@@ -15,6 +17,11 @@ enum Api {
  */
 export const list = (params) => defHttp.post({ url: Api.list, params });
 
+// 分站查询接口
+export const subStationList = (params) => defHttp.get({ url: Api.subStationList, params });
+// 同步分站
+export const initSubStation = (params) => defHttp.post({ url: Api.initSubStation, params });
+
 export const safetyList = (params) => defHttp.post({ url: Api.safetyList, params });
 
 export const safetyDeviceList = (params) => defHttp.post({ url: Api.safetyDeviceList, params });

+ 38 - 9
src/views/vent/monitorManager/windowMonitor/index.vue

@@ -22,15 +22,28 @@
           <span class="input-title">风窗面积:</span>
           <a-input-number size="small" placeholder="0" :min="0" :max="90" :step="1" v-model:value="windowAngle" />
         </div> -->
-        <div class="row" v-if="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:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
-        </div>
-        <div class="row" v-if="selectData.nwindownum == 1">
-          <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(1)">设定风窗面积</div>
-          <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
-        </div>
+        <template v-if="hasPermission('window:showAngle')">
+          <div class="row" v-if="selectData.nwindownum > 1">
+            <div v-if="hasPermission('window:control')" class="button-box" @click="setAngle(1)">设定前窗角度</div>
+            <div v-if="hasPermission('window:control')" class="button-box" @click="setAngle(2)">设定后窗角度</div>
+            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
+          </div>
+          <div class="row" v-if="selectData.nwindownum == 1">
+            <div v-if="hasPermission('window:control')" class="button-box" @click="setAngle(1)">设定风窗角度</div>
+            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
+          </div>
+        </template>
+        <template v-else>
+          <div class="row" v-if="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:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
+          </div>
+          <div class="row" v-if="selectData.nwindownum == 1">
+            <div v-if="hasPermission('window:control')" class="button-box" @click="setArea(1)">设定风窗面积</div>
+            <div v-if="hasPermission('window:ldkz')" class="button-box" @click="setArea(3)">自主联动控制</div>
+          </div>
+        </template>
       </div>
       <div class="top-right row">
         <!-- <div class="control-type row">
@@ -339,6 +352,22 @@
     modalIsShow.value = true;
   };
 
+  // 设置风窗角度
+  const setAngle = (flag) => {
+    if (selectData.nwindownum == 2) {
+      modalTitle.value = flag === 1 ? '设定前窗角度' : '设定后窗角度';
+    } else {
+      modalTitle.value = '设定风窗角度';
+    }
+
+    if (flag == 3) {
+      modalTitle.value = '自主联动控制';
+    }
+
+    modalType.value = flag + '';
+    modalIsShow.value = true;
+  };
+
   const handleOK = (passWord, handlerState, windowAngleNum) => {
     if (!passWord && !globalConfig?.simulatedPassword) {
       message.warning('请输入密码!');

+ 1 - 1
src/views/vent/monitorManager/windowMonitor/modal.vue

@@ -6,7 +6,7 @@
         <div class="warning-text">您是否要进行{{ title }}操作?</div>
       </div>
       <div class="vent-flex-row input-box" v-if="type !== '3'">
-        <div class="label">风窗面积:</div>
+        <div class="label">{{ title.includes('角度') ? '风窗角度:' : '风窗面积:' }}</div>
         <a-input-number size="small" placeholder="0" :min="0" :max="90" v-model:value="area" />
       </div>
       <div v-if="!globalConfig?.simulatedPassword" class="vent-flex-row input-box">

+ 504 - 476
src/views/vent/performance/fileDetail/index.vue

@@ -4,8 +4,16 @@
     <div class="content">
       <div class="left-box">
         <!-- 左侧树菜单 -->
-        <fileSystem :selected="selected" :list="listArr" :draggable="true" @delete-node="onDeltet" @on-click="onClick"
-          @change-name="onChangeName" @addNode="onAddNode" @downloadNode="downloadNode">
+        <fileSystem
+          :selected="selected"
+          :list="listArr"
+          :draggable="true"
+          @delete-node="onDeltet"
+          @on-click="onClick"
+          @change-name="onChangeName"
+          @addNode="onAddNode"
+          @downloadNode="downloadNode"
+        >
           <template #icon="{ item }">
             <template v-if="item.isFolder">
               <SvgIcon v-if="item.expanded" size="18" name="file-open" />
@@ -31,8 +39,7 @@
               <template #title>
                 <span>删除</span>
               </template>
-              <a-popconfirm v-if="type == 'deleteNode'" title="是否确认删除!" ok-text="确定" cancel-text="取消"
-                @confirm="confirmDel">
+              <a-popconfirm v-if="type == 'deleteNode'" title="是否确认删除!" ok-text="确定" cancel-text="取消" @confirm="confirmDel">
                 <i class="iconfont icon-guanbi"></i>
               </a-popconfirm>
             </a-tooltip>
@@ -50,21 +57,29 @@
           <span style="color: #fff">文件名称:</span>
           <a-input v-model:value="searchForm.fileName" placeholder="请输入文件名称" :disabled="activeKey != '1'" />
           <span style="color: #fff">文件类型:</span>
-          <a-select v-model:value="searchForm.fileType" placeholder="请选择..." style="width: 220px; margin-right: 20px"
-            :disabled="activeKey != '1'">
+          <a-select v-model:value="searchForm.fileType" placeholder="请选择..." style="width: 220px; margin-right: 20px" :disabled="activeKey != '1'">
             <a-select-option v-for="item in filetypeList" :value="item.value">{{ item.label }}</a-select-option>
           </a-select>
-          <a-button type="primary" preIcon="ant-design:search-outlined" @click="onSearch"
-            :disabled="activeKey != '1'">查询</a-button>
-          <a-button type="primary" style="float: right;" @click="reportSum" v-if="sysOrgCode=='sdmtjtgsd'">汇总报表</a-button>
+          <a-button type="primary" preIcon="ant-design:search-outlined" @click="onSearch" :disabled="activeKey != '1'">查询</a-button>
+          <a-button type="primary" style="float: right" @click="reportSum" v-if="sysOrgCode == 'sdmtjtgsd'">汇总报表</a-button>
           <a-button type="primary" style="float: right; margin-right: 20px" @click="openModal(true)">文件上传</a-button>
         </div>
         <div class="list">
           <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
             <a-tab-pane key="1" tab="全部">
-              <NormalTable :key="alive" :submitInfo="submitInfo" :selfParam="selfParam" :searchParam="searchForm"
-                :nodeParam="nodeParam" :columns="columns" :list="getTree" :deleteById="deleteById" :downLoad="downLoad"
-                designScope="file-detail" title="文件详情" />
+              <NormalTable
+                :key="alive"
+                :submitInfo="submitInfo"
+                :selfParam="selfParam"
+                :searchParam="searchForm"
+                :nodeParam="nodeParam"
+                :columns="columns"
+                :list="getTree"
+                :deleteById="deleteById"
+                :downLoad="downLoad"
+                designScope="file-detail"
+                title="文件详情"
+              />
             </a-tab-pane>
             <a-tab-pane key="2" tab="待审批">
               <approvalPend :key="alive2" :selected="selected" />
@@ -86,8 +101,7 @@
           </a-radio-group>
         </a-form-item>
         <a-form-item label="文件类型">
-          <JDictSelectTag v-model:value="formState.fileType" placeholder="请选择文件类型" dictCode="file_type"
-            style="width: 260px" />
+          <JDictSelectTag v-model:value="formState.fileType" placeholder="请选择文件类型" dictCode="file_type" style="width: 260px" />
         </a-form-item>
         <a-form-item label="文件上传">
           <a-upload :before-upload="beforeUpload" @remove="handleRemove" :multiple="false" :file-list="fileList">
@@ -98,11 +112,13 @@
     </a-modal>
     <!-- 汇总报表弹窗 -->
     <a-modal v-model:visible="visiblehHz" centered :width="600" title="报表汇总" :footer="null" @cancel="handleCancelHz">
-      <div
-        style="height:240px;overflow-y: auto;display: flex;flex-direction: column;align-items: center; padding: 10px;box-sizing: border-box">
+      <div style="height: 240px; overflow-y: auto; display: flex; flex-direction: column; align-items: center; padding: 10px; box-sizing: border-box">
         <vue3-seamless-scroll hover-stop="true" :list="reportHzList" :hover="true" :step="0.06" class="seamless-warp1">
-          <div v-for="(item, index) in reportHzList" :key="index"
-            style="width:100%;height:40px;display: flex;justify-content: space-between;align-items: center">
+          <div
+            v-for="(item, index) in reportHzList"
+            :key="index"
+            style="width: 100%; height: 40px; display: flex; justify-content: space-between; align-items: center"
+          >
             <span>{{ item.time }}</span>
             <span>{{ item.msg }}</span>
           </div>
@@ -112,497 +128,509 @@
   </div>
 </template>
 <script lang="ts" setup name="system-user">
-import { Vue3SeamlessScroll } from 'vue3-seamless-scroll';
-import customHeader from '/@/components/vent/customHeader.vue';
-import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
-import fileSystem from './commen/fileSystem.vue';
-import treeIcon from './commen/Icon/treeIcon.vue';
-import NormalTable from '../comment/NormalTable.vue';
-import approvalPend from '../approvalPend/index.vue';
-import endEd from '../endEd/index.vue';
-import { useRouter } from 'vue-router';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { SvgIcon } from '/@/components/Icon';
-import { ref, onMounted, reactive, nextTick, watch,onUnmounted } from 'vue';
-import { columns } from './fileDetail.data';
-import { getTree, createFile, editMenu, delMenu, uploadApi, downLoad, deleteById, listData, getNowUserAgencyData,sumVentReport, queryVentMonReportJd, zipdownload } from './fileDetail.api';
-import { useGlobSetting } from '/@/hooks/setting';
-
-const { sysOrgCode } = useGlobSetting();
-let visiblehHz = ref(false)
-let reportHzList = ref<any[]>([])
-let timer: null | NodeJS.Timeout = null;
-let activeKey = ref('1');
-let selfParam = reactive({
-  //各矿参数
-  sysOrgCode: '',
-  bpmStatus: null,
-  flag: false,
-});
-let router = useRouter(); //路由
-const { createMessage } = useMessage();
-let searchForm = reactive({
-  fileName: '',
-  fileType: '',
-});
-let filetypeList = reactive<any[]>([
-  { label: 'txt', value: 'txt' },
-  { label: 'doc', value: 'doc' },
-  { label: 'docx', value: 'docx' },
-  { label: 'xls', value: 'xls' },
-  { label: 'xlsx', value: 'xlsx' },
-  { label: 'ppt', value: 'ppt' },
-  { label: 'pptx', value: 'pptx' },
-  { label: 'jpg', value: 'jpg' },
-  { label: 'png', value: 'png' },
-  { label: 'pdf', value: 'pdf' },
-]);
-let fileList = reactive<any[]>([]); //上传文件列表
-// let uploadParam = reactive({}); //上传文件参数
-let nodeParam = reactive({}); //点击树节点时传递的参数
-let alive = ref(0); //点击树节点刷新表格数据
-let alive2 = ref(0);
-let alive3 = ref(0);
-let visible = ref(false); //控制上传弹窗的显示
-let formState = reactive({
-  //上传文件类型,是否审批
-  isApprove: null,
-  fileType: '',
-});
-//文件审批-提交信息
-let submitInfo = ref<any[]>([]);
-
-//lxh 当前选中树节点
-let selected = reactive<any>({
-  id: null,
-  pid: null,
-  title: '',
-  isFolder: false,
-});
-let flag = ref('');
-//左侧菜单列表
-let listArr = reactive<any[]>([]);
-//获取要删除的节点数据
-let delNode = reactive({});
-
-//下载目录
-function downloadNode(data) {
-  console.log(data, '999000=============================================')
-  zipdownload({ id: data.id, ifMine: false }).then((res) => {
-    let filename = `${data.fileName}`;
-    downFilePublic(res, filename);
+  import { Vue3SeamlessScroll } from 'vue3-seamless-scroll';
+  import customHeader from '/@/components/vent/customHeader.vue';
+  import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
+  import fileSystem from './commen/fileSystem.vue';
+  import treeIcon from './commen/Icon/treeIcon.vue';
+  import NormalTable from '../comment/NormalTable.vue';
+  import approvalPend from '../approvalPend/index.vue';
+  import endEd from '../endEd/index.vue';
+  import { useRouter } from 'vue-router';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { SvgIcon } from '/@/components/Icon';
+  import { ref, onMounted, reactive, nextTick, watch, onUnmounted } from 'vue';
+  import { columns } from './fileDetail.data';
+  import {
+    getTree,
+    createFile,
+    editMenu,
+    delMenu,
+    uploadApi,
+    downLoad,
+    deleteById,
+    listData,
+    getNowUserAgencyData,
+    sumVentReport,
+    queryVentMonReportJd,
+    zipdownload,
+  } from './fileDetail.api';
+  import { useGlobSetting } from '/@/hooks/setting';
+
+  const { sysOrgCode } = useGlobSetting();
+  let visiblehHz = ref(false);
+  let reportHzList = ref<any[]>([]);
+  let timer: null | NodeJS.Timeout = null;
+  let activeKey = ref('1');
+  let selfParam = reactive({
+    //各矿参数
+    sysOrgCode: '',
+    bpmStatus: null,
+    flag: false,
   });
-}
-// 下载公用方法
-function downFilePublic(content, fileName) {
-  const blob = new Blob([content], { type: 'application/zip;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); // 释放标签
-  } else {
-    // 其他浏览器
-    navigator.msSaveBlob(blob, fileName);
+  let router = useRouter(); //路由
+  const { createMessage } = useMessage();
+  let searchForm = reactive({
+    fileName: '',
+    fileType: '',
+  });
+  let filetypeList = reactive<any[]>([
+    { label: 'txt', value: 'txt' },
+    { label: 'doc', value: 'doc' },
+    { label: 'docx', value: 'docx' },
+    { label: 'xls', value: 'xls' },
+    { label: 'xlsx', value: 'xlsx' },
+    { label: 'ppt', value: 'ppt' },
+    { label: 'pptx', value: 'pptx' },
+    { label: 'jpg', value: 'jpg' },
+    { label: 'png', value: 'png' },
+    { label: 'pdf', value: 'pdf' },
+  ]);
+  let fileList = reactive<any[]>([]); //上传文件列表
+  // let uploadParam = reactive({}); //上传文件参数
+  let nodeParam = reactive({}); //点击树节点时传递的参数
+  let alive = ref(0); //点击树节点刷新表格数据
+  let alive2 = ref(0);
+  let alive3 = ref(0);
+  let visible = ref(false); //控制上传弹窗的显示
+  let formState = reactive({
+    //上传文件类型,是否审批
+    isApprove: null,
+    fileType: '',
+  });
+  //文件审批-提交信息
+  let submitInfo = ref<any[]>([]);
+
+  //lxh 当前选中树节点
+  let selected = reactive<any>({
+    id: null,
+    pid: null,
+    title: '',
+    isFolder: false,
+  });
+  let flag = ref('');
+  //左侧菜单列表
+  let listArr = reactive<any[]>([]);
+  //获取要删除的节点数据
+  let delNode = reactive({});
+
+  //下载目录
+  function downloadNode(data) {
+    console.log(data, '999000=============================================');
+    zipdownload({ id: data.id, ifMine: false }).then((res) => {
+      let filename = `${data.fileName}`;
+      downFilePublic(res, filename);
+    });
   }
-}
-//汇总报表
- function reportSum() {
-  visiblehHz.value = true
-  sumVentReport()
-  timer = setInterval(async () => {
-    let res = await queryVentMonReportJd()
-    reportHzList.value = res.jdList
-    if (res.flag) {
-      visiblehHz.value = false
-      clearTimeout(timer);
-      reportHzList.value.length=0
-      alive.value = new Date().getTime();
+  // 下载公用方法
+  function downFilePublic(content, fileName) {
+    const blob = new Blob([content], { type: 'application/zip;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); // 释放标签
     } else {
-      visiblehHz.value = true
+      // 其他浏览器
+      navigator.msSaveBlob(blob, fileName);
     }
-  }, 3000)
-}
-//关闭汇总弹窗
-function handleCancelHz(){
-  reportHzList.value.length=0
-  visiblehHz.value = false
-  clearTimeout(timer);
-  alive.value = new Date().getTime();
-}
-//上传文件
-let openModal = (val) => {
-  formState.isApprove = null;
-  formState.fileType = '';
-  fileList.length = 0;
-  visible.value = val;
-};
-
-//tabs选项切换
-let tabChange = (activeKeyVal) => {
-  activeKey.value = activeKeyVal;
-  switch (activeKeyVal) {
-    case '1':
-      alive.value = new Date().getTime();
-      break;
-    case '2':
-      alive2.value = new Date().getTime();
-      break;
-    case '3':
-      alive3.value = new Date().getTime();
-      break;
   }
-};
-//文件审批状态切换
-let changeRadio = (val) => {
-  formState.isApprove = val.target.value;
-};
-//开始上传
-let handleOk = () => {
-  if (formState.isApprove === null) {
-    createMessage.warning('请选择文件审批状态!');
-  } else {
-    const formData = new FormData();
-    formData.append('file', fileList[0]);
-    formData.append('parentId', selected.id);
-    formData.append('isApprove', formState.isApprove);
-    formData.append('fileType', formState.fileType);
-    uploadApi(formData).then((res) => {
-      console.log(res, '上传返回');
+  //汇总报表
+  function reportSum() {
+    visiblehHz.value = true;
+    sumVentReport();
+    timer = setInterval(async () => {
+      let res = await queryVentMonReportJd();
+      reportHzList.value = res.jdList;
+      if (res.flag) {
+        visiblehHz.value = false;
+        clearTimeout(timer);
+        reportHzList.value.length = 0;
+        alive.value = new Date().getTime();
+      } else {
+        visiblehHz.value = true;
+      }
+    }, 3000);
+  }
+  //关闭汇总弹窗
+  function handleCancelHz() {
+    reportHzList.value.length = 0;
+    visiblehHz.value = false;
+    clearTimeout(timer);
+    alive.value = new Date().getTime();
+  }
+  //上传文件
+  let openModal = (val) => {
+    formState.isApprove = null;
+    formState.fileType = '';
+    fileList.length = 0;
+    visible.value = val;
+  };
+
+  //tabs选项切换
+  let tabChange = (activeKeyVal) => {
+    activeKey.value = activeKeyVal;
+    switch (activeKeyVal) {
+      case '1':
+        alive.value = new Date().getTime();
+        break;
+      case '2':
+        alive2.value = new Date().getTime();
+        break;
+      case '3':
+        alive3.value = new Date().getTime();
+        break;
+    }
+  };
+  //文件审批状态切换
+  let changeRadio = (val) => {
+    formState.isApprove = val.target.value;
+  };
+  //开始上传
+  let handleOk = () => {
+    if (formState.isApprove === null) {
+      createMessage.warning('请选择文件审批状态!');
+    } else {
+      const formData = new FormData();
+      formData.append('file', fileList[0]);
+      formData.append('parentId', selected.id);
+      formData.append('isApprove', formState.isApprove);
+      formData.append('fileType', formState.fileType);
+      uploadApi(formData).then((res) => {
+        console.log(res, '上传返回');
+        alive.value = new Date().getTime();
+        visible.value = false;
+      });
+    }
+  };
+  //取消上传
+  let handleCancel = () => {
+    visible.value = false;
+  };
+  let list2trees = (data) => {
+    // 删除 所有 children,以防止多次调用
+    data.forEach(function (item) {
+      delete item.children;
+    });
+    // 将数据存储为 以 id 为 KEY 的 map 索引数据列
+    let map = {};
+    data.forEach(function (item) {
+      map[item.id] = item;
+    });
+    var val = [];
+    data.forEach(function (item) {
+      item.isFolder = true;
+      item.title = item.fileName;
+      item.pid = item.parentId;
+      // 以当前遍历项,的pid,去map对象中找到索引的id
+      var parent = map[item.pid];
+      // 好绕啊,如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的父级中
+      if (parent) {
+        (parent.children || (parent.children = [])).push(item);
+      } else {
+        //如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中,作为顶级
+        val.push(item);
+      }
+    });
+    return val;
+  };
+
+  let getTypeTableList = async () => {
+    let parentId = nodeParam.id || '';
+    let selectFlag = nodeParam.id ? false : true;
+    let likeFileName = searchForm.fileName || '';
+    let fileSuffix = searchForm.fileType || '';
+    let bpmStatus = selfParam.bpmStatus || '';
+    let sysOrgCode = selfParam.sysOrgCode || '';
+    let res = await getTree({
+      parentId: parentId,
+      selectFlag: selectFlag,
+      likeFileName: likeFileName,
+      fileSuffix: '.' + fileSuffix,
+      bpmStatus: bpmStatus,
+      sysOrgCode: sysOrgCode,
+    });
+    console.log(res, 'tableList--------------------');
+  };
+
+  //获取左侧菜单树数据
+  let getTreeList = async () => {
+    listArr.length = 0;
+    let data = await getTree({ parentId: '' });
+    let datas = data.records.filter((v) => v.fileType == null);
+    let list = list2trees(datas);
+    listArr.push(...list);
+    console.log(listArr, '树节点数据');
+    selected.id = listArr[0].id;
+    selected.pid = listArr[0].pid;
+    selected.title = listArr[0].title;
+    selected.isFolder = listArr[0].isFolder;
+  };
+
+  //点击目录
+  const onClick = (node) => {
+    selected.id = node.id;
+    selected.pid = node.pid;
+    selected.title = node.title;
+    selected.isFolder = node.isFolder;
+    console.log(selected, 'selec----------');
+    if (flag.value != node.title) {
       alive.value = new Date().getTime();
-      visible.value = false;
+      nodeParam = node;
+      flag.value = node.title;
+    }
+  };
+  //添加文件
+  const onAddNode = async (node) => {
+    let data = await createFile({ fileName: node.newName, type: 'FOL', parentId: node.id });
+    console.log(data, '新增文件返回');
+    getTreeList();
+  };
+
+  //  修改名字
+  const onChangeName = (node) => {
+    editMenu({
+      id: node.id,
+      fileName: node.newName,
+      parentId: node.pid,
+    }).then((res) => {
+      getTreeList();
     });
-  }
-};
-//取消上传
-let handleCancel = () => {
-  visible.value = false;
-};
-let list2trees = (data) => {
-  // 删除 所有 children,以防止多次调用
-  data.forEach(function (item) {
-    delete item.children;
-  });
-  // 将数据存储为 以 id 为 KEY 的 map 索引数据列
-  let map = {};
-  data.forEach(function (item) {
-    map[item.id] = item;
-  });
-  var val = [];
-  data.forEach(function (item) {
-    item.isFolder = true;
-    item.title = item.fileName;
-    item.pid = item.parentId;
-    // 以当前遍历项,的pid,去map对象中找到索引的id
-    var parent = map[item.pid];
-    // 好绕啊,如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的父级中
-    if (parent) {
-      (parent.children || (parent.children = [])).push(item);
+  };
+  // 删除
+  let onDeltet = (node) => {
+    delNode = { ...node };
+  };
+  //确定删除
+  let confirmDel = () => {
+    if (delNode.pid == 'root') {
+      createMessage.warning('根节点不能被删除!');
+    } else if (delNode.children) {
+      createMessage.warning('该节点无法被删除,请先删除该节点下的子节点!');
     } else {
-      //如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中,作为顶级
-      val.push(item);
+      delMenu({ id: delNode.id }).then((res) => {
+        console.log(res, '删除文件');
+        getTreeList();
+      });
     }
-  });
-  return val;
-};
-
-let getTypeTableList = async () => {
-  let parentId = nodeParam.id || '';
-  let selectFlag = nodeParam.id ? false : true;
-  let likeFileName = searchForm.fileName || '';
-  let fileSuffix = searchForm.fileType || '';
-  let bpmStatus = selfParam.bpmStatus || '';
-  let sysOrgCode = selfParam.sysOrgCode || '';
-  let res = await getTree({
-    parentId: parentId,
-    selectFlag: selectFlag,
-    likeFileName: likeFileName,
-    fileSuffix: '.' + fileSuffix,
-    bpmStatus: bpmStatus,
-    sysOrgCode: sysOrgCode,
-  });
-  console.log(res, 'tableList--------------------');
-};
-
-//获取左侧菜单树数据
-let getTreeList = async () => {
-  listArr.length = 0;
-  let data = await getTree({ parentId: '' });
-  let datas = data.records.filter((v) => v.fileType == null);
-  let list = list2trees(datas);
-  listArr.push(...list);
-  console.log(listArr, '树节点数据');
-  selected.id = listArr[0].id;
-  selected.pid = listArr[0].pid;
-  selected.title = listArr[0].title;
-  selected.isFolder = listArr[0].isFolder;
-};
-
-//点击目录
-const onClick = (node) => {
-  selected.id = node.id;
-  selected.pid = node.pid;
-  selected.title = node.title;
-  selected.isFolder = node.isFolder;
-  console.log(selected, 'selec----------');
-  if (flag.value != node.title) {
+  };
+
+  //查询列表
+  let onSearch = () => {
     alive.value = new Date().getTime();
-    nodeParam = node;
-    flag.value = node.title;
+  };
+  //上传文件
+  let beforeUpload = (file) => {
+    console.log(file, '选中文件');
+    fileList.length = 0;
+    let index = file.name.indexOf('.');
+    let name = file.name.substring(index + 1);
+    if (name == 'png' || name == 'jpg' || name == 'gif' || name == 'psd' || name == 'webp') {
+      createMessage.warning('禁止上传图片类型的文件!');
+    } else {
+      fileList.push(file);
+    }
+  };
+  // 文件移除
+  let handleRemove = (file) => {
+    const index = fileList.indexOf(file);
+    const newFileList = fileList.slice();
+    newFileList.splice(index, 1);
+    fileList.length = 0;
+  };
+  //文件-提交
+  async function getListData() {
+    let res = await listData({ zx: true, column: 'createTime', order: 'desc', status: 1 });
+    console.log(res, '审批提交-----------');
+    submitInfo.value = res;
   }
-};
-//添加文件
-const onAddNode = async (node) => {
-  let data = await createFile({ fileName: node.newName, type: 'FOL', parentId: node.id });
-  console.log(data, '新增文件返回');
-  getTreeList();
-};
-
-//  修改名字
-const onChangeName = (node) => {
-  editMenu({
-    id: node.id,
-    fileName: node.newName,
-    parentId: node.pid,
-  }).then((res) => {
+  watch(
+    () => router.currentRoute.value,
+    (val) => {
+      console.log('各矿传参', val);
+      selfParam.bpmStatus = val.query.bpmStatus;
+      selfParam.sysOrgCode = val.query.sysOrgCode;
+      selfParam.flag = val.query.flag;
+    },
+    { immediate: true }
+  );
+  onMounted(() => {
     getTreeList();
+    getListData();
+    getTypeTableList();
+  });
+  onUnmounted(() => {
+    if (timer) {
+      clearTimeout(timer);
+      timer = undefined;
+    }
   });
-};
-// 删除
-let onDeltet = (node) => {
-  delNode = { ...node };
-};
-//确定删除
-let confirmDel = () => {
-  if (delNode.pid == 'root') {
-    createMessage.warning('根节点不能被删除!');
-  } else if (delNode.children) {
-    createMessage.warning('该节点无法被删除,请先删除该节点下的子节点!');
-  } else {
-    delMenu({ id: delNode.id }).then((res) => {
-      console.log(res, '删除文件');
-      getTreeList();
-    });
-  }
-};
-
-//查询列表
-let onSearch = () => {
-  alive.value = new Date().getTime();
-};
-//上传文件
-let beforeUpload = (file) => {
-  console.log(file, '选中文件');
-  fileList.length = 0;
-  let index = file.name.indexOf('.');
-  let name = file.name.substring(index + 1);
-  if (name == 'png' || name == 'jpg' || name == 'gif' || name == 'psd' || name == 'webp') {
-    createMessage.warning('禁止上传图片类型的文件!');
-  } else {
-    fileList.push(file);
-  }
-};
-// 文件移除
-let handleRemove = (file) => {
-  const index = fileList.indexOf(file);
-  const newFileList = fileList.slice();
-  newFileList.splice(index, 1);
-  fileList.length = 0;
-};
-//文件-提交
-async function getListData() {
-  let res = await listData({ zx: true, column: 'createTime', order: 'desc', status: 1 });
-  console.log(res, '审批提交-----------');
-  submitInfo.value = res;
-}
-watch(
-  () => router.currentRoute.value,
-  (val) => {
-    console.log('各矿传参', val);
-    selfParam.bpmStatus = val.query.bpmStatus;
-    selfParam.sysOrgCode = val.query.sysOrgCode;
-    selfParam.flag = val.query.flag;
-  },
-  { immediate: true }
-);
-onMounted(() => {
-  getTreeList();
-  getListData();
-  getTypeTableList();
-});
-onUnmounted(() => {
-  if (timer) {
-    clearTimeout(timer);
-    timer = undefined;
-  }
-});
 </script>
 
 <style lang="less" scoped>
-@ventSpace: zxm;
-
-.file-details {
-  width: calc(100% - 10px);
-  height: calc(100% - 100px);
-  padding: 0px 15px 15px 15px;
-  position: relative;
-  margin-top: 100px;
-  // background: url(../../../../assets/images/files/homes/bd.png) no-repeat center;
-  // background-size: contain;
-
-  &::after {
-    display: block;
-    content: '';
-    height: 200px;
-    width: 100%;
-    position: absolute;
-    background-image: linear-gradient(#2eb2ff05, #2ea2ff00);
-    border-top: 1px solid #2eb2ff20;
-    top: 0px;
-    left: 0px;
-  }
+  @ventSpace: zxm;
 
-  .content {
-    width: 100%;
-    height: 100%;
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-    align-items: flex-start;
+  .file-details {
+    width: calc(100% - 10px);
+    height: calc(100% - 100px);
+    padding: 0px 15px 15px 15px;
     position: relative;
-    z-index: 999;
+    margin-top: 100px;
+    // background: url(../../../../assets/images/files/homes/bd.png) no-repeat center;
+    // background-size: contain;
+
+    &::after {
+      display: block;
+      content: '';
+      height: 200px;
+      width: 100%;
+      position: absolute;
+      background-image: linear-gradient(#2eb2ff05, #2ea2ff00);
+      border-top: 1px solid #2eb2ff20;
+      top: 0px;
+      left: 0px;
+    }
 
-    .left-box {
-      width: 18%;
+    .content {
+      width: 100%;
       height: 100%;
-      padding: 10px;
-      border: 1px solid #99e8ff66;
-      background: #27546e1a;
-      box-shadow: 0px 0px 20px 7px rgba(145, 233, 254, 0.7) inset;
-      -moz-box-shadow: 0px 0px 20px 7px rgba(145, 233, 254, 0.7) inset;
-      -webkit-box-shadow: 0px 0px 50px 1px rgb(149 235 255 / 5%) inset;
-
-      // lxh
-      .iconfont {
-        color: #fff;
-        font-size: 12px;
-        margin-left: 5px;
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      align-items: flex-start;
+      position: relative;
+      z-index: 999;
+
+      .left-box {
+        width: 18%;
+        height: 100%;
+        padding: 10px;
+        border: 1px solid #99e8ff66;
+        background: #27546e1a;
+        box-shadow: 0px 0px 20px 7px rgba(145, 233, 254, 0.7) inset;
+        -moz-box-shadow: 0px 0px 20px 7px rgba(145, 233, 254, 0.7) inset;
+        -webkit-box-shadow: 0px 0px 50px 1px rgb(149 235 255 / 5%) inset;
+
+        // lxh
+        .iconfont {
+          color: #fff;
+          font-size: 12px;
+          margin-left: 5px;
+        }
       }
-    }
 
-    .right-box {
-      width: 82%;
-      height: 100%;
-      padding: 0px 0px 0px 10px;
-      box-sizing: border-box;
+      .right-box {
+        width: 82%;
+        height: 100%;
+        padding: 0px 0px 0px 10px;
+        box-sizing: border-box;
+
+        .search {
+          height: 34px;
+          line-height: 34px;
+          margin-bottom: 15px;
+        }
+      }
 
-      .search {
-        height: 34px;
-        line-height: 34px;
-        margin-bottom: 15px;
+      .list {
+        height: calc(100% - 49px);
+        position: relative;
       }
     }
 
-    .list {
-      height: calc(100% - 49px);
-      position: relative;
+    .zxm-form {
+      padding: 10px !important;
     }
   }
 
-  .zxm-form {
-    padding: 10px !important;
+  .seamless-warp1 {
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+  }
+
+  ::v-deep .jeecg-svg-icon {
+    margin-right: 5px;
+  }
+
+  ::v-deep .jeecg-basic-table-form-container {
+    padding: 0px 0px;
+  }
+
+  ::v-deep .zxm-btn-primary {
+    background-color: transparent;
+    border: none;
+    background: url(../../../../assets/images/files/details/btn.png) no-repeat !important;
+    background-size: 100% 100% !important;
+  }
+
+  ::v-deep .zxm-tree-switcher {
+    background: transparent;
   }
 
-}
-
-.seamless-warp1 {
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-}
-
-::v-deep .jeecg-svg-icon {
-  margin-right: 5px;
-}
-
-::v-deep .jeecg-basic-table-form-container {
-  padding: 0px 0px;
-}
-
-::v-deep .zxm-btn-primary {
-  background-color: transparent;
-  border: none;
-  background: url(../../../../assets/images/files/details/btn.png) no-repeat !important;
-  background-size: 100% 100% !important;
-}
-
-::v-deep .zxm-tree-switcher {
-  background: transparent;
-}
-
-::v-deep .zxm-input {
-  width: 220px;
-  height: 30px;
-  background: transparent;
-  border: 1px solid #31bccc;
-  color: #fff;
-  margin-right: 20px;
-  border-radius: 5px;
-}
-
-::v-deep .zxm-select:not(.zxm-select-customize-input) .zxm-select-selector {
-  height: 30px !important;
-  background: transparent !important;
-  border: 1px solid #31bccc !important;
-  border-radius: 5px !important;
-  color: #fff !important;
-}
-
-::v-deep .zxm-select-single.zxm-select-show-arrow .zxm-select-selection-item {
-  color: #fff !important;
-}
-
-::v-deep .zxm-btn-group {
-  margin-right: 25px;
-}
-
-::v-deep .zxm-upload-list-item-name {
-  color: #fff;
-}
-
-::v-deep .zxm-upload-list-item:hover .zxm-upload-list-item-info {
-  background-color: transparent;
-}
-
-:deep(.@{ventSpace}-table-cell-row-hover) {
-  background: #264d8833 !important;
-}
-
-:deep(.@{ventSpace}-table-row-selected) {
-  background: #268bc522 !important;
-}
-
-:deep(.@{ventSpace}-select-dropdown) {
-  border: 1px solid #ececec66;
-
-  .@{ventSpace}-select-item-option-selected,
-  .@{ventSpace}-select-item-option-active {
-    background-color: #ffffff33 !important;
+  ::v-deep .zxm-input {
+    width: 220px;
+    height: 30px;
+    background: transparent;
+    border: 1px solid #31bccc;
+    color: #fff;
+    margin-right: 20px;
+    border-radius: 5px;
   }
 
-  .@{ventSpace}-select-item:hover {
-    background-color: #ffffff33 !important;
+  ::v-deep .zxm-select:not(.zxm-select-customize-input) .zxm-select-selector {
+    height: 30px !important;
+    background: transparent !important;
+    border: 1px solid #31bccc !important;
+    border-radius: 5px !important;
+    color: #fff !important;
   }
-}
 
-::v-deep .zxm-form-item-control-input {
-  width: 90%;
-}
+  ::v-deep .zxm-select-single.zxm-select-show-arrow .zxm-select-selection-item {
+    color: #fff !important;
+  }
+
+  ::v-deep .zxm-btn-group {
+    margin-right: 25px;
+  }
+
+  ::v-deep .zxm-upload-list-item-name {
+    color: #fff;
+  }
+
+  ::v-deep .zxm-upload-list-item:hover .zxm-upload-list-item-info {
+    background-color: transparent;
+  }
+
+  :deep(.@{ventSpace}-table-cell-row-hover) {
+    background: #264d8833 !important;
+  }
+
+  :deep(.@{ventSpace}-table-row-selected) {
+    background: #268bc522 !important;
+  }
+
+  :deep(.@{ventSpace}-select-dropdown) {
+    border: 1px solid #ececec66;
+
+    .@{ventSpace}-select-item-option-selected,
+    .@{ventSpace}-select-item-option-active {
+      background-color: #ffffff33 !important;
+    }
+
+    .@{ventSpace}-select-item:hover {
+      background-color: #ffffff33 !important;
+    }
+  }
+
+  ::v-deep .zxm-form-item-control-input {
+    width: 90%;
+  }
 </style>

+ 242 - 233
src/views/vent/reportManager/comment/NormalTable.vue

@@ -19,272 +19,281 @@
         <slot name="filterCell" v-bind="{ column, record }"></slot>
       </template>
     </BasicTable>
-    <DeviceModal :editID="editID" :reportId="reportId" :reportLogHis="reportLogHis" :fileType="fileType"
-      @register="registerModal" :addOredit="addOredit" @saveOrUpdate="saveOrUpdate" />
+    <DeviceModal
+      :editID="editID"
+      :reportId="reportId"
+      :reportLogHis="reportLogHis"
+      :fileType="fileType"
+      @register="registerModal"
+      :addOredit="addOredit"
+      @saveOrUpdate="saveOrUpdate"
+    />
     <!-- 报表或模板上传弹窗 -->
-    <tempUpload :visibleUp="visibleUp" @resetUpload="resetUpload"></tempUpload>
-
+    <tempUpload :visibleUp="visibleUp" @resetUpload="resetUpload" />
   </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 tempUpload from './common/tempUpload.vue'
-import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-import { useListPage } from '/@/hooks/system/useListPage';
-import { synReportFile } from '../reportManager.api'
-
-const props = defineProps({
-
-  searchParam: {
-    type: Object,
-    default: () => {
-      return {}
-    }
-  },
-
-  //下载文件接口
-  downLoad: {
-    type: Function,
-    required: true,
-  },
-  columns: {
-    type: Array,
-    // required: true,
-    default: () => [],
-  },
-  searchFormSchema: {
-    type: Array,
-    default: () => [],
-  },
-  list: {
-    type: Function,
-    required: true,
-  },
-  deleteById: {
-    type: Function,
-    required: true,
-  },
-  batchDelete: {
-    type: Function,
-  },
-
+  //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 tempUpload from './common/tempUpload.vue';
+  import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { synReportFile } from '../reportManager.api';
 
-  designScope: {
-    type: String,
-  },
-  title: {
-    type: String,
-  },
-});
-
-//区分打开编辑或新增弹窗
-let addOredit = ref('')
-//文件ID
-let editID = ref(0);
-let fileType = ref(''); //文件类型
-let reportLogHis = ref('')//是否为报表记录编辑
-let reportId = ref('')//历史记录列表传参
-const emit = defineEmits(['saveAdd']);
-const record = reactive({});
-const columnList = getTableHeaderColumns('');
-let visibleUp = ref(0)
-let resetTable = ref(0)
-//列表查询参数
-let searchParams = reactive({
-  busKind: '',
-  modelType: "",
-  reportType: '',
-})
-const [registerModal, { openModal, closeModal }] = useModal();
-// 列表页面公共参数、方法
-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,
-    scroll: { y: 650 },
-    formConfig: {
-      showAdvancedButton: true,
-      // labelWidth: 100,
-      labelAlign: 'left',
-      labelCol: {
-        xs: 24,
-        sm: 24,
-        md: 24,
-        lg: 9,
-        xl: 7,
-        xxl: 5,
+  const props = defineProps({
+    searchParam: {
+      type: Object,
+      default: () => {
+        return {};
       },
-      schemas: props.searchFormSchema as any[],
     },
-    useSearchForm: props.searchFormSchema.length > 0 ? true : false,
-    striped: true,
-    actionColumn: {
-      width: 180,
+
+    //下载文件接口
+    downLoad: {
+      type: Function,
+      required: true,
+    },
+    columns: {
+      type: Array,
+      // required: true,
+      default: () => [],
     },
-    //自定义默认排序
-    defSort: {
-      column: 'createTime',
-      order: 'desc',
+    searchFormSchema: {
+      type: Array,
+      default: () => [],
     },
-    beforeFetch: (params) => {
-      return Object.assign(params, { column: 'createTime', ...searchParams });
+    list: {
+      type: Function,
+      required: true,
+    },
+    deleteById: {
+      type: Function,
+      required: true,
+    },
+    batchDelete: {
+      type: Function,
     },
-  },
-});
-//注册table数据
-const [registerTable, { reload, getForm }, { rowSelection, selectedRowKeys }] = tableContext;
 
-//报表或模板上传
-function handleUpload() {
-  visibleUp.value = new Date().getTime()
-}
-function resetUpload() {
-  resetTable.value = new Date().getTime()
-}
+    designScope: {
+      type: String,
+    },
+    title: {
+      type: String,
+    },
+  });
 
-/**
- * 新增事件
- */
-function handleAdd() {
-  addOredit.value = 'add'
-  for (let key in record) {
-    delete record[key];
-  }
-  openModal(true);
-}
+  //区分打开编辑或新增弹窗
+  let addOredit = ref('');
+  //文件ID
+  let editID = ref(0);
+  let fileType = ref(''); //文件类型
+  let reportLogHis = ref(''); //是否为报表记录编辑
+  let reportId = ref(''); //历史记录列表传参
+  const emit = defineEmits(['saveAdd']);
+  const record = reactive({});
+  const columnList = getTableHeaderColumns('');
+  let visibleUp = ref(0);
+  let resetTable = ref(0);
+  //列表查询参数
+  let searchParams = reactive({
+    busKind: '',
+    modelType: '',
+    reportType: '',
+  });
+  const [registerModal, { openModal, closeModal }] = useModal();
+  // 列表页面公共参数、方法
+  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,
+      scroll: { y: 650 },
+      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,
+      },
+      //自定义默认排序
+      defSort: {
+        column: 'createTime',
+        order: 'desc',
+      },
+      beforeFetch: (params) => {
+        return Object.assign(params, { column: 'createTime', ...searchParams });
+      },
+    },
+  });
+  //注册table数据
+  const [registerTable, { reload, getForm }, { rowSelection, selectedRowKeys }] = tableContext;
 
-//新增保存
-function saveOrUpdate(param) {
-  console.log(param, '新增参数----------')
-  emit('saveAdd', param)
-}
+  //报表或模板上传
+  function handleUpload() {
+    visibleUp.value = new Date().getTime();
+  }
+  function resetUpload() {
+    resetTable.value = new Date().getTime();
+  }
 
-/**
- * 编辑事件
- */
-function handleEdit(data) {
-  addOredit.value = 'edit'
-  reportLogHis.value = ''
-  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');
-  openModal(true, {
-    record,
-  });
-}
+  /**
+   * 新增事件
+   */
+  function handleAdd() {
+    addOredit.value = 'add';
+    for (let key in record) {
+      delete record[key];
+    }
+    openModal(true);
+  }
 
-//同步报表
-async function handleReport(data){
-  let res=await synReportFile({id:data.id})
-  if(res){
-    resetTable.value = new Date().getTime()
+  //新增保存
+  function saveOrUpdate(param) {
+    console.log(param, '新增参数----------');
+    emit('saveAdd', param);
   }
-}
 
-/**
- * 删除事件
- */
-async function handleDelete(record) {
-  await props.deleteById({ id: record.id }, reload);
-}
+  /**
+   * 编辑事件
+   */
+  function handleEdit(data) {
+    addOredit.value = 'edit';
+    reportLogHis.value = '';
+    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');
+    openModal(true, {
+      record,
+    });
+  }
 
-// 历史记录
-function handleHisrecord(data) {
-  addOredit.value = 'hisRecord'
-  Object.assign(record, toRaw(data));
-  reportId.value = record.id
-  console.log(reportId.value, '历史记录列表传参---00000000')
-  openModal(true, {
-    record,
-  });
-}
+  //同步报表
+  async function handleReport(data) {
+    let res = await synReportFile({ id: data.id });
+    if (res) {
+      resetTable.value = new Date().getTime();
+    }
+  }
 
+  /**
+   * 删除事件
+   */
+  async function handleDelete(record) {
+    await props.deleteById({ id: record.id }, reload);
+  }
 
-//下载文件
-function handleDownLoad(record) {
-  console.log(record, '下载');
-  props.downLoad({ id: record.id }).then((res) => {
-    console.log(res, '文件下载成功');
-    let filename = `${record.fileName}`;
-    downFilePublic(res, 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); // 释放标签
-  } else {
-    // 其他浏览器
-    navigator.msSaveBlob(blob, fileName);
+  // 历史记录
+  function handleHisrecord(data) {
+    addOredit.value = 'hisRecord';
+    Object.assign(record, toRaw(data));
+    reportId.value = record.id;
+    console.log(reportId.value, '历史记录列表传参---00000000');
+    openModal(true, {
+      record,
+    });
   }
-}
 
-watch(() => props.searchParam, (newS, oldS) => {
-  searchParams.busKind = newS.busKind
-  searchParams.modelType = newS.modelType
-  searchParams.reportType = newS.reportType
-}, { immediate: true, deep: true })
+  //下载文件
+  function handleDownLoad(record) {
+    console.log(record, '下载');
+    props.downLoad({ id: record.id }).then((res) => {
+      console.log(res, '文件下载成功');
+      let filename = `${record.fileName}`;
+      downFilePublic(res, 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); // 释放标签
+    } else {
+      // 其他浏览器
+      navigator.msSaveBlob(blob, fileName);
+    }
+  }
 
-defineExpose({
-  doRequest, onExportXls, onImportXls, reload, getForm
-});
+  watch(
+    () => props.searchParam,
+    (newS, oldS) => {
+      searchParams.busKind = newS.busKind;
+      searchParams.modelType = newS.modelType;
+      searchParams.reportType = newS.reportType;
+    },
+    { immediate: true, deep: true }
+  );
 
+  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) {
-  background: #264d8833 !important;
-}
-
-:deep(.@{ventSpace}-table-row-selected) {
-  background: #268bc522 !important;
-}
-
-:deep(.@{ventSpace}-table-tbody > tr > td) {
-  background-color: #0dc3ff05;
-}
+  :deep(.@{ventSpace}-table-cell-row-hover) {
+    background: #264d8833 !important;
+  }
 
-:deep(.jeecg-basic-table-row__striped) {
-  td {
-    background-color: @vent-table-no-hover !important;
+  :deep(.@{ventSpace}-table-row-selected) {
+    background: #268bc522 !important;
   }
-}
 
-:deep(.@{ventSpace}-select-dropdown) {
+  :deep(.@{ventSpace}-table-tbody > tr > td) {
+    background-color: #0dc3ff05;
+  }
 
-  .@{ventSpace}-select-item-option-selected,
-  .@{ventSpace}-select-item-option-active {
-    background-color: #ffffff33 !important;
+  :deep(.jeecg-basic-table-row__striped) {
+    td {
+      background-color: @vent-table-no-hover !important;
+    }
   }
 
-  .@{ventSpace}-select-item:hover {
-    background-color: #ffffff33 !important;
+  :deep(.@{ventSpace}-select-dropdown) {
+    .@{ventSpace}-select-item-option-selected,
+    .@{ventSpace}-select-item-option-active {
+      background-color: #ffffff33 !important;
+    }
+
+    .@{ventSpace}-select-item:hover {
+      background-color: #ffffff33 !important;
+    }
   }
-}
-</style>
+</style>

+ 160 - 161
src/views/vent/reportManager/comment/reportMap.vue

@@ -1,60 +1,64 @@
 <template>
-    <div class="report-map">
-        <div class="search-area">
-            <a-tree-select v-model:value="searchForm.sysOrgCode" show-search style="width:280px;margin-right:15px"
-                :dropdown-style="{ maxHeight: '200px', overflow: 'auto' }" placeholder="请选择部门..." allow-clear
-                tree-default-expand-all :tree-data="sysOrgCodeList" tree-node-filter-prop="title">
-                <template #title="{ value: val, title }">
-                    {{ title }}
-                </template>
-            </a-tree-select>
-            <a-button type="primary" preIcon="ant-design:search-outlined" style="margin-right:15px"
-                @click="getSearch">查询</a-button>
-            <a-button preIcon="ant-design:sync-outlined" @click="onReset">重置</a-button>
-        </div>
-        <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd"
-            style="margin-bottom: 10px">新增</a-button>
-        <a-table size="small" :dataSource="dataSource" :columns="columnsMap" :scroll="{ y: 620 }"
-            :pagination="pagination" @change="pageChange">
-            <template #action="{ record }">
-                <a class="table-action-link" @click="handleEdit(record)">编辑</a>
-                <a class="table-action-link" @click="handleDel(record)">删除</a>
-            </template>
-        </a-table>
-        <!-- 添加/编辑弹窗 -->
-        <a-modal v-model:visible="visibleMap" width="1000px" :footer="null" :title="titleMap" centered destroyOnClose>
-            <reportModal :isToggle="isToggle" :sysOrgCodeList="sysOrgCodeList" :formState="formState" @Close="Close">
-            </reportModal>
-        </a-modal>
+  <div class="report-map">
+    <div class="search-area">
+      <a-tree-select
+        v-model:value="searchForm.sysOrgCode"
+        show-search
+        style="width: 280px; margin-right: 15px"
+        :dropdown-style="{ maxHeight: '200px', overflow: 'auto' }"
+        placeholder="请选择部门..."
+        allow-clear
+        tree-default-expand-all
+        :tree-data="sysOrgCodeList"
+        tree-node-filter-prop="title"
+      >
+        <template #title="{ value: val, title }">
+          {{ title }}
+        </template>
+      </a-tree-select>
+      <a-button type="primary" preIcon="ant-design:search-outlined" style="margin-right: 15px" @click="getSearch">查询</a-button>
+      <a-button preIcon="ant-design:sync-outlined" @click="onReset">重置</a-button>
     </div>
+    <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd" style="margin-bottom: 10px">新增</a-button>
+    <a-table size="small" :dataSource="dataSource" :columns="columnsMap" :scroll="{ y: 620 }" :pagination="pagination" @change="pageChange">
+      <template #action="{ record }">
+        <a class="table-action-link" @click="handleEdit(record)">编辑</a>
+        <a class="table-action-link" @click="handleDel(record)">删除</a>
+      </template>
+    </a-table>
+    <!-- 添加/编辑弹窗 -->
+    <a-modal v-model:visible="visibleMap" width="1000px" :footer="null" :title="titleMap" centered destroyOnClose>
+      <reportModal :isToggle="isToggle" :sysOrgCodeList="sysOrgCodeList" :formState="formState" @Close="Close" />
+    </a-modal>
+  </div>
 </template>
 
 <script setup lang="ts">
-//ts语法
-import { ref, reactive, toRaw, watch, onMounted } from 'vue';
-import { listMap, queryDepartTreeSync, reportDel, queryTreeList } from '../reportManager.api'
-import { columnsMap } from '../reportManager.data'
-import reportModal from './report-modal.vue'
-
-let dataSource = ref<any[]>([])
-let searchForm = reactive({
+  //ts语法
+  import { ref, reactive, toRaw, watch, onMounted } from 'vue';
+  import { listMap, queryDepartTreeSync, reportDel, queryTreeList } from '../reportManager.api';
+  import { columnsMap } from '../reportManager.data';
+  import reportModal from './report-modal.vue';
+
+  let dataSource = ref<any[]>([]);
+  let searchForm = reactive({
     sysOrgCode: '',
-})
-let sysOrgCodeList = ref<any[]>([])
-//分页参数配置
-let pagination = reactive({
+  });
+  let sysOrgCodeList = ref<any[]>([]);
+  //分页参数配置
+  let pagination = reactive({
     current: 1, // 当前页码
     pageSize: 10, // 每页显示条数
     total: 0, // 总条目数,后端返回
     // showTotal: (total, range) => `${range[0]}-${range[1]} 条,总共 ${total} 条`, // 分页右下角显示信息
     showSizeChanger: true, // 是否可改变每页显示条数
-    pageSizeOptions: ['10', '20', '50',], // 可选的每页显示条数
-})
-let visibleMap = ref(false)
-let titleMap = ref('')
-let isToggle = ref('')
-let formState = reactive({
-    id:'',
+    pageSizeOptions: ['10', '20', '50'], // 可选的每页显示条数
+  });
+  let visibleMap = ref(false);
+  let titleMap = ref('');
+  let isToggle = ref('');
+  let formState = reactive({
+    id: '',
     sysOrgCode: '',
     formula: '',
     groupCol: '',
@@ -65,118 +69,113 @@ let formState = reactive({
     sheet: '',
     col: '',
     row: '',
-    name: ''
-})
-
-
-//关闭弹窗
-function Close() {
-    visibleMap.value = false
-    pagination.current = 1
-    getListMap()
-}
-//添加
-function handleAdd() {
-    titleMap.value = '新增报表映射'
-    visibleMap.value = true
-    isToggle.value = 'add'
+    name: '',
+  });
+
+  //关闭弹窗
+  function Close() {
+    visibleMap.value = false;
+    pagination.current = 1;
+    getListMap();
+  }
+  //添加
+  function handleAdd() {
+    titleMap.value = '新增报表映射';
+    visibleMap.value = true;
+    isToggle.value = 'add';
     formState = {
-        sysOrgCode: '',
-        formula: '',
-        groupCol: '',
-        groupRow: '',
-        groupSheet: '',
-        isCompute: true,
-        mineCells: [],
-        sheet: '',
-        col: '',
-        row: '',
-        name: ''
-    }
-
-}
-//编辑
-function handleEdit(record) {
-    titleMap.value = '编辑报表映射'
-    visibleMap.value = true
-    isToggle.value = 'edit'
+      sysOrgCode: '',
+      formula: '',
+      groupCol: '',
+      groupRow: '',
+      groupSheet: '',
+      isCompute: true,
+      mineCells: [],
+      sheet: '',
+      col: '',
+      row: '',
+      name: '',
+    };
+  }
+  //编辑
+  function handleEdit(record) {
+    titleMap.value = '编辑报表映射';
+    visibleMap.value = true;
+    isToggle.value = 'edit';
 
     formState = {
-        id:record.id,
-        sysOrgCode: record.sysOrgCode,
-        formula: record.formula,
-        groupCol: record.groupCol,
-        groupRow: record.groupRow,
-        groupSheet: record.groupSheet,
-        isCompute: record.isCompute,
-        mineCells: record.mineCells,
-        sheet: record.sheet,
-        col: record.col,
-        row: record.row,
-        name: record.name
-    }
-    console.log(formState, '00000===========')
-
-}
-//删除
-async function handleDel(record) {
-    await reportDel({ id: record.id })
-    pagination.current = 1
-    getListMap()
-}
-
-//分页切换
-function pageChange(val) {
-    pagination.current = val.current
-    pagination.pageSize = val.pageSize
-    getListMap()
-}
-//获取所属部门编号列表数据
-async function queryDepartTreeSyncList() {
-    let res = await queryTreeList()
-    console.log(res, '部门编号列表--------')
-    res.forEach(el=>{
-        el.value=el.orgCode
-        el.children.forEach(v=>{
-            v.value=v.orgCode
-        })
-    })
-    sysOrgCodeList = res || []
-}
-
-//获取数据列表
-async function getListMap() {
-    let res = await listMap({ sysOrgCode: searchForm.sysOrgCode, pageNo: pagination.current, pageSize: pagination.pageSize, })
-    console.log(res, 'res=========')
+      id: record.id,
+      sysOrgCode: record.sysOrgCode,
+      formula: record.formula,
+      groupCol: record.groupCol,
+      groupRow: record.groupRow,
+      groupSheet: record.groupSheet,
+      isCompute: record.isCompute,
+      mineCells: record.mineCells,
+      sheet: record.sheet,
+      col: record.col,
+      row: record.row,
+      name: record.name,
+    };
+    console.log(formState, '00000===========');
+  }
+  //删除
+  async function handleDel(record) {
+    await reportDel({ id: record.id });
+    pagination.current = 1;
+    getListMap();
+  }
+
+  //分页切换
+  function pageChange(val) {
+    pagination.current = val.current;
+    pagination.pageSize = val.pageSize;
+    getListMap();
+  }
+  //获取所属部门编号列表数据
+  async function queryDepartTreeSyncList() {
+    let res = await queryTreeList();
+    console.log(res, '部门编号列表--------');
+    res.forEach((el) => {
+      el.value = el.orgCode;
+      el.children.forEach((v) => {
+        v.value = v.orgCode;
+      });
+    });
+    sysOrgCodeList.value = res || [];
+  }
+
+  //获取数据列表
+  async function getListMap() {
+    let res = await listMap({ sysOrgCode: searchForm.sysOrgCode, pageNo: pagination.current, pageSize: pagination.pageSize });
+    console.log(res, 'res=========');
     if (res.records && res.records.length != 0) {
-        dataSource.value = res.records
-        pagination.total = res.total
+      dataSource.value = res.records;
+      pagination.total = res.total;
     } else {
-        dataSource.value = res.records
+      dataSource.value = res.records;
     }
-}
-//查询
-function getSearch() {
-    pagination.current = 1
-    getListMap()
-}
-//重置
-function onReset() {
-    pagination.current = 1
-    searchForm.sysOrgCode = ''
-    getListMap()
-}
-
-
-onMounted(() => {
-    queryDepartTreeSyncList()
-    getListMap()
-})
-
+  }
+  //查询
+  function getSearch() {
+    pagination.current = 1;
+    getListMap();
+  }
+  //重置
+  function onReset() {
+    pagination.current = 1;
+    searchForm.sysOrgCode = '';
+    getListMap();
+  }
+
+  onMounted(() => {
+    queryDepartTreeSyncList();
+    getListMap();
+  });
 </script>
 
 <style lang="less" scoped>
-.report-map {
+  .report-map {
     position: relative;
     width: 100%;
     height: 100%;
@@ -184,24 +183,24 @@ onMounted(() => {
     box-sizing: border-box;
 
     .search-area {
-        display: flex;
-        height: 60px;
-        align-items: center;
-
+      display: flex;
+      height: 60px;
+      align-items: center;
     }
-}
+  }
 
-:deep(.zxm-select-selector) {
+  :deep(.zxm-select-selector) {
     width: 100%;
     // color: #fff;
     border: 1px solid #3ad8ff77 !important;
     background-color: #ffffff00 !important;
-}
+  }
 
-:deep(.zxm-select-selection-item) {
+  :deep(.zxm-select-selection-item) {
     color: #fff !important;
-}
+  }
 
-// :deep(.zxm-select-selection-placeholder) {
-//     color: #ccc !important;
-// }</style>
+  // :deep(.zxm-select-selection-placeholder) {
+  //     color: #ccc !important;
+  // }
+</style>