Преглед на файлове

Merge branch 'master' of http://39.97.59.228:8013/hrx/goaf-monitoring-system

lxh преди 3 месеца
родител
ревизия
c1151738a9
променени са 58 файла, в които са добавени 658 реда и са изтрити 3847 реда
  1. 1 0
      public/js/global.js
  2. 1 1
      src/api/sys/menu.ts
  3. 7 0
      src/components/Form/src/BasicForm.vue
  4. 7 0
      src/components/Form/src/TableForm.vue
  5. 109 100
      src/components/Form/src/jeecg/components/MineCascader/MineCascader.vue
  6. 2 2
      src/components/Table/src/hooks/useDataSource.ts
  7. 11 1
      src/views/analysis/warningAnalysis/autoFireAnalysis/autoFireAnalysis.data.ts
  8. 40 0
      src/views/analysis/warningAnalysis/connectAnalysis/hooks/form.ts
  9. 19 20
      src/views/analysis/warningAnalysis/connectAnalysis/index.vue
  10. 3 3
      src/views/analysis/warningAnalysis/fireAreaJudgeAnalysis/fireAreaJudgeAnalysis.data.ts
  11. 1 1
      src/views/analysis/warningAnalysis/overlimitAlarm/overlimitAlarm.data.ts
  12. 1 1
      src/views/analysis/warningAnalysis/pressureDiffAnalysis/pressureDiffAnalysis.data.ts
  13. 1 1
      src/views/analysis/warningAnalysis/sealRiskJudgeAnalysis/sealRiskJudgeAnalysis.data.ts
  14. 3 1
      src/views/dashboard/SealedGoaf/index.vue
  15. 2 0
      src/views/dashboard/basicInfo/dataQuality/components/DataQualityModal.vue
  16. 50 23
      src/views/dashboard/basicInfo/dataQuality/dataQuality.data.ts
  17. 161 47
      src/views/dashboard/basicInfo/dataQuality/index.vue
  18. 1 1
      src/views/dashboard/basicInfo/minesInfo/minesInfo.data.ts
  19. 1 0
      src/views/monitor/log/index.vue
  20. 1 0
      src/views/monitor/sealedMonitor/index.vue
  21. 48 25
      src/views/monitor/sealedMonitor/monitor.data.ts
  22. 34 1
      src/views/system/algorithm/algorithm.data.ts
  23. 1 1
      src/views/system/algorithm/index.vue
  24. 1 1
      src/views/system/checkRule/check.rule.api.ts
  25. 2 2
      src/views/system/checkRule/check.rule.data.ts
  26. 22 150
      src/views/system/departUser/components/DepartRoleAuthDrawer.vue
  27. 2 8
      src/views/system/departUser/components/DepartRoleInfoTab.vue
  28. 10 120
      src/views/system/departUser/components/DepartTree.vue
  29. 3 12
      src/views/system/departUser/components/DepartUserInfoTab.vue
  30. 1 1
      src/views/system/departUser/depart.user.api.ts
  31. 4 6
      src/views/system/departUser/depart.user.data.ts
  32. 9 8
      src/views/system/departUser/index.less
  33. 33 22
      src/views/system/departUser/index.vue
  34. 1 0
      src/views/system/dict/index.vue
  35. 0 17
      src/views/system/fillRule/FillRuleModal.vue
  36. 3 3
      src/views/system/fillRule/fill.rule.data.ts
  37. 1 0
      src/views/system/notice/index.vue
  38. 2 1
      src/views/system/role/index.vue
  39. 0 377
      src/views/system/tenant/TenantUserList.vue
  40. 0 86
      src/views/system/tenant/components/TenantInviteUserModal.vue
  41. 0 57
      src/views/system/tenant/components/TenantModal.vue
  42. 0 77
      src/views/system/tenant/components/TenantPackAllotModal.vue
  43. 0 147
      src/views/system/tenant/components/TenantRecycleBinModal.vue
  44. 0 100
      src/views/system/tenant/components/TenantUserDrawer.vue
  45. 0 109
      src/views/system/tenant/components/TenantUserList.vue
  46. 0 183
      src/views/system/tenant/components/TenantUserRightList.vue
  47. 0 159
      src/views/system/tenant/components/TenantUserSelectModal.vue
  48. 23 26
      src/views/system/tenant/index.vue
  49. 0 432
      src/views/system/tenant/my/MyTenantDetail.vue
  50. 0 170
      src/views/system/tenant/my/MyTenantList.vue
  51. 0 272
      src/views/system/tenant/pack/PackPermissionDrawer.vue
  52. 0 188
      src/views/system/tenant/pack/TenantCurrentPackList.vue
  53. 0 162
      src/views/system/tenant/pack/TenantDefaultPackList.vue
  54. 0 267
      src/views/system/tenant/pack/TenantPackList.vue
  55. 0 70
      src/views/system/tenant/pack/TenantPackMenuModal.vue
  56. 0 170
      src/views/system/tenant/pack/TenantPackUserModal.vue
  57. 9 40
      src/views/system/tenant/tenant.api.ts
  58. 27 175
      src/views/system/tenant/tenant.data.ts

+ 1 - 0
public/js/global.js

@@ -313,6 +313,7 @@ const __STATIC_ROUTES__ = [
           icon: '',
           icon: '',
           componentName: 'index',
           componentName: 'index',
           title: '地图管理',
           title: '地图管理',
+          hideMenu: true,
         },
         },
         name: 'association',
         name: 'association',
       },
       },

+ 1 - 1
src/api/sys/menu.ts

@@ -63,7 +63,7 @@ export const getMenuList: () => Promise<getMenuListResultModel> = () => {
           const template = ele.children[0];
           const template = ele.children[0];
           const routes = tree.map((d) => {
           const routes = tree.map((d) => {
             const route = generateStaticSealedMonitorRoute(template, d);
             const route = generateStaticSealedMonitorRoute(template, d);
-            route.meta.hideMenu = route.children?.length === 0;
+            // route.meta.hideMenu = route.children?.length === 0;
             return route;
             return route;
           });
           });
           ele.children.push(...routes);
           ele.children.push(...routes);

+ 7 - 0
src/components/Form/src/BasicForm.vue

@@ -452,5 +452,12 @@
         }
         }
       }
       }
     }
     }
+
+    // 使用默认定位的select dropdown内容需要强制定位以消除动态计算位置后再被Adaptive Container变形后造成的位置偏移问题
+    .ant-select-dropdown,
+    .ant-picker-dropdown {
+      left: 0px !important;
+      top: 35px !important;
+    }
   }
   }
 </style>
 </style>

+ 7 - 0
src/components/Form/src/TableForm.vue

@@ -461,5 +461,12 @@
         }
         }
       }
       }
     }
     }
+
+    // 使用默认定位的select dropdown内容需要强制定位以消除动态计算位置后再被Adaptive Container变形后造成的位置偏移问题
+    .ant-select-dropdown,
+    .ant-picker-dropdown {
+      left: 0px !important;
+      top: 35px !important;
+    }
   }
   }
 </style>
 </style>

+ 109 - 100
src/components/Form/src/jeecg/components/MineCascader/MineCascader.vue

@@ -1,9 +1,18 @@
 <template>
 <template>
-  <Cascader :value="innerValue" :options="options" placeholder="全部" :field-names="{
-    label: 'departName',
-    value: 'id',
-    children: 'childDepart',
-  }" :show-search="showSearch" :allow-clear="allowClear" :change-on-select="changeOnSelect" @change="handleChange">
+  <Cascader
+    :value="innerValue"
+    :options="options"
+    placeholder="全部"
+    :field-names="{
+      label: 'departName',
+      value: 'id',
+      children: 'childDepart',
+    }"
+    :show-search="showSearch"
+    :allow-clear="allowClear"
+    :change-on-select="changeOnSelect"
+    @change="handleChange"
+  >
     <template #displayRender="{ labels }">
     <template #displayRender="{ labels }">
       {{ labels[labels.length - 1] }}
       {{ labels[labels.length - 1] }}
     </template>
     </template>
@@ -12,111 +21,111 @@
 </template>
 </template>
 
 
 <script lang="ts">
 <script lang="ts">
-import { last } from 'lodash';
-import { defineComponent, ref, watch } from 'vue';
-// import { useMessage } from '/@/hooks/web/useMessage';
-import { propTypes } from '/@/utils/propTypes';
-import { useMineDepartmentStore } from '/@/store/modules/mine';
-import { Cascader } from 'ant-design-vue';
+  import { last } from 'lodash';
+  import { defineComponent, ref, watch } from 'vue';
+  // import { useMessage } from '/@/hooks/web/useMessage';
+  import { propTypes } from '/@/utils/propTypes';
+  import { useMineDepartmentStore } from '/@/store/modules/mine';
+  import { Cascader } from 'ant-design-vue';
 
 
-/**
- * 矿区级联选择器,该组件会根据配置从store中获取初始数据
- *
- * 组件数据流梳理:初始化数据及选项 -> 更新数据 -> 同步STORE -> 计算组件内依赖
- *
- * 本组件在初始化后不再监听STORE中的数据变化,因为这样可能导致用户通过Tabs切换时出现数据混乱
- */
-export default defineComponent({
-  name: 'MineCascader',
-  components: { Cascader },
-  props: {
-    value: propTypes.string.def(''),
-    placeholder: propTypes.string.def('全部'),
-    /** 根节点ID,如果传入,组件将过滤该节点下的节点 */
-    rootId: propTypes.string,
-    /** 是否从已存储的信息中初始化组件值 */
-    initFromStore: propTypes.bool.def(true),
-    /** 是否从将值同步至STORE */
-    syncToStore: propTypes.bool.def(true),
-    showSearch: propTypes.bool.def(true),
-    allowClear: propTypes.bool.def(true),
-    changeOnSelect: propTypes.bool.def(true),
-    // clearOnDestroy: propTypes.bool.def(false),
-  },
-  emits: ['change', 'update:value'],
-  setup(props, { emit }) {
-    // const { createMessage } = useMessage();
-    const mineStore = useMineDepartmentStore();
-    const innerValue = ref<string[]>([]);
-    const options = ref(mineStore.getDepartTree);
+  /**
+   * 矿区级联选择器,该组件会根据配置从store中获取初始数据
+   *
+   * 组件数据流梳理:初始化数据及选项 -> 更新数据 -> 同步STORE -> 计算组件内依赖
+   *
+   * 本组件在初始化后不再监听STORE中的数据变化,因为这样可能导致用户通过Tabs切换时出现数据混乱
+   */
+  export default defineComponent({
+    name: 'MineCascader',
+    components: { Cascader },
+    props: {
+      value: propTypes.string.def(''),
+      placeholder: propTypes.string.def('全部'),
+      /** 根节点ID,如果传入,组件将过滤该节点下的节点 */
+      rootId: propTypes.string,
+      /** 是否从已存储的信息中初始化组件值 */
+      initFromStore: propTypes.bool.def(true),
+      /** 是否从将值同步至STORE */
+      syncToStore: propTypes.bool.def(true),
+      showSearch: propTypes.bool.def(true),
+      allowClear: propTypes.bool.def(true),
+      changeOnSelect: propTypes.bool.def(true),
+      // clearOnDestroy: propTypes.bool.def(false),
+    },
+    emits: ['change', 'update:value'],
+    setup(props, { emit }) {
+      // const { createMessage } = useMessage();
+      const mineStore = useMineDepartmentStore();
+      const innerValue = ref<string[]>([]);
+      const options = ref(mineStore.getDepartTree);
 
 
-    // if (props.clearOnDestroy) {
-    //   const raw = getDepartId.value;
-    //   onUnmounted(() => {
-    //     mineStore.setDepartById(raw);
-    //   });
-    // }
+      // if (props.clearOnDestroy) {
+      //   const raw = getDepartId.value;
+      //   onUnmounted(() => {
+      //     mineStore.setDepartById(raw);
+      //   });
+      // }
 
 
-    if (props.rootId) {
-      options.value = mineStore.filterDepartTree((e) => e.parentId === props.rootId);
-    }
-
-    // 如果从STORE里初始化数据需要触发一次watcher以初始化组件状态
-    if (props.initFromStore) {
-      handleWatch(mineStore.getDepartId);
-      // 为了让使用该组件的各个页面能够第一时间使用到该组件传递的值,手动触发一次emit
-      handleChange([mineStore.getDepartId]);
-    } else {
-      handleWatch(props.value);
-      // 为了让使用该组件的各个页面能够第一时间使用到该组件传递的值,手动触发一次emit
-      handleChange([props.value]);
-    }
-
-    /**
-     * change事件
-     * @param e
-     */
-    function handleChange(value: any[] = []) {
-      console.log(value, 'value===')
-      if (!value.length) {
-        emit('update:value', null);
-        emit('change', null);
-      } else if (!mineStore.findDepartById(last(value), options.value)) {
-        console.warn('[Change] The value provided is not included in MineOptions');
-        const val = mineStore.calcMineCodeByDepart(options.value);
-        emit('update:value', val);
-        emit('change', val);
-      } else {
-        emit('update:value', last(value));
-        emit('change', last(value));
+      if (props.rootId) {
+        options.value = mineStore.filterDepartTree((e) => e.parentId === props.rootId);
       }
       }
-    }
 
 
-    function handleWatch(id: string = '') {
-      // rootId提供了选项过滤功能,任何传入的值都应该检查
-      if (!mineStore.findDepartById(id, options.value)) {
-        console.warn('[Watch] The id provided is not included in MineOptions');
-        innerValue.value = [];
+      // 如果从STORE里初始化数据需要触发一次watcher以初始化组件状态
+      if (props.initFromStore) {
+        handleWatch(mineStore.getDepartId);
+        // 为了让使用该组件的各个页面能够第一时间使用到该组件传递的值,手动触发一次emit
+        handleChange([mineStore.getDepartId]);
       } else {
       } else {
-        const path = mineStore.calcDepartPathById(id, options.value, (e) => e.id);
-        innerValue.value = path;
+        handleWatch(props.value);
+        // 为了让使用该组件的各个页面能够第一时间使用到该组件传递的值,手动触发一次emit
+        handleChange([props.value]);
       }
       }
 
 
-      if (props.syncToStore) {
-        mineStore.setDepartById(id);
+      /**
+       * change事件
+       * @param e
+       */
+      function handleChange(value: any[] = []) {
+        if (!mineStore.findDepartById(last(value), options.value)) {
+          console.warn('[Change] The value provided is not included in MineOptions');
+          const val = mineStore.calcMineCodeByDepart(options.value);
+          emit('update:value', val);
+          emit('change', val);
+        } else {
+          emit('update:value', last(value));
+          emit('change', last(value));
+        }
       }
       }
 
 
-      const path = mineStore.calcDepartPathById(id, options.value, (e) => e.id);
-      innerValue.value = path;
-    }
+      function handleWatch(id: string = '') {
+        if (id === '') {
+          // 当监听到的数据为空时,99%的情况是外部操作导致,因此触发一次 change -> watch
+          return handleChange([]);
+        }
+        // rootId提供了选项过滤功能,任何传入的值都应该检查
+        if (!mineStore.findDepartById(id, options.value)) {
+          console.warn('[Watch] The id provided is not included in MineOptions');
+          innerValue.value = [];
+        } else {
+          const path = mineStore.calcDepartPathById(id, options.value, (e) => e.id);
+          innerValue.value = path;
+        }
+
+        if (props.syncToStore) {
+          mineStore.setDepartById(id);
+        }
+
+        const path = mineStore.calcDepartPathById(id, options.value, (e) => e.id);
+        innerValue.value = path;
+      }
 
 
-    watch(() => props.value, handleWatch);
+      watch(() => props.value, handleWatch);
 
 
-    return {
-      innerValue,
-      options,
-      handleChange,
-    };
-  },
-});
+      return {
+        innerValue,
+        options,
+        handleChange,
+      };
+    },
+  });
 </script>
 </script>

+ 2 - 2
src/components/Table/src/hooks/useDataSource.ts

