Эх сурвалжийг харах

ProjectMenu移植 & models改动

xjj 2 жил өмнө
parent
commit
5078483411
57 өөрчлөгдсөн 396 нэмэгдсэн , 215 устгасан
  1. 1 1
      src/Frameworks/SysRouter/index.ts
  2. 16 6
      src/Project/Functions/FuncMain.ts
  3. 14 0
      src/Project/Functions/Handlers/ProjectMenuHandle.ts
  4. 16 4
      src/Project/Functions/LevelAFunctions/FuncProjectMenu.tsx
  5. 11 4
      src/Project/Functions/LevelAFunctions/FuncProjectSelection.ts
  6. 3 1
      src/Project/Os.ts
  7. BIN
      src/Project/assets/UnityMenu/Breadcrumb.png
  8. BIN
      src/Project/assets/UnityMenu/BreadcrumbContentBg.png
  9. BIN
      src/Project/assets/UnityMenu/BreadcrumbHead.png
  10. BIN
      src/Project/assets/UnityMenu/BreadcrumbSelect.png
  11. BIN
      src/Project/assets/UnityMenu/ICON/func-01-DirectDrinking.png
  12. BIN
      src/Project/assets/UnityMenu/ICON/func-01-build-0.png
  13. BIN
      src/Project/assets/UnityMenu/ICON/func-01-build-10.png
  14. BIN
      src/Project/assets/UnityMenu/ICON/func-01-build-3.png
  15. BIN
      src/Project/assets/UnityMenu/ICON/func-01-build-4.png
  16. BIN
      src/Project/assets/UnityMenu/ICON/func-01-build.png
  17. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-BaseInfo.png
  18. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-ConfigManagement.png
  19. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-DataCenter.png
  20. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-DataView.png
  21. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-DeviceManagement.png
  22. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-EnergyManagement.png
  23. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-LimitedSpace.png
  24. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-ProManagement.png
  25. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-SecurityManagement.png
  26. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops-WaterQManagement.png
  27. BIN
      src/Project/assets/UnityMenu/ICON/func-01-ops.png
  28. BIN
      src/Project/assets/UnityMenu/ICON/func-01-point-bom.png
  29. BIN
      src/Project/assets/UnityMenu/ICON/func-06-ManDay.png
  30. BIN
      src/Project/assets/UnityMenu/ICON/func-06-globalCockpit.png
  31. BIN
      src/Project/assets/UnityMenu/ICON/newModel.png
  32. BIN
      src/Project/assets/UnityMenu/Menu.png
  33. BIN
      src/Project/assets/UnityMenu/TogMenuBackground.png
  34. BIN
      src/Project/assets/UnityMenu/TogMenuClose.png
  35. BIN
      src/Project/assets/UnityMenu/background.jpg
  36. BIN
      src/Project/assets/UnityMenu/background.png
  37. BIN
      src/Project/assets/UnityMenu/barBackground.png
  38. BIN
      src/Project/assets/UnityMenu/header.png
  39. BIN
      src/Project/assets/UnityMenu/leftLine.png
  40. BIN
      src/Project/assets/UnityMenu/newBackground.jpg
  41. BIN
      src/Project/assets/UnityMenu/newModel.png
  42. BIN
      src/Project/assets/UnityMenu/noIcon.png
  43. 1 1
      src/Project/constants/index.ts
  44. 56 23
      src/Project/pages/ProjectMenu/MenuStyle.less
  45. 82 140
      src/Project/pages/ProjectMenu/index.tsx
  46. 2 1
      src/Project/pages/ProjectSelect/index.js
  47. 3 0
      src/Project/pages/global.less
  48. 2 2
      src/Project/services/platformMenu.ts
  49. 3 3
      src/Project/services/project.ts
  50. 23 5
      src/Project/services/typings.d.ts
  51. 1 1
      src/Project/services/user.ts
  52. 3 3
      src/app.ts
  53. 9 4
      src/models/dep.ts
  54. 114 0
      src/models/menu.ts
  55. 6 2
      src/models/project.ts
  56. 13 5
      src/models/projectRoleList.ts
  57. 17 9
      src/models/userList.ts

+ 1 - 1
src/Frameworks/SysRouter/index.ts

