소스 검색

[Feat 0000] 获取组织树的相关逻辑开发及对接

houzekong 2 달 전
부모
커밋
df8f682375
5개의 변경된 파일79개의 추가작업 그리고 93개의 파일을 삭제
  1. 2 2
      public/js/global.js
  2. 29 41
      src/api/sys/menu.ts
  3. 14 19
      src/api/sys/model/menuModel.ts
  4. 1 5
      src/main.ts
  5. 33 26
      src/store/modules/mine.ts

+ 2 - 2
public/js/global.js

@@ -148,7 +148,7 @@ const __STATIC_ROUTES__ = [
     component: 'LAYOUT',
     children: [
       {
-        path: '/sealed/${id}',
+        path: '/sealed/${rawid}',
         component: '/monitor/sealedMonitor/index',
         meta: {
           keepAlive: true,
@@ -159,7 +159,7 @@ const __STATIC_ROUTES__ = [
           hideMenu: true
           // orderNo: '${departOrder}',
         },
-        name: 'sealed-${id}',
+        name: 'sealed-${rawid}',
       }
     ],
     meta: {

+ 29 - 41
src/api/sys/menu.ts

@@ -1,12 +1,14 @@
 import { defHttp } from '/@/utils/http/axios';
-import { getMenuListResultModel, EnfMineTreeItem, RouteItem } from './model/menuModel';
+import { getMenuListResultModel, EnfMineTreeItem } from './model/menuModel';
 import { useUserStoreWithOut } from '@/store/modules/user';
 import { setAuthCache } from '@/utils/auth';
 import { TOKEN_KEY } from '@/enums/cacheEnum';
 import { router } from '@/router';
 import { PageEnum } from '@/enums/pageEnum';
 import { getFormattedText } from '/@/components/Configurable/hooks/helper';
-import { listToTree } from '/@/utils/helper/treeHelper';
+// import { listToTree } from '/@/utils/helper/treeHelper';
+import { MineDepartment, useMineDepartmentStore } from '/@/store/modules/mine';
+import { AppRouteRecordRaw } from '/@/router/types';
 
 enum Api {
   GetMenuList = '/sys/permission/getUserPermissionByToken',
@@ -17,24 +19,26 @@ enum Api {
   // SwitchVue3Menu = '/sys/switchVue3Menu',
 }
 
-const generateStaticSealedMonitorRoute = (route: RouteItem, item: EnfMineTreeItem) => {
-  const res: RouteItem = {
-    component: route.component,
-    path: getFormattedText(item, route.path),
-    name: getFormattedText(item, route.name || ''),
-    meta: {
-      ...route.meta,
-      title: getFormattedText(item, route.meta.title),
-      hideMenu: false,
-      // orderNo: parseInt(getFormattedText(item, String(route.meta.orderNo))),
-    },
-  };
+const generateStaticSealedMonitorRoute = (route: AppRouteRecordRaw, items: MineDepartment[]) => {
+  return items.map((item) => {
+    const res: AppRouteRecordRaw = {
+      component: route.component,
+      path: getFormattedText(item, route.path),
+      name: getFormattedText(item, route.name || ''),
+      meta: {
+        ...route.meta,
+        title: getFormattedText(item, route.meta.title),
+        hideMenu: false,
+      },
+    };
+    const [__, LEAF_LEVEL_ORG, ___] = item.memoDesc;
 
-  if (item.childDepart) {
-    res.children = item.childDepart.map((child) => generateStaticSealedMonitorRoute(route, child));
-  }
+    if (item.orgType !== LEAF_LEVEL_ORG && item.childDepart.length) {
+      res.children = generateStaticSealedMonitorRoute(route, item.childDepart);
+    }
 
-  return res;
+    return res;
+  });
 };
 
 /**
@@ -42,17 +46,8 @@ const generateStaticSealedMonitorRoute = (route: RouteItem, item: EnfMineTreeIte
  */
 
 export const getMenuList: () => Promise<getMenuListResultModel> = () => {
-  return Promise.all([
-    defHttp.get<getMenuListResultModel>({ url: Api.GetMenuList }),
-    defHttp.get({
-      url: Api.getEnfMineTreeData,
-    }),
-  ]).then(([res, raw]) => {
-    const tree = listToTree(raw, {
-      id: 'id',
-      pid: 'parentId',
-      children: 'childDepart',
-    });
+  const mineStore = useMineDepartmentStore();
+  return Promise.all([defHttp.get<getMenuListResultModel>({ url: Api.GetMenuList }), mineStore.fetchDepartTree()]).then(([res]) => {
     return {
       allAuth: res.allAuth || [],
       auth: res.auth || [],
@@ -61,12 +56,9 @@ export const getMenuList: () => Promise<getMenuListResultModel> = () => {
       menu: __STATIC_ROUTES__.map((ele) => {
         if (ele.children && ele.children.length && ele.meta?.generation) {
           const template = ele.children[0];
-          const routes = tree.map((d) => {
-            const route = generateStaticSealedMonitorRoute(template, d);
-            // route.meta.hideMenu = route.children?.length === 0;
-            return route;
-          });
-          ele.children.push(...routes);
+          const routes = generateStaticSealedMonitorRoute(template, mineStore.getDepartTree);
+
+          ele.children = routes;
         }
 
         return ele;
@@ -93,6 +85,7 @@ export function getBackMenuAndPerms() {
         },
       });
     }
+    throw e;
   });
 }
 
@@ -106,10 +99,5 @@ export function getBackMenuAndPerms() {
 // };
 
 export function getEnfMineTree() {
-  return defHttp.get<EnfMineTreeItem[]>(
-    { url: Api.getEnfMineTreeData }
-    // {
-    //   isTransformResponse: false,
-    // }
-  );
+  return defHttp.get<EnfMineTreeItem[]>({ url: Api.getEnfMineTreeData });
 }

+ 14 - 19
src/api/sys/model/menuModel.ts

@@ -1,14 +1,4 @@
-import type { RouteMeta } from 'vue-router';
-export interface RouteItem {
-  path: string;
-  component: any;
-  meta: RouteMeta;
-  name?: string;
-  alias?: string | string[];
-  redirect?: string;
-  caseSensitive?: boolean;
-  children?: RouteItem[];
-}
+import { AppRouteRecordRaw } from '/@/router/types';
 
 /**
  * @description: Get menu return value
@@ -17,7 +7,7 @@ export interface getMenuListResultModel {
   codeList: string[];
   allAuth: any[];
   auth: any[];
-  menu: RouteItem[];
+  menu: AppRouteRecordRaw[];
 }
 
 export interface EnfMineTreeItem {
@@ -25,12 +15,17 @@ export interface EnfMineTreeItem {
   id: string;
   /** 部门名称 */
   departName: string;
-  /** 父部门ID */
+  /** 部门编码 */
+  orgCode: string;
+  /** 父级部门ID */
   parentId: string;
-  /** 子部门列表 */
-  childDepart: EnfMineTreeItem[];
-  /** 部门排序 */
-  departOrder?: number;
-  /** 是否为叶节点,前端添加 */
-  isLeaf?: boolean;
+  /** 组织类型 */
+  orgType: string;
+  /** 编码 */
+  fax: string;
+
+  /** 备注 */
+  memo?: string;
+  /** 备注2 */
+  memoDesc: string[];
 }

+ 1 - 5
src/main.ts

@@ -1,7 +1,7 @@
 import type { MainAppProps } from '#/main';
 import 'uno.css';
 import '/@/design/index.less';
-import Antd from 'ant-design-vue';
+// import Antd from 'ant-design-vue';
 import 'ant-design-vue/dist/reset.css';
 // 注册图标
 import 'virtual:svg-icons-register';
@@ -19,7 +19,6 @@ import { registerGlobComp } from '/@/components/registerGlobComp';
 import { registerThirdComp } from '/@/settings/registerThirdComp';
 import { useSso } from '/@/hooks/web/useSso';
 import { useAppStoreWithOut } from '@/store/modules/app';
-import { useMineDepartmentStore } from './store/modules/mine';
 
 // 程序入口
 async function main() {
@@ -118,7 +117,4 @@ function setupProps(props?: MainAppProps) {
   }
   const appStore = useAppStoreWithOut();
   appStore.setMainAppProps(props);
-
-  const mineStore = useMineDepartmentStore();
-  mineStore.fetchDepartTree();
 }

+ 33 - 26
src/store/modules/mine.ts

@@ -1,12 +1,14 @@
 import { defineStore } from 'pinia';
 import { ref, computed } from 'vue';
 
-import { getEnfMineTree } from '/@/api/sys/menu';
-import { getUserMinePermissionData } from '/@/components/Form/src/jeecg/components/MineCascader/mineData.api';
+// import { getEnfMineTree } from '/@/api/sys/menu';
+// import { getUserMinePermissionData } from '/@/components/Form/src/jeecg/components/MineCascader/mineData.api';
 import { findNode, findNodeAll, findPath, listToTree, treeToList, forEach } from '/@/utils/helper/treeHelper';
 import { isArray, isFunction, isNil } from 'lodash';
+import { getEnfMineTree } from '/@/api/sys/menu';
+import { EnfMineTreeItem } from '/@/api/sys/model/menuModel';
 
-export interface MineDepartment {
+export interface MineDepartment extends EnfMineTreeItem {
   /** 唯一标识 */
   id: string;
   /** 原本的标识 */
@@ -14,19 +16,17 @@ export interface MineDepartment {
   /** 部门名称 */
   departName: string;
   /** 父部门ID */
-  parentId: string | null;
+  parentId: string;
   /** 是否为叶子节点(矿井是叶子节点) */
   isLeaf: boolean;
   /** 子部门列表 */
   childDepart: MineDepartment[];
   /** 传真,用作矿井编号(矿井编码) */
-  fax: string | null;
+  fax: string;
   /** 是否禁用,没有子节点的部门即禁用 */
   disabled?: boolean;
 }
 
-const TOP_LEVEL_ORG = '1';
-const LEAF_LEVEL_ORG = '4';
 const DEFAULT_CONFIG = {
   id: 'id',
   pid: 'parentId',
@@ -94,43 +94,50 @@ export const useMineDepartmentStore = defineStore('mine-department-store', () =>
 
   /**
    * 获取组织树数据(异步)
-   * 2. getUserMinePermissionData: 获取矿井(叶子节点)数据
+   * 2. getEnfMineTree: 获取矿井(叶子节点)数据
    */
   async function fetchDepartTree() {
     try {
       // 并行请求两个接口
-      const r2 = await getUserMinePermissionData({});
-      r2.forEach((node) => {
-        const isLeaf = node.orgType === LEAF_LEVEL_ORG;
-        node.isLeaf = isLeaf;
-
-        if (isLeaf) {
-          node.rawid = node.id;
-          node.id = node.fax; // 使用矿井编码作为ID
+      const r2 = await getEnfMineTree();
+      if (!r2.length) return;
+      const [TOP_LEVEL_ORG = '1', __, LEAF_LEVEL_ORG = '4'] = r2[0].memoDesc;
+
+      const r1 = r2.reduce((arr: MineDepartment[], node) => {
+        const isRoot = node.orgType === TOP_LEVEL_ORG;
+        if (isRoot) return arr; // 根节点不处理
+
+        const ele: MineDepartment = {
+          ...node,
+          isLeaf: false,
+          rawid: node.id,
+          childDepart: [],
+        };
+
+        if (node.orgType === LEAF_LEVEL_ORG) {
+          ele.isLeaf = true;
+          ele.id = node.fax; // 使用矿井编码作为ID
         }
-      });
+
+        arr.push(ele);
+        return arr;
+      }, []);
 
       // 合并数据并转换为树形结构
-      const tree: any[] = [];
-      listToTree(r2, DEFAULT_CONFIG).some((node: any) => {
-        if (node.orgType === TOP_LEVEL_ORG) {
-          tree.push(...node[DEFAULT_CONFIG.children]);
-          return true;
-        }
-        return false;
-      });
+      // const tree: any[] = [];
+      const tree = listToTree(r1, DEFAULT_CONFIG);
 
       forEach(
         tree,
         (node) => {
           // 跳过叶节点
           if (node.isLeaf) return;
-          node.rawid = node.id;
           node.id = calcMineCodeByDepart(node);
           node.disabled = !Boolean(node.childDepart.length);
         },
         DEFAULT_CONFIG
       );
+
       departTree.value = tree;
       // 深拷贝保存原始数据,用于过滤后恢复
       // rawTree.value = JSON.parse(JSON.stringify(tree));