@@ -262,7 +262,7 @@ export function useDataSource(
       // 代码逻辑说明: 【QQYUN-8316】table查询条件,请求剔除空字符串字段
       // 代码逻辑说明: 【QQYUN-8316】table查询条件,请求剔除空字符串字段
       for (const item of Object.entries(params)) {
       for (const item of Object.entries(params)) {
         const [key, val] = item;
         const [key, val] = item;
-        if (val === '') {
+        if (val === '' || val === undefined) {
           delete params[key];
           delete params[key];
         }
         }
       }
       }
@@ -314,7 +314,7 @@ export function useDataSource(
   }
   }
 
 
   function setTableData<T = Recordable>(values: T[]) {
   function setTableData<T = Recordable>(values: T[]) {
-    dataSourceRef.value = values;
+    dataSourceRef.value = values as any;
   }
   }
 
 
   function getDataSource<T = Recordable>() {
   function getDataSource<T = Recordable>() {

+ 11 - 1
src/views/analysis/warningAnalysis/autoFireAnalysis/autoFireAnalysis.data.ts

@@ -51,6 +51,16 @@ export const columns: BasicColumn[] = [
     dataIndex: 'coalSeamLevel',
     dataIndex: 'coalSeamLevel',
     width: 100,
     width: 100,
   },
   },
+  {
+    title: 'C2H4(ppm)',
+    dataIndex: 'c2h4Val',
+    width: 100,
+  },
+  {
+    title: 'C2H2(ppm)',
+    dataIndex: 'c2h2Val',
+    width: 100,
+  },
   {
   {
     title: 'CO浓度(ppm)',
     title: 'CO浓度(ppm)',
     dataIndex: 'coVal',
     dataIndex: 'coVal',
@@ -160,7 +170,7 @@ export const searchFormSchema: FormSchema[] = [
   },
   },
   {
   {
     field: 'riskLevel',
     field: 'riskLevel',
-    label: '自燃情况',
+    label: '自燃倾向性',
     component: 'Select',
     component: 'Select',
     componentProps: {
     componentProps: {
       options: [
       options: [

+ 40 - 0
src/views/analysis/warningAnalysis/connectAnalysis/hooks/form.ts

@@ -0,0 +1,40 @@
+import { ref } from 'vue';
+import { useRoute } from 'vue-router';
+import { getGoafSelectOption } from '/@/views/monitor/sealedMonitor/monitor.api';
+
+export function useInitForm() {
+  // const mineStore = useMineDepartmentStore();
+  const route = useRoute();
+  const loading = ref(false);
+  const innerValue = ref<string>((route.query.mineCode as string) || '');
+  // 给历史数据默认填充的矿码
+
+  if (innerValue.value) {
+    // mineStore.setDepartById(code as string);
+    initGoafOptions(innerValue);
+  }
+
+  // 采空区选择器
+  const goafId = ref('');
+  const goafOptions = ref<any[]>([]);
+
+  function initGoafOptions(mineCode) {
+    loading.value = true;
+    return getGoafSelectOption({ mineCode })
+      .then(({ options, defaultValue }) => {
+        goafOptions.value = options;
+        goafId.value = defaultValue;
+      })
+      .finally(() => {
+        loading.value = false;
+      });
+  }
+
+  return {
+    goafOptions,
+    goafId,
+    innerValue,
+    loading,
+    initGoafOptions,
+  };
+}

+ 19 - 20
src/views/analysis/warningAnalysis/connectAnalysis/index.vue

@@ -23,7 +23,7 @@
           <div class="filter-section param-section">
           <div class="filter-section param-section">
             <span class="filter-label">密闭名称:</span>
             <span class="filter-label">密闭名称:</span>
             <Select ref="select" v-model:value="goafId" style="width: 300px" placeholder="请选择老空区">
             <Select ref="select" v-model:value="goafId" style="width: 300px" placeholder="请选择老空区">
-              <SelectOption v-for="(item, index) in goafOption" :key="index" :value="item.value">{{ item.label }} </SelectOption>
+              <SelectOption v-for="(item, index) in goafOptions" :key="index" :value="item.value">{{ item.label }} </SelectOption>
             </Select>
             </Select>
           </div>
           </div>
         </Col>
         </Col>
@@ -42,7 +42,7 @@
         </Col>
         </Col>
         <Col :span="2">
         <Col :span="2">
           <div class="filter-section">
           <div class="filter-section">
-            <Button type="primary" @click="generateChart">
+            <Button type="primary" @click="generateChart" :loading="loading">
               <template #icon>
               <template #icon>
                 <SvgIcon style="margin-right: 10px" name="shencen" />
                 <SvgIcon style="margin-right: 10px" name="shencen" />
               </template>
               </template>
@@ -82,20 +82,20 @@
   import echartLengend from './components/echart-lengend.vue';
   import echartLengend from './components/echart-lengend.vue';
   import echartContent from './components/echart-content.vue';
   import echartContent from './components/echart-content.vue';
   import echartDivder from './components/echart-divder.vue';
   import echartDivder from './components/echart-divder.vue';
-  import { getGoafHistory, getGoafList } from './connectAnalysis.api';
+  import { getGoafHistory } from './connectAnalysis.api';
   import { useRouter } from 'vue-router';
   import { useRouter } from 'vue-router';
   import { useMineDepartmentStore } from '/@/store/modules/mine';
   import { useMineDepartmentStore } from '/@/store/modules/mine';
   import { SvgIcon } from '/@/components/Icon';
   import { SvgIcon } from '/@/components/Icon';
+  import { useInitForm } from './hooks/form';
+
+  const { goafOptions, goafId, innerValue, loading, initGoafOptions } = useInitForm();
 
 
   // 组件注册
   // 组件注册
   const RangePicker: any = DatePicker.RangePicker;
   const RangePicker: any = DatePicker.RangePicker;
   const { currentRoute } = useRouter();
   const { currentRoute } = useRouter();
   // 筛选相关响应式数据
   // 筛选相关响应式数据
   const dateRange = ref([dayjs().add(-30, 'day'), dayjs()]); // 默认时间范围(近1天)
   const dateRange = ref([dayjs().add(-30, 'day'), dayjs()]); // 默认时间范围(近1天)
-  const goafId = ref(''); //采空区id
-  const goafOption = ref<any[]>([]); //采空区列表
   const mineStore = useMineDepartmentStore();
   const mineStore = useMineDepartmentStore();
-  const innerValue = ref('');
   const checkList = ref<any[]>(['coVal', 'ch4Val', 'c2h4Val', 'c2h2Val', 'co2Val', 'o2Val', 'sourcePressure', 'temperature']); //当前选中要进行显示的选项
   const checkList = ref<any[]>(['coVal', 'ch4Val', 'c2h4Val', 'c2h2Val', 'co2Val', 'o2Val', 'sourcePressure', 'temperature']); //当前选中要进行显示的选项
   const echartData = reactive({
   const echartData = reactive({
     xData: [] as any,
     xData: [] as any,
@@ -104,9 +104,8 @@
 
 
   //煤矿选项切换
   //煤矿选项切换
   function changeCascader(val) {
   function changeCascader(val) {
-    console.log(val, '111---');
     innerValue.value = val;
     innerValue.value = val;
-    getGoafListData();
+    initGoafOptions(val);
   }
   }
   //时间选择选项切换
   //时间选择选项切换
   function changeTime(val) {
   function changeTime(val) {
@@ -142,18 +141,18 @@
   }
   }
 
 
   //获取采空区列表
   //获取采空区列表
-  async function getGoafListData() {
-    let res = await getGoafList({ mineCode: innerValue.value });
-    console.log(res, '90');
-    goafOption.value =
-      res.map((el) => {
-        return {
-          label: el.devicePos,
-          value: el.id,
-        };
-      }) || [];
-    goafId.value = goafOption.value.length ? (goafId.value ? goafId.value : goafOption.value[0]['value']) : '';
-  }
+  // async function getGoafListData() {
+  //   let res = await getGoafList({ mineCode: innerValue.value });
+  //   console.log(res, '90');
+  //   goafOption.value =
+  //     res.map((el) => {
+  //       return {
+  //         label: el.devicePos,
+  //         value: el.id,
+  //       };
+  //     }) || [];
+  //   goafId.value = goafOption.value.length ? (goafId.value ? goafId.value : goafOption.value[0]['value']) : '';
+  // }
 
 
   onMounted(async () => {
   onMounted(async () => {
     const mineCode = currentRoute.value['query']['mineCode']; //传递过来的矿ID
     const mineCode = currentRoute.value['query']['mineCode']; //传递过来的矿ID

+ 3 - 3
src/views/analysis/warningAnalysis/fireAreaJudgeAnalysis/fireAreaJudgeAnalysis.data.ts

@@ -88,10 +88,10 @@ export const columns: BasicColumn[] = [
     // 自定义渲染函数,计算并显示天数差
     // 自定义渲染函数,计算并显示天数差
     customRender: ({ record }) => {
     customRender: ({ record }) => {
       // 校验预警时间是否存在
       // 校验预警时间是否存在
-      if (!record?.createTime) {
+      if (!record?.updateTime) {
         return '0';
         return '0';
       }
       }
-      const alarmDate = new Date(record.createTime);
+      const alarmDate = new Date(record.updateTime);
       alarmDate.setHours(0, 0, 0, 0);
       alarmDate.setHours(0, 0, 0, 0);
       const alarmTime = alarmDate.getTime();
       const alarmTime = alarmDate.getTime();
       if (isNaN(alarmTime)) {
       if (isNaN(alarmTime)) {
@@ -178,7 +178,7 @@ export const searchFormSchema: FormSchema[] = [
   },
   },
   {
   {
     field: 'riskLevel',
     field: 'riskLevel',
-    label: '自燃情况',
+    label: '自燃倾向性',
     component: 'Select',
     component: 'Select',
     componentProps: {
     componentProps: {
       options: [
       options: [

+ 1 - 1
src/views/analysis/warningAnalysis/overlimitAlarm/overlimitAlarm.data.ts

@@ -150,7 +150,7 @@ export const searchFormSchema: FormSchema[] = [
   },
   },
   {
   {
     field: 'riskLevel',
     field: 'riskLevel',
-    label: '自燃情况',
+    label: '自燃倾向性',
     component: 'Select',
     component: 'Select',
     componentProps: {
     componentProps: {
       options: [
       options: [

+ 1 - 1
src/views/analysis/warningAnalysis/pressureDiffAnalysis/pressureDiffAnalysis.data.ts

@@ -151,7 +151,7 @@ export const searchFormSchema: FormSchema[] = [
   },
   },
   {
   {
     field: 'riskLevel',
     field: 'riskLevel',
-    label: '自燃情况',
+    label: '自燃倾向性',
     component: 'Select',
     component: 'Select',
     componentProps: {
     componentProps: {
       options: [
       options: [

+ 1 - 1
src/views/analysis/warningAnalysis/sealRiskJudgeAnalysis/sealRiskJudgeAnalysis.data.ts

@@ -154,7 +154,7 @@ export const searchFormSchema: FormSchema[] = [
   },
   },
   {
   {
     field: 'riskLevel',
     field: 'riskLevel',
-    label: '自燃情况',
+    label: '自燃倾向性',
     component: 'Select',
     component: 'Select',
     componentProps: {
     componentProps: {
       options: [
       options: [

+ 3 - 1
src/views/dashboard/SealedGoaf/index.vue

@@ -47,7 +47,9 @@
       mineData.value = { coalSeamFireData, productionStatusData, overLimitData, goafAlarmData, goafAlarmLevel };
       mineData.value = { coalSeamFireData, productionStatusData, overLimitData, goafAlarmData, goafAlarmLevel };
 
 
       // 4. 赋值更新后的配置到configs(触发组件重新渲染)
       // 4. 赋值更新后的配置到configs(触发组件重新渲染)
-      configs.value = [...testConfigSealedGoaf]; // 解构触发响应式更新
+      if (configs.value.length === 0) {
+        configs.value = [...testConfigSealedGoaf]; // 解构触发响应式更新
+      }
 
 
       // 5. 更新页面数据
       // 5. 更新页面数据
       updateData(mineData.value);
       updateData(mineData.value);

+ 2 - 0
src/views/dashboard/basicInfo/dataQuality/components/DataQualityModal.vue

@@ -8,6 +8,7 @@
     :min-height="600"
     :min-height="600"
     :max-height="1000"
     :max-height="1000"
     scrollable
     scrollable
+    centered
     destroyOnClose
     destroyOnClose
     :bodyStyle="{ padding: '20px' }"
     :bodyStyle="{ padding: '20px' }"
   >
   >
@@ -372,6 +373,7 @@ async function handleSubmit() {
     const now = dayjs().format('YYYY-MM-DD HH:mm:ss');
     const now = dayjs().format('YYYY-MM-DD HH:mm:ss');
     const result = {
     const result = {
       ...currentRecord.value,
       ...currentRecord.value,
+      mineCode: formData.mineCode,
       queJson: JSON.stringify(submitQueList),
       queJson: JSON.stringify(submitQueList),
       createTime: mode.value === 'add' ? now : (currentRecord.value.createTime || now),
       createTime: mode.value === 'add' ? now : (currentRecord.value.createTime || now),
       updateTime: now,
       updateTime: now,

+ 50 - 23
src/views/dashboard/basicInfo/dataQuality/dataQuality.data.ts

@@ -1,6 +1,7 @@
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { h } from 'vue';
 import { h } from 'vue';
 import { Ref } from 'vue';
 import { Ref } from 'vue';
+import dayjs from 'dayjs';
 
 
 // 1. 颜色映射(固定规则,可根据业务调整)
 // 1. 颜色映射(固定规则,可根据业务调整)
 export const colorHexMap: Record<string, string> = {
 export const colorHexMap: Record<string, string> = {
@@ -9,15 +10,18 @@ export const colorHexMap: Record<string, string> = {
   gold: '#faad14',
   gold: '#faad14',
   red: '#f5222d',
   red: '#f5222d',
   gray: '#8c8c8c',
   gray: '#8c8c8c',
-  black: '#000000', 
+  black: '#000000',
 };
 };
 
 
 // 2. 定义动态映射的类型(供外部传入)
 // 2. 定义动态映射的类型(供外部传入)
-export type ProductionStatusMap = Record<string | number, { 
-  label: string; 
-  value: number | string; 
-  color: string; 
-}>;
+export type ProductionStatusMap = Record<
+  string | number,
+  {
+    label: string;
+    value: number | string;
+    color: string;
+  }
+>;
 
 
 // 3. 生成表格列(支持传入动态映射)
 // 3. 生成表格列(支持传入动态映射)
 export function getColumns(dynamicStatusMap: Ref<ProductionStatusMap>) {
 export function getColumns(dynamicStatusMap: Ref<ProductionStatusMap>) {
@@ -41,12 +45,16 @@ export function getColumns(dynamicStatusMap: Ref<ProductionStatusMap>) {
         // 空值/异常值处理
         // 空值/异常值处理
         const status = record.mineProStatus;
         const status = record.mineProStatus;
         // 从动态映射中取值,兜底未知状态
         // 从动态映射中取值,兜底未知状态
-        const { label, color } = dynamicStatusMap.value[status] || { 
-          label: '-', 
+        const { label, color } = dynamicStatusMap.value[status] || {
+          label: '-',
         };
         };
-        return h('span', { 
-          style: { color: colorHexMap[color] } 
-        }, label);
+        return h(
+          'span',
+          {
+            style: { color: colorHexMap[color] },
+          },
+          label
+        );
       },
       },
     },
     },
     {
     {
@@ -130,7 +138,7 @@ export function getSearchFormSchema(dynamicStatusOptions: Ref<{ label: string; v
   ];
   ];
   return searchFormSchema;
   return searchFormSchema;
 }
 }
-export const topFormSchema :FormSchema[] = [
+export const topFormSchema: FormSchema[] = [
   {
   {
     field: 'mineCode',
     field: 'mineCode',
     label: '煤矿名称',
     label: '煤矿名称',
@@ -138,17 +146,15 @@ export const topFormSchema :FormSchema[] = [
     componentProps: {
     componentProps: {
       changeOnSelect: false,
       changeOnSelect: false,
       initFromStore: false,
       initFromStore: false,
-      syncToStore: false
+      syncToStore: false,
     },
     },
     required: true,
     required: true,
-    rules: [
-      { required: true, message: '请选择煤矿名称', trigger: 'change' },
-    ],
+    rules: [{ required: true, message: '请选择煤矿名称', trigger: 'change' }],
   },
   },
 ];
 ];
 
 
 /** 弹框表单配置 */
 /** 弹框表单配置 */
-export const formSchema :FormSchema[] = [
+export const formSchema: FormSchema[] = [
   {
   {
     field: 'goafName',
     field: 'goafName',
     label: '工作面名称',
     label: '工作面名称',
@@ -168,9 +174,7 @@ export const formSchema :FormSchema[] = [
       format: 'YYYY-MM-DD HH:mm:ss',
       format: 'YYYY-MM-DD HH:mm:ss',
     },
     },
     required: true,
     required: true,
-    rules: [
-      { required: true, message: '请选择开始时间', trigger: 'change' },
-    ],
+    rules: [{ required: true, message: '请选择开始时间', trigger: 'blur' }],
   },
   },
   {
   {
     field: 'endTime',
     field: 'endTime',
@@ -181,9 +185,7 @@ export const formSchema :FormSchema[] = [
       format: 'YYYY-MM-DD HH:mm:ss',
       format: 'YYYY-MM-DD HH:mm:ss',
     },
     },
     required: true,
     required: true,
-    rules: [
-      { required: true, message: '请选择结束时间', trigger: 'change' },
-    ],
+    rules: [{ required: true, message: '请选择结束时间', trigger: 'blur' }],
   },
   },
   {
   {
     field: 'queCon',
     field: 'queCon',
@@ -211,3 +213,28 @@ export const formSchema :FormSchema[] = [
   //   ],
   //   ],
   // },
   // },
 ];
 ];
+
+export const exportFormSchema: FormSchema[] = [
+  {
+    field: 'startTime',
+    label: '开始时间',
+    component: 'DatePicker',
+    componentProps: {
+      showTime: true,
+      format: 'YYYY-MM-DD HH:mm:ss',
+    },
+    required: true,
+    rules: [{ required: true, message: '请选择开始时间', trigger: 'blur' }],
+  },
+  {
+    field: 'endTime',
+    label: '结束时间',
+    component: 'DatePicker',
+    componentProps: {
+      showTime: true,
+      format: 'YYYY-MM-DD HH:mm:ss',
+    },
+    required: true,
+    rules: [{ required: true, message: '请选择结束时间', trigger: 'blur' }],
+  },
+];

+ 161 - 47
src/views/dashboard/basicInfo/dataQuality/index.vue

@@ -6,11 +6,8 @@
       <BasicTable style="padding: 0" @register="registerUnresolvedTable">
       <BasicTable style="padding: 0" @register="registerUnresolvedTable">
         <template #resetBefore>
         <template #resetBefore>
           <a-button type="primary" class="ml-8px" preIcon="mdi:page-next-outline" @click="handleOpenModal({}, 'add')"> 新增问题 </a-button>
           <a-button type="primary" class="ml-8px" preIcon="mdi:page-next-outline" @click="handleOpenModal({}, 'add')"> 新增问题 </a-button>
-          <a-button type="default" class="ml-8px" preIcon="mdi:download" @click="onExportXlsA"> 导出 </a-button>
+          <a-button type="default" class="ml-8px" preIcon="mdi:download" @click="handleOpenExportModal('unresolved')"> 导出 </a-button>
         </template>
         </template>
-        <!-- <template #submitBefore>
-          <a-button type="primary" preIcon="mdi:page-next-outline" @click="handleOpenModal({}, 'add')"> 新增问题 </a-button>
-        </template> -->
         <template #queJson="{ record }">
         <template #queJson="{ record }">
           <div style="display: flex; align-items: center; gap: 8px; width: 100%; justify-content: space-between">
           <div style="display: flex; align-items: center; gap: 8px; width: 100%; justify-content: space-between">
             <span style="white-space: pre-line; word-wrap: break-word; line-height: 1.6; display: block; text-align: left; padding: 2px 4px">
             <span style="white-space: pre-line; word-wrap: break-word; line-height: 1.6; display: block; text-align: left; padding: 2px 4px">
@@ -61,14 +58,13 @@
     <TabPane key="resolved" tab="已解决">
     <TabPane key="resolved" tab="已解决">
       <BasicTable style="padding: 0" @register="registerResolvedTable">
       <BasicTable style="padding: 0" @register="registerResolvedTable">
         <template #resetBefore>
         <template #resetBefore>
-          <a-button type="default" class="ml-8px" preIcon="mdi:download" @click="onExportXlsB"> 导出 </a-button>
+          <a-button type="default" class="ml-8px" preIcon="mdi:download" @click="handleOpenExportModal('resolved')"> 导出 </a-button>
         </template>
         </template>
         <template #queJson="{ record }">
         <template #queJson="{ record }">
           <div style="display: flex; align-items: center; gap: 8px; width: 100%">
           <div style="display: flex; align-items: center; gap: 8px; width: 100%">
             <span style="flex: 1; text-align: center">
             <span style="flex: 1; text-align: center">
               {{ record?.queJson ? formatQueJson(record.queJson) : '' }}
               {{ record?.queJson ? formatQueJson(record.queJson) : '' }}
             </span>
             </span>
-            <!-- 按钮:无需额外样式,自然靠最右侧 -->
             <button @click="record && handleOpenModal(record, 'view')" class="action-btn" title="查看问题详情">
             <button @click="record && handleOpenModal(record, 'view')" class="action-btn" title="查看问题详情">
               <SvgIcon name="view" />
               <SvgIcon name="view" />
             </button>
             </button>
@@ -85,22 +81,63 @@
 
 
   <!-- 处理弹框 -->
   <!-- 处理弹框 -->
   <DataQualityModal @register="registerModal" @success="handleModalSuccess" />
   <DataQualityModal @register="registerModal" @success="handleModalSuccess" />
+
+  <!-- 导出时间选择Modal-->
+  <Modal
+    v-model:open="exportModalVisible"
+    title="选择导出时间范围"
+    :width="600"
+    @ok="handleExportConfirm"
+    @cancel="handleExportCancel"
+    okText="确认导出"
+    cancelText="取消"
+    centered
+    :confirm-loading="exportConfirmLoading"
+    destroyOnClose
+    :bodyStyle="{ padding: '20px' }"
+  >
+    <a-form
+      ref="exportFormRef"
+      :model="exportFormData"
+      :rules="exportFormRules"
+      layout="horizontal"
+      :label-col="{ span: 6 }"
+      :wrapper-col="{ span: 18 }"
+    >
+      <a-form-item
+        v-for="schema in exportFormSchema"
+        :key="schema.field"
+        :name="schema.field"
+        :label="schema.label"
+        :rules="schema.rules"
+      >
+        <component
+          :is="getExportFormComponent(schema.component)"
+          v-model:value="exportFormData[schema.field]"
+          v-bind="schema.componentProps"
+          :placeholder="`请选择${schema.label}`"
+          style="width: 100%"
+        />
+      </a-form-item>
+    </a-form>
+  </Modal>
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-  import { ref, nextTick, computed, onMounted } from 'vue';
+  import { ref, nextTick, computed, onMounted, reactive } from 'vue';
   import { useRouter } from 'vue-router';
   import { useRouter } from 'vue-router';
-  import { BasicTable } from '/@/components/Table';
+  import { BasicTable, } from '/@/components/Table';
   import { useModal } from '/@/components/Modal';
   import { useModal } from '/@/components/Modal';
-  import { Tabs, TabPane, Popconfirm, message } from 'ant-design-vue';
+  import { Tabs, TabPane, Popconfirm, message, Modal, DatePicker } from 'ant-design-vue';
+  import type { FormInstance } from 'ant-design-vue/es/form';
   import DataQualityModal from './components/DataQualityModal.vue';
   import DataQualityModal from './components/DataQualityModal.vue';
   import { SvgIcon } from '/@/components/Icon';
   import { SvgIcon } from '/@/components/Icon';
-  import { getColumns, getSearchFormSchema, type ProductionStatusMap } from './dataQuality.data';
+  import { getColumns, getSearchFormSchema, type ProductionStatusMap, exportFormSchema } from './dataQuality.data';
   import { getDataQuaQueList, addDataQuaQue, deleteDataQuaQue, editDataQuaQue } from '../basicInfo.api';
   import { getDataQuaQueList, addDataQuaQue, deleteDataQuaQue, editDataQuaQue } from '../basicInfo.api';
   import { findNode } from '/@/utils/helper/treeHelper';
   import { findNode } from '/@/utils/helper/treeHelper';
   import { useMineDepartmentStore } from '/@/store/modules/mine';
   import { useMineDepartmentStore } from '/@/store/modules/mine';
   import { getDictItemsByCode } from '/@/utils/dict';
   import { getDictItemsByCode } from '/@/utils/dict';
-  import dayjs from 'dayjs';
+  import dayjs, { Dayjs } from 'dayjs';
   import { useListPage } from '/@/hooks/system/useListPage';
   import { useListPage } from '/@/hooks/system/useListPage';
 
 
   // 路由实例
   // 路由实例
@@ -110,6 +147,43 @@
   // 响应式数据
   // 响应式数据
   const activeKey = ref('unresolved'); // 激活的Tab键
   const activeKey = ref('unresolved'); // 激活的Tab键
   const pageMode = ref('add');
   const pageMode = ref('add');
+  
+  // 导出Modal相关状态
+  const exportModalVisible = ref(false);
+  const exportFormRef = ref<FormInstance>();
+  const exportConfirmLoading = ref(false);
+  const exportType = ref<'resolved' | 'unresolved'>('unresolved'); // 记录当前导出类型
+  const exportConfig = ref({
+    url: '/province/dataQuaQue/exportDataQuaQueList',
+    name: '数据质量',
+    params: {
+      isOk: 0,
+      startTime: '',
+      endTime: '',
+    },
+  });
+
+  // 导出表单数据和规则(参考DataQualityModal写法)
+  const exportFormData = reactive({
+    startTime: null as Dayjs | null,
+    endTime: null as Dayjs | null,
+  });
+
+  // 提取导出表单规则(从exportFormSchema)
+  const exportFormRules = reactive({
+    startTime: exportFormSchema.find(item => item.field === 'startTime')?.rules || [],
+    endTime: exportFormSchema.find(item => item.field === 'endTime')?.rules || [],
+  });
+
+  // 导出表单组件映射
+  const exportFormComponentMap = {
+    DatePicker,
+  };
+
+  // 获取导出表单组件
+  const getExportFormComponent = (componentName: string) => {
+    return exportFormComponentMap[componentName as keyof typeof exportFormComponentMap];
+  };
 
 
   // ========== 定义动态状态映射/下拉选项 ==========
   // ========== 定义动态状态映射/下拉选项 ==========
   // 1. 动态生产状态映射(key: 状态value,value: 包含label/color的配置)
   // 1. 动态生产状态映射(key: 状态value,value: 包含label/color的配置)
@@ -183,7 +257,6 @@
       indexColumnProps: {
       indexColumnProps: {
         title: '序号',
         title: '序号',
       },
       },
-      // canResize: false,
       actionColumn: {
       actionColumn: {
         width: 200,
         width: 200,
         title: '操作',
         title: '操作',
@@ -192,19 +265,13 @@
       },
       },
       immediate: false, // 先不立即加载,等状态数据获取后再加载
       immediate: false, // 先不立即加载,等状态数据获取后再加载
     },
     },
-    exportConfig: {
-      url: '/province/dataQuaQue/exportDataQuaQueList',
-      name: '数据质量',
-      params: {
-        isOk: 0,
-      },
-    },
+    exportConfig: exportConfig.value,
   });
   });
 
 
   const [registerUnresolvedTable, { reload: reloadUnresolved }] = tableContextA;
   const [registerUnresolvedTable, { reload: reloadUnresolved }] = tableContextA;
 
 
   // 已解决表格注册
   // 已解决表格注册
-  const { tableContext: tableContextB, onExportXls: onExportXlsB } = useListPage({
+  const { tableContext: tableContextB, onExportXls: onExportXlsB  } = useListPage({
     tableProps: {
     tableProps: {
       api: async (params: any) => {
       api: async (params: any) => {
         return await getDataQuaQueList({ ...params, isOk: true });
         return await getDataQuaQueList({ ...params, isOk: true });
@@ -219,7 +286,6 @@
       useSearchForm: true,
       useSearchForm: true,
       pagination: true,
       pagination: true,
       striped: true,
       striped: true,
-      // bordered: true,
       showIndexColumn: false,
       showIndexColumn: false,
       indexColumnProps: {
       indexColumnProps: {
         title: '序号',
         title: '序号',
@@ -232,13 +298,7 @@
       },
       },
       immediate: false, // 先不立即加载
       immediate: false, // 先不立即加载
     },
     },
-    exportConfig: {
-      url: '/province/dataQuaQue/exportDataQuaQueList',
-      name: '数据质量',
-      params: {
-        isOk: 1,
-      },
-    },
+    exportConfig: exportConfig.value,
   });
   });
 
 
   const [registerResolvedTable, { reload: reloadResolved }] = tableContextB;
   const [registerResolvedTable, { reload: reloadResolved }] = tableContextB;
@@ -246,6 +306,77 @@
   // 弹框注册
   // 弹框注册
   const [registerModal, { openModal }] = useModal();
   const [registerModal, { openModal }] = useModal();
 
 
+  /**
+   * 打开导出时间选择Modal
+   * @param type 导出类型:resolved 或 unresolved
+   */
+  function handleOpenExportModal(type: 'resolved' | 'unresolved') {
+    exportType.value = type;
+    exportModalVisible.value = true;
+    // 打开Modal时重置表单
+    nextTick(() => {
+      exportFormRef.value?.resetFields();
+      exportFormData.startTime = null;
+      exportFormData.endTime = null;
+    });
+  }
+
+  /**
+   * 导出Modal确认处理
+   */
+  async function handleExportConfirm() {
+    try {
+      exportConfirmLoading.value = true;
+      // 表单校验(参考DataQualityModal的校验方式)
+      if (!exportFormRef.value) return;
+      const validateResult = await exportFormRef.value.validate();
+      if (!validateResult) return;
+
+      // 格式化时间
+      const startTime = exportFormData.startTime?.format('YYYY-MM-DD HH:mm:ss') || '';
+      const endTime = exportFormData.endTime?.format('YYYY-MM-DD HH:mm:ss') || '';
+
+      // 校验时间逻辑(结束时间不能早于开始时间)
+      if (exportFormData.startTime && exportFormData.endTime && dayjs(endTime).isBefore(dayjs(startTime))) {
+        message.error('结束时间不能早于开始时间');
+        return;
+      }
+
+      // 根据类型选择对应的exportConfig和导出方法
+      exportConfig.value.params = {
+        isOk: exportType.value === 'resolved' ? 1 : 0,
+        startTime,
+        endTime,
+      };
+
+      if (exportType.value === 'unresolved') {
+        await onExportXlsA();
+      } else {
+        await onExportXlsB();
+      }
+
+      // 关闭Modal
+      exportModalVisible.value = false;
+      message.success('导出请求已发送,请注意查收文件');
+    } catch (error: any) {
+      console.error('导出失败:', error);
+      message.error(error.message || '导出失败,请检查表单填写是否正确');
+    } finally {
+      exportConfirmLoading.value = false;
+    }
+  }
+
+  /**
+   * 导出Modal取消处理
+   */
+  function handleExportCancel() {
+    exportModalVisible.value = false;
+    // 取消时重置表单
+    exportFormRef.value?.resetFields();
+    exportFormData.startTime = null;
+    exportFormData.endTime = null;
+  }
+
   // 解析queJson并拼接orderNum+queCon的辅助函数
   // 解析queJson并拼接orderNum+queCon的辅助函数
   function formatQueJson(queJsonStr: string) {
   function formatQueJson(queJsonStr: string) {
     // 空值处理
     // 空值处理
@@ -309,17 +440,6 @@
     await safeReloadActiveTable();
     await safeReloadActiveTable();
   }
   }
 
 
-  /**
-   * 根据标签获取表格数据(已解决/未解决)
-   * @param result 弹框数据
-   */
-  // function getQuaQueListByTab() {
-  //   return async (params: any) => {
-  //     const isOk = activeKey.value === 'resolved' ? true : false;
-  //     return await getDataQuaQueList({ ...params, isOk: isOk });
-  //   };
-  // }
-
   /**
   /**
    * 打开弹框函数
    * 打开弹框函数
    * @param result 弹框数据
    * @param result 弹框数据
@@ -413,8 +533,10 @@
     try {
     try {
       await editDataQuaQue(copyRecord);
       await editDataQuaQue(copyRecord);
       await safeReloadActiveTable();
       await safeReloadActiveTable();
+      message.success('标记为已解决成功');
     } catch (error) {
     } catch (error) {
       console.error('操作失败:', error);
       console.error('操作失败:', error);
+      message.error('操作失败,请稍后重试');
     }
     }
   }
   }
 
 
@@ -426,14 +548,6 @@
 </script>
 </script>
 
 
 <style scoped lang="less">
 <style scoped lang="less">
-  // .data-quality-page {
-  //   padding: 0 12px;
-  //   margin: 16px;
-  //   border: 1px solid @border-color-base;
-  //   .ant-form {
-  //     background-color: #fff;
-  //   }
-  // }
   .form-part {
   .form-part {
     padding: 12px 10px 6px 10px;
     padding: 12px 10px 6px 10px;
     margin-bottom: 8px;
     margin-bottom: 8px;

+ 1 - 1
src/views/dashboard/basicInfo/minesInfo/minesInfo.data.ts

@@ -70,7 +70,7 @@ export function getColumns(dynamicStatusMap: Ref<ProductionStatusMap>): BasicCol
       },
       },
     },
     },
     {
     {
-      title: '自燃情况',
+      title: '自燃倾向性',
       dataIndex: 'alarmLevel',
       dataIndex: 'alarmLevel',
       width: 100,
       width: 100,
     },
     },

+ 1 - 0
src/views/monitor/log/index.vue

@@ -61,6 +61,7 @@
       },
       },
       formConfig: {
       formConfig: {
         schemas: searchSchema,
         schemas: searchSchema,
+        schemaGroupNames: ['常规查询'],
         fieldMapToTime: [['fieldTime', ['createTime_begin', 'createTime_end'], 'YYYY-MM-DD']],
         fieldMapToTime: [['fieldTime', ['createTime_begin', 'createTime_end'], 'YYYY-MM-DD']],
       },
       },
     },
     },

+ 1 - 0
src/views/monitor/sealedMonitor/index.vue

@@ -72,6 +72,7 @@
             label: '煤矿名称',
             label: '煤矿名称',
             component: 'MineCascader',
             component: 'MineCascader',
             colProps: { span: 6 },
             colProps: { span: 6 },
+            required: true,
             componentProps: {
             componentProps: {
               initFromStore: false,
               initFromStore: false,
               syncToStore: false,
               syncToStore: false,

+ 48 - 25
src/views/monitor/sealedMonitor/monitor.data.ts

@@ -5,6 +5,7 @@ import { TreeItem } from '/@/components/Tree/index';
 import { ModuleDataChart } from '/@/components/Configurable/types';
 import { ModuleDataChart } from '/@/components/Configurable/types';
 import { h } from 'vue';
 import { h } from 'vue';
 import { StatusColorEnum } from '/@/enums/jeecgEnum';
 import { StatusColorEnum } from '/@/enums/jeecgEnum';
+import { getDictItemsByCode } from '/@/utils/dict';
 
 
 const riskMap = {
 const riskMap = {
   '1': '低风险',
   '1': '低风险',
@@ -13,6 +14,8 @@ const riskMap = {
   '4': '高风险',
   '4': '高风险',
 };
 };
 
 
+const dictMap = getDictItemsByCode('mineProStatus');
+
 // 实时数据相关
 // 实时数据相关
 export const columns: BasicColumn[] = [
 export const columns: BasicColumn[] = [
   // {
   // {
@@ -40,6 +43,29 @@ export const columns: BasicColumn[] = [
     dataIndex: 'coalSeamName',
     dataIndex: 'coalSeamName',
     width: 100,
     width: 100,
   },
   },
+  {
+    title: '自燃倾向性',
+    dataIndex: 'coalSeamLevel',
+    width: 100,
+  },
+  {
+    title: '生产状态',
+    dataIndex: 'productionStatus',
+    width: 100,
+    customRender({ text }) {
+      // 从动态映射取值,兜底未知状态
+      const color = { '0': StatusColorEnum.green, '1': StatusColorEnum.blue }[text] || StatusColorEnum.red;
+      const label = dictMap.find((item) => item.value == text)?.label || '-';
+      // 渲染带颜色的文字
+      return h(
+        'span',
+        {
+          style: { color },
+        },
+        label
+      );
+    },
+  },
   {
   {
     title: 'CO(ppm)',
     title: 'CO(ppm)',
     dataIndex: 'coVal',
     dataIndex: 'coVal',
@@ -126,34 +152,31 @@ export const columns: BasicColumn[] = [
 ];
 ];
 
 
 export const searchFormSchema: FormSchema[] = [
 export const searchFormSchema: FormSchema[] = [
-  {
-    field: 'mineNameAbbr',
-    label: '煤矿简称',
-    component: 'Input',
-    colProps: { span: 6 },
-  },
+  // {
+  //   field: 'mineNameAbbr',
+  //   label: '煤矿简称',
+  //   component: 'Input',
+  //   colProps: { span: 6 },
+  // },
   {
   {
     field: 'productStatus',
     field: 'productStatus',
     label: '生产状态',
     label: '生产状态',
-    component: 'Select',
+    component: 'JDictSelectTag',
     componentProps: {
     componentProps: {
-      options: [
-        { label: '拟建矿井', value: '0' },
-        { label: '正常生产矿井', value: '1' },
-        { label: '长期停产矿井', value: '1' },
-      ],
+      dictCode: 'mineProStatus',
+      placeholder: '请选择生产状态',
     },
     },
     colProps: { span: 6 },
     colProps: { span: 6 },
   },
   },
   {
   {
-    field: 'riskLevel',
-    label: '自燃情况',
+    field: 'coalSeamLevel',
+    label: '自燃倾向性',
     component: 'Select',
     component: 'Select',
     componentProps: {
     componentProps: {
       options: [
       options: [
-        { label: 'Ⅰ类容易自燃', value: '0' },
-        { label: 'Ⅱ类自燃', value: '1' },
-        { label: 'Ⅲ类不易自燃', value: '2' },
+        { label: 'Ⅰ类容易自燃', value: 'Ⅰ类容易自燃' },
+        { label: 'Ⅱ类自燃', value: 'Ⅱ类自燃' },
+        { label: 'Ⅲ类不易自燃', value: 'Ⅲ类不易自燃' },
       ],
       ],
     },
     },
     colProps: { span: 6 },
     colProps: { span: 6 },
@@ -180,7 +203,7 @@ export const modalDetailsData: {
     //   value: 'coalSeamName',
     //   value: 'coalSeamName',
     // },
     // },
     // {
     // {
-    //   label: '自燃情况',
+    //   label: '自燃倾向性',
     //   value: 'Ⅰ类容易自燃',
     //   value: 'Ⅰ类容易自燃',
     // },
     // },
     {
     {
@@ -430,7 +453,7 @@ export const historicalFormSchema: FormSchema[] = [
   // },
   // },
   // {
   // {
   //   field: 'riskLevel',
   //   field: 'riskLevel',
-  //   label: '自燃情况',
+  //   label: '自燃倾向性',
   //   component: 'Select',
   //   component: 'Select',
   //   componentProps: {
   //   componentProps: {
   //     options: [
   //     options: [
@@ -467,11 +490,11 @@ export const historicalFormSchema: FormSchema[] = [
     component: 'DatePicker',
     component: 'DatePicker',
     componentProps: {
     componentProps: {
       //日期格式化,页面上显示的值
       //日期格式化,页面上显示的值
-      format: 'YYYY-MM-DD hh:mm:ss',
+      format: 'YYYY-MM-DD',
       //返回值格式化(绑定值的格式)
       //返回值格式化(绑定值的格式)
-      valueFormat: 'YYYY-MM-DD hh:mm:ss',
+      valueFormat: 'YYYY-MM-DD 00:00:00',
     },
     },
-    defaultValue: dayjs().add(-30, 'day').format('YYYY-MM-DD hh:mm:ss'),
+    defaultValue: dayjs().add(-30, 'day').format('YYYY-MM-DD'),
     colProps: { span: 6 },
     colProps: { span: 6 },
   },
   },
   {
   {
@@ -480,11 +503,11 @@ export const historicalFormSchema: FormSchema[] = [
     component: 'DatePicker',
     component: 'DatePicker',
     componentProps: {
     componentProps: {
       //日期格式化,页面上显示的值
       //日期格式化,页面上显示的值
-      format: 'YYYY-MM-DD hh:mm:ss',
+      format: 'YYYY-MM-DD',
       //返回值格式化(绑定值的格式)
       //返回值格式化(绑定值的格式)
-      valueFormat: 'YYYY-MM-DD hh:mm:ss',
+      valueFormat: 'YYYY-MM-DD 23:59:59',
     },
     },
-    defaultValue: dayjs().format('YYYY-MM-DD hh:mm:ss'),
+    defaultValue: dayjs().format('YYYY-MM-DD'),
     colProps: { span: 6 },
     colProps: { span: 6 },
   },
   },
 ];
 ];

+ 34 - 1
src/views/system/algorithm/algorithm.data.ts

@@ -344,7 +344,18 @@ export const schemasCoalAlarm: FormSchema[] = [
     slot: 'InputGreaterNumber',
     slot: 'InputGreaterNumber',
     /** 借用 */
     /** 借用 */
     groupName: '  CO2(%) <',
     groupName: '  CO2(%) <',
-    colProps: { span: 12, style: 'margin-right: 1px' },
+    colProps: { span: 12 },
+  },
+  {
+    field: 'fireWarn3C2h4',
+    label: ' ',
+    suffix: '',
+    labelWidth: 118,
+    component: 'Input',
+    slot: 'InputLowerNumber',
+    /** 借用 */
+    groupName: '< C2H4(ppm)  ',
+    colProps: { span: 12 },
   },
   },
   {
   {
     field: 'fireWarn4CoRzl',
     field: 'fireWarn4CoRzl',
@@ -404,6 +415,28 @@ export const schemasCoalAlarm: FormSchema[] = [
     groupName: '<= CO2(%)  ',
     groupName: '<= CO2(%)  ',
     colProps: { span: 12 },
     colProps: { span: 12 },
   },
   },
+  {
+    field: 'fireWarn4C2h4',
+    label: ' ',
+    suffix: '',
+    labelWidth: 118,
+    component: 'Input',
+    slot: 'InputLowerNumber',
+    /** 借用 */
+    groupName: '< C2H4(ppm)  ',
+    colProps: { span: 12 },
+  },
+  {
+    field: 'fireWarn4C2h2',
+    label: ' ',
+    suffix: '',
+    labelWidth: 118,
+    component: 'Input',
+    slot: 'InputLowerNumber',
+    /** 借用 */
+    groupName: '< C2H2(ppm)  ',
+    colProps: { span: 12, style: 'margin-right: 1px' },
+  },
   {
   {
     field: 'm3',
     field: 'm3',
     label: '火区密闭启封判定模型',
     label: '火区密闭启封判定模型',

+ 1 - 1
src/views/system/algorithm/index.vue

@@ -126,7 +126,7 @@
       rowKey: 'id',
       rowKey: 'id',
       showIndexColumn: true,
       showIndexColumn: true,
       formConfig: {
       formConfig: {
-        showResetButton: false,
+        // showResetButton: false,
         schemas: searchFormSchema,
         schemas: searchFormSchema,
         schemaGroupNames: ['常规查询'],
         schemaGroupNames: ['常规查询'],
       },
       },

+ 1 - 1
src/views/system/checkRule/check.rule.api.ts

@@ -65,7 +65,7 @@ export const batchDeleteCheckRule = (params, handleSuccess) => {
  */
  */
 export const validateCheckRule = (ruleCode, value) => {
 export const validateCheckRule = (ruleCode, value) => {
   value = encodeURIComponent(value);
   value = encodeURIComponent(value);
-  const params = { ruleCode, value };
+  let params = { ruleCode, value };
   return defHttp.get({ url: Api.checkByCode, params }, { isTransformResponse: false });
   return defHttp.get({ url: Api.checkByCode, params }, { isTransformResponse: false });
 };
 };
 
 

+ 2 - 2
src/views/system/checkRule/check.rule.data.ts

@@ -1,6 +1,6 @@
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { render } from '/@/utils/common/renderUtils';
 import { render } from '/@/utils/common/renderUtils';
-import { duplicateCheckDelay } from '/@/views/system/user/user.api';
+import { duplicateCheck } from '/@/views/system/user/user.api';
 import { validateCheckRule } from '/@/views/system/checkRule/check.rule.api';
 import { validateCheckRule } from '/@/views/system/checkRule/check.rule.api';
 import { array } from 'vue-types';
 import { array } from 'vue-types';
 
 
@@ -80,7 +80,7 @@ export const formSchema: FormSchema[] = [
                 fieldVal: value,
                 fieldVal: value,
                 dataId: model.id,
                 dataId: model.id,
               };
               };
-              duplicateCheckDelay(params)
+              duplicateCheck(params)
                 .then((res) => {
                 .then((res) => {
                   res.success ? resolve() : reject('规则编码已存在!');
                   res.success ? resolve() : reject('规则编码已存在!');
                 })
                 })

+ 22 - 150
src/views/system/departUser/components/DepartRoleAuthDrawer.vue

@@ -1,34 +1,26 @@
 <template>
 <template>
-  <BasicDrawer :width="650" :loading="loading" showFooter okText="保存并关闭" @ok="onSubmit(true)" @close="onClose" @register="registerDrawer">
-    <template #title>
-      部门角色权限配置
-      <a-dropdown>
-        <Icon icon="ant-design:more-outlined" class="more-icon" />
-        <template #overlay>
-          <a-menu @click="treeMenuClick">
-            <a-menu-item key="checkAll">{{ t('component.tree.selectAll') }}</a-menu-item>
-            <a-menu-item key="cancelCheck">{{ t('component.tree.unSelectAll') }}</a-menu-item>
-            <div class="line"></div>
-            <a-menu-item key="openAll">{{ t('component.tree.expandAll') }}</a-menu-item>
-            <a-menu-item key="closeAll">{{ t('component.tree.unExpandAll') }}</a-menu-item>
-            <div class="line"></div>
-            <a-menu-item key="relation">{{ t('component.tree.checkStrictly') }}</a-menu-item>
-            <a-menu-item key="standAlone">{{ t('component.tree.checkUnStrictly') }}</a-menu-item>
-          </a-menu>
-        </template>
-      </a-dropdown>
-    </template>
+  <BasicDrawer
+    title="部门角色权限配置"
+    :width="650"
+    :loading="loading"
+    showFooter
+    okText="保存并关闭"
+    @ok="onSubmit(true)"
+    @close="onClose"
+    @register="registerDrawer"
+  >
     <div>
     <div>
       <a-spin :spinning="loading">
       <a-spin :spinning="loading">
         <template v-if="treeData.length > 0">
         <template v-if="treeData.length > 0">
           <BasicTree
           <BasicTree
             title="所拥有的部门权限"
             title="所拥有的部门权限"
+            toolbar
             checkable
             checkable
             :treeData="treeData"
             :treeData="treeData"
             :checkedKeys="checkedKeys"
             :checkedKeys="checkedKeys"
             :selectedKeys="selectedKeys"
             :selectedKeys="selectedKeys"
             :expandedKeys="expandedKeys"
             :expandedKeys="expandedKeys"
-            :checkStrictly="true"
+            :checkStrictly="checkStrictly"
             :clickRowToExpand="false"
             :clickRowToExpand="false"
             @check="onCheck"
             @check="onCheck"
             @expand="onExpand"
             @expand="onExpand"
@@ -57,11 +49,9 @@
   import { BasicTree } from '/@/components/Tree/index';
   import { BasicTree } from '/@/components/Tree/index';
   import { BasicDrawer, useDrawer, useDrawerInner } from '/@/components/Drawer';
   import { BasicDrawer, useDrawer, useDrawerInner } from '/@/components/Drawer';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { useI18n } from '/@/hooks/web/useI18n';
+
   import DepartRoleDataRuleDrawer from './DepartRoleDataRuleDrawer.vue';
   import DepartRoleDataRuleDrawer from './DepartRoleDataRuleDrawer.vue';
   import { queryTreeListForDeptRole, queryDeptRolePermission, saveDeptRolePermission } from '../depart.user.api';
   import { queryTreeListForDeptRole, queryDeptRolePermission, saveDeptRolePermission } from '../depart.user.api';
-  import { translateTitle } from '@/utils/common/compUtils';
-  import { DEPART_ROLE_AUTH_CONFIG_KEY } from '/@/enums/cacheEnum';
 
 
   defineEmits(['register']);
   defineEmits(['register']);
   const { createMessage } = useMessage();
   const { createMessage } = useMessage();
@@ -74,42 +64,26 @@
   const expandedKeys = ref<Array<any>>([]);
   const expandedKeys = ref<Array<any>>([]);
   const selectedKeys = ref<Array<any>>([]);
   const selectedKeys = ref<Array<any>>([]);
   const allTreeKeys = ref<Array<any>>([]);
   const allTreeKeys = ref<Array<any>>([]);
-  //父子节点选中状态是否关联 true不关联,false关联
-  const checkStrictly = ref(false);
-  const { t } = useI18n();
+  const checkStrictly = ref(true);
 
 
   // 注册抽屉组件
   // 注册抽屉组件
   const [registerDrawer, { closeDrawer }] = useDrawerInner((data) => {
   const [registerDrawer, { closeDrawer }] = useDrawerInner((data) => {
     roleId.value = data.record.id;
     roleId.value = data.record.id;
     departId.value = data.record.departId;
     departId.value = data.record.departId;
-    loadData({
-      success: (ids) => {
-        // 代码逻辑说明: 【TV360X-1619】同步系统角色改法加上缓存,默认层级关联修正原生层级关联bug
-        const localData = localStorage.getItem(DEPART_ROLE_AUTH_CONFIG_KEY);
-        if (localData) {
-          const obj = JSON.parse(localData);
-          obj.level && treeMenuClick({ key: obj.level });
-          obj.expand && treeMenuClick({ key: obj.expand });
-        } else {
-          // expandedKeys.value = ids;
-        }
-      },
-    });
+    loadData();
   });
   });
   // 注册数据规则授权弹窗抽屉
   // 注册数据规则授权弹窗抽屉
   const [registerDataRuleDrawer, dataRuleDrawer] = useDrawer();
   const [registerDataRuleDrawer, dataRuleDrawer] = useDrawer();
 
 
-  async function loadData(options: any = {}) {
+  async function loadData() {
     try {
     try {
       loading.value = true;
       loading.value = true;
       // 用户角色授权功能,查询菜单权限树
       // 用户角色授权功能,查询菜单权限树
       const { ids, treeList } = await queryTreeListForDeptRole({ departId: departId.value });
       const { ids, treeList } = await queryTreeListForDeptRole({ departId: departId.value });
       if (ids.length > 0) {
       if (ids.length > 0) {
         allTreeKeys.value = ids;
         allTreeKeys.value = ids;
-        // 代码逻辑说明: 【TV360X-1619】同步系统角色改法加上缓存,默认层级关联修正原生层级关联bug
-        options.success?.(ids);
-        // 代码逻辑说明: 【issues/1169】我的部门功能中的【部门权限】中未翻译 t('') 多语言---
-        treeData.value = translateTitle(treeList);
+        expandedKeys.value = ids;
+        treeData.value = treeList;
         // 查询角色授权
         // 查询角色授权
         checkedKeys.value = await queryDeptRolePermission({ roleId: roleId.value });
         checkedKeys.value = await queryDeptRolePermission({ roleId: roleId.value });
         lastCheckedKeys.value = [checkedKeys.value];
         lastCheckedKeys.value = [checkedKeys.value];
@@ -130,58 +104,13 @@
     loading.value = false;
     loading.value = false;
   }
   }
 
 
-  /**
-   * 点击选中
-   * 2024-07-04
-   * liaozhiyang
-   */
-  function onCheck(o, e) {
-    // checkStrictly: true=>层级独立,false=>层级关联.
+  // tree勾选复选框事件
+  function onCheck(event) {
     if (checkStrictly.value) {
     if (checkStrictly.value) {
-      checkedKeys.value = o.checked ? o.checked : o;
+      checkedKeys.value = event.checked;
     } else {
     } else {
-      const keys = getNodeAllKey(e.node, 'children', 'key');
-      if (e.checked) {
-        // 反复操作下可能会有重复的keys,得用new Set去重下
-        checkedKeys.value = [...new Set([...checkedKeys.value, ...keys])];
-      } else {
-        const result = removeMatchingItems(checkedKeys.value, keys);
-        checkedKeys.value = result;
-      }
-    }
-  }
-  /**
-   * 2024-07-04
-   * liaozhiyang
-   * 删除相匹配数组的项
-   */
-  function removeMatchingItems(arr1, arr2) {
-    // 使用哈希表记录 arr2 中的元素
-    const hashTable = {};
-    for (const item of arr2) {
-      hashTable[item] = true;
+      checkedKeys.value = event;
     }
     }
-    // 使用 filter 方法遍历第一个数组,过滤出不在哈希表中存在的项
-    return arr1.filter((item) => !hashTable[item]);
-  }
-  /**
-   * 2024-07-04
-   * liaozhiyang
-   * 获取当前节点及以下所有子孙级的key
-   */
-  function getNodeAllKey(node: any, children: any, key: string) {
-    const result: any = [];
-    result.push(node[key]);
-    const recursion = (data) => {
-      data.forEach((item: any) => {
-        result.push(item[key]);
-        if (item[children]?.length) {
-          recursion(item[children]);
-        }
-      });
-    };
-    node[children]?.length && recursion(node[children]);
-    return result;
   }
   }
 
 
   // tree展开事件
   // tree展开事件
@@ -226,61 +155,4 @@
       }
       }
     }
     }
   }
   }
-
-  /**
-   * 树菜单选择
-   * @param key
-   */
-  function treeMenuClick({ key }) {
-    if (key === 'checkAll') {
-      checkedKeys.value = allTreeKeys.value;
-    } else if (key === 'cancelCheck') {
-      checkedKeys.value = [];
-    } else if (key === 'openAll') {
-      expandedKeys.value = allTreeKeys.value;
-      saveLocalOperation('expand', 'openAll');
-    } else if (key === 'closeAll') {
-      expandedKeys.value = [];
-      saveLocalOperation('expand', 'closeAll');
-    } else if (key === 'relation') {
-      checkStrictly.value = false;
-      saveLocalOperation('level', 'relation');
-    } else {
-      checkStrictly.value = true;
-      saveLocalOperation('level', 'standAlone');
-    }
-  }
-  /**
-   * 2024-07-04
-   * liaozhiyang
-   * */
-  const saveLocalOperation = (key, value) => {
-    const localData = localStorage.getItem(DEPART_ROLE_AUTH_CONFIG_KEY);
-    const obj = localData ? JSON.parse(localData) : {};
-    obj[key] = value;
-    localStorage.setItem(DEPART_ROLE_AUTH_CONFIG_KEY, JSON.stringify(obj));
-  };
 </script>
 </script>
-<style lang="less" scoped>
-  /** 固定操作按钮 */
-  .jeecg-basic-tree {
-    position: absolute;
-    width: 618px;
-  }
-  .line {
-    height: 1px;
-    width: 100%;
-    border-bottom: 1px solid #f0f0f0;
-  }
-  .more-icon {
-    font-size: 20px !important;
-    color: black;
-    display: inline-flex;
-    float: right;
-    margin-right: 2px;
-    cursor: pointer;
-  }
-  :deep(.jeecg-tree-header) {
-    border-bottom: none;
-  }
-</style>

+ 2 - 8
src/views/system/departUser/components/DepartRoleInfoTab.vue

@@ -3,7 +3,7 @@
   <BasicTable @register="registerTable" :rowSelection="rowSelection">
   <BasicTable @register="registerTable" :rowSelection="rowSelection">
     <!--插槽:table标题-->
     <!--插槽:table标题-->
     <template #tableTitle>
     <template #tableTitle>
-      <a-button type="primary" preIcon="ant-design:plus-outlined" @click="addDepartRole" :disabled="!departId">添加部门角色</a-button>
+      <a-button type="primary" preIcon="ant-design:plus-outlined" @click="addDepartRole">添加部门角色</a-button>
       <template v-if="selectedRowKeys.length > 0">
       <template v-if="selectedRowKeys.length > 0">
         <a-divider type="vertical" />
         <a-divider type="vertical" />
         <a-dropdown>
         <a-dropdown>
@@ -88,17 +88,11 @@
           ...adaptiveColProps,
           ...adaptiveColProps,
           style: { textAlign: 'left' },
           style: { textAlign: 'left' },
         },
         },
-        showResetButton: !!departId.value,
-        showSubmitButton: !!departId.value,
       },
       },
-      // 【issues/1064】列设置的 cacheKey
-      tableSetting: { cacheKey: 'depart_user_departInfo' },
       // 请求之前对参数做处理
       // 请求之前对参数做处理
       beforeFetch(params) {
       beforeFetch(params) {
         params.deptId = departId.value;
         params.deptId = departId.value;
       },
       },
-      // 代码逻辑说明: 【TV360X-53】未选择部门的情况下,部门角色全查出来了
-      immediate: !!departId.value,
     },
     },
   });
   });
 
 
@@ -116,7 +110,7 @@
     () => reload()
     () => reload()
   );
   );
   onMounted(() => {
   onMounted(() => {
-    // reload();
+    reload();
   });
   });
 
 
   // 清空选择的行
   // 清空选择的行

+ 10 - 120
src/views/system/departUser/components/DepartTree.vue

@@ -1,84 +1,63 @@
 <template>
 <template>
   <div class="bg-white m-4 mr-0 overflow-hidden">
   <div class="bg-white m-4 mr-0 overflow-hidden">
-    <div v-if="userIdentity === '2'" class="j-table-operator" style="width: 100%">
-      <a-button type="primary" preIcon="ant-design:plus-outlined" @click="onAddChildDepart">添加下级</a-button>
-      <!--      <a-button type="primary" preIcon="ant-design:edit-outlined" @click="editDepart">编辑</a-button>-->
-      <a-button :disabled="!(checkedKeys && checkedKeys.length > 0)" preIcon="ant-design:delete-outlined" @click="onDeleteBatch">删除</a-button>
-    </div>
     <a-spin :spinning="loading">
     <a-spin :spinning="loading">
       <template v-if="userIdentity === '2'">
       <template v-if="userIdentity === '2'">
-        <a-input-search placeholder="按部门名称搜索…" style="margin-bottom: 10px" @search="onSearch" />
         <!--组织机构树-->
         <!--组织机构树-->
         <BasicTree
         <BasicTree
           v-if="!treeReloading"
           v-if="!treeReloading"
-          :toolbar="false"
-          :search="false"
-          :showLine="false"
-          :clickRowToExpand="false"
-          :multiple="false"
+          title="部门列表"
+          toolbar
+          search
+          showLine
           :checkStrictly="true"
           :checkStrictly="true"
+          :clickRowToExpand="false"
           :treeData="treeData"
           :treeData="treeData"
-          :checkedKeys="checkedKeys"
           :selectedKeys="selectedKeys"
           :selectedKeys="selectedKeys"
           :expandedKeys="expandedKeys"
           :expandedKeys="expandedKeys"
           :autoExpandParent="autoExpandParent"
           :autoExpandParent="autoExpandParent"
-          :beforeRightClick="getRightMenuList"
           @select="onSelect"
           @select="onSelect"
           @expand="onExpand"
           @expand="onExpand"
-          @check="onCheck"
+          @search="onSearch"
         />
         />
       </template>
       </template>
       <a-empty v-else description="普通员工无此权限" />
       <a-empty v-else description="普通员工无此权限" />
     </a-spin>
     </a-spin>
-    <DepartFormModal :rootTreeData="treeData" @register="registerModal" @success="handleSuccess" />
   </div>
   </div>
 </template>
 </template>
 
 
 <script lang="ts" setup>
 <script lang="ts" setup>
   import { inject, nextTick, ref } from 'vue';
   import { inject, nextTick, ref } from 'vue';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import { BasicTree, ContextMenuItem } from '/@/components/Tree';
+  import { BasicTree } from '/@/components/Tree';
   import { queryMyDepartTreeList, searchByKeywords } from '../depart.user.api';
   import { queryMyDepartTreeList, searchByKeywords } from '../depart.user.api';
-  import DepartFormModal from '@/views/system/depart/components/DepartFormModal.vue';
-  import { useModal } from '@/components/Modal';
-  import { deleteBatchDepart } from '@/views/system/depart/depart.api';
 
 
   const prefixCls = inject('prefixCls');
   const prefixCls = inject('prefixCls');
   const emit = defineEmits(['select']);
   const emit = defineEmits(['select']);
   const { createMessage } = useMessage();
   const { createMessage } = useMessage();
 
 
   let loading = ref<boolean>(false);
   let loading = ref<boolean>(false);
-  // 负责部门ID
-  let myDepIds = ref<any[]>([]);
   // 部门树列表数据
   // 部门树列表数据
   let treeData = ref<any[]>([]);
   let treeData = ref<any[]>([]);
   // 当前展开的项
   // 当前展开的项
   let expandedKeys = ref<any[]>([]);
   let expandedKeys = ref<any[]>([]);
   // 当前选中的项
   // 当前选中的项
   let selectedKeys = ref<any[]>([]);
   let selectedKeys = ref<any[]>([]);
-  // 当前选中的项
-  let selectedNode = ref<any>({});
-  // 当前选中的项
-  let checkedKeys = ref<any[]>([]);
   // 是否自动展开父级
   // 是否自动展开父级
   let autoExpandParent = ref<boolean>(true);
   let autoExpandParent = ref<boolean>(true);
-  // 用户身份(1:普通员工  2:上级)
+  // 用户身份
   let userIdentity = ref<string>('2');
   let userIdentity = ref<string>('2');
   // 树组件重新加载
   // 树组件重新加载
   let treeReloading = ref<boolean>(false);
   let treeReloading = ref<boolean>(false);
-  // 注册 modal
-  const [registerModal, { openModal }] = useModal();
+
   // 加载部门信息
   // 加载部门信息
   function loadDepartTreeData() {
   function loadDepartTreeData() {
     loading.value = true;
     loading.value = true;
-    treeReloading.value = true;
     treeData.value = [];
     treeData.value = [];
     queryMyDepartTreeList()
     queryMyDepartTreeList()
       .then((res) => {
       .then((res) => {
         if (res.success) {
         if (res.success) {
           if (Array.isArray(res.result)) {
           if (Array.isArray(res.result)) {
             treeData.value = res.result;
             treeData.value = res.result;
-            myDepIds.value = res.result.map((item) => item.id);
             userIdentity.value = res.message;
             userIdentity.value = res.message;
             autoExpandParentNode();
             autoExpandParentNode();
           }
           }
@@ -86,11 +65,7 @@
           createMessage.warning(res.message);
           createMessage.warning(res.message);
         }
         }
       })
       })
-      .finally(async () => {
-        await nextTick();
-        loading.value = false;
-        treeReloading.value = false;
-      });
+      .finally(() => (loading.value = false));
   }
   }
 
 
   loadDepartTreeData();
   loadDepartTreeData();
@@ -113,47 +88,6 @@
     }
     }
   }
   }
 
 
-  // 添加子级部门
-  function onAddChildDepart() {
-    if (selectedKeys.value && selectedKeys.value.length === 0) {
-      createMessage.warning('请先选择一个部门');
-      return;
-    }
-    const record = { parentId: selectedKeys.value[0] };
-    openModal(true, { isUpdate: false, isChild: true, record });
-  }
-
-  // 编辑部门
-  function editDepart() {
-    if (selectedKeys.value && selectedKeys.value.length === 0) {
-      createMessage.warning('请先选择一个部门');
-      return;
-    }
-    if (myDepIds.value.includes(selectedKeys.value[0])) {
-      createMessage.warning('不能编辑负责部门');
-      return;
-    }
-    console.log('selectedNode', selectedNode.value);
-    openModal(true, { isUpdate: false, isChild: true, record: { ...selectedNode.value } });
-  }
-
-  // 删除部门
-  async function onDeleteBatch() {
-    const idList = checkedKeys.value;
-    if (myDepIds.value.includes(idList[0])) {
-      createMessage.warning('不能删除负责部门');
-      return;
-    }
-    if (idList.length > 0) {
-      try {
-        loading.value = true;
-        await deleteBatchDepart({ ids: idList.join(',') }, true);
-        await loadDepartTreeData();
-      } finally {
-        loading.value = false;
-      }
-    }
-  }
   // 重新加载树组件,防止无法默认展开数据
   // 重新加载树组件,防止无法默认展开数据
   async function reloadTree() {
   async function reloadTree() {
     await nextTick();
     await nextTick();
@@ -167,9 +101,7 @@
    */
    */
   function setSelectedKey(key: string, data?: object) {
   function setSelectedKey(key: string, data?: object) {
     selectedKeys.value = [key];
     selectedKeys.value = [key];
-    checkedKeys.value = [key];
     if (data) {
     if (data) {
-      selectedNode.value = { ...data };
       emit('select', data);
       emit('select', data);
     }
     }
   }
   }
@@ -201,16 +133,6 @@
       // 这样可以防止用户取消选择
       // 这样可以防止用户取消选择
       setSelectedKey(selectedKeys.value[0]);
       setSelectedKey(selectedKeys.value[0]);
     }
     }
-    checkedKeys.value = [selectedKeys.value[0]];
-  }
-
-  // 树选中事件
-  function onCheck(keys) {
-    if (keys.checked && keys.checked.length > 0) {
-      checkedKeys.value = [...keys.checked];
-    } else {
-      checkedKeys.value = [];
-    }
   }
   }
 
 
   // 树展开事件
   // 树展开事件
@@ -218,38 +140,6 @@
     expandedKeys.value = keys;
     expandedKeys.value = keys;
     autoExpandParent.value = false;
     autoExpandParent.value = false;
   }
   }
-
-  //成功回调
-  async function handleSuccess() {
-    await loadDepartTreeData();
-  }
-  /**
-   *
-   * @param node
-   */
-  function getRightMenuList(node: any): ContextMenuItem[] {
-    return [
-      {
-        label: '添加下级',
-        disabled: myDepIds.value.includes(node.key),
-        handler: () => {
-          setSelectedKey(node.key);
-          onAddChildDepart();
-        },
-        icon: 'ant-design:plus-outlined',
-      },
-      {
-        label: '编辑',
-        disabled: myDepIds.value.includes(node.key),
-        handler: () => {
-          setSelectedKey(node.key);
-          const record = { ...node.dataRef };
-          openModal(true, { isUpdate: true, record, isChild: true });
-        },
-        icon: 'ant-design:edit-outlined',
-      },
-    ];
-  }
 </script>
 </script>
 <style lang="less" scoped>
 <style lang="less" scoped>
   /*升级antd3后,查询框与树贴的太近,样式优化*/
   /*升级antd3后,查询框与树贴的太近,样式优化*/

+ 3 - 12
src/views/system/departUser/components/DepartUserInfoTab.vue

@@ -3,8 +3,8 @@
   <BasicTable @register="registerTable" :rowSelection="rowSelection">
   <BasicTable @register="registerTable" :rowSelection="rowSelection">
     <!--插槽:table标题-->
     <!--插槽:table标题-->
     <template #tableTitle>
     <template #tableTitle>
-      <a-button type="primary" preIcon="ant-design:plus-outlined" @click="selectAddUser" :disabled="!departId">添加已有用户</a-button>
-      <a-button type="primary" preIcon="ant-design:plus-outlined" @click="createUser" :disabled="!departId">新建用户</a-button>
+      <a-button type="primary" preIcon="ant-design:plus-outlined" @click="selectAddUser">添加已有用户</a-button>
+      <a-button type="primary" preIcon="ant-design:plus-outlined" @click="createUser">新建用户</a-button>
       <template v-if="selectedRowKeys.length > 0">
       <template v-if="selectedRowKeys.length > 0">
         <a-dropdown>
         <a-dropdown>
           <template #overlay>
           <template #overlay>
@@ -29,7 +29,7 @@
   </BasicTable>
   </BasicTable>
   <UserDrawer @register="registerDrawer" @success="onUserDrawerSuccess" />
   <UserDrawer @register="registerDrawer" @success="onUserDrawerSuccess" />
   <DepartRoleUserAuthDrawer @register="registerUserAuthDrawer" />
   <DepartRoleUserAuthDrawer @register="registerUserAuthDrawer" />
-  <UserSelectModal ref="userSelectModalRef" rowKey="id" @register="registerSelUserModal" @getSelectResult="onSelectUserOk" />
+  <UserSelectModal rowKey="id" @register="registerSelUserModal" @getSelectResult="onSelectUserOk" />
 </template>
 </template>
 
 
 <script lang="ts" setup>
 <script lang="ts" setup>
@@ -50,7 +50,6 @@
   const props = defineProps({
   const props = defineProps({
     data: { require: true, type: Object },
     data: { require: true, type: Object },
   });
   });
-  const userSelectModalRef: any = ref(null);
   // 当前选中的部门ID,可能会为空,代表未选择部门
   // 当前选中的部门ID,可能会为空,代表未选择部门
   const departId = computed(() => props.data?.id);
   const departId = computed(() => props.data?.id);
 
 
@@ -87,17 +86,11 @@
           ...adaptiveColProps,
           ...adaptiveColProps,
           style: { textAlign: 'left' },
           style: { textAlign: 'left' },
         },
         },
-        showResetButton: !!departId.value,
-        showSubmitButton: !!departId.value,
       },
       },
-      // 【issues/1064】列设置的 cacheKey
-      tableSetting: { cacheKey: 'depart_user_userInfo' },
       // 请求之前对参数做处理
       // 请求之前对参数做处理
       beforeFetch(params) {
       beforeFetch(params) {
         params.depId = departId.value;
         params.depId = departId.value;
       },
       },
-      // 代码逻辑说明: 【TV360X-1861】没部门时不加载用户信息
-      immediate: !!departId.value,
     },
     },
   });
   });
 
 
@@ -160,8 +153,6 @@
 
 
   // 选择添加已有用户
   // 选择添加已有用户
   function selectAddUser() {
   function selectAddUser() {
-    // 代码逻辑说明: 【TV360X-1613】再次打开还是上次的选中用户,没置空
-    userSelectModalRef.value.rowSelection.selectedRowKeys = [];
     selUserModal.openModal();
     selUserModal.openModal();
   }
   }
 
 

+ 1 - 1
src/views/system/departUser/depart.user.api.ts

@@ -138,7 +138,7 @@ export const saveDeptRolePermission = (params) => defHttp.post({ url: DepartRole
  *  查询部门角色数据权限列表
  *  查询部门角色数据权限列表
  */
  */
 export const queryDepartRoleDataRule = (functionId, departId, roleId, params?) => {
 export const queryDepartRoleDataRule = (functionId, departId, roleId, params?) => {
-  const url = `${DepartRoleApi.dataRule}/${unref(functionId)}/${unref(departId)}/${unref(roleId)}`;
+  let url = `${DepartRoleApi.dataRule}/${unref(functionId)}/${unref(departId)}/${unref(roleId)}`;
   return defHttp.get({ url, params });
   return defHttp.get({ url, params });
 };
 };
 /**
 /**

+ 4 - 6
src/views/system/departUser/depart.user.data.ts

@@ -1,5 +1,5 @@
 import { Ref } from 'vue';
 import { Ref } from 'vue';
-import { duplicateCheckDelay } from '/@/views/system/user/user.api';
+import { duplicateCheck } from '/@/views/system/user/user.api';
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { DescItem } from '/@/components/Description';
 import { DescItem } from '/@/components/Description';
 import { findTree } from '/@/utils/common/compUtils';
 import { findTree } from '/@/utils/common/compUtils';
@@ -109,13 +109,13 @@ export const departRoleModalFormSchema: FormSchema[] = [
               return Promise.reject('部门角色编码不可输入汉字!');
               return Promise.reject('部门角色编码不可输入汉字!');
             }
             }
             return new Promise((resolve, reject) => {
             return new Promise((resolve, reject) => {
-              const params = {
+              let params = {
                 tableName: 'sys_depart_role',
                 tableName: 'sys_depart_role',
                 fieldName: 'role_code',
                 fieldName: 'role_code',
                 fieldVal: value,
                 fieldVal: value,
                 dataId: model.id,
                 dataId: model.id,
               };
               };
-              duplicateCheckDelay(params)
+              duplicateCheck(params)
                 .then((res) => {
                 .then((res) => {
                   res.success ? resolve() : reject(res.message || '校验失败');
                   res.success ? resolve() : reject(res.message || '校验失败');
                 })
                 })
@@ -148,7 +148,7 @@ export function useBaseInfoForm(treeData: Ref<any[]>) {
       label: '上级部门',
       label: '上级部门',
       render(val) {
       render(val) {
         if (val) {
         if (val) {
-          const data = findTree(treeData.value, (item) => item.key == val);
+          let data = findTree(treeData.value, (item) => item.key == val);
           return data?.title ?? val;
           return data?.title ?? val;
         }
         }
         return val;
         return val;
@@ -168,8 +168,6 @@ export function useBaseInfoForm(treeData: Ref<any[]>) {
           return '部门';
           return '部门';
         } else if (val === '3') {
         } else if (val === '3') {
           return '岗位';
           return '岗位';
-        } else if(val === '4'){
-          return '子公司';
         }
         }
         return val;
         return val;
       },
       },

+ 9 - 8
src/views/system/departUser/index.less

@@ -1,4 +1,5 @@
 @prefix-cls: ~'@{namespace}-depart-user';
 @prefix-cls: ~'@{namespace}-depart-user';
+@ventSpace: zxm;
 
 
 .@{prefix-cls} {
 .@{prefix-cls} {
   &--tree-search {
   &--tree-search {
@@ -13,21 +14,21 @@
         box-shadow: none;
         box-shadow: none;
       }
       }
 
 
-      .ant-select.ant-select-disabled {
-        .ant-select-selector {
+      .@{ventSpace}-select.@{ventSpace}-select-disabled {
+        .@{ventSpace}-select-selector {
           border: 0;
           border: 0;
           color: black;
           color: black;
           background-color: transparent;
           background-color: transparent;
         }
         }
 
 
-        .ant-select-selector,
-        .ant-select-selection-item {
+        .@{ventSpace}-select-selector,
+        .@{ventSpace}-select-selection-item {
           cursor: text !important;
           cursor: text !important;
           user-select: initial !important;
           user-select: initial !important;
         }
         }
 
 
-        .ant-select-selection-search,
-        .ant-select-arrow {
+        .@{ventSpace}-select-selection-search,
+        .@{ventSpace}-select-arrow {
           display: none;
           display: none;
         }
         }
       }
       }
@@ -38,8 +39,8 @@
 // 夜间模式样式兼容
 // 夜间模式样式兼容
 [data-theme='dark'] .@{prefix-cls} {
 [data-theme='dark'] .@{prefix-cls} {
   &--base-info-form {
   &--base-info-form {
-    .ant-select.ant-select-disabled {
-      .ant-select-selector {
+    .@{ventSpace}-select.@{ventSpace}-select-disabled {
+      .@{ventSpace}-select-selector {
         color: #c9d1d9;
         color: #c9d1d9;
         background-color: transparent;
         background-color: transparent;
       }
       }

+ 33 - 22
src/views/system/departUser/index.vue

@@ -1,24 +1,25 @@
 <template>
 <template>
-  <a-row :class="['p-4', `${prefixCls}--box`]" :gutter="10">
+  <a-row :class="['p-4', `${prefixCls}--box`]" :gutter="10" style="margin-top: 10px">
     <a-col :xl="6" :lg="8" :md="10" :sm="24" style="flex: 1">
     <a-col :xl="6" :lg="8" :md="10" :sm="24" style="flex: 1">
       <a-card :bordered="false" style="height: 100%">
       <a-card :bordered="false" style="height: 100%">
         <DepartTree @select="onTreeSelect" />
         <DepartTree @select="onTreeSelect" />
       </a-card>
       </a-card>
     </a-col>
     </a-col>
     <a-col :xl="18" :lg="16" :md="14" :sm="24" style="flex: 1">
     <a-col :xl="18" :lg="16" :md="14" :sm="24" style="flex: 1">
-      <a-card :bordered="false" style="height: 100%">
-        <a-tabs defaultActiveKey="user-info">
-          <a-tab-pane tab="基本信息" key="base-info" forceRender>
-            <DepartBaseInfoTab :data="departData" />
-          </a-tab-pane>
-          <a-tab-pane tab="用户信息" key="user-info">
-            <DepartUserInfoTab :key="reRender" :data="departData" />
-          </a-tab-pane>
-          <a-tab-pane tab="部门角色" key="role-info">
-            <DepartRoleInfoTab :key="reRender" :data="departData" />
-          </a-tab-pane>
-        </a-tabs>
-      </a-card>
+      <!-- <a-card :bordered="false" style="height: 100%">
+        
+      </a-card> -->
+      <a-tabs defaultActiveKey="user-info">
+        <a-tab-pane tab="基本信息" key="base-info" forceRender>
+          <DepartBaseInfoTab :data="departData" />
+        </a-tab-pane>
+        <a-tab-pane tab="用户信息" key="user-info">
+          <DepartUserInfoTab :data="departData" />
+        </a-tab-pane>
+        <a-tab-pane tab="部门角色" key="role-info">
+          <DepartRoleInfoTab :data="departData" />
+        </a-tab-pane>
+      </a-tabs>
     </a-col>
     </a-col>
   </a-row>
   </a-row>
 </template>
 </template>
@@ -38,19 +39,29 @@
   // 当前选中的部门信息
   // 当前选中的部门信息
   let departData = ref({});
   let departData = ref({});
 
 
-  const reRender = ref(-1);
-
   // 左侧树选择后触发
   // 左侧树选择后触发
   function onTreeSelect(data) {
   function onTreeSelect(data) {
-    // 代码逻辑说明: 【issues/7658】我的部门无部门列表数据时,点击查询或者重置能查出数据
-    if (reRender.value == -1) {
-      // 重新渲染组件
-      reRender.value = Math.random();
-    }
     departData.value = data;
     departData.value = data;
   }
   }
 </script>
 </script>
 
 
-<style lang="less">
+<style lang="less" scoped>
   @import './index.less';
   @import './index.less';
+  @ventSpace: zxm;
+  
+  .@{ventSpace}-tabs-tab {
+    padding: 12px !important;
+  }
+  .bg-white {
+    background-color: #ffffff00 !important;
+  }
+  .@{ventSpace}-tabs {
+    border: 1px solid #44d3ff70 !important;
+    border-radius: 2px !important;
+    -webkit-backdrop-filter: blur(8px) !important;
+    backdrop-filter: blur(8px) !important;
+    box-shadow: 0 0 20px #44b4ff33 inset;
+    background-color: #ffffff11 !important;
+    padding: 10px;
+  }
 </style>
 </style>

+ 1 - 0
src/views/system/dict/index.vue

@@ -72,6 +72,7 @@
       columns: columns,
       columns: columns,
       formConfig: {
       formConfig: {
         schemas: searchFormSchema,
         schemas: searchFormSchema,
+        schemaGroupNames: ['常规查询'],
       },
       },
       actionColumn: {
       actionColumn: {
         width: 240,
         width: 240,

+ 0 - 17
src/views/system/fillRule/FillRuleModal.vue

@@ -10,9 +10,6 @@
   import { BasicForm, useForm } from '/@/components/Form/index';
   import { BasicForm, useForm } from '/@/components/Form/index';
   import { formSchema } from './fill.rule.data';
   import { formSchema } from './fill.rule.data';
   import { saveFillRule, updateFillRule } from './fill.rule.api';
   import { saveFillRule, updateFillRule } from './fill.rule.api';
-  import { useMessage } from '@/hooks/web/useMessage';
-
-  const { createMessage: $message } = useMessage();
 
 
   //设置标题
   //设置标题
   const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
   const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
@@ -46,20 +43,6 @@
   async function handleSubmit() {
   async function handleSubmit() {
     try {
     try {
       let formValue = await validate();
       let formValue = await validate();
-
-      // 检查参数是否合法
-      let ruleParams = formValue.ruleParams;
-      if (!!ruleParams) {
-        ruleParams = JSON.parse(ruleParams);
-        for (const key of Object.keys(ruleParams)) {
-          // online 保留字检查
-          if (key === 'onl_watch') {
-            $message.error('参数名称不能是onl_watch');
-            return;
-          }
-        }
-      }
-
       setModalProps({ confirmLoading: true });
       setModalProps({ confirmLoading: true });
       if (isUpdate.value) {
       if (isUpdate.value) {
         let allFieldsValue = getFieldsValue();
         let allFieldsValue = getFieldsValue();

+ 3 - 3
src/views/system/fillRule/fill.rule.data.ts

@@ -1,5 +1,5 @@
 import { BasicColumn, FormSchema } from '/@/components/Table';
 import { BasicColumn, FormSchema } from '/@/components/Table';
-import { duplicateCheckDelay } from '/@/views/system/user/user.api';
+import { duplicateCheck } from '/@/views/system/user/user.api';
 
 
 export const columns: BasicColumn[] = [
 export const columns: BasicColumn[] = [
   {
   {
@@ -74,13 +74,13 @@ export const formSchema: FormSchema[] = [
               if (!value) {
               if (!value) {
                 return reject('请输入规则编码!');
                 return reject('请输入规则编码!');
               }
               }
-              const params = {
+              let params = {
                 tableName: 'sys_fill_rule',
                 tableName: 'sys_fill_rule',
                 fieldName: 'rule_code',
                 fieldName: 'rule_code',
                 fieldVal: value,
                 fieldVal: value,
                 dataId: model.id,
                 dataId: model.id,
               };
               };
-              duplicateCheckDelay(params)
+              duplicateCheck(params)
                 .then((res) => {
                 .then((res) => {
                   res.success ? resolve() : reject('规则编码已存在!');
                   res.success ? resolve() : reject('规则编码已存在!');
                 })
                 })

+ 1 - 0
src/views/system/notice/index.vue

@@ -57,6 +57,7 @@
       columns: columns,
       columns: columns,
       formConfig: {
       formConfig: {
         schemas: searchFormSchema,
         schemas: searchFormSchema,
+        schemaGroupNames: ['常规查询'],
         fieldMapToTime: [['sendTime', ['sendTime_begin', 'sendTime_end'], 'YYYY-MM-DD']],
         fieldMapToTime: [['sendTime', ['sendTime_begin', 'sendTime_end'], 'YYYY-MM-DD']],
       },
       },
     },
     },

+ 2 - 1
src/views/system/role/index.vue

@@ -63,9 +63,10 @@
       columns: columns,
       columns: columns,
       formConfig: {
       formConfig: {
         // 代码逻辑说明: 【QQYUN-5873】查询区域lablel默认居左
         // 代码逻辑说明: 【QQYUN-5873】查询区域lablel默认居左
-        labelWidth: 65,
+        // labelWidth: 65,
         rowProps: { gutter: 24 },
         rowProps: { gutter: 24 },
         schemas: searchFormSchema,
         schemas: searchFormSchema,
+        schemaGroupNames: ['常规查询'],
       },
       },
       actionColumn: {
       actionColumn: {
         width: 120,
         width: 120,

+ 0 - 377
src/views/system/tenant/TenantUserList.vue

@@ -1,377 +0,0 @@
-<template>
-  <div>
-    <!--引用表格-->
-    <BasicTable @register="registerTable" :rowSelection="rowSelection">
-      <!--插槽:table标题-->
-      <template #tableTitle>
-        <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate">新增</a-button>
-        <a-button preIcon="ant-design:user-add-outlined" type="primary" @click="handleInvitation" style="margin-right: 5px"> 邀请用户加入 </a-button>
-        <JThirdAppButton biz-type="user" :selected-row-keys="selectedRowKeys" syncToApp syncToLocal @sync-finally="onSyncFinally" />
-        <a-button type="primary" @click="openQuitModal(true, {})" preIcon="ant-design:user-delete-outlined">离职人员</a-button>
-        <div style="margin-left: 10px; margin-top: 5px">
-          当前登录租户: <span class="tenant-name">{{ loginTenantName }}</span>
-        </div>
-        <a-tooltip title="租户用户更多操作说明">
-          <a-icon type="question-circle" style="margin-left: 8px; cursor: pointer" @click="tipShow = true" />
-        </a-tooltip>
-      </template>
-      <!--操作栏-->
-      <template #action="{ record }">
-        <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
-      </template>
-    </BasicTable>
-    <!--用户抽屉-->
-    <TenantUserDrawer @register="registerDrawer" @success="handleSuccess" />
-    <!-- 离职人员列弹窗 -->
-    <UserQuitModal @register="registerQuitModal" @success="reload" />
-    <!--  变更拥有者弹窗  -->
-    <UserSelectModal @register="registerUserModal" :excludeUserIdList="excludeUserIdList" :maxSelectCount="1" @getSelectResult="selectResult" />
-    <!--  套餐分配弹窗  -->
-    <TenantPackAllotModal @register="registerPackAllotModal"></TenantPackAllotModal>
-    <!--  邀请人弹窗  -->
-    <TenantInviteUserModal @register="registerSelUserModal" @inviteOk="handleInviteUserOk" />
-    <a-modal v-model:open="tipShow" :footer="null" title="租户用户更多操作说明" :width="800">
-      <ul class="user-tenant-tip">
-        <li>移除:将用户从当前租户中移除</li>
-        <li>删除:仅可删除当天创建的用户,删除后可在系统用户回收站恢复</li>
-        <li>离职:非租户创建者可进行离职操作,离职员工可在离职人员列表查看</li>
-        <li>交接:租户创建者可进行租户交接,交接后员工信息可在离职人员列表查看</li>
-      </ul>
-      <div style="height: 10px"></div>
-    </a-modal>
-  </div>
-</template>
-
-<script lang="ts" name="tenant-system-user" setup>
-  //ts语法
-  import { onMounted, ref, unref } from 'vue';
-  import { BasicTable, TableAction, ActionItem } from '/@/components/Table';
-  import UserDrawer from '../user/UserDrawer.vue';
-  import JThirdAppButton from '/@/components/jeecg/thirdApp/JThirdAppButton.vue';
-  import UserQuitModal from '../user/UserQuitModal.vue';
-  import { useDrawer } from '/@/components/Drawer';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { useModal } from '/@/components/Modal';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { columns, searchFormSchema } from '../user/user.data';
-  import {
-    list,
-    deleteUser,
-    batchDeleteUser,
-    getImportUrl,
-    getExportUrl,
-    frozenBatch,
-    getUserTenantPageList,
-    updateUserTenantStatus,
-  } from '../user/user.api';
-  // import { usePermission } from '/@/hooks/web/usePermission'
-  // const { hasPermission } = usePermission();
-  import { userTenantColumns, userTenantFormSchema } from '../user/user.data';
-  import { useUserStore } from '/@/store/modules/user';
-  import UserSelectModal from '/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue';
-  import { getTenantId } from '/@/utils/auth';
-  import { changeOwenUserTenant } from '/@/views/system/usersetting/UserSetting.api';
-  import { getLoginTenantName, invitationUserJoin, leaveTenant } from '/@/views/system/tenant/tenant.api';
-  import TenantUserDrawer from './components/TenantUserDrawer.vue';
-  import { sameDay, tenantSaasMessage } from '@/utils/common/compUtils';
-  import TenantPackAllotModal from './components/TenantPackAllotModal.vue';
-  import TenantInviteUserModal from '@/views/system/tenant/components/TenantInviteUserModal.vue';
-
-  const { createMessage, createConfirm } = useMessage();
-
-  //注册drawer
-  const [registerDrawer, { openDrawer }] = useDrawer();
-  //离职代理人model
-  const [registerQuitAgentModal, { openModal: openQuitAgentModal }] = useModal();
-  //离职用户列表model
-  const [registerQuitModal, { openModal: openQuitModal }] = useModal();
-  //分配套餐弹窗
-  const [registerPackAllotModal, { openModal: openPackAllotModal }] = useModal();
-  const userStore = useUserStore();
-  const createBy = userStore.getUserInfo.username;
-  //弹窗提示显示
-  const tipShow = ref<boolean>(false);
-
-  // 列表页面公共参数、方法
-  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
-    designScope: 'user-list',
-    tableProps: {
-      title: '租户用户列表',
-      api: getUserTenantPageList,
-      columns: userTenantColumns,
-      size: 'small',
-      formConfig: {
-        schemas: userTenantFormSchema,
-      },
-      actionColumn: {
-        width: 120,
-      },
-      beforeFetch: (params) => {
-        params['userTenantStatus'] = '1,3,4';
-        return Object.assign({ column: 'createTime', order: 'desc' }, params);
-      },
-    },
-  });
-
-  //注册table数据
-  const [registerTable, { reload, updateTableDataRecord }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;
-
-  /**
-   * 新增事件
-   */
-  function handleCreate() {
-    openDrawer(true, {
-      isUpdate: false,
-      showFooter: true,
-      tenantSaas: true,
-    });
-  }
-  /**
-   * 编辑事件
-   */
-  async function handleEdit(record: Recordable) {
-    openDrawer(true, {
-      record,
-      isUpdate: true,
-      showFooter: true,
-      tenantSaas: true,
-    });
-  }
-  /**
-   * 详情
-   */
-  async function handleDetail(record: Recordable) {
-    openDrawer(true, {
-      record,
-      isUpdate: true,
-      showFooter: false,
-      tenantSaas: true,
-    });
-  }
-
-  /**
-   * 成功回调
-   */
-  function handleSuccess() {
-    reload();
-  }
-
-  /**
-   *同步钉钉和微信回调
-   */
-  function onSyncFinally({ isToLocal }) {
-    // 同步到本地时刷新下数据
-    if (isToLocal) {
-      reload();
-    }
-  }
-
-  /**
-   * 操作栏
-   */
-  function getTableAction(record): ActionItem[] {
-    return [
-      {
-        label: '编辑',
-        onClick: handleEdit.bind(null, record),
-        // ifShow: () => hasPermission('system:user:edit'),
-      },
-    ];
-  }
-  /**
-   * 下拉操作栏
-   */
-  function getDropDownAction(record): ActionItem[] {
-    return [
-      {
-        label: '查看详情',
-        onClick: handleDetail.bind(null, record),
-      },
-      {
-        label: '移除用户',
-        onClick: handleLeave.bind(null, record.id),
-      },
-      {
-        label: '删除用户',
-        popConfirm: {
-          title: '是否确认删除该用户',
-          confirm: handleDeleteUser.bind(null, record),
-        },
-        ifShow: () => record.username !== userStore.getUserInfo?.username && sameDay(record.createTime),
-      },
-      {
-        label: '变更拥有者',
-        onClick: handleHandover.bind(null, record),
-        ifShow: () => {
-          return record.username === record.createBy;
-        },
-      },
-      {
-        label: '同意',
-        onClick: updateStatus.bind(null, record.id, '1'),
-        ifShow: () => {
-          return (record.status === '3' || record.status === '4') && record.createBy === createBy;
-        },
-      },
-      {
-        label: '拒绝',
-        popConfirm: {
-          title: '是否确认拒绝',
-          confirm: updateStatus.bind(null, record.id, '4'),
-        },
-        ifShow: () => {
-          return record.status === '3' && record.createBy === createBy;
-        },
-      },
-      {
-        label: '用户套餐',
-        onClick: handleAllotPack.bind(null, record),
-      },
-    ];
-  }
-
-  /**
-   * 更新用户租户状态
-   * @param id
-   * @param status
-   */
-  function updateStatus(id, status) {
-    updateUserTenantStatus({ userId: id, status: status })
-      .then((res) => {
-        if (res.success) {
-          handleSuccess();
-        }
-      })
-      .catch((e) => {
-        createMessage.warning(e.message);
-      });
-  }
-
-  //============================================ 租户离职交接  ============================================
-  //租户id
-  const tenantId = ref<string>('');
-  //排除自己的编号集合
-  const excludeUserIdList = ref<any>([]);
-  //离职代理人model
-  const [registerUserModal, { openModal: openUserModal }] = useModal();
-  //邀请用户加入弹窗
-  const [registerSelUserModal, { openModal: userOpenModal }] = useModal();
-  const handOverUserName = ref<string>('');
-
-  /**
-   * 人员交接
-   */
-  function handleHandover(record) {
-    tenantId.value = getTenantId();
-    excludeUserIdList.value = [record.id];
-    //记录一下当前需要交接的用户名
-    handOverUserName.value = record.createBy;
-    openUserModal(true);
-  }
-
-  /**
-   * 用户选择回调
-   * @param options
-   * @param values
-   */
-  function selectResult(options, values) {
-    console.log(values);
-    if (values && values.length > 0) {
-      let userId = values[0];
-      changeOwenUserTenant({ userId: userId, tenantId: unref(tenantId) }).then((res) => {
-        if (res.success) {
-          createMessage.success('交接成功');
-          let username = userStore.getUserInfo?.username;
-          if (username == handOverUserName.value) {
-            userStore.logout(true);
-          } else {
-            reload();
-          }
-        } else {
-          createMessage.warning(res.message);
-        }
-      });
-    }
-  }
-  //============================================  租户离职交接  ============================================
-
-  //update-begin---author:wangshuai ---date:20230710  for:【QQYUN-5723】4、显示当前登录租户------------
-  const loginTenantName = ref<string>('');
-
-  getTenantName();
-
-  async function getTenantName() {
-    loginTenantName.value = await getLoginTenantName();
-  }
-  //update-end---author:wangshuai ---date:20230710  for:【QQYUN-5723】4、显示当前登录租户------------
-
-  /**
-   * 分配套餐
-   *
-   * @param record
-   */
-  function handleAllotPack(record) {
-    openPackAllotModal(true, {
-      record,
-    });
-  }
-
-  /**
-   * 删除用户
-   */
-  function handleDeleteUser(record) {
-    deleteUser({ id: record.id }, reload);
-  }
-
-  /**
-   * 邀请用户加入租户
-   */
-  function handleInvitation() {
-    userOpenModal(true, {});
-  }
-
-  /**
-   * 用户选择回调事件
-   * @param username
-   * @param phone
-   * @param userSelectId
-   */
-  async function handleInviteUserOk(phone, username) {
-    let tId = getTenantId();
-    if (phone) {
-      await invitationUserJoin({ ids: tId, phone: phone });
-      reload();
-    }
-    if (username) {
-      await invitationUserJoin({ ids: tId, username: username });
-      reload();
-    }
-  }
-
-  /**
-   * 请离
-   * @param id
-   */
-  async function handleLeave(id) {
-    await leaveTenant({ userIds: id, tenantId: getTenantId() }, reload);
-  }
-
-  onMounted(() => {
-    tenantSaasMessage('租户用户');
-  });
-</script>
-
-<style scoped>
-  .tenant-name {
-    text-decoration: underline;
-    margin: 5px;
-    font-size: 15px;
-  }
-  .user-tenant-tip {
-    margin: 20px;
-    background-color: #f8f9fb;
-    color: #99a1a9;
-    border-radius: 4px;
-    padding: 12px;
-  }
-</style>

+ 0 - 86
src/views/system/tenant/components/TenantInviteUserModal.vue

@@ -1,86 +0,0 @@
-<!--邀请用户加入租户弹窗-->
-<template>
-  <BasicModal @register="registerModal" :width="500" :title="title" @ok="handleSubmit">
-    <BasicForm @register="registerForm" />
-  </BasicModal>
-</template>
-
-<script lang="ts">
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, useForm } from '/@/components/Form/index';
-  import { defineComponent, ref } from 'vue';
-  export default defineComponent({
-    name: 'TenantInviteUserModal',
-    components: {
-      BasicModal,
-      BasicForm,
-    },
-    setup(props, { emit }) {
-      const title = ref<string>('邀请成员');
-      const [registerForm, { resetFields, validate }] = useForm({
-        schemas: [
-          {
-            label: '邀请方式',
-            field: 'invitedMode',
-            component: 'RadioButtonGroup',
-            defaultValue: 1,
-            componentProps: {
-              options: [
-                { label: '手机号', value: 1 },
-                { label: '用户账号', value: 2 },
-              ],
-            },
-          },
-          {
-            label: '手机号',
-            field: 'phone',
-            component: 'Input',
-            ifShow: ({ values }) => values.invitedMode === 1,
-            dynamicRules: ({ values }) => {
-              return values.invitedMode === 1
-                ? [
-                    { required: true, message: '请填写手机号' },
-                    { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' },
-                  ]
-                : [{ pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' }];
-            },
-          },
-          {
-            field: 'user',
-            component: 'Input',
-            label: '用户账号',
-            ifShow: ({ values }) => values.invitedMode === 2,
-            dynamicRules: ({ values }) => {
-              return values.invitedMode === 2 ? [{ required: true, message: '请输入用户账号' }] : [];
-            },
-          },
-        ],
-        showActionButtonGroup: false,
-      });
-      //表单赋值
-      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
-        //重置表单
-        await resetFields();
-        setModalProps({ minHeight: 100 });
-      });
-
-      /**
-       * 提交,返回给租户list页面
-       */
-      async function handleSubmit() {
-        let values = await validate();
-        emit('inviteOk', values.phone, values.user);
-        closeModal();
-      }
-
-      return {
-        title,
-        registerModal,
-        registerForm,
-        handleSubmit,
-      };
-    },
-  });
-</script>
-
-<style scoped></style>

+ 0 - 57
src/views/system/tenant/components/TenantModal.vue

@@ -1,57 +0,0 @@
-<template>
-  <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit" width="700px">
-    <BasicForm @register="registerForm" />
-  </BasicModal>
-</template>
-<script lang="ts" setup>
-  import { ref, computed, unref } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, useForm } from '/@/components/Form/index';
-  import { formSchema } from '../tenant.data';
-  import { saveOrUpdateTenant, getTenantById } from '../tenant.api';
-  // Emits声明
-  const emit = defineEmits(['register', 'success']);
-  const isUpdate = ref(true);
-  //表单配置
-  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({
-    // labelWidth: 150,
-    schemas: formSchema,
-    showActionButtonGroup: false,
-  });
-  //表单赋值
-  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
-    //重置表单
-    await resetFields();
-    setModalProps({ confirmLoading: false });
-    isUpdate.value = !!data?.isUpdate;
-    if (unref(isUpdate)) {
-      // 编辑模式下禁用id字段
-      updateSchema({ field: 'id', dynamicDisabled: true });
-      //获取详情
-      data.record = await getTenantById({ id: data.record.id });
-      //表单赋值
-      await setFieldsValue({
-        ...data.record,
-      });
-    } else {
-      updateSchema({ field: 'id', dynamicDisabled: false });
-    }
-  });
-  //设置标题
-  const title = computed(() => (!unref(isUpdate) ? '新增租户' : '编辑租户'));
-  //表单提交事件
-  async function handleSubmit(v) {
-    try {
-      let values = await validate();
-      setModalProps({ confirmLoading: true });
-      //提交表单
-      await saveOrUpdateTenant(values, isUpdate.value);
-      //关闭弹窗
-      closeModal();
-      //刷新列表
-      emit('success');
-    } finally {
-      setModalProps({ confirmLoading: false });
-    }
-  }
-</script>

+ 0 - 77
src/views/system/tenant/components/TenantPackAllotModal.vue

@@ -1,77 +0,0 @@
-<!--  用户套餐分配页面 -->
-<template>
-  <BasicModal @register="registerModal" :width="500" title="分配套餐" @ok="handleSubmit">
-    <BasicForm @register="registerForm">
-      <template #packId="{ model, field }">
-        <a-checkbox-group v-model:value="model[field]" :options="packOption"></a-checkbox-group>
-      </template>
-    </BasicForm>
-  </BasicModal>
-</template>
-
-<script lang="ts">
-  import { BasicModal, useModalInner } from '@/components/Modal';
-  import { BasicForm, useForm } from '@/components/Form';
-  import { packUserAllotSchemas } from '@/views/system/tenant/tenant.data';
-  import { listPackByTenantUserId } from '@/views/system/tenant/tenant.api';
-  import { getTenantId } from '@/utils/auth';
-  import { ref, defineComponent } from 'vue';
-
-  export default defineComponent({
-    name: 'TenantCurrentPackList',
-    components: {
-      BasicModal,
-      BasicForm,
-    },
-    setup() {
-      //产品包的option
-      const packOption = ref<any>([]);
-      //表单配置
-      const [registerForm, { resetFields, setFieldsValue, setProps }] = useForm({
-        schemas: packUserAllotSchemas,
-        showActionButtonGroup: false,
-      });
-      //表单赋值
-      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
-        setModalProps({ confirmLoading: false, showCancelBtn: false, showOkBtn: false });
-        //重置表单
-        await resetFields();
-        let tenantId = getTenantId();
-        let result = await listPackByTenantUserId({ tenantId: tenantId, userId: data.record.id });
-        if (result) {
-          if (result.packList) {
-            for (const item of result.packList) {
-              if (item.packCode) {
-                item.label = item.packName + '(默认产品包)';
-              } else {
-                item.label = item.packName;
-              }
-              item.value = item.id;
-              item.key = item.id;
-            }
-            packOption.value = result.packList;
-          } else {
-            packOption.value = [];
-          }
-          if (result.userPackIdList) {
-            data.record.packId = result.userPackIdList;
-          }
-        }
-        setModalProps({ confirmLoading: false });
-        await setFieldsValue({
-          ...data.record,
-          userId: data.record.id,
-        });
-        setProps({ disabled: true });
-      });
-
-      return {
-        registerForm,
-        registerModal,
-        packOption,
-      };
-    },
-  });
-</script>
-
-<style scoped lang="less"></style>

+ 0 - 147
src/views/system/tenant/components/TenantRecycleBinModal.vue

@@ -1,147 +0,0 @@
-<!--回收站-->
-<template>
-  <BasicModal v-bind="$attrs" @register="registerModal" title="用户回收站" :showOkBtn="false" width="1000px" destroyOnClose>
-    <BasicTable @register="registerTable" :rowSelection="rowSelection">
-      <!--插槽:table标题-->
-      <template #tableTitle>
-        <a-dropdown v-if="selectedRowKeys.length > 0">
-          <template #overlay>
-            <a-menu>
-              <a-menu-item key="1" @click="batchHandleDelete">
-                <Icon icon="ant-design:delete-outlined"></Icon>
-                批量删除
-              </a-menu-item>
-              <a-menu-item key="1" @click="batchHandleRevert">
-                <Icon icon="ant-design:redo-outlined"></Icon>
-                批量还原
-              </a-menu-item>
-            </a-menu>
-          </template>
-          <a-button
-            >批量操作
-            <Icon icon="ant-design:down-outlined"></Icon>
-          </a-button>
-        </a-dropdown>
-      </template>
-      <!--操作栏-->
-      <template #action="{ record }">
-        <TableAction :actions="getTableAction(record)" />
-      </template>
-    </BasicTable>
-  </BasicModal>
-</template>
-
-<script lang="ts" setup name="tenant-recycle-bin-modal">
-  import { BasicTable, TableAction } from '/@/components/Table';
-  import { recycleBinPageList, deleteLogicDeleted, revertTenantLogic } from '../tenant.api';
-  import { recycleColumns, searchRecycleFormSchema } from '../tenant.data';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { Modal } from 'ant-design-vue';
-  import { toRaw, unref } from 'vue';
-
-  const { createMessage: $message } = useMessage();
-  const [registerModal] = useModalInner(() => {});
-  // 列表页面公共参数、方法
-  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
-    tableProps: {
-      api: recycleBinPageList,
-      columns: recycleColumns,
-      size: 'small',
-      formConfig: {
-        schemas: searchRecycleFormSchema,
-      },
-      actionColumn: {
-        width: 120,
-      },
-      ellipsis: true,
-    },
-  });
-  const emit = defineEmits(['success', 'register']);
-  //注册table数据
-  const [registerTable, { reload, updateTableDataRecord }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;
-
-  //获取操作栏事件
-  function getTableAction(record) {
-    return [
-      {
-        label: '还原',
-        icon: 'ant-design:redo-outlined',
-        popConfirm: {
-          title: '是否确认还原',
-          confirm: handleRevert.bind(null, record),
-        },
-      },
-      {
-        label: '彻底删除',
-        icon: 'ant-design:scissor-outlined',
-        popConfirm: {
-          title: '是否确认彻底删除',
-          confirm: handleDelete.bind(null, record),
-        },
-      },
-    ];
-  }
-
-  /**
-   * 还原
-   * @param record
-   */
-  function handleRevert(record) {
-    revertTenantLogic({ ids: record.id }, handleSuccess);
-    emit('success');
-  }
-
-  /**
-   * 成功刷新表格
-   */
-  function handleSuccess() {
-    (selectedRowKeys.value = []) && reload();
-  }
-
-  /**
-   * 彻底删除
-   * @param record
-   */
-  async function handleDelete(record) {
-    await deleteLogicDeleted({ ids: record.id }, handleSuccess);
-  }
-
-  /**
-   * 批量彻底删除
-   */
-  function batchHandleDelete() {
-    Modal.confirm({
-      title: '彻底删除',
-      content: '是否确认彻底删除',
-      okText: '确认',
-      cancelText: '取消',
-      onOk: () => {
-        deleteLogicDeleted({ ids: toRaw(unref(selectedRowKeys)).join(',') }, handleSuccess);
-      },
-    });
-  }
-
-  /**
-   * 批量还原
-   */
-  function batchHandleRevert() {
-    Modal.confirm({
-      title: '还原',
-      content: '是否确认还原',
-      okText: '确认',
-      cancelText: '取消',
-      onOk: () => {
-        revertTenantLogic({ ids: toRaw(unref(selectedRowKeys)).join(',') }, handleSuccess);
-        emit('success');
-      },
-    });
-  }
-</script>
-
-<style lang="less" scoped>
-  :deep(.ant-popover-inner-content) {
-    width: 185px !important;
-  }
-</style>

+ 0 - 100
src/views/system/tenant/components/TenantUserDrawer.vue

@@ -1,100 +0,0 @@
-<template>
-  <BasicDrawer @register="registerDrawer" :title="title" :width="580" destroyOnClose @ok="handleSubmit">
-    <BasicForm @register="registerForm" />
-  </BasicDrawer>
-</template>
-
-<script lang="ts">
-  import { defineComponent, ref, unref, computed } from 'vue';
-  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
-  import { BasicForm, useForm } from '/@/components/Form';
-  import { getUserDepartList } from '../../user/user.api';
-  import { tenantUserSchema } from '../tenant.data';
-  import { saveOrUpdateTenantUser } from '../tenant.api';
-
-  export default defineComponent({
-    name: 'TenantUserDrawer',
-    components: {
-      BasicDrawer,
-      BasicForm,
-    },
-    emits: ['success', 'register'],
-    setup(_p, { emit }) {
-      const status = ref<string>('');
-      const isUpdate = ref(false);
-      const title = computed(() => {
-        return isUpdate.value ? '编辑人员' : '添加人员';
-      });
-
-      //表单
-      const [registerForm, { setFieldsValue, resetFields, validate, setProps, clearValidate }] = useForm({
-        schemas: tenantUserSchema,
-        showActionButtonGroup: false,
-        labelCol: { span: 24 },
-        wrapperCol: { span: 24 },
-      });
-
-      const showFooter = ref<boolean>(true);
-      // modal
-      const [registerDrawer, { closeDrawer, setDrawerProps }] = useDrawerInner(async (data) => {
-        isUpdate.value = data.isUpdate;
-        await resetFields();
-        showFooter.value = data?.showFooter ?? true;
-        setDrawerProps({ showFooter: showFooter.value });
-        if (unref(isUpdate)) {
-          const userDepart = await getUserDepartList({ userId: data.record.id });
-          let departData: any = '';
-          if (userDepart && userDepart.length > 0) {
-            departData = userDepart.map((item) => item.value);
-          }
-          let formData = {
-            ...data.record,
-            selecteddeparts: departData,
-            selectedroles: data.record.selectedroles,
-          };
-          status.value = data.status;
-          await setFieldsValue(formData);
-        }
-        // 隐藏底部时禁用整个表单
-        setProps({ disabled: !data?.showFooter });
-        if (!data?.showFooter) {
-          await clearValidate();
-        }
-      });
-
-      const confirmLoading = ref<boolean>(false);
-
-      //提交事件
-      async function handleSubmit() {
-        const data: any = await validate();
-        if (!data.username) {
-          data.username = data.phone;
-        }
-        data.password = '123456';
-        confirmLoading.value = true;
-        await saveOrUpdateTenantUser(data, isUpdate.value);
-        confirmLoading.value = false;
-        emit('success');
-        handleClose();
-      }
-
-      /**
-       * 取消
-       */
-      function handleClose() {
-        closeDrawer();
-      }
-
-      return {
-        isUpdate,
-        title,
-        registerForm,
-        registerDrawer,
-        handleSubmit,
-        handleClose,
-        status,
-        confirmLoading,
-      };
-    },
-  });
-</script>

+ 0 - 109
src/views/system/tenant/components/TenantUserList.vue

@@ -1,109 +0,0 @@
-<template>
-  <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit" width="800px">
-    <BasicTable @register="registerTable" :rowSelection="rowSelection">
-      <template #tableTitle>
-        <a-button
-          v-if="selectedRowKeys.length > 0"
-          preIcon="ant-design:delete-outlined"
-          type="primary"
-          @click="handleLeaveBatch"
-          style="margin-right: 5px"
-          >批量请离</a-button
-        >
-      </template>
-      <template #action="{ record }">
-        <TableAction :actions="getActions(record)" />
-      </template>
-    </BasicTable>
-  </BasicModal>
-</template>
-<script lang="ts" setup>
-  import { ref, computed, unref } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, useForm } from '/@/components/Form/index';
-  import { userColumns, userSearchFormSchema } from '../tenant.data';
-  import { getTenantUserList, leaveTenant } from '../tenant.api';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { BasicTable, TableAction } from '/@/components/Table';
-
-  const tenantId = ref<number>(0);
-  // 列表页面公共参数、方法
-  const { prefixCls, tableContext } = useListPage({
-    designScope: 'tenant-template',
-    tableProps: {
-      api: getTenantUserList,
-      columns: userColumns,
-      immediate: false,
-      formConfig: {
-        schemas: userSearchFormSchema,
-        // 代码逻辑说明: 【QQYUN-5698】样式问题------------
-        labelWidth: 40,
-        actionColOptions: {
-          xs: 24,
-          sm: 8,
-          md: 8,
-          lg: 8,
-          xl: 8,
-          xxl: 8,
-        },
-      },
-      beforeFetch: (params) => {
-        return Object.assign(params, { userTenantId: unref(tenantId) });
-      },
-    },
-  });
-  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
-
-  // Emits声明
-  const emit = defineEmits(['register', 'success']);
-  //表单赋值
-  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
-    tenantId.value = data.id;
-    success();
-  });
-  //设置标题
-  const title = '成员';
-  //表单提交事件
-  async function handleSubmit(v) {
-    closeModal();
-  }
-
-  function getActions(record) {
-    return [
-      {
-        label: '移除',
-        onClick: handleLeave.bind(null, record.id),
-      },
-    ];
-  }
-
-  /**
-   * 成功
-   */
-  function success() {
-    (selectedRowKeys.value = []) && reload();
-  }
-
-  /**
-   * 请离
-   * @param id
-   */
-  async function handleLeave(id) {
-    await leaveTenant({ userIds: id, tenantId: unref(tenantId) }, success);
-  }
-
-  /**
-   * 批量请离
-   */
-  async function handleLeaveBatch() {
-    await leaveTenant({ userIds: selectedRowKeys.value.join(','), tenantId: unref(tenantId) }, success);
-  }
-</script>
-
-<style scoped>
-  /*update-begin---author:wangshuai ---date:20220705  for:查询组件input有后缀,隐藏掉------------*/
-  :deep(.ant-input-suffix) {
-    display: none;
-  }
-  /*update-begin---author:wangshuai ---date:20220705  for:查询组件input有后缀,隐藏掉------------*/
-</style>

+ 0 - 183
src/views/system/tenant/components/TenantUserRightList.vue

@@ -1,183 +0,0 @@
-<template>
-  <BasicTable @register="registerTable" style="padding-top: 10px">
-    <template #departNames="{ text, record }">
-      <template v-if="text && text.length > 0">
-        {{ getName(text) }}
-      </template>
-    </template>
-    <template #positionNames="{ text, record }">
-      <template v-if="text && text.length > 0">
-        {{ getName(text) }}
-      </template>
-    </template>
-    <template #tableTitle>
-      <a-button preIcon="ant-design:usergroup-add-outlined" type="primary" @click="addUser" :disabled="tenantPackData.izSysn == '1'"
-        >邀请成员</a-button
-      >
-      <a-button preIcon="ant-design:rollback-outlined" @click="cancel">关闭</a-button>
-    </template>
-    <!--操作栏-->
-    <template #action="{ record }">
-      <TableAction :actions="getTableAction(record)" />
-    </template>
-  </BasicTable>
-  <tenant-user-select-modal :multi="true" @register="registerUserModal" @on-select="onSelected" :tenantId="getTenantId"></tenant-user-select-modal>
-</template>
-
-<script lang="ts">
-  import { defineComponent, defineEmits } from 'vue';
-  import { BasicModal } from '@/components/Modal';
-  import { BasicTable, TableAction } from '@/components/Table';
-  import TenantUserSelectModal from '@/views/system/tenant/components/TenantUserSelectModal.vue';
-  import { addTenantPackUser, deleteTenantPackUser } from '@/views/system/tenant/tenant.api';
-  //注册table数据
-  import { useListPage } from '@/hooks/system/useListPage';
-  import { queryTenantPackUserList } from '@/views/system/tenant/tenant.api';
-  import { tenantPackUserColumns } from '@/views/system/tenant/tenant.data';
-  import { useModal } from '@/components/Modal';
-  import { computed, reactive } from 'vue';
-
-  export default defineComponent({
-    name: 'TenantUserRightList',
-    components: { BasicModal, BasicTable, TableAction, TenantUserSelectModal },
-    emits: ['cancel'],
-    setup(props, { emit }) {
-      const [registerUserModal, { openModal: openUserModal, closeModal: closeUserModal }] = useModal();
-      //获取租户id
-      const getTenantId = computed(() => {
-        return tenantPackData.tenantId;
-      });
-
-      //套餐包信息
-      const tenantPackData = reactive<any>({});
-      const { tableContext } = useListPage({
-        tableProps: {
-          api: queryTenantPackUserList,
-          immediate: false,
-          columns: tenantPackUserColumns,
-          canResize: false,
-          useSearchForm: false,
-          beforeFetch: (params) => {
-            params.tenantId = tenantPackData.tenantId;
-            params.packId = tenantPackData.id;
-            params.status = 1;
-            return params;
-          },
-          actionColumn: {
-            width: 120,
-            fixed: 'right',
-          },
-        },
-      });
-
-      const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
-
-      /**
-       * 初始化数据
-       * @param value
-       */
-      function initData(value) {
-        console.log('value::', value);
-        Object.assign(tenantPackData, value);
-        reload();
-      }
-
-      /**
-       * 表格操作列
-       * @param record
-       */
-      function getTableAction(record) {
-        return [
-          {
-            label: '移除',
-            popConfirm: {
-              title: '是否确认移除',
-              confirm: handleDelete.bind(null, record),
-            },
-            ifShow: () => tenantPackData.izSysn != '1',
-          },
-        ];
-      }
-
-      /**
-       * 删除
-       */
-      async function handleDelete(record) {
-        let params = {
-          packId: record.packId,
-          packName: record.packName,
-          tenantId: tenantPackData.tenantId,
-          userId: record.id,
-          realname: record.realname,
-        };
-        await deleteTenantPackUser(params);
-        await reload();
-      }
-
-      /**
-       * 添加用户弹窗
-       */
-      function addUser() {
-        openUserModal(true, {
-          list: [],
-        });
-      }
-
-      /**
-       * 邀请人回调事件
-       * @param arr
-       */
-      async function onSelected(arr) {
-        if (arr && arr.length > 0) {
-          let names: any[] = [];
-          let ids: any[] = [];
-          for (let u of arr) {
-            names.push(u.realname);
-            ids.push(u.id);
-          }
-          let params = {
-            packId: tenantPackData.id,
-            packName: tenantPackData.packName,
-            tenantId: tenantPackData.tenantId,
-            userId: ids.join(','),
-            realname: names.join(','),
-          };
-          await addTenantPackUser(params);
-          await reload();
-          closeUserModal();
-        }
-      }
-
-      /**
-       * 获取部门/职务名称
-       * @param value
-       */
-      function getName(value) {
-        return value.join(',');
-      }
-
-      /**
-       * 关闭
-       */
-      function cancel() {
-        emit('cancel');
-      }
-
-      return {
-        getTableAction,
-        onSelected,
-        registerTable,
-        registerUserModal,
-        getTenantId,
-        rowSelection,
-        addUser,
-        initData,
-        getName,
-        cancel,
-        tenantPackData,
-      };
-    },
-  });
-</script>
-
-<style scoped lang="less"></style>

+ 0 - 159
src/views/system/tenant/components/TenantUserSelectModal.vue

@@ -1,159 +0,0 @@
-<!--套餐中使用的用户选择框-->
-<template>
-  <div>
-    <BasicModal
-      v-bind="$attrs"
-      @register="register"
-      :title="modalTitle"
-      width="900px"
-      wrapClassName="j-user-select-modal"
-      @ok="handleOk"
-      destroyOnClose
-    >
-      <BasicTable ref="tableRef" @register="registerTable" :rowSelection="rowSelection">
-        <template #tableTitle></template>
-      </BasicTable>
-    </BasicModal>
-  </div>
-</template>
-<script lang="ts">
-  import { defineComponent, ref } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { getTenantUserList } from '../tenant.api';
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { userColumns, userSearchFormSchema } from '../tenant.data';
-
-  export default defineComponent({
-    name: 'TenantUserSelectModal',
-    components: {
-      //此处需要异步加载BasicTable
-      BasicModal,
-      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {
-        loading: true,
-      }),
-    },
-    props: {
-      //选择框标题
-      modalTitle: {
-        type: String,
-        default: '选择用户',
-      },
-      //查询参数
-      tenantId: {
-        type: Number,
-        default: 0,
-      },
-      //排除用户id的集合
-      excludeUserIdList: {
-        type: Array,
-        default: [],
-      },
-    },
-    emits: ['register', 'on-select'],
-    setup(props, { emit, refs }) {
-      const tableScroll = ref<any>({ x: false });
-      const tableRef = ref();
-      //注册弹框
-      const [register, { closeModal }] = useModalInner(() => {
-        if (window.innerWidth < 900) {
-          tableScroll.value = { x: 900 };
-        } else {
-          tableScroll.value = { x: false };
-        }
-        setTimeout(() => {
-          if (tableRef.value) {
-            tableRef.value.setSelectedRowKeys([]);
-          }
-        }, 800);
-      });
-
-      //定义表格列
-      const columns = [
-        {
-          title: '账号',
-          dataIndex: 'username',
-          width: 40,
-          align: 'left',
-        },
-        {
-          title: '姓名',
-          dataIndex: 'realname',
-          width: 40,
-        },
-        {
-          title: '性别',
-          dataIndex: 'sex_dictText',
-          width: 20,
-        },
-        {
-          title: '手机号码',
-          dataIndex: 'phone',
-          width: 30,
-        },
-        {
-          title: '邮箱',
-          dataIndex: 'email',
-          width: 40,
-        },
-        {
-          title: '状态',
-          dataIndex: 'status_dictText',
-          width: 20,
-        },
-      ];
-
-      // 列表页面公共参数、方法
-      const { prefixCls, tableContext } = useListPage({
-        designScope: 'tenant-template',
-        tableProps: {
-          api: getTenantUserList,
-          columns: userColumns,
-          scroll: { y: 390 },
-          rowKey: 'id',
-          showActionColumn: false,
-          formConfig: {
-            schemas: userSearchFormSchema,
-            labelWidth: 60,
-            actionColOptions: {
-              xs: 24,
-              sm: 8,
-              md: 8,
-              lg: 8,
-              xl: 8,
-              xxl: 8,
-            },
-          },
-          beforeFetch: (params) => {
-            return Object.assign(params, { userTenantId: props.tenantId });
-          },
-        },
-      });
-      const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
-
-      /**
-       * 确定选择
-       */
-      function handleOk() {
-        //返回选中事件
-        emit('on-select', rowSelection.selectedRows, rowSelection.selectedRowKeys);
-      }
-
-      return {
-        handleOk,
-        register,
-        columns,
-        rowSelection,
-        tableScroll,
-        tableRef,
-        registerTable,
-      };
-    },
-  });
-</script>
-
-<style scoped>
-  :deep(.ant-input-suffix) {
-    display: none;
-  }
-</style>

+ 23 - 26
src/views/system/tenant/index.vue

@@ -7,14 +7,14 @@
           <template #overlay>
           <template #overlay>
             <a-menu>
             <a-menu>
               <a-menu-item key="1" @click="batchHandleDelete">
               <a-menu-item key="1" @click="batchHandleDelete">
-                <Icon icon="ant-design:delete-outlined"></Icon>
+                <Icon icon="ant-design:delete-outlined" />
                 删除
                 删除
               </a-menu-item>
               </a-menu-item>
             </a-menu>
             </a-menu>
           </template>
           </template>
           <a-button
           <a-button
             >批量操作
             >批量操作
-            <Icon icon="mdi:chevron-down"></Icon>
+            <Icon icon="mdi:chevron-down" />
           </a-button>
           </a-button>
         </a-dropdown>
         </a-dropdown>
         <a-button
         <a-button
@@ -26,12 +26,12 @@
           >邀请用户加入</a-button
           >邀请用户加入</a-button
         >
         >
         <a-button
         <a-button
-          preIcon="ant-design:sliders-outlined"
+          preIcon="ant-design:plus-outlined"
           type="primary"
           type="primary"
           @click="handlePack"
           @click="handlePack"
           style="margin-right: 5px"
           style="margin-right: 5px"
           :disabled="selectedRowKeys.length === 0"
           :disabled="selectedRowKeys.length === 0"
-          >套餐管理</a-button
+          >套餐</a-button
         >
         >
         <a-button type="primary" @click="recycleBinClick" preIcon="ant-design:hdd-outlined">回收站</a-button>
         <a-button type="primary" @click="recycleBinClick" preIcon="ant-design:hdd-outlined">回收站</a-button>
       </template>
       </template>
@@ -40,12 +40,12 @@
       </template>
       </template>
     </BasicTable>
     </BasicTable>
     <TenantModal @register="registerModal" @success="reload" />
     <TenantModal @register="registerModal" @success="reload" />
-    <TenantInviteUserModal @register="registerSelUserModal" @inviteOk="handleInviteUserOk" />
-    <TenantUserModal @register="registerTenUserModal" />
+    <!-- <TenantInviteUserModal @register="registerSelUserModal" @inviteOk="handleInviteUserOk"/> -->
+    <!-- <TenantUserModal @register="registerTenUserModal" /> -->
     <!--  产品包  -->
     <!--  产品包  -->
-    <TenantPackList @register="registerPackModal" />
+    <!-- <TenantPackList @register="registerPackModal" /> -->
     <!--  租户回收站  -->
     <!--  租户回收站  -->
-    <TenantRecycleBinModal @register="registerRecycleBinModal" @success="reload" />
+    <!-- <TenantRecycleBinModal @register="registerRecycleBinModal" @success="reload" /> -->
   </div>
   </div>
 </template>
 </template>
 <script lang="ts" name="system-tenant" setup>
 <script lang="ts" name="system-tenant" setup>
@@ -54,20 +54,20 @@
   import { useModal } from '/@/components/Modal';
   import { useModal } from '/@/components/Modal';
   import { getTenantList, deleteTenant, batchDeleteTenant, invitationUserJoin } from './tenant.api';
   import { getTenantList, deleteTenant, batchDeleteTenant, invitationUserJoin } from './tenant.api';
   import { columns, searchFormSchema } from './tenant.data';
   import { columns, searchFormSchema } from './tenant.data';
-  import TenantModal from './components/TenantModal.vue';
+  // import TenantModal from './components/TenantModal.vue';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useListPage } from '/@/hooks/system/useListPage';
   import { useListPage } from '/@/hooks/system/useListPage';
-  import TenantInviteUserModal from './components/TenantInviteUserModal.vue';
-  import TenantUserModal from './components/TenantUserList.vue';
-  import TenantPackList from './pack/TenantPackList.vue';
-  import TenantRecycleBinModal from './components/TenantRecycleBinModal.vue';
+  // import TenantInviteUserModal from './components/TenantInviteUserModal.vue';
+  // // import TenantUserModal from './components/TenantUserList.vue';
+  // import TenantPackList from './pack/TenantPackList.vue';
+  // import TenantRecycleBinModal from './components/TenantRecycleBinModal.vue';
 
 
   const { createMessage } = useMessage();
   const { createMessage } = useMessage();
   const [registerModal, { openModal }] = useModal();
   const [registerModal, { openModal }] = useModal();
-  const [registerSelUserModal, { openModal: userOpenModal }] = useModal();
-  const [registerTenUserModal, { openModal: tenUserOpenModal }] = useModal();
-  const [registerPackModal, { openModal: packModal }] = useModal();
-  const [registerRecycleBinModal, { openModal: recycleBinModal }] = useModal();
+  // const [registerSelUserModal, { openModal: userOpenModal }] = useModal();
+  // const [registerTenUserModal, { openModal: tenUserOpenModal }] = useModal();
+  // const [registerPackModal, { openModal: packModal }] = useModal();
+  // const [registerRecycleBinModal, { openModal: recycleBinModal }] = useModal();
 
 
   // 列表页面公共参数、方法
   // 列表页面公共参数、方法
   const { prefixCls, tableContext } = useListPage({
   const { prefixCls, tableContext } = useListPage({
@@ -156,17 +156,14 @@
   /**
   /**
    * 用户选择回调事件
    * 用户选择回调事件
    * @param options
    * @param options
-   * @param phone
-   * @param userSelectId
+   * @param value
    */
    */
-  async function handleInviteUserOk(phone, username) {
-    // 代码逻辑说明: 【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户------------
-    if (phone) {
-      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: phone });
-    }
-    if (username) {
-      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), username: username });
+  async function handleInviteUserOk(value) {
+    //update-begin---author:wangshuai ---date:20230314  for:【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户------------
+    if (value) {
+      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: value });
     }
     }
+    //update-end---author:wangshuai ---date:20230314  for:【QQYUN-4605】后台的邀请谁加入租户,没办法选不是租户下的用户------------
   }
   }
 
 
   /**
   /**

+ 0 - 432
src/views/system/tenant/my/MyTenantDetail.vue

@@ -1,432 +0,0 @@
-<!--我的租户详情-->
-<template>
-  <div class="message-set-container">
-    <div class="message-set-box">
-      <div class="message-set-header">
-        <span class="font17">组织信息</span>
-      </div>
-      <a-form :model="formState">
-        <div class="message-set-content">
-          <div class="common-info">
-            <div class="common-info-row">
-              <div class="common-info-row-label">组织LOGO</div>
-              <div class="common-info-row-content">
-                <JImageUpload v-model:value="formState.companyLogo" @change="handleCompanyLogoChange"></JImageUpload>
-              </div>
-            </div>
-            <div class="common-info-row m-top24">
-              <div class="common-info-row-label">组织名称</div>
-              <span class="m-right16">{{ formState.name }}</span>
-              <span class="edit-name" @click="goUpdate('name')">修改</span>
-            </div>
-            <div class="common-info-row m-top24">
-              <div class="common-info-row-label">组织门牌号</div>
-              <div class="common-info-row-content">
-                <span class="pointer">
-                  <span>{{ formState.houseNumber }}</span>
-                </span>
-              </div>
-            </div>
-            <div class="common-info-row m-top24">
-              <div class="common-info-row-label">组织编号(ID)</div>
-              <div class="common-info-row-content">
-                <span class="pointer">
-                  <span>{{ formState.id }}</span>
-                </span>
-              </div>
-            </div>
-            <div class="split-line"></div>
-            <div class="common-info-row">
-              <div class="common-info-row-label">所在地</div>
-              <span class="m-right16">{{ formState.companyAddress_dictText }}</span>
-              <span class="edit-name" @click="goUpdate('companyAddress')">修改</span>
-            </div>
-            <div class="common-info-row m-top24">
-              <div class="common-info-row-label">所在行业</div>
-              <span class="m-right16">{{ formState.trade_dictText }}</span>
-              <span class="edit-name" @click="goUpdate('trade')">修改</span>
-            </div>
-            <div class="common-info-row m-top24">
-              <div class="common-info-row-label">工作地点</div>
-              <span class="m-right16">{{ formState.workPlace }}</span>
-              <span class="edit-name" @click="goUpdate('workPlace')">修改</span>
-            </div>
-            <div class="cancel-split-line"></div>
-          </div>
-        </div>
-      </a-form>
-    </div>
-  </div>
-  <!-- 组织名称修改弹窗 -->
-  <a-modal v-model:open="modalVisible.name" title="修改组织名称" width="500" destroy-on-close @ok="doUpdate('name')">
-    <a-form ref="manageNameRef" :model="updateInfo" :rules="getManageNameRules">
-      <a-form-item name="name" class="form-item-padding">
-        <div class="form-group">
-          <span class="form-label">
-            组织名称
-            <span class="txt-middle red">*</span>
-          </span>
-          <a-input v-model:value="updateInfo.name" />
-        </div>
-      </a-form-item>
-    </a-form>
-  </a-modal>
-
-  <!-- 组织所在地弹窗 -->
-  <a-modal v-model:open="modalVisible.companyAddress" title="所在地" width="500" destroy-on-close @ok="doUpdate('companyAddress')">
-    <a-form :model="updateInfo">
-      <a-form-item name="companyAddress" class="form-item-padding">
-        <div style="margin-top: 20px">
-          <j-area-select v-model:value="updateInfo.companyAddress" />
-        </div>
-      </a-form-item>
-    </a-form>
-  </a-modal>
-
-  <!-- 组织所在行业弹窗 -->
-  <a-modal v-model:open="modalVisible.trade" title="设置所在行业" width="500" destroy-on-close @ok="doUpdate('trade')">
-    <a-form :model="updateInfo">
-      <a-form-item name="trade" class="form-item-padding">
-        <div style="margin-top: 20px">
-          <j-dict-select-tag v-model:value="updateInfo.trade" dictCode="trade" />
-        </div>
-      </a-form-item>
-    </a-form>
-  </a-modal>
-
-  <!-- 工作地点弹窗 -->
-  <a-modal v-model:open="modalVisible.workPlace" title="设置工作地点" width="500" destroy-on-close @ok="doUpdate('workPlace')">
-    <a-form ref="workPlaceRef" :model="updateInfo">
-      <a-form-item name="name" class="form-item-padding">
-        <div style="margin-top: 20px">
-          <a-textarea placeholder="请填写工作地点" v-model:value="updateInfo.workPlace" />
-        </div>
-      </a-form-item>
-    </a-form>
-  </a-modal>
-</template>
-<script lang="ts" name="tenant-my-tenant-list" setup>
-  import { onMounted, reactive, ref } from 'vue';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { getFileAccessHttpUrl, tenantSaasMessage } from '@/utils/common/compUtils';
-  import { getTenantById, saveOrUpdateTenant } from '@/views/system/tenant/tenant.api';
-  import { getTenantId } from '@/utils/auth';
-  import { getDataByCode, getRealCode, provinceOptions } from '@/components/Form/src/utils/areaDataUtil';
-  import { initDictOptions } from '@/utils/dict';
-  import { createImgPreview } from '@/components/Preview';
-  import { JImageUpload } from '@/components/Form';
-  // import {updateTenantInfo} from "@/views/super/myapps/organization/organization.api";
-  import { defHttp } from '/@/utils/http/axios';
-  import JAreaSelect from '/@/components/Form/src/jeecg/components/JAreaSelect.vue';
-  import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
-
-  const { createMessage } = useMessage();
-  const formState = reactive({
-    id: '',
-    name: '',
-    houseNumber: '',
-    companyAddress_dictText: '',
-    trade_dictText: '',
-    workPlace: '',
-    createBy: '',
-    companyLogo: '',
-  });
-  let tradeOptions: any[] = [];
-  //组织名称ref
-  const manageNameRef = ref();
-  // modal显示
-  const modalVisible = reactive<any>({
-    name: false,
-    trade: false,
-    companyAddress: false,
-  });
-
-  // 组织名称检验规则
-  const getManageNameRules = {
-    name: [{ required: true, message: '组织名称不能为空', trigger: 'blur' }],
-  };
-
-  //修改对象
-  const updateInfo = reactive<any>({
-    name: '',
-    trade: '',
-    companyAddress: '',
-    workPlace: '',
-  });
-
-  /**
-   * 初始化租户信息
-   */
-  async function initTenant() {
-    let result = await getTenantById({ id: getTenantId() });
-    if (result) {
-      if (result.companyAddress) {
-        formState.companyAddress_dictText = getPcaText(result.companyAddress);
-      } else {
-        formState.companyAddress_dictText = '';
-      }
-      if (result.trade) {
-        formState.trade_dictText = await getTradeText(result.trade);
-      } else {
-        formState.trade_dictText = '';
-      }
-      Object.assign(formState, result);
-    }
-  }
-
-  /**
-   * 获取省市区文本
-   * @param code
-   */
-  function getPcaText(code) {
-    let arr = getRealCode(code, 3);
-    console.log('arr:::', arr);
-    let provinces: any = provinceOptions.filter((item) => item.value == arr[0]);
-    let cities: any[] = getDataByCode(arr[0]);
-    let areas: any[] = getDataByCode(arr[1]);
-    let str = '';
-    if (provinces && provinces.length > 0) {
-      str = provinces[0].label;
-      if (cities && cities.length > 0) {
-        let temp1 = cities.filter((item) => item.value == arr[1]);
-        str = str + '/' + temp1[0].label;
-        if (areas && areas.length > 0) {
-          let temp2 = areas.filter((item) => item.value == arr[2]);
-          str = str + '/' + temp2[0].label;
-        }
-      }
-    }
-    return str;
-  }
-
-  /**
-   * 获取行业文本
-   *
-   * @param trade
-   */
-  async function getTradeText(trade) {
-    if (tradeOptions.length == 0) {
-      let options: any = await initDictOptions('trade');
-      tradeOptions = options;
-    }
-    let arr = tradeOptions.filter((item) => item.value == trade);
-    if (arr.length > 0) {
-      return arr[0].label;
-    }
-    return '';
-  }
-
-  /**
-   * 公司logo上传成功事件
-   *
-   * @param val
-   */
-  function handleCompanyLogoChange(val) {
-    if (val) {
-      saveOrUpdateTenant({ id: formState.id, companyLogo: val }, true);
-    }
-  }
-
-  /**
-   * 更新打开弹窗
-   *
-   * @param key
-   */
-  function goUpdate(key) {
-    modalVisible[key] = true;
-    updateInfo[key] = formState[key];
-  }
-
-  /**
-   * 编辑租户信息
-   * @param params
-   */
-  async function updateTenantInfo(params) {
-    return defHttp.put({ url: '/sys/tenant/editOwnTenant', params });
-  }
-
-  /**
-   * 更新数据
-   * @param key
-   */
-  async function doUpdate(key) {
-    if (key == 'name') {
-      await manageNameRef.value.validateFields();
-    }
-    //所在地为空报错
-    if (key == 'companyAddress') {
-      if (updateInfo[key] instanceof Array) {
-        updateInfo[key] = '';
-      }
-    }
-    let params = {
-      id: formState.id,
-      [key]: updateInfo[key],
-    };
-    await updateTenantInfo(params);
-    initTenant();
-    modalVisible[key] = false;
-  }
-
-  onMounted(() => {
-    //提示信息
-    tenantSaasMessage('我的租户');
-    initTenant();
-  });
-</script>
-<style lang="less" scoped>
-  .message-set-container {
-    box-sizing: border-box;
-    flex: 1;
-    margin: 16px;
-    min-height: 0;
-  }
-  .message-set-box {
-    background: #fff;
-    border-radius: 4px;
-    display: flex;
-    flex-direction: column;
-    min-width: 750px;
-    position: relative;
-    height: 100%;
-  }
-  .message-set-header {
-    align-items: center;
-    background: #fff;
-    border-bottom: 1px solid #eaeaea;
-    box-sizing: border-box;
-    color: #333;
-    display: flex;
-    font-weight: 600;
-    height: 57px;
-    line-height: 57px;
-    padding: 0 18px 0 24px;
-  }
-  .message-set-content {
-    box-sizing: border-box;
-    flex: 1;
-    min-height: 0;
-    overflow-x: hidden;
-  }
-  .font17 {
-    font-size: 17px;
-  }
-  .common-info {
-    padding: 20px 24px;
-    background: #ffffff;
-    margin-bottom: 20px;
-  }
-  .common-info-row {
-    color: #333;
-    display: flex;
-    font-size: 13px;
-  }
-  .common-info-row-label {
-    color: #757575;
-    display: flex;
-    justify-content: flex-start;
-    width: 140px;
-  }
-  .common-info-row-content {
-    display: flex;
-    flex: 1;
-    flex-direction: column;
-  }
-  .pointer {
-    cursor: pointer;
-  }
-  .delete-color {
-    color: #f51744;
-    cursor: pointer;
-  }
-  .set-describe {
-    color: #757575;
-    margin-top: 10px !important;
-  }
-  .m-top24 {
-    margin-top: 24px;
-  }
-  .edit-name {
-    border: none;
-    border-radius: 3px;
-    box-sizing: border-box;
-    color: #1e88e5;
-    cursor: pointer;
-    display: inline-block;
-    outline: none;
-    text-shadow: none;
-    user-select: none;
-    vertical-align: middle;
-  }
-  .m-right16 {
-    margin-right: 16px;
-  }
-  .split-line {
-    background: #eaeaea;
-    height: 1px;
-    margin: 40px 0;
-    width: 100%;
-  }
-  .cancel-split-line {
-    background: #eaeaea;
-    height: 1px;
-    margin: 40px 0 20px;
-    width: 100%;
-  }
-  .form-item-padding {
-    padding: 0 24px 22px;
-  }
-  .form-group {
-    display: table;
-    font-size: 13px;
-    position: relative;
-    width: 100%;
-    .form-label {
-      color: #333;
-      font-weight: 600;
-      line-height: 29px;
-    }
-    .txt-middle {
-      vertical-align: middle !important;
-    }
-  }
-  .red {
-    color: red;
-  }
-  .domain-background {
-    height: 56px;
-    margin-top: 6px;
-    width: 100px;
-    margin-left: 142px;
-  }
-  .cancellation {
-    color: #333333;
-    font-size: 20px;
-    font-weight: 700;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-  :deep(.ant-upload.ant-upload-select) {
-    width: 80px !important;
-    height: 80px !important;
-    border: unset !important;
-  }
-  :deep(.ant-upload-list-item-container) {
-    width: 80px !important;
-    height: 80px !important;
-    border: unset !important;
-  }
-  .edit-name {
-    border: none;
-    border-radius: 3px;
-    box-sizing: border-box;
-    color: #1e88e5;
-    cursor: pointer;
-    display: inline-block;
-    outline: none;
-    text-shadow: none;
-    user-select: none;
-    vertical-align: middle;
-  }
-</style>

+ 0 - 170
src/views/system/tenant/my/MyTenantList.vue

@@ -1,170 +0,0 @@
-<template>
-  <div>
-    <BasicTable @register="registerTable" :rowSelection="rowSelection" @fetch-success="onFetchSuccess">
-      <template #tableTitle>
-        <a-button
-          preIcon="ant-design:user-add-outlined"
-          type="primary"
-          @click="handleInvitation"
-          style="margin-right: 5px"
-          :disabled="selectedRowKeys.length === 0"
-          >邀请用户加入</a-button
-        >
-        <!--        <a-button
-          preIcon="ant-design:plus-outlined"
-          type="primary"
-          @click="handlePack"
-          style="margin-right: 5px"
-          :disabled="selectedRowKeys.length === 0"
-          >套餐</a-button
-        >-->
-      </template>
-      <template #action="{ record }">
-        <TableAction :actions="getActions(record)" />
-      </template>
-    </BasicTable>
-    <TenantInviteUserModal @register="registerSelUserModal" @inviteOk="handleInviteUserOk" />
-    <TenantUserModal @register="registerTenUserModal" />
-    <!--  产品包  -->
-    <TenantPackList @register="registerPackModal" />
-  </div>
-</template>
-<script lang="ts" name="tenant-my-tenant-list" setup>
-  import { onMounted, ref, unref } from 'vue';
-  import { BasicTable, TableAction } from '/@/components/Table';
-  import { useModal } from '/@/components/Modal';
-  import { invitationUserJoin, getTenantPageListByUserId } from '../tenant.api';
-  import { columns, searchFormSchema } from '../tenant.data';
-  import TenantModal from '../components/TenantModal.vue';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import TenantInviteUserModal from '../components/TenantInviteUserModal.vue';
-  import TenantUserModal from '../components/TenantUserList.vue';
-  import TenantPackList from '../pack/TenantPackList.vue';
-  import { getTenantId } from '/@/utils/auth';
-  import { useUserStore } from '/@/store/modules/user';
-  import { tenantSaasMessage } from '@/utils/common/compUtils';
-
-  const { createMessage } = useMessage();
-  const [registerModal, { openModal }] = useModal();
-  const [registerSelUserModal, { openModal: userOpenModal }] = useModal();
-  const [registerTenUserModal, { openModal: tenUserOpenModal }] = useModal();
-  const [registerPackModal, { openModal: packModal }] = useModal();
-  const userStore = useUserStore();
-
-  // 列表页面公共参数、方法
-  const { prefixCls, tableContext } = useListPage({
-    designScope: 'tenant-template',
-    tableProps: {
-      title: '租户列表',
-      api: getTenantPageListByUserId,
-      columns: columns,
-      formConfig: {
-        schemas: searchFormSchema,
-      },
-      actionColumn: {
-        width: 150,
-        fixed: 'right',
-      },
-      rowSelection: {
-        type: 'radio',
-      },
-      beforeFetch: (params) => {
-        return Object.assign(params, { userTenantStatus: '1,3,4' });
-      },
-    },
-  });
-  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;
-
-  // 默认选中当前租户
-  function onFetchSuccess(data) {
-    let items = data.items;
-    console.log('items:', items);
-    // 当前登录租户ID
-    let loginTenantId = getTenantId();
-    console.log('loginTenantId:', loginTenantId);
-    // 如果当前登录租户ID在列表中,则默认选中
-    if (items && items.length > 0 && loginTenantId) {
-      for (let i = 0; i < items.length; i++) {
-        if (items[i].id == loginTenantId) {
-          console.log('items[i].id:', items[i].id);
-          selectedRowKeys.value = [items[i].id];
-          selectedRows.value = [items[i]];
-          return;
-        }
-      }
-    }
-  }
-
-  /**
-   * 操作列定义
-   * @param record
-   */
-  function getActions(record) {
-    return [
-      {
-        label: '用户',
-        onClick: handleSeeUser.bind(null, record.id),
-      },
-    ];
-  }
-
-  /**
-   * 邀请用户加入租户
-   */
-  function handleInvitation() {
-    userOpenModal(true, {});
-  }
-
-  /**
-   * 用户选择回调事件
-   * @param options
-   * @param phone
-   * @param userSelectId
-   */
-  async function handleInviteUserOk(phone, username) {
-    if (phone) {
-      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: phone });
-    }
-    if (username) {
-      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), username: username });
-    }
-  }
-
-  /**
-   * 查看用户
-   * @param id
-   */
-  async function handleSeeUser(id) {
-    tenUserOpenModal(true, {
-      id: id,
-    });
-  }
-
-  /**
-   * 新增产品包
-   */
-  async function handlePack() {
-    if (unref(selectedRowKeys).length > 1) {
-      createMessage.warn('请选择一个');
-      return;
-    }
-    packModal(true, {
-      tenantId: unref(selectedRowKeys.value.join(',')),
-      //我的租户不显示新增和编辑产品包
-      showPackAddAndEdit: false,
-    });
-  }
-
-  /**
-   * 删除成功之后回调事件
-   */
-  function handleSuccess() {
-    (selectedRowKeys.value = []) && reload();
-  }
-
-  onMounted(() => {
-    //提示信息
-    tenantSaasMessage('我的租户');
-  });
-</script>