@@ -73,7 +73,7 @@ export const route: GT.IRouterOptions[] = [
   {
     key: PAGE_KEY.ProjectMenu,
     //@ts-ignore
-    component: () => import('@/Project/pages/DataMeter'),
+    component: () => import('@/Project/pages/ProjectMenu'),
     options: {
       header: false,
     },

+ 16 - 6
src/Project/Functions/FuncMain.ts

@@ -3,11 +3,13 @@ import LoginHandle from './Handlers/LoginHandler';
 import PlatformMenuHandle from './Handlers/PlatformMenuHandle';
 import DataMeterHandle from './Handlers/DataMeterHandler';
 import { FuncPageMenuState } from './LevelAFunctions/FuncPageMenu';
+import ProjectMenuHandle from './Handlers/ProjectMenuHandle';
 export enum FuncMainState {
   Login, // 登录页
   PlatformMenu, // 首页
   ProjectSelection, // 项目选择页
-  PageMenu, // 菜单页
+  ProjectMenu, // 菜单页
+  PageMenu,
   Map,
   DataMeter,
 }
@@ -22,8 +24,9 @@ export default class FuncMain extends Func<FuncMainState> {
         () => null,
         () => window.GT_APP.funcProjectSelection.setActive(false),
       );
-
       sm.addState(FuncMainState.Login, new LoginHandle());
+
+      sm.addState(FuncMainState.ProjectMenu, new ProjectMenuHandle());
       sm.addState(FuncMainState.DataMeter, new DataMeterHandle());
       sm.addState(FuncMainState.PlatformMenu, new PlatformMenuHandle());
       sm.addState(
@@ -32,10 +35,17 @@ export default class FuncMain extends Func<FuncMainState> {
         () => null,
         () => window.GT_APP.funcMap.setActive(false),
       );
-      sm.addState(FuncMainState.PlatformMenu, () => {
-        window.GT_APP.funcPageMenu.setActive(true);
-        window.GT_APP.funcPageMenu.changeState(FuncPageMenuState.ProjectDetail);
-      }, null, null);
+      sm.addState(
+        FuncMainState.PlatformMenu,
+        () => {
+          window.GT_APP.funcPageMenu.setActive(true);
+          window.GT_APP.funcPageMenu.changeState(
+            FuncPageMenuState.ProjectDetail,
+          );
+        },
+        null,
+        null,
+      );
     });
   }
 }

+ 14 - 0
src/Project/Functions/Handlers/ProjectMenuHandle.ts

@@ -0,0 +1,14 @@
+import StateHandler from '@/Engine/StateMahines/StateHandler';
+import { FuncMainState } from '../FuncMain';
+
+export default class ProjectMenuHandle implements StateHandler<FuncMainState> {
+  stateIn(): void {
+    window.GT_APP.funcProjectMenu.setActive(true);
+  }
+  stateRunning(): FuncMainState {
+    return FuncMainState.PlatformMenu;
+  }
+  stateExit(): void {
+    window.GT_APP.funcProjectMenu.setActive(false);
+  }
+}

+ 16 - 4
src/Project/Functions/LevelAFunctions/FuncProjectMenu.tsx

@@ -1,5 +1,6 @@
 import Func from '@/Engine/ECS/Function';
 import { PAGE_KEY } from '@/Project/constants';
+import { FuncMainState } from '../FuncMain';
 export enum FuncProjectMenuState {
   ProjectMenu,
 }
@@ -13,16 +14,27 @@ export default class FuncProjectMenu extends Func<FuncProjectMenuState> {
         this.onStateIn,
         null,
         this.onStateExit,
+        this,
       );
     });
   }
   onStateIn(): void {
-    const clickMenu = (menu: any): void => {
-      console.log(menu);
-    };
-    window.GT_APP.sysPage.add(PAGE_KEY.ProjectMenu, { clickMenu });
+    window.GT_APP.sysPage.add(PAGE_KEY.ProjectMenu, {
+      clickMenu: this.clickMenu,
+      subModule: 2,
+    });
   }
   onStateExit(): void {
     window.GT_APP.sysPage.removeByKey(PAGE_KEY.ProjectMenu);
   }
+  clickMenu(menu: Api.IMenu): void {
+    console.log(menu);
+    if (!menu.UnityPath) return;
+    let app = window.GT_APP;
+    switch (menu.UnityPath) {
+      case '1':
+        app.funcMain.changeState(FuncMainState.PageMenu);
+        break;
+    }
+  }
 }

+ 11 - 4
src/Project/Functions/LevelAFunctions/FuncProjectSelection.ts

@@ -1,5 +1,6 @@
 import Func from '@/Engine/ECS/Function';
 import { PAGE_KEY } from '@/Project/constants';
+import { FuncMainState } from '../FuncMain';
 export enum FuncProjectSelectionState {
   idle,
 }
@@ -13,19 +14,25 @@ export default class FuncProjectSelection extends Func<FuncProjectSelectionState
         this.onIdleStateIn,
         null,
         this.onIdleStateExit,
+        this,
       );
     });
   }
   onIdleStateIn(): void {
-    const selectProject = (projcet: Api.IProject) => {
-      console.log(projcet);
-    };
+    // const selectProject = (projcet: Api.IProject) => {
+    //   console.log(projcet);
+    //   // window.GT_APP.funcMain.changeState(FuncMainState.PageMenu)
+
+    // };
     window.GT_APP.sysPage.add(PAGE_KEY.ProjectSelection, {
-      selectProject,
+      selectProject: this.selectProject,
       subModule: 1,
     });
   }
   onIdleStateExit(): void {
     window.GT_APP.sysPage.removeByKey(PAGE_KEY.ProjectSelection);
   }