+ 0 - 272
src/views/system/tenant/pack/PackPermissionDrawer.vue

@@ -1,272 +0,0 @@
-<template>
-  <BasicDrawer v-bind="$attrs" @register="registerDrawer" width="650px" destroyOnClose showFooter>
-    <template #title>
-      权限配置
-      <a-dropdown>
-        <a-button class="more-icon">
-          更多操作
-          <Icon icon="ant-design:down-outlined" size="14px" style="position: relative; top: 1px; right: 5px"></Icon>
-        </a-button>
-        <template #overlay>
-          <a-menu @click="treeMenuClick">
-            <a-menu-item key="checkAll">选择全部</a-menu-item>
-            <a-menu-item key="cancelCheck">取消选择</a-menu-item>
-            <div class="line"></div>
-            <a-menu-item key="openAll">展开全部</a-menu-item>
-            <a-menu-item key="closeAll">折叠全部</a-menu-item>
-            <div class="line"></div>
-            <a-menu-item key="relation">层级关联</a-menu-item>
-            <a-menu-item key="standAlone">层级独立</a-menu-item>
-          </a-menu>
-        </template>
-      </a-dropdown>
-    </template>
-    <BasicTree
-      ref="treeRef"
-      checkable
-      :treeData="treeData"
-      :checkedKeys="checkedKeys"
-      :expandedKeys="expandedKeys"
-      :selectedKeys="selectedKeys"
-      :clickRowToExpand="false"
-      :checkStrictly="true"
-      title="所拥有的的权限"
-      @check="onCheck"
-    >
-      <template #title="{ slotTitle, ruleFlag }">
-        {{ slotTitle }}
-        <Icon v-if="ruleFlag" icon="ant-design:align-left-outlined" style="margin-left: 5px; color: red"></Icon>
-      </template>
-    </BasicTree>
-    <!--右下角按钮-->
-    <template #footer>
-      <!-- <PopConfirmButton title="确定放弃编辑?" @confirm="closeDrawer" okText="确定" cancelText="取消"></PopConfirmButton> -->
-      <a-button @click="closeDrawer">取消</a-button>
-      <a-button @click="handleSubmit(false)" type="primary" :loading="loading" ghost style="margin-right: 0.8rem">仅保存</a-button>
-      <a-button @click="handleSubmit(true)" type="primary" :loading="loading">保存并关闭</a-button>
-    </template>
-  </BasicDrawer>
-</template>
-<script lang="ts" setup>
-  import { ref, unref } from 'vue';
-  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
-  import { BasicTree, TreeItem } from '/@/components/Tree';
-  import { queryPremTreeList, editPackPermission } from '../tenant.api';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { PACK_AUTH_CONFIG_KEY } from '/@/enums/cacheEnum';
-  const emit = defineEmits(['register', 'success']);
-  //树的信息
-  const treeData = ref<TreeItem[]>([]);
-  //树的全部节点信息
-  const allTreeKeys = ref([]);
-  //树的选择节点信息
-  const checkedKeys = ref<any>([]);
-  //树的选中的节点信息
-  const selectedKeys = ref([]);
-  const packId = ref('');
-  //树的实例
-  const treeRef = ref(null);
-  const loading = ref(false);
-
-  //展开折叠的key
-  const expandedKeys = ref<any>([]);
-  //父子节点选中状态是否关联 true不关联,false关联
-  const checkStrictly = ref<boolean>(false);
-  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
-    await reset();
-    setDrawerProps({ confirmLoading: false, loading: true });
-    packId.value = data.packId;
-    //初始化数据
-    const roleResult = await queryPremTreeList();
-    treeData.value = translateTitle(roleResult.treeList);
-    allTreeKeys.value = roleResult.ids;
-    const localData = localStorage.getItem(PACK_AUTH_CONFIG_KEY);
-    if (localData) {
-      const obj = JSON.parse(localData);
-      obj.level && treeMenuClick({ key: obj.level });
-      obj.expand && treeMenuClick({ key: obj.expand });
-    } else {
-      expandedKeys.value = roleResult.ids;
-    }
-
-    //初始化角色菜单数据
-    if (data.permissionIds) {
-      checkedKeys.value = data.permissionIds.split(',');
-    }
-
-    setDrawerProps({ loading: false });
-  });
-  /**
-   * 翻译菜单名称
-   */
-  function translateTitle(data) {
-    if (data?.length) {
-      data.forEach((item) => {
-        if (item.slotTitle) {
-          const { t } = useI18n();
-          if (item.slotTitle.includes("t('") && t) {
-            item.slotTitle = new Function('t', `return ${item.slotTitle}`)(t);
-          }
-        }
-        if (item.children?.length) {
-          translateTitle(item.children);
-        }
-      });
-    }
-    return data;
-  }
-  /**
-   * 点击选中
-   */
-  function onCheck(o, e) {
-    // checkStrictly: true=>层级独立,false=>层级关联.
-    if (checkStrictly.value) {
-      checkedKeys.value = o.checked ? o.checked : o;
-    } else {
-      const keys = getNodeAllKey(e.node, 'children', 'key');
-      if (e.checked) {
-        // 反复操作下可能会有重复的keys,得用new Set去重下
-        checkedKeys.value = [...new Set([...checkedKeys.value, ...keys])];
-      } else {
-        const result = removeMatchingItems(checkedKeys.value, keys);
-        checkedKeys.value = result;
-      }
-    }
-  }
-  /**
-   * 删除相匹配数组的项
-   */
-  function removeMatchingItems(arr1, arr2) {
-    // 使用哈希表记录 arr2 中的元素
-    const hashTable = {};
-    for (const item of arr2) {
-      hashTable[item] = true;
-    }
-    // 使用 filter 方法遍历第一个数组,过滤出不在哈希表中存在的项
-    return arr1.filter((item) => !hashTable[item]);
-  }
-  /**
-   * 获取当前节点及以下所有子孙级的key
-   */
-  function getNodeAllKey(node: any, children: any, key: string) {
-    const result: any = [];
-    result.push(node[key]);
-    const recursion = (data) => {
-      data.forEach((item: any) => {
-        result.push(item[key]);
-        if (item[children]?.length) {
-          recursion(item[children]);
-        }
-      });
-    };
-    node[children]?.length && recursion(node[children]);
-    return result;
-  }
-
-  /**
-   * 数据重置
-   */
-  function reset() {
-    treeData.value = [];
-    allTreeKeys.value = [];
-    checkedKeys.value = [];
-    selectedKeys.value = [];
-    packId.value = '';
-  }
-  /**
-   * 获取tree实例
-   */
-  function getTree() {
-    const tree = unref(treeRef);
-    if (!tree) {
-      throw new Error('tree is null!');
-    }
-    return tree;
-  }
-  /**
-   * 提交
-   */
-  async function handleSubmit(exit) {
-    let params = {
-      id: unref(packId),
-      permissionIds: unref(getTree()?.getCheckedKeys()).join(','),
-    };
-    if (loading.value === false) {
-      await doSave(params);
-    } else {
-      console.log('请等待上次执行完毕!');
-    }
-    if (exit) {
-      // 如果关闭
-      closeDrawer();
-    }
-  }
-
-  // VUE角色授权重复保存 #352
-  async function doSave(params) {
-    loading.value = true;
-    try {
-      await editPackPermission(params);
-      emit('success');
-    } catch (e) {
-      loading.value = false;
-    }
-    setTimeout(() => {
-      loading.value = false;
-    }, 500);
-  }
-
-  /**
-   * 树菜单选择
-   * @param key
-   */
-  function treeMenuClick({ key }) {
-    if (key === 'checkAll') {
-      checkedKeys.value = allTreeKeys.value;
-    } else if (key === 'cancelCheck') {
-      checkedKeys.value = [];
-    } else if (key === 'openAll') {
-      expandedKeys.value = allTreeKeys.value;
-      saveLocalOperation('expand', 'openAll');
-    } else if (key === 'closeAll') {
-      expandedKeys.value = [];
-      saveLocalOperation('expand', 'closeAll');
-    } else if (key === 'relation') {
-      checkStrictly.value = false;
-      saveLocalOperation('level', 'relation');
-    } else {
-      checkStrictly.value = true;
-      saveLocalOperation('level', 'standAlone');
-    }
-  }
-  /**
-   * 角色授权弹窗操作缓存
-   */
-  const saveLocalOperation = (key, value) => {
-    const localData = localStorage.getItem(PACK_AUTH_CONFIG_KEY);
-    const obj = localData ? JSON.parse(localData) : {};
-    obj[key] = value;
-    localStorage.setItem(PACK_AUTH_CONFIG_KEY, JSON.stringify(obj));
-  };
-</script>
-
-<style lang="less" scoped>
-  /** 固定操作按钮 */
-  .jeecg-basic-tree {
-    position: absolute;
-    width: 618px;
-  }
-  .line {
-    height: 1px;
-    width: 100%;
-    border-bottom: 1px solid #f0f0f0;
-  }
-  .more-icon {
-    float: right;
-    margin-right: 2px;
-    cursor: pointer;
-  }
-  :deep(.jeecg-tree-header) {
-    border-bottom: none;
-  }
-</style>

+ 0 - 188
src/views/system/tenant/pack/TenantCurrentPackList.vue

@@ -1,188 +0,0 @@
-<!-- 当前租户下套餐 -->
-<template>
-  <div style="display: flex; width: 100%">
-    <div :style="leftStyle">
-      <BasicTable @register="registerTable">
-        <template #tableTitle>
-          <div style="margin-left: 10px; margin-top: 5px"
-            >当前登录租户: <span class="tenant-name">{{ loginTenantName }}</span>
-          </div>
-        </template>
-        <!--操作栏-->
-        <template #action="{ record }">
-          <TableAction :actions="getTableAction(record)" />
-        </template>
-      </BasicTable>
-    </div>
-    <div v-if="showRight" style="width: 49%; transition: width 0.3s">
-      <TenantUserRightList ref="rightListRef" @cancel="handleCancel"></TenantUserRightList>
-    </div>
-  </div>
-  <TenantPackMenuModal @register="registerPackMenu" @success="success" />
-</template>
-<script lang="ts">
-  import { ref, unref, defineComponent, defineEmits } from 'vue';
-  import { useModal } from '/@/components/Modal';
-  import { packFormSchema, tenantPackColumns } from '../tenant.data';
-  import { getLoginTenantName, packList } from '../tenant.api';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { BasicTable, TableAction } from '/@/components/Table';
-  import TenantPackMenuModal from './TenantPackMenuModal.vue';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { getTenantId } from '/@/utils/auth';
-  import TenantUserRightList from '../components/TenantUserRightList.vue';
-
-  export default defineComponent({
-    name: 'TenantCurrentPackList',
-    components: {
-      TenantUserRightList,
-      BasicTable,
-      TableAction,
-      TenantPackMenuModal,
-    },
-    setup() {
-      const [registerPackMenu, { openModal }] = useModal();
-      const [registerPackUser, { openModal: packUserOpenModal }] = useModal();
-
-      const tenantId = ref<number>();
-      const rightListRef = ref<any>();
-      //是否显示右侧用户列表
-      const showRight = ref<any>();
-      //左侧样式
-      const leftStyle = ref<any>({
-        width: '100%',
-        transition: 'width 0.3s',
-      });
-
-      // 列表页面公共参数、方法
-      const { prefixCls, tableContext } = useListPage({
-        designScope: 'tenant-template',
-        tableProps: {
-          api: packList,
-          columns: tenantPackColumns,
-          immediate: false,
-          formConfig: {
-            schemas: packFormSchema,
-            labelCol: {
-              xxl: 8,
-            },
-            actionColOptions: {
-              xs: 24,
-              sm: 8,
-              md: 8,
-              lg: 8,
-              xl: 8,
-              xxl: 8,
-            },
-          },
-          beforeFetch: (params) => {
-            return Object.assign(params, { tenantId: tenantId.value, status: '1', packType: 'custom' });
-          },
-        },
-      });
-      const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;
-      //当前登录的租户名称
-      const loginTenantName = ref<string>('');
-      const { createMessage } = useMessage();
-
-      /**
-       * 获取租户名称
-       */
-      getTenantName();
-
-      async function getTenantName() {
-        let id = getTenantId();
-        if (id) {
-          loginTenantName.value = await getLoginTenantName();
-          tenantId.value = Number(id);
-          await reload();
-        }
-      }
-
-      /**
-       * 表格操作
-       * @param record
-       */
-      function getTableAction(record) {
-        return [
-          {
-            label: '用户',
-            onClick: seeTenantPackUser.bind(null, record),
-          },
-          {
-            label: '权限详情',
-            onClick: handleDetail.bind(null, record),
-          },
-        ];
-      }
-
-      /**
-       * 成功
-       */
-      function success() {
-        (selectedRowKeys.value = []) && reload();
-      }
-
-      /**
-       * 套餐包下面的用户
-       * @param record
-       */
-      function seeTenantPackUser(record) {
-        showRight.value = true;
-        leftStyle.value = {
-          width: '50%',
-          transition: 'width 0.3s',
-        };
-        setTimeout(() => {
-          rightListRef.value.initData(record);
-        }, 300);
-      }
-
-      /**
-       * 详情
-       * @param record
-       */
-      function handleDetail(record) {
-        openModal(true, {
-          isUpdate: true,
-          record: record,
-          tenantId: unref(tenantId),
-          packType: 'custom',
-          showFooter: false,
-        });
-      }
-
-      /**
-       * 关闭回调
-       */
-      function handleCancel() {
-        showRight.value = false;
-        leftStyle.value = {
-          width: '100%',
-          transition: 'width 0.3s',
-        };
-      }
-
-      return {
-        registerPackMenu,
-        success,
-        getTableAction,
-        registerTable,
-        rowSelection,
-        rightListRef,
-        showRight,
-        registerPackUser,
-        loginTenantName,
-        leftStyle,
-        handleCancel,
-      };
-    },
-  });
-</script>
-<style lang="less" scoped>
-  .tenant-name {
-    text-decoration: underline;
-    margin: 5px;
-    font-size: 15px;
-  }
-</style>