+  selectProject(): void {
+    window.GT_APP.funcMain.changeState(FuncMainState.ProjectMenu);
+  }
 }

+ 3 - 1
src/Project/Os.ts

@@ -6,6 +6,7 @@ import FuncPlatformMenu from './Functions/LevelAFunctions/FuncPlatformMenu';
 import FuncProjectSelection from './Functions/LevelAFunctions/FuncProjectSelection';
 import FuncPageMenu from './Functions/LevelAFunctions/FuncPageMenu';
 import SysPage from '@/Frameworks/SysPage';
+import FuncProjectMenu from './Functions/LevelAFunctions/FuncProjectMenu';
 class Os {
   isActive: Boolean = false;
   funcMain: FuncMain;
@@ -13,7 +14,7 @@ class Os {
   funcPlatformMenu: FuncPlatformMenu;
   funcMap: FuncMap;
   funcProjectSelection: FuncProjectSelection;
-
+  funcProjectMenu: FuncProjectMenu;
   funcDataMeter: FuncDataMeter;
 
   funcPageMenu: FuncPageMenu;
@@ -32,6 +33,7 @@ class Os {
 
     this.funcDataMeter = new FuncDataMeter('FuncDataMeter');
     this.funcPageMenu = new FuncPageMenu('FuncPageMenu');
+    this.funcProjectMenu = new FuncProjectMenu('funcProjectMenu');
 
     // sys
     this.sysPage = new SysPage('SysRouter');

BIN
src/Project/assets/UnityMenu/Breadcrumb.png


BIN
src/Project/assets/UnityMenu/BreadcrumbContentBg.png


BIN
src/Project/assets/UnityMenu/BreadcrumbHead.png


BIN
src/Project/assets/UnityMenu/BreadcrumbSelect.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-DirectDrinking.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-build-0.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-build-10.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-build-3.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-build-4.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-build.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-BaseInfo.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-ConfigManagement.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-DataCenter.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-DataView.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-DeviceManagement.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-EnergyManagement.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-LimitedSpace.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-ProManagement.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-SecurityManagement.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops-WaterQManagement.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-ops.png


BIN
src/Project/assets/UnityMenu/ICON/func-01-point-bom.png


BIN
src/Project/assets/UnityMenu/ICON/func-06-ManDay.png


BIN
src/Project/assets/UnityMenu/ICON/func-06-globalCockpit.png


BIN
src/Project/assets/UnityMenu/ICON/newModel.png


BIN
src/Project/assets/UnityMenu/Menu.png


BIN
src/Project/assets/UnityMenu/TogMenuBackground.png


BIN
src/Project/assets/UnityMenu/TogMenuClose.png


BIN
src/Project/assets/UnityMenu/background.jpg


BIN
src/Project/assets/UnityMenu/background.png


BIN
src/Project/assets/UnityMenu/barBackground.png


BIN
src/Project/assets/UnityMenu/header.png


BIN
src/Project/assets/UnityMenu/leftLine.png


BIN
src/Project/assets/UnityMenu/newBackground.jpg


BIN
src/Project/assets/UnityMenu/newModel.png


BIN
src/Project/assets/UnityMenu/noIcon.png


+ 1 - 1
src/Project/constants/index.ts

@@ -78,4 +78,4 @@ export const RoleType = [
 ];
 
 export const BuildNodeCode = 'func-01-build';
-export const OpsNodeCode = 'func-01-build';
+export const OpsNodeCode = 'func-01-ops';

+ 56 - 23
src/Project/pages/ProjectMenu/MenuStyle.less

@@ -1,15 +1,17 @@
 .background {
-  background-image: url(@/assets/UnityMenu/background.jpg);
-  width: '100%';
+  background-image: url("@/Project/assets/UnityMenu/newBackground.jpg");
+  width: 100%;
   height: 100vh;
   background-size: cover;
   background-repeat: no-repeat;
+
   :global {
     .ant-popover-inner {
       background: #0d1a2b;
     }
   }
 }
+
 .menu {
   width: 1.2rem;
   height: 1.2rem;
@@ -19,10 +21,10 @@
   display: flex;
   justify-content: center;
   align-items: center;
-  cursor: pointer;
 }
+
 .TogMenu {
-  background-image: url(@/assets/UnityMenu/TogMenuBackground.png);
+  background-image: url(@/Project/assets/UnityMenu/TogMenuBackground.png);
   width: 3.56rem;
   background-size: cover;
   background-repeat: no-repeat;
@@ -33,8 +35,9 @@
   flex-direction: column;
   z-index: 99999;
 }
+
 .TogMenuClose {
-  background-image: url(@/assets/UnityMenu/TogMenuClose.png);
+  background-image: url(@/Project/assets/UnityMenu/TogMenuClose.png);
   width: 0.23rem;
   height: 5px;
   background-size: cover;
@@ -43,6 +46,7 @@
   right: 0.1rem;
   top: 0.14rem;
 }
+
 .TogMenuItem {
   margin-left: 0.22rem;
   margin-right: 0.4rem;
@@ -51,54 +55,81 @@
   align-items: center;
   border-bottom: 1px solid rgb(176, 192, 224);
 }
+
 .TogMenuItemLeftLine {
-  background-image: url(@/assets/UnityMenu/leftLine.png);
+  background-image: url(@/Project/assets/UnityMenu/leftLine.png);
   height: 0.16rem;
   width: 4px;
   background-size: cover;
   background-repeat: no-repeat;
 }
+
 .TogMenuItemText {
   font-size: 0.18rem;
-  font-family: 'Microsoft YaHei UI'; /* Microsoft YaHei UI;*/
+  font-family: 'Microsoft YaHei UI';
+  /* Microsoft YaHei UI;*/
   font-weight: 400;
   color: #ffffff;
   line-height: 0.34rem;
   margin-left: 0.18rem;
-  cursor: pointer;
 }
+
 .menuContent {
   display: flex;
   justify-content: center;
   align-items: center;
-  width: '100%';
+  width: 100%;
   height: calc(100vh - 0.6rem);
 }
+
 .menuFriName {
-  font-size: 0.26rem;
-  font-family: 'Microsoft YaHei UI'; /* Microsoft YaHei UI;*/
-  font-weight: 400;
-  color: #ffffff;
-  line-height: 0.45rem;
-  text-shadow: 0px 5px 14px rgba(0, 0, 0, 0.35), 0px 3px 12px rgba(0, 0, 0, 0.19);
+  font-size: 24px;
+  margin-top: 22px;
+  font-family: Microsoft YaHei UI;
+  color: #bae3ff;
   cursor: pointer;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
   user-select: none;
   letter-spacing: 2px;
+  text-align: center;
+  word-break: keep-all;
 }
+
 .card {
   width: 12rem;
   height: 6.4rem;
 }
+
 .wrap {
+  width: 1480px;
+  height: 100vh;
+  margin: 0 auto;
   display: flex;
   flex-wrap: wrap;
+  justify-content: center;
+  align-content: center;
 }
+
 .item {
   display: flex;
   flex-direction: column;
   align-items: center;
-  width: 4rem;
-  height: 2.4rem;
+  width: 292px;
+  height: 220px;
+  margin-bottom: 64px;
+
+}
+
+.disabled {
+  cursor: not-allowed;
+}
+
+.empty {
+  height: 1px;
+  width: 2.92rem;
+  visibility: hidden;
 }
 
 .headerText {
@@ -121,31 +152,33 @@
   display: flex;
   align-items: center;
 }
+
 .BreadcrumbItem {
   background-size: contain;
   background-repeat: no-repeat;
   height: 0.34rem;
   font-size: 16px;
-  font-family: 'Microsoft YaHei UI'; /* Microsoft YaHei UI;*/
+  font-family: 'Microsoft YaHei UI';
+  /* Microsoft YaHei UI;*/
   font-weight: bold;
   color: #ffffff;
   line-height: 0.34rem;
-  background: url(@/assets/UnityMenu/BreadcrumbSelect.png) no-repeat center;
+  background: url(@/Project/assets/UnityMenu/BreadcrumbSelect.png) no-repeat center;
   background-size: 100% 100%;
   padding-left: 0.18rem;
   padding-right: 0.16rem;
-  cursor: pointer;
+
   &.active {
-    background-image: url(@/assets/UnityMenu/Breadcrumb.png);
+    background-image: url(@/Project/assets/UnityMenu/Breadcrumb.png);
   }
 }
 
 .BreadcrumbContent {
-  background-image: url(@/assets/UnityMenu/TogMenuBackground.png);
+  background-image: url(@/Project/assets/UnityMenu/TogMenuBackground.png);
   width: 2.68rem;
   background-size: cover;
   background-repeat: no-repeat;
   position: absolute;
   display: flex;
   flex-direction: column;
-}
+}

+ 82 - 140
src/Project/pages/ProjectMenu/index.tsx

@@ -1,225 +1,167 @@
-import { useRequest } from '@umijs/max';
+import { useModel, useRequest } from '@umijs/max';
+import { Spin } from 'antd';
 import React, { useState, useEffect } from 'react';
 import menuStyle from './MenuStyle.less';
 
-const noIcon = require('@/assets/UnityMenu/noIcon.png');
 const grayIcon = [
   {
     code: 'func-01-ops-BaseInfo',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-BaseInfo.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-BaseInfo.png'),
     name: '水厂介绍',
   },
   {
     code: 'func-01-ops-DataView',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-DataView.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-DataView.png'),
     name: '数据驾驶舱',
   },
   {
     code: 'func-01-ops-DeviceManagement',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-DeviceManagement.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-DeviceManagement.png'),
     name: '设备管理',
   },
   {
     code: 'func-01-ops-ProManagement',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-ProManagement.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-ProManagement.png'),
     name: '生产管理',
   },
   {
     code: 'func-01-ops-SecurityManagement',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-SecurityManagement.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-SecurityManagement.png'),
     name: '安全管理',
   },
   {
     code: 'func-01-ops-LimitedSpace',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-LimitedSpace.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-LimitedSpace.png'),
     name: '有限空间管理',
   },
   {
     code: 'func-01-ops-EnergyManagement',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-EnergyManagement.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-EnergyManagement.png'),
     name: '能耗管理',
   },
   {
     code: 'func-01-ops-WaterQManagement',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-WaterQManagement.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-WaterQManagement.png'),
     name: '水质管理',
   },
   {
     code: 'func-01-build-0',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-build-0.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-build-0.png'),
     name: '数据中心',
   },
   {
     code: 'func-01-ops-ConfigManagement',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-ops-ConfigManagement.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-ops-ConfigManagement.png'),
     name: '配置管理',
   },
 
   {
     code: 'func-01-build-0',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-build-0.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-build-0.png'),
     name: '数据中心',
   },
   {
     code: 'func-01-build-3',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-build-3.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-build-3.png'),
     name: '计划管理',
   },
   {
     code: 'func-01-build-4',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-build-4.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-build-4.png'),
     name: '安全管理',
   },
   {
     code: 'func-01-build-10',
-    iconPath: require('@/assets/UnityMenu/ICON/func-01-build-10.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/func-01-build-10.png'),
     name: '流程管理',
   },
 
   {
     code: '',
-    iconPath: require('@/assets/UnityMenu/ICON/newModel.png'),
+    iconPath: require('@/Project/assets/UnityMenu/ICON/newModel.png'),
     name: '新增功能',
   },
 ];
+
 function ModuleMenu(props: any) {
   const {
-    location: {
-      query: { moduleCode, projectId },
-    },
+    params: { subModule, clickMenu },
   } = props;
+  const { projectMenu, queryProjectMenu, loading } = useModel('menu');
 
-  const { data: waterMenuData } = useRequest(async () => {});
-  const [curMenu, setCurMenu] = useState<Api.IMenu[]>([]);
-
-  // useEffect(() => {
-  //   dispatch({
-  //     type: 'menu/getMenuByDepId',
-  //     callback: menu => {
-  //       let moduleMenu = (menu.children || []).find(item => item.Code == moduleCode);
-  //       if (moduleMenu) initMenu(moduleMenu, handleMenuClick);
-  //     },
-  //     payload: { version: 2, projectId },
-  //   });
-  // }, []);
-
-  const initMenu = (parent: Api.IMenu) => {
-    if (parent?.children) {
-      let menu = [
-        ...parent.children,
-        // {
-        //   Name: '新增功能',
-        //   ID: -1,
-        //   Code: '',
-        //   Type: 1,
-        //   Icon: require('@/assets/UnityMenu/ICON/newModel.png'),
-        //   WebPath: '',
-        //   UnityPath: '',
-        // },
-      ];
-
-      for (let i = 0; i < menu.length; i++) {
-        let element = menu[i];
-        if (element.Type != 1) {
-          menu.splice(i, 1);
-          i--; //i
-          continue;
-        }
-        // element.name = element.Name;
-        // element.iconPath = element.Icon || noIcon;
-        // element.active = element.children != undefined || element.UnityPath != '';
-        if (!element.active) continue;
-      }
-      setCurMenu(menu);
-    }
-  };
   // const backToProjectSelect = () => {
   //   UnityAction.sendMsg('back', '');
   // };
   const handleMenuClick = (element: Api.IMenu) => {
+    console.log(element);
     if (!element.active) return;
-    let menu = [];
-    // console.log(element);
-    // UnityAction.sendMsg('EnterApp', element);
-    var parent = waterMenuData?.children.find(
-      (item: Api.IMenu) => item.ID == element.ParentID,
-    );
-    if (parent) {
-      menu.push(parent);
-      var current = parent?.children.find(
-        (item: Api.IMenu) => item.Code == element.Code,
+    clickMenu?.(element);
+    // let menu = [];
+    // // console.log(element);
+    // // UnityAction.sendMsg('EnterApp', element);
+    // var parent = waterMenuData?.children.find(
+    //   (item: Api.IMenu) => item.ID == element.ParentID,
+    // );
+    // if (parent) {
+    //   menu.push(parent);
+    //   var current = parent?.children.find(
+    //     (item: Api.IMenu) => item.Code == element.Code,
+    //   );
+    //   if (current) {
+    //     menu.push(current);
+    //   }
+    // }
+  };
+
+  const getSrc = (item: Api.IMenu) => {
+    if (item.active) {
+      return (
+        item.Icon || require('@/Project/assets/UnityMenu/ICON/newModel.png')
       );
-      if (current) {
-        menu.push(current);
-      }
+    } else {
+      return grayIcon.find((icon) => icon.code === item.Code)?.iconPath;
     }
   };
+  useEffect(() => {
+    queryProjectMenu(subModule);
+  }, []);
 
   return (
-    <>
-      <div className={menuStyle.background}>
-        <div className={menuStyle.menuContent}>
-          <div className={menuStyle.wrap}>
-            {curMenu.map((item) => (
-              <div className={menuStyle.item}>
-                <div
-                  onClick={() => handleMenuClick(item)}
-                  className={menuStyle.menu}
-                  style={
-                    item.active
-                      ? {}
-                      : item.ID === -1
-                      ? { cursor: 'not-allowed' }
-                      : {}
-                  }
-                >
-                  <img
-                    className={menuStyle.pic}
-                    src={
-                      item.active
-                        ? item.Icon ||
-                          require('@/assets/UnityMenu/ICON/newModel.png')
-                        : grayIcon.find((icon) => icon.code === item.Code)
-                            ?.iconPath
-                    }
-                    style={item.active ? {} : { cursor: 'not-allowed' }}
-                  />
-                </div>
-                <div style={{ marginTop: '0.22rem', textAlign: 'center' }}>
-                  <span
-                    className={menuStyle.menuFriName}
-                    style={
-                      item.active
-                        ? {}
-                        : { color: '#6081B2', cursor: 'not-allowed' }
-                    }
-                  >
-                    {item.Name}
-                  </span>
-                </div>
-              </div>
-            ))}
-          </div>
+    <div className={menuStyle.background}>
+      <Spin spinning={loading}>
+        <div className={menuStyle.wrap}>
+          {projectMenu.map((item) => (
+            <div
+              key={item.ID}
+              className={`${menuStyle.item} ${
+                item.active ? '' : menuStyle.disabled
+              }`}
+              onClick={() => handleMenuClick(item)}
+            >
+              <img className={menuStyle.pic} src={getSrc(item)} />
+              <span className={menuStyle.menuFriName}>{item.Name}</span>
+            </div>
+          ))}
+          {/* 新增功能 */}
+          {projectMenu.length > 0 && (
+            <div className={menuStyle.item} style={{ cursor: 'not-allowed' }}>
+              <img
+                className={menuStyle.pic}
+                src={require('@/Project/assets/UnityMenu/ICON/newModel.png')}
+              />
+              <span className={menuStyle.menuFriName}>新增功能</span>
+            </div>
+          )}
+
+          <div className={menuStyle.empty}></div>
+          <div className={menuStyle.empty}></div>
+          <div className={menuStyle.empty}></div>
+          <div className={menuStyle.empty}></div>
+          <div className={menuStyle.empty}></div>
+          <div className={menuStyle.empty}></div>
         </div>
-      </div>
-      {/* {
-        unityBack == undefined && <button
-          className={style.enterBtn}
-          type="button"
-          onClick={e => {
-            backToProjectSelect();
-            e.stopPropagation();
-          }}
-          style={{
-            position: 'absolute',
-            right: 0,
-            top: 100,
-          }}
-        >
-          返回
-        </button>
-      } */}
-    </>
+      </Spin>
+    </div>
   );
 }
 export default ModuleMenu;

+ 2 - 1
src/Project/pages/ProjectSelect/index.js

@@ -128,7 +128,6 @@ function ProjectSelect(props) {
     </div>
   );
 }
-export default ProjectSelect;
 
 function ProjectItem(props) {
   const { item, onDoubleClick } = props;
@@ -219,3 +218,5 @@ function Line(props) {
     </div>
   );
 }
+
+export default ProjectSelect;

+ 3 - 0
src/Project/pages/global.less

@@ -38,6 +38,9 @@ select,
 textarea {
   font: 12px/1.5tahoma, arial, \5b8b\4f53;
 }
+html {
+  font-size: 100px;
+}
 
 h1,
 h2,

+ 2 - 2
src/Project/services/platformMenu.ts

@@ -1,10 +1,10 @@
 import { request } from '@umijs/max';
 
-export async function getMenuData(params:any) {
+export async function getMenuData(params: any) {
   return request(`/api/v1/menu`, {
     params: params,
   });
 }
-export async function getMenuDataByProject(projectId:string) {
+export async function getMenuDataByProject(projectId: string | number) {
   return request(`/api/v2/user/project/menu/${projectId}`);
 }

+ 3 - 3
src/Project/services/project.ts

@@ -4,7 +4,7 @@ import { request } from 'umi';
 //获取项目列表
 export async function getProjectList(
   params: any,
-): Promise<Api.IResponseStructure> {
+) {
   const response = await request(`/api/v2/project`, {
     params: params,
   });
@@ -85,7 +85,7 @@ export async function queryFormHistoryData2(params: any) {
 }
 
 //获取当前项目详情
-export async function queryProjectById(params: any): Promise<Api.IResponseStructure> {
+export async function queryProjectById(params: any){
   return request(`/api/v2/project/detail/${params.ID}`);
 }
 
@@ -102,7 +102,7 @@ export async function addProjectUserV2(param: any) {
 }
 
 
-export async function queryUserList(Id: Number) {
+export async function queryUserList(Id: any) {
   return request(`/api/v1/user/project/${Id}`);
 }
 

+ 23 - 5
src/Project/services/typings.d.ts

@@ -19,11 +19,6 @@ declare namespace Api {
   interface IAccess {
     [key: string]: boolean;
   }
-  interface IResponseStructure {
-    code: number;
-    data: any;
-    msg?: string;
-  }
   interface IProject {
     Name: string;
     ID: number;
@@ -139,4 +134,27 @@ declare namespace Api {
 
     active?: boolean;
   }
+  interface IProjectAccess {
+    RoleCode: string;
+    RoleId: number;
+    RoleName: string;
+    Menus: { [key: string]: boolean };
+  }
+}
+declare interface IResponse<T> {
+  code: number;
+  data: T;
+  msg?: string;
+}
+declare interface IListResponse<T> {
+  code: number;
+  data: {
+    list: T[];
+    pagination: {
+      current: number;
+      pageSize: number;
+      total: number;
+    };
+  };
+  msg?: string;
 }

+ 1 - 1
src/Project/services/user.ts

@@ -22,7 +22,7 @@ export async function queryDepList(userName: string) {
   });
 }
 
-export async function queryCurrent(): Promise<Api.IResponseStructure> {
+export async function queryCurrent() {
   return request('/api/v2/user/current-user');
 }
 

+ 3 - 3
src/app.ts

@@ -24,7 +24,7 @@ export async function getInitialState(): Promise<any> {
 // axios配置
 export const request: RequestConfig = {
   errorConfig: {
-    errorThrower(res: Api.IResponseStructure) {
+    errorThrower(res: IResponse<any>) {
       // const { data, code, msg } = res;
       // if (code !== 200) {
       //   const error: any = new Error(msg);
@@ -38,7 +38,7 @@ export const request: RequestConfig = {
       if (opts?.skipErrorHandler) throw error;
       // 我们的 errorThrower 抛出的错误。
       if (error.name === 'AjaxError') {
-        const errorInfo: Api.IResponseStructure | undefined = error.info;
+        const errorInfo: IResponse<any> | undefined = error.info;
         const inLoginPage = window.GT_APP.funcLogin.IsActive;
         if (!inLoginPage && errorInfo) {
           message.error(errorInfo.msg || errorInfo.data);
@@ -67,7 +67,7 @@ export const request: RequestConfig = {
   ],
   responseInterceptors: [
     (res) => {
-      const resData = res.data as Api.IResponseStructure;
+      const resData = res.data as IResponse<any>;
       const { code, msg, data } = resData;
       if (code !== 200) {
         const error: any = new Error(msg);

+ 9 - 4
src/models/dep.ts

@@ -1,13 +1,18 @@
 import { useRequest } from '@umijs/max';
 import { queryDepV2 } from '@/Project/services/dep';
 const dep = () => {
-  const { data: depTrees, loading: loading, run: run } = useRequest(queryDepV2, {
+  const {
+    data: depTrees,
+    loading: loading,
+    run: run,
+  } = useRequest(queryDepV2, {
+    manual: true,
     defaultParams: [
       {
         pageSize: 9999,
       },
     ],
   });
-  return { depTrees, loading }
-}
-export default dep;
+  return { depTrees, loading, queryDep: run };
+};
+export default dep;

+ 114 - 0
src/models/menu.ts

@@ -0,0 +1,114 @@
+import { OpsNodeCode, BuildNodeCode } from '@/Project/constants';
+import {
+  getMenuData,
+  getMenuDataByProject,
+} from '@/Project/services/platformMenu';
+import { useModel, useRequest } from '@umijs/max';
+import { useMemo, useState } from 'react';
+
+interface IPermission {
+  [key: string]: boolean;
+}
+const useMenu = () => {
+  const projectModel = useModel('project');
+  const projectId = projectModel.project?.ID;
+  // 1=build   2=ops
+  const [module, changeModule] = useState<number>(1);
+  const allMenuRequest = useRequest(
+    () =>
+      getMenuData({
+        version: 2,
+      }),
+    {
+      manual: true,
+    },
+  );
+  const allMenu: Api.IMenu[] = allMenuRequest.data?.list || [];
+  const projectMenuRequest = useRequest(
+    async (module: number) => {
+      changeModule(module);
+      let allMenuRes = await getMenuData({
+        projectId,
+        version: 2,
+      });
+      let accessRes = await getMenuDataByProject(projectId!);
+      const allMenu: Api.IMenu[] = allMenuRes.data?.list || [];
+      const access: Api.IProjectAccess[] = accessRes.data || [];
+      return { data: initData(allMenu, access, module) };
+    },
+    {
+      manual: true,
+    },
+  );
+
+  return {
+    allMenu,
+    projectMenu: projectMenuRequest.data || [],
+    changeModule,
+    loading: projectMenuRequest.loading || allMenuRequest.loading,
+    queryAllMenu: allMenuRequest.run,
+    queryProjectMenu: projectMenuRequest.run,
+  };
+};
+const initData = (
+  allMenu: Api.IMenu[],
+  access: Api.IProjectAccess[],
+  module: number,
+) => {
+  if (!access || allMenu.length == 0) return [];
+
+  let menu = allMenu.find((item: Api.IMenu) => item.MenuType == 0);
+  if (!menu || !menu.children) return [];
+  var permission: IPermission = {};
+  for (let i = 0; i < access.length; i++) {
+    let element = access[i].Menus;
+    if (element == null) continue;
+    permission = {
+      ...permission,
+      ...element,
+    };
+  }
+  let subMenu = menu.children.find((item) => {
+    if (module == 1) {
+      return item.Code == BuildNodeCode;
+    } else {
+      return item.Code == OpsNodeCode;
+    }
+  });
+  if (!subMenu) return [];
+
+  return filterWaterMenuDataByDepId(subMenu.children || [], permission);
+};
+
+// 根据权限过滤菜单栏
+const filterWaterMenuDataByDepId = (
+  menuData: Api.IMenu[],
+  permission: IPermission,
+) => {
+  if (!menuData) {
+    return [];
+  }
+  var arr: Api.IMenu[] = [];
+  menuData.forEach((item) => {
+    if (item.Type != 1) return;
+    if (!permission[item.Code]) return;
+    arr.push(item);
+    if (item.children) {
+      let newChildren = filterWaterMenuDataByDepId(item.children, permission);
+      if (newChildren.length == 0) {
+        delete item.children;
+      } else {
+        item.children = newChildren;
+      }
+    }
+
+    if (item.children?.length || item.UnityPath) {
+      item.active = true;
+    } else {
+      item.active = false;
+    }
+  });
+  return arr;
+};
+
+export default useMenu;

+ 6 - 2
src/models/project.ts

@@ -7,7 +7,9 @@ const useProject = () => {
   // 当前选中项目
   const [project, setProject] = useState<Api.IProject>();
   // 项目列表
-  const projectRequest = useRequest(getProjectList);
+  const projectRequest = useRequest(getProjectList, {
+    manual: true,
+  });
   const projectList: Api.IProject[] = projectRequest.data?.list || [];
 
   const getProject = useCallback(
@@ -16,12 +18,14 @@ const useProject = () => {
     },
     [projectRequest.data],
   );
+  console.log(project);
 
   return {
     project,
-    setProject,
     projectList,
+    setProject,
     getProject,
+    queryProjectList: projectRequest.run,
   };
 };
 

+ 13 - 5
src/models/projectRoleList.ts

@@ -1,8 +1,16 @@
 import { useRequest, useModel } from '@umijs/max';
 import { queryProjectRole } from '@/Project/services/project';
 const projectRoleList = () => {
-  // const { project } = useModel('project');
-  const { data: { full_roles }, loading: loading } = useRequest(queryProjectRole, { defaultParams: [{ projectId: 46, mod: 1 }] });
-  return { full_roles }
-}
-export default projectRoleList;
+  const projectModel = useModel('project');
+  const projectId = projectModel.project?.ID;
+  const {
+    data,
+    run,
+    loading: loading,
+  } = useRequest(() => queryProjectRole({ projectId: projectId, mod: 1 }), {
+    ready: Boolean(projectId),
+    refreshDeps: [projectId],
+  });
+  return { full_roles: data?.full_roles || [], queryRole: run };
+};
+export default projectRoleList;

+ 17 - 9
src/models/userList.ts

@@ -3,12 +3,20 @@ import { useModel, useRequest } from '@umijs/max';
 import { queryUserList } from '@/Project/services/project';
 
 export default () => {
-  const [curProjectId, setCurProjectId] = useState(0);
-  const { data: userList, loading: loading, run: run } = useRequest(queryUserList, { manual: true });
-  useEffect(() => {
-    if (curProjectId) {
-      run(curProjectId)
-    }
-  }, [curProjectId]);
-  return { userList, loading, setCurProjectId }
-}
+  const projectModel = useModel('project');
+  const projectId = projectModel.project?.ID;
+  const {
+    data: userList,
+    loading: loading,
+    run: run,
+  } = useRequest(
+    async () => {
+      return queryUserList(projectId);
+    },
+    {
+      manual: true,
+    },
+  );
+
+  return { userList, loading, queryUserList: run };
+};