+ 0 - 162
src/views/system/tenant/pack/TenantDefaultPackList.vue

@@ -1,162 +0,0 @@
-<template>
-  <div>
-    <BasicTable @register="registerTable" :rowSelection="rowSelection">
-      <template #tableTitle>
-        <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd">租户默认套餐 </a-button>
-        <a-button
-          v-if="selectedRowKeys.length > 0"
-          preIcon="ant-design:delete-outlined"
-          type="primary"
-          @click="handlePackBatch"
-          style="margin-right: 5px"
-          >批量删除
-        </a-button>
-        <span style="color: #666; font-size: 14px; margin-left: 12px; margin-top: 4px; display: inline-block">
-          租户默认套餐是指新建租户时自动拥有的基础套餐,所有租户都将继承这些套餐权限
-        </span>
-      </template>
-      <template #action="{ record }">
-        <TableAction :actions="getActions(record)" />
-      </template>
-    </BasicTable>
-    <!--  套餐包  -->
-    <TenantPackMenuModal @register="registerPackMenuModal" @success="handleSuccess" />
-    <PackPermissionDrawer @register="registerPackPermDrawer" @success="handleSuccess" />
-  </div>
-</template>
-<script lang="ts" name="tenant-default-pack" setup>
-  import { ref, unref } from 'vue';
-  import { BasicTable, TableAction } from '/@/components/Table';
-  import { useModal } from '/@/components/Modal';
-  import { deleteTenantPack, packList } from '../tenant.api';
-  import { defalutPackColumns, defaultPackFormSchema } from '../tenant.data';
-  import TenantPackMenuModal from './TenantPackMenuModal.vue';
-  import PackPermissionDrawer from './PackPermissionDrawer.vue';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { useUserStore } from '/@/store/modules/user';
-  import { Modal } from 'ant-design-vue';
-  import { useDrawer } from '@/components/Drawer';
-
-  const { createMessage } = useMessage();
-  const [registerModal, { openModal }] = useModal();
-  const [registerPackMenuModal, { openModal: packModal }] = useModal();
-  const userStore = useUserStore();
-
-  // 列表页面公共参数、方法
-  const { prefixCls, tableContext } = useListPage({
-    designScope: 'tenant-template',
-    tableProps: {
-      api: packList,
-      columns: defalutPackColumns,
-      formConfig: {
-        schemas: defaultPackFormSchema,
-      },
-      beforeFetch: (params) => {
-        return Object.assign(params, { packType: 'default' });
-      },
-    },
-  });
-  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;
-  const [registerPackPermDrawer, { openDrawer: openPackPermDrawer }] = useDrawer();
-
-  /**
-   * 操作列定义
-   * @param record
-   */
-  function getActions(record) {
-    return [
-      {
-        label: '授权',
-        onClick: handleRolePrem.bind(null, record),
-      },
-      {
-        label: '编辑',
-        onClick: handleEdit.bind(null, record),
-      },
-      {
-        label: '删除',
-        popConfirm: {
-          title: '是否确认删除租户套餐包',
-          confirm: handleDelete.bind(null, record.id),
-        },
-      },
-    ];
-  }
-
-  /**
-   * 编辑套餐包
-   */
-  function handleAdd() {
-    packModal(true, {
-      isUpdate: false,
-      packType: 'default',
-      showFooter: true,
-    });
-  }
-
-  /**
-   * 删除默认套餐包
-   */
-  async function handleDelete(id) {
-    await deleteTenantPack({ ids: id }, handleSuccess);
-  }
-  /**
-   * 编辑
-   */
-  function handleEdit(record) {
-    packModal(true, {
-      isUpdate: true,
-      record: record,
-      packType: 'default',
-      showFooter: true,
-    });
-  }
-
-  /**
-   * 新增套餐包
-   */
-  async function handlePack() {
-    if (unref(selectedRowKeys).length > 1) {
-      createMessage.warn('请选择一个');
-      return;
-    }
-    packModal(true, {
-      tenantId: unref(selectedRowKeys.value.join(',')),
-    });
-  }
-
-  /**
-   * 删除成功之后回调事件
-   */
-  function handleSuccess() {
-    (selectedRowKeys.value = []) && reload();
-  }
-
-  /**
-   * 批量删除套餐包
-   */
-  async function handlePackBatch() {
-    Modal.confirm({
-      title: '删除租户套餐包',
-      content: '是否删除租户套餐包',
-      okText: '确认',
-      cancelText: '取消',
-      onOk: async () => {
-        await deleteTenantPack({ ids: selectedRowKeys.value.join(',') }, handleSuccess);
-      },
-    });
-  }
-
-  /**
-   * 授权
-   *
-   * @param record
-   */
-  function handleRolePrem(record) {
-    openPackPermDrawer(true, {
-      packId: record.id,
-      permissionIds: record.permissionIds,
-    });
-  }
-</script>

+ 0 - 267
src/views/system/tenant/pack/TenantPackList.vue

@@ -1,267 +0,0 @@
-<template>
-  <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit" width="800px" :showCancelBtn="false" :showOkBtn="false">
-    <BasicTable @register="registerTable" :rowSelection="rowSelection">
-      <template #tableTitle>
-        <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd" style="margin-right: 5px" v-if="showPackAddAndEdit"
-          >新增
-        </a-button>
-        <a-button
-          v-if="selectedRowKeys.length > 0"
-          preIcon="ant-design:delete-outlined"
-          type="primary"
-          @click="handlePackBatch"
-          style="margin-right: 5px"
-          >批量删除
-        </a-button>
-        <a-button preIcon="ant-design:sync-outlined" type="primary" @click="handleSyncDefaultPack" style="margin-right: 5px"
-          >初始化默认套餐
-        </a-button>
-      </template>
-      <template #action="{ record }">
-        <TableAction :actions="getActions(record)" :dropDownActions="getDropDownAction(record)" />
-      </template>
-    </BasicTable>
-  </BasicModal>
-  <TenantPackMenuModal @register="registerPackMenu" @success="success" />
-  <TenantPackUserModal @register="registerPackUser" @success="success" />
-  <PackPermissionDrawer @register="registerPackPermDrawer" @success="success" />
-</template>
-<script lang="ts" setup name="tenant-pack-modal">
-  import { reactive, ref, unref } from 'vue';
-  import { BasicModal, useModal, useModalInner } from '/@/components/Modal';
-  import { packColumns, userColumns, packFormSchema } from '../tenant.data';
-  import { getTenantUserList, leaveTenant, packList, deleteTenantPack, syncDefaultTenantPack } from '../tenant.api';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { BasicTable, TableAction } from '/@/components/Table';
-  import TenantPackMenuModal from './TenantPackMenuModal.vue';
-  import { Modal } from 'ant-design-vue';
-  import TenantPackUserModal from './TenantPackUserModal.vue';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import PackPermissionDrawer from '@/views/system/tenant/pack/PackPermissionDrawer.vue';
-  import { useDrawer } from '@/components/Drawer';
-
-  const [registerPackMenu, { openModal }] = useModal();
-  const [registerPackUser, { openModal: packUserOpenModal }] = useModal();
-  const [registerPackPermDrawer, { openDrawer: openPackPermDrawer }] = useDrawer();
-
-  const tenantId = ref<number>(0);
-  // 列表页面公共参数、方法
-  const { prefixCls, tableContext } = useListPage({
-    designScope: 'tenant-template',
-    tableProps: {
-      api: packList,
-      columns: packColumns,
-      immediate: false,
-      formConfig: {
-        schemas: packFormSchema,
-        labelCol: {
-          xxl: 8,
-        },
-        actionColOptions: {
-          xs: 24,
-          sm: 8,
-          md: 8,
-          lg: 8,
-          xl: 8,
-          xxl: 8,
-        },
-      },
-      beforeFetch: (params) => {
-        return Object.assign(params, { tenantId: unref(tenantId), packType: 'custom' });
-      },
-    },
-  });
-  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;
-  // Emits声明
-  const emit = defineEmits(['register', 'success']);
-  //是否显示新增和编辑套餐包
-  const showPackAddAndEdit = ref<boolean>(false);
-  //表单赋值
-  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
-    tenantId.value = data.tenantId;
-    showPackAddAndEdit.value = data.showPackAddAndEdit;
-    success();
-  });
-  //设置标题
-  const title = '租户个性化套餐包';
-
-  //表单提交事件
-  async function handleSubmit(v) {
-    closeModal();
-  }
-
-  function getActions(record) {
-    return [
-      {
-        label: '用户',
-        onClick: seeTenantPackUser.bind(null, record),
-      },
-      {
-        label: '授权',
-        onClick: handleRolePrem.bind(null, record),
-        ifShow: () => {
-          return showPackAddAndEdit.value;
-        },
-      },
-    ];
-  }
-
-  /**
-   * 成功
-   */
-  function success() {
-    (selectedRowKeys.value = []) && reload();
-  }
-
-  /**
-   * 编辑
-   * @param record
-   */
-  async function handleEdit(record) {
-    openModal(true, {
-      isUpdate: true,
-      record: record,
-      tenantId: unref(tenantId),
-      packType: 'custom',
-      showFooter: true,
-    });
-  }
-
-  //默认系统套餐包不允许删除,包含(超级管理员、组织账户管理员、组织应用管理员)
-  const packCode = reactive<any>(['superAdmin', 'accountAdmin', 'appAdmin']);
-  const { createMessage } = useMessage();
-
-  /**
-   * 删除套餐包
-   * @param 删除
-   */
-  async function handleDelete(record) {
-    // 代码逻辑说明: 系统默认套餐包不允许删除------------
-    if (packCode.indexOf(record.packCode) != -1) {
-      createMessage.warning('默认系统套餐包不允许删除');
-      return;
-    }
-    if (record.packCode && record.packCode.indexOf('default') != -1) {
-      createMessage.warning('默认套餐包不允许删除');
-      return;
-    }
-    await deleteTenantPack({ ids: record.id }, success);
-  }
-
-  /**
-   * 批量删除套餐包
-   */
-  async function handlePackBatch() {
-    let value = selectedRows.value;
-    if (value && value.length > 0) {
-      for (let i = 0; i < value.length; i++) {
-        if (packCode.indexOf(value[i].packCode) != -1) {
-          createMessage.warning('默认系统套餐包不允许删除');
-          return;
-        }
-        // 代码逻辑说明: 默认套餐不允许删除---
-        if (value[i].packCode && value[i].packCode.indexOf('default') != -1) {
-          createMessage.warning('默认套餐包不允许删除');
-          return;
-        }
-      }
-    }
-    Modal.confirm({
-      title: '删除租户套餐包',
-      content: '是否删除租户套餐包',
-      okText: '确认',
-      cancelText: '取消',
-      onOk: async () => {
-        await deleteTenantPack({ ids: selectedRowKeys.value.join(',') }, success);
-      },
-    });
-  }
-
-  async function handleSyncDefaultPack() {
-    Modal.confirm({
-      title: '初始化默认套餐包',
-      content: '是否初始化默认套餐包',
-      okText: '确认',
-      cancelText: '取消',
-      onOk: async () => {
-        await syncDefaultTenantPack({ tenantId: unref(tenantId) }, success);
-      },
-    });
-  }
-
-  /**
-   *
-   * 新增表单
-   */
-  function handleAdd() {
-    openModal(true, {
-      isUpdate: false,
-      tenantId: unref(tenantId),
-      packType: 'custom',
-      showFooter: true,
-    });
-  }
-
-  /**
-   * 套餐包下面的用户
-   * @param record
-   */
-  function seeTenantPackUser(record) {
-    packUserOpenModal(true, {
-      record: record,
-    });
-  }
-
-  /**
-   * 更多
-   * @param record
-   */
-  function getDropDownAction(record) {
-    return [
-      {
-        label: '编辑',
-        onClick: handleEdit.bind(null, record),
-        ifShow: () => {
-          return showPackAddAndEdit.value;
-        },
-      },
-      {
-        label: '详情',
-        onClick: handleDetail.bind(null, record),
-      },
-      {
-        label: '删除',
-        popConfirm: {
-          title: '是否确认删除租户套餐包',
-          confirm: handleDelete.bind(null, record),
-        },
-      },
-    ];
-  }
-
-  /**
-   * 详情
-   * @param record
-   */
-  function handleDetail(record) {
-    openModal(true, {
-      isUpdate: true,
-      record: record,
-      tenantId: unref(tenantId),
-      packType: 'custom',
-      showFooter: false,
-    });
-  }
-
-  /**
-   * 授权
-   *
-   * @param record
-   */
-  function handleRolePrem(record) {
-    openPackPermDrawer(true, {
-      packId: record.id,
-      permissionIds: record.permissionIds,
-    });
-  }
-</script>

+ 0 - 70
src/views/system/tenant/pack/TenantPackMenuModal.vue

@@ -1,70 +0,0 @@
-<template>
-  <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit" width="800px" destroyOnClose>
-    <BasicForm @register="registerForm" />
-  </BasicModal>
-</template>
-<script lang="ts" setup name="tenant-pack-menu-modal">
-  import { ref, computed, unref } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, useForm } from '/@/components/Form';
-  import { packMenuFormSchema } from '../tenant.data';
-  import { addPackPermission, editPackPermission } from '../tenant.api';
-
-  const isUpdate = ref<boolean>(false);
-  // Emits声明
-  const emit = defineEmits(['register', 'success']);
-  //表单配置
-  const [registerForm, { resetFields, setFieldsValue, validate, setProps }] = useForm({
-    schemas: packMenuFormSchema,
-    showActionButtonGroup: false,
-  });
-  //租户
-  const tenantId = ref<number>();
-  //套餐包类型
-  const packType = ref<number>();
-  //权限
-  const permissionIds = ref<string>();
-  //表单赋值
-  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
-    //重置表单
-    await resetFields();
-    isUpdate.value = !!data?.isUpdate;
-    if (data.tenantId) {
-      tenantId.value = data.tenantId;
-    }
-    packType.value = data.packType;
-    if (unref(isUpdate)) {
-      //表单赋值
-      console.log(data.record);
-      await setFieldsValue({ ...data.record });
-      permissionIds.value = data.record.permissionIds;
-    }
-    // 代码逻辑说明: 【QQYUN-5685】2 套餐包增加一个查看:添加底部有没有按钮及表单禁用------------
-    setModalProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter });
-    // 隐藏底部时禁用整个表单
-    setProps({ disabled: !data?.showFooter });
-  });
-  //设置标题
-  const title = computed(() => (unref(isUpdate) ? '编辑 租户套餐' : '新增 租户套餐'));
-  //表单提交事件
-  async function handleSubmit(v) {
-    const values = await validate();
-
-    setModalProps({ confirmLoading: true });
-    values.packType = unref(packType);
-    if (values.packType === 'custom') {
-      values.tenantId = unref(tenantId);
-    } else {
-      values.tenantId = 0;
-    }
-    values.permissionIds = permissionIds.value;
-    if (!unref(isUpdate)) {
-      await addPackPermission(values);
-    } else {
-      await editPackPermission(values);
-    }
-    emit('success');
-    setModalProps({ confirmLoading: false });
-    closeModal();
-  }
-</script>

+ 0 - 170
src/views/system/tenant/pack/TenantPackUserModal.vue

@@ -1,170 +0,0 @@
-<template>
-  <BasicModal @register="registerModal" destroyOnClose :title="title" :width="1000" :footer="null">
-    <BasicTable @register="registerTable" :rowSelection="rowSelection">
-      <template #departNames="{ text, record }">
-        <template v-if="text && text.length > 0">
-          {{ getName(text) }}
-        </template>
-      </template>
-      <template #positionNames="{ text, record }">
-        <template v-if="text && text.length > 0">
-          {{ getName(text) }}
-        </template>
-      </template>
-      <template #tableTitle>
-        <a-button preIcon="ant-design:usergroup-add-outlined" type="primary" @click="addUser">邀请成员</a-button>
-      </template>
-      <!--操作栏-->
-      <template #action="{ record }">
-        <TableAction :actions="getTableAction(record)" />
-      </template>
-    </BasicTable>
-    <tenant-user-select-modal :multi="true" @register="registerUserModal" @on-select="onSelected" :tenantId="getTenantId"></tenant-user-select-modal>
-  </BasicModal>
-</template>
-
-<script lang="ts">
-  import { computed, defineComponent, reactive, ref } from 'vue';
-  import { BasicModal, useModal, useModalInner } from '/@/components/Modal';
-  import { BasicTable, TableAction } from '/@/components/Table';
-  import { useListPage } from '/@/hooks/system/useListPage';
-  import { tenantPackUserColumns } from '../tenant.data';
-  import { queryTenantPackUserList, deleteTenantPackUser, addTenantPackUser } from '../tenant.api';
-  import TenantUserSelectModal from '../components/TenantUserSelectModal.vue';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { useUserStore } from '/@/store/modules/user';
-
-  export default defineComponent({
-    name: 'TenantPackUserModal',
-    components: { BasicModal, BasicTable, TableAction, TenantUserSelectModal },
-    setup() {
-      //获取租户id
-      const getTenantId = computed(() => {
-        return tenantPackData.tenantId;
-      });
-
-      //套餐包信息
-      const tenantPackData = reactive<any>({});
-      //表单赋值
-      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
-        setModalProps({ confirmLoading: false, showCancelBtn: true, showOkBtn: false });
-        Object.assign(tenantPackData, data.record);
-        await reload();
-      });
-      const { createMessage } = useMessage();
-      //设置标题
-      const title = ref<string>('用户');
-      //注册table数据
-      const { tableContext } = useListPage({
-        tableProps: {
-          api: queryTenantPackUserList,
-          immediate: false,
-          columns: tenantPackUserColumns,
-          canResize: false,
-          useSearchForm: false,
-          beforeFetch: (params) => {
-            params.tenantId = tenantPackData.tenantId;
-            params.packId = tenantPackData.id;
-            params.status = 1;
-            return params;
-          },
-          actionColumn: {
-            width: 120,
-            fixed: 'right',
-          },
-        },
-      });
-      const [registerUserModal, { openModal: openUserModal, closeModal: closeUserModal }] = useModal();
-      const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
-
-      /**
-       * 获取部门/职务名称
-       * @param value
-       */
-      function getName(value) {
-        return value.join(',');
-      }
-
-      /**
-       * 表格操作列
-       * @param record
-       */
-      function getTableAction(record) {
-        return [
-          {
-            label: '移除',
-            popConfirm: {
-              title: '是否确认移除',
-              confirm: handleDelete.bind(null, record),
-            },
-          },
-        ];
-      }
-
-      /**
-       * 删除
-       */
-      async function handleDelete(record) {
-        let params = {
-          packId: record.packId,
-          packName: record.packName,
-          tenantId: tenantPackData.tenantId,
-          userId: record.id,
-          realname: record.realname,
-        };
-        await deleteTenantPackUser(params);
-        await reload();
-      }
-
-      /**
-       * 添加用户弹窗
-       */
-      function addUser() {
-        openUserModal(true, {
-          list: [],
-        });
-      }
-
-      /**
-       * 邀请人回调事件
-       * @param arr
-       */
-      async function onSelected(arr) {
-        if (arr && arr.length > 0) {
-          let names: any[] = [];
-          let ids: any[] = [];
-          for (let u of arr) {
-            names.push(u.realname);
-            ids.push(u.id);
-          }
-          console.log(tenantPackData);
-          let params = {
-            packId: tenantPackData.id,
-            packName: tenantPackData.packName,
-            tenantId: tenantPackData.tenantId,
-            userId: ids.join(','),
-            realname: names.join(','),
-          };
-          await addTenantPackUser(params);
-          await reload();
-        }
-        closeUserModal();
-      }
-
-      return {
-        title,
-        registerModal,
-        registerTable,
-        rowSelection,
-        getName,
-        getTableAction,
-        registerUserModal,
-        addUser,
-        onSelected,
-        getTenantId,
-      };
-    },
-  });
-</script>
-
-<style lang="less" scoped></style>

+ 9 - 40
src/views/system/tenant/tenant.api.ts

@@ -16,11 +16,10 @@ enum Api {
   packList = '/sys/tenant/packList',
   packList = '/sys/tenant/packList',
   addPackPermission = '/sys/tenant/addPackPermission',
   addPackPermission = '/sys/tenant/addPackPermission',
   editPackPermission = '/sys/tenant/editPackPermission',
   editPackPermission = '/sys/tenant/editPackPermission',
-  deleteTenantPack = '/sys/tenant/deleteTenantPack',
+  deletePackPermissions = '/sys/tenant/deletePackPermissions',
   recycleBinPageList = '/sys/tenant/recycleBinPageList',
   recycleBinPageList = '/sys/tenant/recycleBinPageList',
   deleteLogicDeleted = '/sys/tenant/deleteLogicDeleted',
   deleteLogicDeleted = '/sys/tenant/deleteLogicDeleted',
   revertTenantLogic = '/sys/tenant/revertTenantLogic',
   revertTenantLogic = '/sys/tenant/revertTenantLogic',
-  syncDefaultPack = '/sys/tenant/syncDefaultPack',
   //用户产品包关系api
   //用户产品包关系api
   queryTenantPackUserList = '/sys/tenant/queryTenantPackUserList',
   queryTenantPackUserList = '/sys/tenant/queryTenantPackUserList',
   deleteTenantPackUser = '/sys/tenant/deleteTenantPackUser',
   deleteTenantPackUser = '/sys/tenant/deleteTenantPackUser',
@@ -29,12 +28,8 @@ enum Api {
   getTenantPageListByUserId = '/sys/tenant/getTenantPageListByUserId',
   getTenantPageListByUserId = '/sys/tenant/getTenantPageListByUserId',
   
   
   //新增、编辑用户租户
   //新增、编辑用户租户
-  saveUser = '/sys/user/addTenantUser',
+  saveUser = '/sys/user/add',
   editUser = '/sys/user/editTenantUser',
   editUser = '/sys/user/editTenantUser',
-  //根据租户id和用户获取用户的产品包列表和当前用户下的产品包id
-  listPackByTenantUserId = '/sys/tenant/listPackByTenantUserId',
-  // 获取菜单权限
-  queryPremTreeList = '/sys/role/queryTreeList',
 }
 }
 
 
 /**
 /**
@@ -50,7 +45,7 @@ export const getTenantList = (params) => {
  * @param params
  * @param params
  */
  */
 export const saveOrUpdateTenant = (params, isUpdate) => {
 export const saveOrUpdateTenant = (params, isUpdate) => {
-  const url = isUpdate ? Api.edit : Api.save;
+  let url = isUpdate ? Api.edit : Api.save;
   return defHttp.post({ url: url, params });
   return defHttp.post({ url: url, params });
 };
 };
 
 
@@ -116,7 +111,7 @@ export const getTenantUserList = (params) => {
 export const leaveTenant = (params, handleSuccess) => {
 export const leaveTenant = (params, handleSuccess) => {
   Modal.confirm({
   Modal.confirm({
     title: '请离',
     title: '请离',
-    content: '是否将此用户请离当前租户',
+    content: '是否请离该用户',
     okText: '确认',
     okText: '确认',
     cancelText: '取消',
     cancelText: '取消',
     onOk: () => {
     onOk: () => {
@@ -155,19 +150,8 @@ export const editPackPermission = (params) => {
  * 删除菜单
  * 删除菜单
  * @param params
  * @param params
  */
  */
-export const deleteTenantPack = (params, handleSuccess) => {
-  return defHttp.delete({ url: Api.deleteTenantPack, data: params }, { joinParamsToUrl: true }).then(() => {
-    handleSuccess();
-  });
-};
-
-/**
- * 初始化套餐包
- * @param params
- * @param handleSuccess
- */
-export const syncDefaultTenantPack = (params, handleSuccess) => {
-  return defHttp.post({ url: Api.syncDefaultPack, data: params }, { joinParamsToUrl: true }).then(() => {
+export const deletePackPermissions = (params, handleSuccess) => {
+  return defHttp.delete({ url: Api.deletePackPermissions, data: params }, { joinParamsToUrl: true }).then(() => {
     handleSuccess();
     handleSuccess();
   });
   });
 };
 };
@@ -239,9 +223,9 @@ export const getTenantPageListByUserId = (params) => {
  * 获取当前登录租户名称
  * 获取当前登录租户名称
  */
  */
 export async function getLoginTenantName() {
 export async function getLoginTenantName() {
-  const tenantId = getTenantId();
+  let tenantId = getTenantId();
   if(tenantId){
   if(tenantId){
-    const result = await getTenantById({ id:tenantId });
+    let result = await getTenantById({ id:tenantId });
     if(result){
     if(result){
       return result.name;
       return result.name;
     }
     }
@@ -254,21 +238,6 @@ export async function getLoginTenantName() {
  * @param params
  * @param params
  */
  */
 export const saveOrUpdateTenantUser = (params, isUpdate) => {
 export const saveOrUpdateTenantUser = (params, isUpdate) => {
-  const url = isUpdate ? Api.editUser : Api.saveUser;
+  let url = isUpdate ? Api.editUser : Api.saveUser;
   return defHttp.post({ url: url, params },{ joinParamsToUrl: true });
   return defHttp.post({ url: url, params },{ joinParamsToUrl: true });
 };
 };
-/**
- * 根据租户id和用户获取用户的产品包列表和当前用户下的产品包id
- * 
- * @param params
- */
-export const listPackByTenantUserId = (params) => {
-  return defHttp.get({ url: Api.listPackByTenantUserId, params });
-}
-
-/**
- * 获取菜单树
- */
-export const queryPremTreeList = () =>{
-  return defHttp.get({ url: Api.queryPremTreeList });
-}

+ 27 - 175
src/views/system/tenant/tenant.data.ts

@@ -40,19 +40,19 @@ export const columns: BasicColumn[] = [
     title: '门牌号',
     title: '门牌号',
     width: 100,
     width: 100,
   },
   },
-  // {
-  //   dataIndex: 'position_dictText',
-  //   title: '职级',
-  //   width: 150
-  // },
-  // {
-  //   dataIndex: 'department_dictText',
-  //   title: '部门',
-  //   width: 150
-  // },
+  {
+    dataIndex: 'position_dictText',
+    title: '职级',
+    width: 150
+  },
+  {
+    dataIndex: 'department_dictText',
+    title: '部门',
+    width: 150
+  },
   {
   {
     dataIndex: 'createBy_dictText',
     dataIndex: 'createBy_dictText',
-    title: '创建者(拥有)',
+    title: '创建者(拥有)',
     width: 150
     width: 150
   },
   },
 /*  {
 /*  {
@@ -147,18 +147,9 @@ export const formSchema: FormSchema[] = [
   }, {
   }, {
     field: 'companyAddress',
     field: 'companyAddress',
     label: '公司地址',
     label: '公司地址',
-    component: 'JAreaSelect',
-    componentProps: {
-      placeholder: '请输入公司地址',
-      rows: 4,
-    }
-  },
-  {
-    field: 'workPlace',
-    label: '工作地点',
     component: 'InputTextArea',
     component: 'InputTextArea',
     componentProps: {
     componentProps: {
-      placeholder: '请输入工作地点',
+      placeholder: '请输入公司地址',
       rows: 4,
       rows: 4,
     }
     }
   },
   },
@@ -260,88 +251,10 @@ export const userSearchFormSchema: FormSchema[] = [
   },
   },
 ];
 ];
 
 
-//套餐包列表
+//产品包列表
 export const packColumns: BasicColumn[] = [
 export const packColumns: BasicColumn[] = [
   {
   {
-    title: '套餐包名称',
-    dataIndex: 'packName',
-    width: 100,
-    customRender: ( { record, text }) => {
-      if(record.packCode && record.packCode.indexOf('default') != -1) {
-        return text + '(默认产品包)';
-      } else {
-        return text;
-      }
-    }
-  },
-  {
-    title: '是否自动分配用户',
-    dataIndex: 'izSysn',
-    width: 100,
-    customRender: ( { text }) => {
-      if(text === '1') {
-        return '是';
-      } else {
-        return '否';
-      }
-    }
-  },
-  {
-    title: '状态',
-    dataIndex: 'status',
-    width: 100,
-    customRender: ({ text }) => {
-      if (text === '1') {
-        return '开启';
-      } else {
-        return '关闭';
-      }
-    },
-  },
-  {
-    title: '备注说明',
-    dataIndex: 'remarks',
-    width: 150,
-  },
-];
-
-//套餐包列表
-export const tenantPackColumns: BasicColumn[] = [
-  {
-    title: '套餐包名称',
-    dataIndex: 'packName',
-    width: 100,
-    customRender: ( { record, text }) => {
-      if(record.packCode && record.packCode.indexOf('default') != -1) {
-        return text + '(默认产品包)';
-      } else {
-        return text;
-      }
-    }
-  },
-  {
-    title: '是否自动分配用户',
-    dataIndex: 'izSysn',
-    width: 100,
-    customRender: ( { text }) => {
-      if(text === '1') {
-        return '是';
-      } else {
-        return '否';
-      }
-    }
-  },
-  {
-    title: '备注说明',
-    dataIndex: 'remarks',
-    width: 150,
-  },
-];
-
-//套餐包列表
-export const defalutPackColumns: BasicColumn[] = [
-  {
-    title: '默认套餐名称',
+    title: '产品包名称',
     dataIndex: 'packName',
     dataIndex: 'packName',
     width: 100,
     width: 100,
   },
   },
@@ -358,72 +271,47 @@ export const defalutPackColumns: BasicColumn[] = [
     },
     },
   },
   },
   {
   {
-    title: '备注说明',
+    title: '备注',
     dataIndex: 'remarks',
     dataIndex: 'remarks',
     width: 150,
     width: 150,
   },
   },
 ];
 ];
 
 
-//套餐包搜索表单
+//产品包搜索表单
 export const packFormSchema: FormSchema[] = [
 export const packFormSchema: FormSchema[] = [
   {
   {
     field: 'packName',
     field: 'packName',
-    label: '套餐包名',
+    label: '产品包名称',
     component: 'JInput',
     component: 'JInput',
     colProps: { xxl: 8 },
     colProps: { xxl: 8 },
   },
   },
 ];
 ];
 
 
-//套餐包搜索表单
-export const defaultPackFormSchema: FormSchema[] = [
-  {
-    field: 'packName',
-    label: '默认套餐名',
-    component: 'JInput',
-    colProps: { xxl: 8 },
-  },
-];
-
-//套餐包表单
+//产品包表单
 export const packMenuFormSchema: FormSchema[] = [
 export const packMenuFormSchema: FormSchema[] = [
   {
   {
     field: 'packName',
     field: 'packName',
-    label: '套餐包名称',
+    label: '产品包名称',
     component: 'Input',
     component: 'Input',
   },
   },
-/*  {
+  {
     field: 'permissionIds',
     field: 'permissionIds',
-    label: '授权菜单',
+    label: '菜单列表',
     component: 'JTreeSelect',
     component: 'JTreeSelect',
     componentProps: {
     componentProps: {
       dict: 'sys_permission,name,id',
       dict: 'sys_permission,name,id',
       pidField: 'parent_id',
       pidField: 'parent_id',
-      hasChildField:'is_leaf',
       multiple: true,
       multiple: true,
       treeCheckAble:true,
       treeCheckAble:true,
       treeCheckStrictly: true,
       treeCheckStrictly: true,
-      converIsLeafVal: 0,
       getPopupContainer: () => document.body,
       getPopupContainer: () => document.body,
     },
     },
-  },*/
+  },
   {
   {
     field: 'remarks',
     field: 'remarks',
-    label: '备注说明',
+    label: '描述',
     component: 'InputTextArea',
     component: 'InputTextArea',
   },
   },
-  {
-    field: 'izSysn',
-    label: '自动分配用户',
-    component: 'Switch',
-    componentProps: {
-      checkedValue: "1",
-      checkedChildren: '是',
-      unCheckedValue: "0",
-      unCheckedChildren: '否',
-    },
-    defaultValue: "1",
-    helpMessage: "默认会自动分配给用户,个性高级套餐,需要租户管理员手工分配人员(拥有更灵活性权限控制)"
-  },  
   {
   {
     field: 'status',
     field: 'status',
     label: '开启状态',
     label: '开启状态',
@@ -442,18 +330,6 @@ export const packMenuFormSchema: FormSchema[] = [
     component: 'Input',
     component: 'Input',
     show: false
     show: false
   },
   },
-  {
-    field: 'packCode',
-    label: '产品包编码',
-    component: 'Input',
-    show: false
-  },  
-  {
-    field: 'packType',
-    label: '产品包类型',
-    component: 'Input',
-    show: false
-  },
 ];
 ];
 
 
 //回收站列表
 //回收站列表
@@ -501,7 +377,7 @@ export const searchRecycleFormSchema : FormSchema[] = [
   },
   },
 ]
 ]
 
 
-//套餐包用户列表
+//产品包用户列表
 export const tenantPackUserColumns: BasicColumn[] = [
 export const tenantPackUserColumns: BasicColumn[] = [
   {
   {
     title: '用户',
     title: '用户',
@@ -567,7 +443,7 @@ export const tenantUserSchema: FormSchema[] = [
     },
     },
   },
   },
   { field: 'selecteddeparts', label: '部门', component: 'JSelectDept', componentProps: { checkStrictly: true } },
   { field: 'selecteddeparts', label: '部门', component: 'JSelectDept', componentProps: { checkStrictly: true } },
- /* {
+  {
     field: 'post',
     field: 'post',
     label: '职位',
     label: '职位',
     component: 'JSelectPosition',
     component: 'JSelectPosition',
@@ -577,33 +453,9 @@ export const tenantUserSchema: FormSchema[] = [
     label: '工号',
     label: '工号',
     component: 'Input',
     component: 'Input',
     dynamicRules: ({ model, schema }) => {
     dynamicRules: ({ model, schema }) => {
-      return [{ required: false, message: '请输入工号' }, { ...rules.duplicateCheckRule('sys_user', 'work_no', model, schema, false)[0] }];
+      return [{ required: true, message: '请输入工号' }, { ...rules.duplicateCheckRule('sys_user', 'work_no', model, schema, false)[0] }];
     },
     },
-  },*/
+  },
   { field: 'relTenantIds', label: '租户', component: 'Input',show:false },
   { field: 'relTenantIds', label: '租户', component: 'Input',show:false },
   { field: 'selectedroles', label: '角色', component: 'Input',show:false },
   { field: 'selectedroles', label: '角色', component: 'Input',show:false },
 ];
 ];
-
-// 分配用户套餐
-export const packUserAllotSchemas: FormSchema[] = [
-  { 
-    field: 'userId', 
-    label: '用户id', 
-    component: 'Input',
-    show: false
-  },
-  {
-    field: 'realname',
-    label: '用户姓名',
-    component: 'Input',
-    componentProps:{
-      readonly : true
-    },
-  },
-  {
-    field: 'packId',
-    label: '套餐',
-    component: 'Select',
-    slot: 'packId'
-  }
-];