Selaa lähdekoodia

Merge branch 'master' of http://120.55.44.4:10080/xujunjie/GtDigManageWeb

Renxy 2 vuotta sitten
vanhempi
commit
a598141b60

+ 18 - 1
.umirc.ts

@@ -33,7 +33,24 @@ export default defineConfig({
     {
       name: '流程图管理',
       path: '/flow',
-      component: './Flow/index',
+      hideChildrenInMenu: true,
+      routes: [
+        {
+          path: '/flow',
+          redirect: '/flow/list',
+        },
+        {
+          name: '流程图列表',
+          path: '/flow/list',
+          component: './Flow/index',
+        },
+        {
+          name: '流程图详情',
+          path: '/flow/audit',
+          component: './Flow/Audit',
+          hideInMenu: true,
+        },
+      ],
     },
     {
       name: '权限演示',

+ 1 - 0
package.json

@@ -13,6 +13,7 @@
   "dependencies": {
     "@ant-design/icons": "^4.7.0",
     "@ant-design/pro-components": "^2.0.1",
+    "@antv/xflow": "^1.0.55",
     "@umijs/max": "^4.0.64",
     "antd": "^5.0.0",
     "qs": "^6.11.1",

+ 7 - 5
src/app.tsx

@@ -3,6 +3,7 @@ import { RunTimeLayoutConfig, RequestConfig } from '@umijs/max';
 import { message } from 'antd';
 import UserDropdown from '@/components/UserDropdown';
 import { getToken } from '@/utils/utils';
+import { history } from 'umi';
 
 // 全局初始化数据配置,用于 Layout 用户信息和权限初始化
 // 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
@@ -44,10 +45,9 @@ export const request: RequestConfig = {
         // 校验是否token失效
         if (tokenExpiredHandle(error.info.code)) return;
         const errorInfo: any = error.info;
-        // const inLoginPage = window.GT_APP.funcLogin.IsActive;
-        // if (!inLoginPage && errorInfo) {
-        //   message.error(errorInfo.msg || errorInfo.data);
-        // }
+        if (errorInfo) {
+          message.error(errorInfo.msg || errorInfo.data);
+        }
       } else if (error.response) {
         // http错误,校验token是否失效
         if (tokenExpiredHandle(error.response.status)) return;
@@ -79,7 +79,8 @@ export const request: RequestConfig = {
         const error: any = new Error(msg);
         error.name = 'AjaxError';
         error.info = { code, msg, data };
-        throw error;
+        // throw error;
+        return Promise.reject(error);
       }
       return res;
     },
@@ -97,6 +98,7 @@ const tokenExpiredHandle = (code: number) => {
     }, 50000);
     message.error('token失效,请重新登录');
 
+    history.push('/login');
     return true;
   } else {
     return false;

BIN
src/assets/UnityMenu/Bom.png


BIN
src/assets/UnityMenu/Manufacturer.png


BIN
src/assets/UnityMenu/OA.png


BIN
src/assets/UnityMenu/agreement.png


BIN
src/assets/UnityMenu/newBackground.jpg


BIN
src/assets/UnityMenu/newModel.png


BIN
src/assets/UnityMenu/noIcon.png


BIN
src/assets/UnityMenu/project.png


BIN
src/assets/UnityMenu/system.png


BIN
src/assets/UnityMenu/time.png


BIN
src/assets/UnityMenu/transfer.png


+ 5 - 4
src/components/AuditForm/ComponentLibrary.js

@@ -19,17 +19,18 @@ function ComponentLibrary(props) {
     onCancel?.();
   };
   return (
-    <Modal visible={visible} onCancel={handleCancel} onOk={handleOk}>
+    <Modal open={visible} onCancel={handleCancel} onOk={handleOk}>
       <Row gutter={12} style={{ paddingTop: 20 }}>
-        {COMPONENT_LIST.map(item => (
-          <Col span={8}>
+        {COMPONENT_LIST.map((item) => (
+          <Col span={8} key={item.componentName}>
             <div
               onClick={() => setCurrentItem(item)}
               style={{
                 display: 'flex',
                 justifyContent: 'flex-start',
                 alignItems: 'center',
-                border: item == currnetItem ? '1px solid #1890FF' : '1px solid #aaa',
+                border:
+                  item == currnetItem ? '1px solid #1890FF' : '1px solid #aaa',
                 width: '100%',
                 padding: '4px 12px',
                 cursor: 'pointer',

+ 1 - 1
src/components/AuditForm/FormContent.js

@@ -54,7 +54,7 @@ function FormContent(props) {
         );
         return (
           <FormItem
-            key={item.id}
+            key={item.props?.id}
             active={index == currentItem}
             onClick={() => handleSelect(index)}
             item={item}

+ 13 - 8
src/components/Flow/components/judgeModal/index.tsx

@@ -10,7 +10,7 @@ const AddCondition = (props: any) => {
 
   let formData = useMemo(() => {
     let formDat = formItems ? JSON.parse(formItems) : [];
-    setValues(formDat.map(cur => cur.props.id));
+    setValues(formDat.map((cur: any) => cur.props.id));
     return formDat;
   }, [formItems]);
 
@@ -26,25 +26,25 @@ const AddCondition = (props: any) => {
         item.props.required
       );
     })
-    .map(item => {
+    .map((item: any) => {
       return {
         label: item.props.label,
         ...item,
       };
     });
 
-  const onChange = (values: []) => {
+  const onChange = (values: any) => {
     setValues(values);
   };
 
   const handleOk = () => {
     let resultData: FormItem[] = [];
-    values.map(value => {
-      const item = formData.find(cur => cur.props.id == value);
+    values.map((value) => {
+      const item = formData.find((cur: any) => cur.props.id == value);
       if (item) {
         resultData.push(item);
       } else {
-        const item = items.find(cur => cur.props.id == value);
+        const item = items.find((cur: any) => cur.props.id == value);
         resultData.push(item);
       }
     });
@@ -60,9 +60,14 @@ const AddCondition = (props: any) => {
         </Button>
         还有{data.length - values.length}组可用条件
       </div>
-      <Modal title="选择条件" visible={visible} onOk={handleOk} onCancel={() => setVisible(false)}>
+      <Modal
+        title="选择条件"
+        open={visible}
+        onOk={handleOk}
+        onCancel={() => setVisible(false)}
+      >
         <p>请选择用来区分审批流程的条件字段 ,已选{values.length}个</p>
-        <Checkbox.Group value={values} onChange={onChange}>
+        <Checkbox.Group value={values} onChange={(values) => onChange(values)}>
           {data.map((item: FormItem) => (
             <Checkbox key={item.props.id} value={item.props.id}>
               {item.props.label}

+ 39 - 38
src/components/Flow/index.less

@@ -2,51 +2,52 @@
 @primaryColor: #1890ff;
 @light-border: 1px solid #d9d9d9;
 
-:global {
-  .flow-user-custom-clz {
-    position: relative;
-    height: 600px;
-    border: @light-border;
-
-    .xflow-x6-canvas {
-      background: @body-bg;
-    }
-
-    .xflow-node-dnd-panel-node-wrapper {
-      .xflow-dnd-node {
-        width: 190px;
-      }
-    }
 
-    .xflow-canvas-dnd-node-tree {
-      border-right: @light-border;
-    }
+.flow-user-custom-clz {
+  position: relative;
+  height: 600px;
+  border: @light-border;
 
-    .xflow-workspace-toolbar-top {
-      border-bottom: @light-border;
-    }
+  .xflow-x6-canvas {
+    background: @body-bg;
+  }
 
-    .xflow-workspace-toolbar-bottom {
-      text-align: center;
-      background: #fff;
-      border-top: @light-border;
+  .xflow-node-dnd-panel-node-wrapper {
+    .xflow-dnd-node {
+      width: 190px;
     }
   }
 
-  .xflow-modal-container {
-    position: fixed;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    z-index: 1000;
+  .xflow-canvas-dnd-node-tree {
+    border-right: @light-border;
   }
-  .xflow-json-schema-form-footer {
-    display: none;
+
+  .xflow-workspace-toolbar-top {
+    border-bottom: @light-border;
   }
-  .flowchart-demo {
-    .__dumi-default-previewer-actions {
-      border: 0;
-    }
+
+  .xflow-workspace-toolbar-bottom {
+    text-align: center;
+    background: #fff;
+    border-top: @light-border;
   }
 }
+
+.xflow-modal-container {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1000;
+}
+
+.xflow-json-schema-form-footer {
+  display: none;
+}
+
+.flowchart-demo {
+  .__dumi-default-previewer-actions {
+    border: 0;
+  }
+}

+ 31 - 22
src/components/Flow/index.tsx

@@ -43,11 +43,11 @@ import CustomFlowchartFormPanel from './node/FlowFormPanel';
 // import CustomRect from './react-node/CustomRect';
 
 import '@antv/xflow/dist/index.css';
-import { Collapse } from "antd"
+import { Collapse } from 'antd';
 import './index.less';
 import { TYPE } from './node/auditNode/mapServe';
 
-const { Panel } = Collapse
+const { Panel } = Collapse;
 
 export interface IProps {
   meta: {
@@ -60,7 +60,7 @@ export interface IProps {
   parentRef?: any;
 }
 
-export const Demo: React.FC<IProps> = props => {
+export const Demo: React.FC<IProps> = (props) => {
   const { meta, flowDetail, parentRef } = props;
   const isEdit = meta.type == 'edit';
   const toolbarConfig = useToolbarConfig();
@@ -72,39 +72,44 @@ export const Demo: React.FC<IProps> = props => {
 
   // 封装供外部主动调用的接口
   useImperativeHandle(parentRef, () => ({
-    getGraphData: async cb => {
-      appRef.current.commandService.executeCommand<NsGraphCmd.SaveGraphData.IArgs>(
+    getGraphData: async (cb: any) => {
+      appRef.current?.commandService.executeCommand<NsGraphCmd.SaveGraphData.IArgs>(
         TOOLBAR_ITEMS.SAVE_GRAPH_DATA,
         {
           saveGraphDataService: (meta, graphData) => {
             let data = JSON.parse(JSON.stringify(graphData));
-            let simpleNodes = data?.nodes?.map(curNode => {
+            let simpleNodes = data?.nodes?.map((curNode: any) => {
               let childrenNodes = data.edges
-                .map(edge => {
+                .map((edge: any) => {
                   if (edge.source?.cell == curNode.id) {
-                    return data.nodes.find(item => item.id == edge.target?.cell);
+                    return data.nodes.find(
+                      (item: any) => item.id == edge.target?.cell,
+                    );
                   }
                 })
-                .filter(item => item);
+                .filter((item: any) => item);
               //按优先级排序子节点
               const children = childrenNodes
-                .sort((a, b) => a.priority - b.priority)
-                .map(item => item.id);
+                .sort((a: any, b: any) => a.priority - b.priority)
+                .map((item: any) => item.id);
               const node = {
                 id: curNode.id,
                 type: curNode.type,
                 //条件节点
                 formItems:
-                  curNode.type == TYPE.JUDGE && !curNode.formItems ? '[]' : curNode.formItems,
+                  curNode.type == TYPE.JUDGE && !curNode.formItems
+                    ? '[]'
+                    : curNode.formItems,
                 priority: curNode.priority,
                 //审批节点
-                initiator: curNode.type == TYPE.INITIATOR ? curNode.initiator : null,
+                initiator:
+                  curNode.type == TYPE.INITIATOR ? curNode.initiator : null,
                 audits: curNode.type == TYPE.AUDIT ? curNode.audits : null,
                 children: children,
               };
               return node;
             });
-            data.nodes = data.nodes.map(item => {
+            data.nodes = data.nodes.map((item: any) => {
               let newItem = JSON.parse(JSON.stringify(item));
               delete newItem.incomingEdges;
               delete newItem.originData;
@@ -130,7 +135,7 @@ export const Demo: React.FC<IProps> = props => {
               return newItem;
             });
             // graphData.edges = []
-            data.edges = data.edges.map(item => {
+            data.edges = data.edges.map((item: any) => {
               // delete item.data;
               // delete item.attrs;
               // delete item.sourcePort;
@@ -151,7 +156,7 @@ export const Demo: React.FC<IProps> = props => {
             cb?.(JSON.stringify(data), JSON.stringify(simpleNodes));
             return data;
           },
-        }
+        },
       );
     },
   }));
@@ -159,7 +164,7 @@ export const Demo: React.FC<IProps> = props => {
    * @param app 当前XFlow工作空间
    * @param extensionRegistry 当前XFlow配置项
    */
-  const onLoad: IAppLoad = async app => {
+  const onLoad: IAppLoad = async (app) => {
     appRef.current = app;
     graphRef.current = await app.getGraphInstance();
     // graphRef.current.disableSnapline()
@@ -170,14 +175,17 @@ export const Demo: React.FC<IProps> = props => {
     if (flowDetail.nodes.length == 0 || !appRef.current) return;
     initGraphCmds(appRef.current, flowDetail);
     // 设置选中状态
-    const node = flowDetail.nodes.find(item => item.isCheck);
+    const node = flowDetail.nodes.find((item: any) => item.isCheck);
     if (node) {
       const args = {
         nodeIds: [node.id],
         resetSelection: true,
       };
       setTimeout(() => {
-        appRef.current.commandService.executeCommand(XFlowNodeCommands.SELECT_NODE.id, args);
+        appRef.current?.commandService.executeCommand(
+          XFlowNodeCommands.SELECT_NODE.id,
+          args,
+        );
       }, 100);
     }
   };
@@ -269,7 +277,8 @@ export const Demo: React.FC<IProps> = props => {
         }}
         showOfficial={false}
         defaultActiveKey={['custom']}
-        position={{ width: 162, top: 40, bottom: 0, left: isEdit && meta.editMode == 1 ? 0 : -999 }}
+        position={{ width: 162, top: 40, bottom: 0, left: isEdit ? 0 : -999 }}
+        // position={{ width: 162, top: 40, bottom: 0, left: isEdit && meta.editMode == 1 ? 0 : -999 }}
       />
       {isEdit && (
         <CanvasToolbar
@@ -313,8 +322,8 @@ export const Demo: React.FC<IProps> = props => {
 };
 
 // 高阶组件
-const DemoHoc = Demo => {
-  const forwardRef = (props, ref) => {
+const DemoHoc = (Demo: any) => {
+  const forwardRef = (props: any, ref: any) => {
     return <Demo parentRef={ref} {...props}></Demo>;
   };
   return React.forwardRef(forwardRef);

+ 1 - 1
src/components/Flow/node/fields/imgSelect.tsx

@@ -37,7 +37,7 @@ const imgSelect: React.FC<IProps> = (props) => {
       </Button>
       <Modal
         title="设备列表"
-        visible={isModalVisible}
+        open={isModalVisible}
         footer={false}
         onOk={handleOk}
         onCancel={handleCancel}

+ 27 - 21
src/components/Flow/node/judgeNode/index.tsx

@@ -7,24 +7,25 @@ import {
   SiginOptions,
   SiginSmallOptions,
 } from '../../components/judgeComponent';
-import { connect } from "umi";
+import { connect } from 'umi';
 export { judgeServe };
 
-const JudgeRect = props => {
+const JudgeRect = (props: any) => {
   const { size = { width: 130, height: 50 }, data, depUserTree } = props;
   const { width, height } = size;
-  const { label, stroke, fill, fontFill, fontSize, type, priority, formItems } = data;
+  const { label, stroke, fill, fontFill, fontSize, type, priority, formItems } =
+    data;
 
   const contentText = useMemo(() => {
     let text = [];
-    const getName = (id, data) => {
+    const getName = (id: any, data: any) => {
       let name = '';
       for (let i = 0; i < data.length; i++) {
         let item = data[i];
         if (item.ID == id) {
           return item.title;
         } else if (item.children?.length > 0) {
-          let title = getName(id, item.children);
+          let title: any = getName(id, item.children);
           if (title) return title;
         }
       }
@@ -34,44 +35,46 @@ const JudgeRect = props => {
     if (formItems) {
       let data: FormItem[] = JSON.parse(formItems);
       data.forEach((item: FormItem) => {
-        let judge: JudgeType = item.judge;
+        let judge = item.judge;
         const label: String = item.props.label;
         switch (judge?.type) {
           case ComponentName.Inner:
             const list = judge?.values
-              .map(item => {
+              ?.map((item) => {
                 return getName(item.value, depUserTree);
               })
-              .filter(item => item);
-            text.push('发起人属于:' + list.join('或'));
+              .filter((item) => item);
+            text.push('发起人属于:' + list?.join('或'));
             break;
           case ComponentName.Number:
-            const type: Number = judge.values[0];
+            const type: Number = judge?.values?.[0];
             const condition = judge.condition;
             if (!condition) break;
             if (type != 6) {
-              let JudgeLabel = JudgeOptions.find(item => item.value == type)?.label;
+              let JudgeLabel = JudgeOptions.find(
+                (item) => item.value == type,
+              )?.label;
 
               text.push(`${label} ${JudgeLabel} ${condition.smallValue}`);
             } else {
               const { smallSign, smallValue, bigSign, bigValue } = condition;
               if (!smallSign || !smallValue || !bigSign || !bigValue) break;
               const getSigin = (sigin: Number) =>
-                SiginOptions.find(item => item.value == sigin)?.label;
+                SiginOptions.find((item) => item.value == sigin)?.label;
               const getSmallSigin = (sigin: Number) =>
-                SiginSmallOptions.find(item => item.value == sigin)?.label;
+                SiginSmallOptions.find((item) => item.value == sigin)?.label;
 
               text.push(
                 `${smallValue} ${getSmallSigin(smallSign)} ${label} ${getSigin(
-                  bigSign
-                )} ${bigValue} `
+                  bigSign,
+                )} ${bigValue} `,
               );
             }
             break;
           case ComponentName.Select:
           case ComponentName.MultiSelect:
             const values = judge.values;
-            text.push(`${label} ${values.join(' 且 ')}`);
+            text.push(`${label} ${values?.join(' 且 ')}`);
             break;
         }
       });
@@ -86,10 +89,13 @@ const JudgeRect = props => {
         width,
         height,
         padding: '6px',
-        boxShadow: '0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)',
+        boxShadow:
+          '0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)',
       }}
     >
-      <span style={{ color: '#7E8185', float: 'right', fontSize: '8px' }}>优先级{priority}</span>
+      <span style={{ color: '#7E8185', float: 'right', fontSize: '8px' }}>
+        优先级{priority}
+      </span>
       <div style={{ color: '#15BC83' }}>{label}</div>
       <div
         style={{
@@ -100,7 +106,7 @@ const JudgeRect = props => {
         }}
       >
         {(contentText || []).map((text, index) => (
-          <>
+          <span key={index}>
             {index != 0 && (
               <>
                 <br />
@@ -110,13 +116,13 @@ const JudgeRect = props => {
             )}
 
             {text}
-          </>
+          </span>
         ))}
       </div>
     </div>
   );
 };
 
-export default connect(({ user }) => ({
+export default connect(({ user }: any) => ({
   depUserTree: user.depUserTree,
 }))(JudgeRect);

+ 3 - 1
src/components/UserDropdown/index.tsx

@@ -4,6 +4,7 @@ import { Link } from 'umi';
 import { Avatar, Dropdown, Menu, MenuProps } from 'antd';
 import { LogoutOutlined, UserOutlined } from '@ant-design/icons';
 import styles from './index.less';
+import { useModel } from '@umijs/max';
 
 const items: MenuProps['items'] = [
   {
@@ -19,11 +20,12 @@ const items: MenuProps['items'] = [
 ];
 
 export default function UserDropdown(props: any) {
+  const { user } = useModel('userInfo');
   return (
     <Dropdown menu={{ items }}>
       <a className={styles.action} onClick={(e) => e.preventDefault()}>
         <Avatar icon={<UserOutlined />} />
-        <span className={styles.name}>admin</span>
+        <span className={styles.name}>{user?.CName}</span>
       </a>
     </Dropdown>
   );

+ 225 - 0
src/models/user.js

@@ -0,0 +1,225 @@
+import { query as queryUsers } from '@/services/user';
+import { queryDepV2 } from '@/services/approval';
+import { queryRole } from '@/services/SysAdmin';
+
+function getDepUserTree(data) {
+  data.title = `${data.Name}`;
+  data.id = data.ID;
+  data.value = data.ID;
+  // data.selectable = false;
+  if (!data.children) data.children = new Array();
+
+  if (data.children) {
+    data.children.forEach((item) => {
+      getDepUserTree(item);
+    });
+  }
+
+  if (data.Users && data.Users.length !== 0) {
+    data.Users.forEach((item) => {
+      item.title = item.CName;
+      item.id = item.ID + '||' + data.ID;
+      item.value = item.ID + '||' + data.ID;
+      // item.selectable = true;
+      item.DepId = data.ID;
+      data.children.push(item);
+    });
+  }
+  return data;
+}
+
+const getRoleList = (data) => {
+  let roleList = [];
+  (data || []).forEach((dep) => {
+    (dep.Role || []).forEach((role) => {
+      roleList.push(role);
+    });
+
+    if (dep.children) {
+      let res = getRoleList(dep.children, roleList);
+      roleList = res.concat(res);
+    }
+  });
+  return roleList;
+};
+export default {
+  namespace: 'user',
+
+  state: {
+    list: [],
+    currentUser: { Permission: {} },
+    message: {},
+    userList: [],
+    depRole: [],
+    depUserTree: [],
+    roleList: [],
+  },
+
+  effects: {
+    *fetch(_, { call, put }) {
+      const response = yield call(queryUsers);
+      if (response) {
+        yield put({
+          type: 'save',
+          payload: response.data.list,
+        });
+      }
+    },
+    *getRoleList({ payload }, { call, put }) {
+      const response = yield call(queryRole, payload);
+      if (response) {
+        yield put({
+          type: 'saveState',
+          payload: { roleList: response.data.list },
+        });
+      }
+    },
+    *fetchDepV2({ payload, callback }, { call, put }) {
+      const response = yield call(queryDepV2, { pageSize: 999999 });
+      if (response) {
+        const depUserTree = response.data.list.map((item) => {
+          return getDepUserTree(item);
+        });
+        yield put({
+          type: 'saveState',
+          payload: { depUserTree },
+        });
+      }
+    },
+    // *fetchCurrent(_, { call, put }) {
+    //   const response = yield call(queryCurrent);
+    //   if (response) {
+    //     yield put({
+    //       type: 'saveCurrentUser',
+    //       payload: response.data,
+    //     });
+    //   }
+    // },
+    // *fetchCurrent({ payload }, { call, put }) {
+    //   const response = yield call(queryCurrentV2);
+    //   let permission = {};
+    //   if (response) {
+    //     let user = response.data;
+    //     user.Permissions?.forEach(item => {
+    //       permission = {
+    //         ...permission,
+    //         ...item.Menus,
+    //       };
+    //     });
+    //     try {
+    //       localStorage.setItem('depId', user.DepId);
+    //       if (payload?.ID) {
+    //         const { data: resData } = yield call(queryProjectMenu, payload);
+    //         // permission = resData[0] ? resData[0]?.Menus : {};
+    //       }
+    //     } catch (error) {
+    //       console.error(error);
+    //     }
+    //     const resRole = yield call(queryUserRole, user.ID);
+    //     let roleList = getRoleList(resRole.data.Dep);
+    //     console.log(roleList);
+
+    //     yield put({
+    //       type: 'saveCurrentUser',
+    //       payload: {
+    //         ...user,
+    //         // Permission: {},
+    //         Permission: permission,
+    //         roleList: roleList,
+    //       },
+    //     });
+    //   }
+    // },
+
+    // *queryDepRole({ payload }, { call, put }) {
+    //   const { data } = yield call(queryUserDetail, payload);
+    //   let depId = payload.DepId;
+    //   let dep = data.Dep.find(item => item.ID == depId);
+    //   yield put({
+    //     type: 'saveDepRole',
+    //     payload: dep.Role,
+    //   });
+    // },
+    // *fetchUnreadNotification(_, { call, put }) {
+    //   const response = yield call(queryUnreadNotification);
+    //   if (response) {
+    //     const { data } = response;
+    //     yield put({
+    //       type: 'savefetchUnreadNotification',
+    //       payload: { message: data },
+    //     });
+    //   }
+    //   // ShowUnreadNotification(list, put);
+    // },
+
+    // *readNotification({ payload }, { call }) {
+    //   console.log(payload);
+    //   yield call(SetNotificationRead, payload);
+    // },
+  },
+
+  reducers: {
+    save(state, action) {
+      return {
+        ...state,
+        list: action.payload,
+      };
+    },
+    saveDepRole(state, action) {
+      return {
+        ...state,
+        depRole: action.payload,
+      };
+    },
+    saveCurrentUser(state, action) {
+      return {
+        ...state,
+        currentUser: action.payload || {
+          Permission: {},
+        },
+      };
+    },
+    changeNotifyCount(state, action) {
+      return {
+        ...state,
+        currentUser: {
+          ...state.currentUser,
+          notifyCount: action.payload.totalCount,
+          unreadCount: action.payload.unreadCount,
+        },
+      };
+    },
+    savefetchUnreadNotification(state, action) {
+      return {
+        ...state,
+        ...action.payload,
+      };
+    },
+    userListHandler(state, { payload }) {
+      return {
+        ...state,
+        userList: payload,
+      };
+    },
+    saveState(state, action) {
+      return {
+        ...state,
+        ...action.payload,
+      };
+    },
+  },
+
+  subscriptions: {
+    setup({ dispatch, history }) {
+      history.listen(({ pathname }) => {
+        if (pathname === '/home') {
+          // setInterval(function(){
+          //   dispatch({
+          //     type: 'fetchUnreadNotification',
+          //   });
+          // }(),1000*20);
+        }
+      });
+    },
+  },
+};

+ 48 - 0
src/models/userInfo.ts

@@ -0,0 +1,48 @@
+// 全局共享数据示例
+import { useRequest } from '@umijs/max';
+import { queryCurrentV2, queryUserRole } from '@/services/user';
+
+const useUser = () => {
+  const { data: user, loading } = useRequest(queryCurrentV2, {
+    cacheKey: 'queryCurrent',
+  });
+  // const { data: roleData, loading } = useRequest(() => queryUserRole(user.ID), {
+  //   cacheKey: 'queryUserRole',
+  //   ready: !!user?.ID,
+  // });
+  // if (!roleData) return { user: null, loading: loading };
+  if (!user) return { user: null, loading: loading };
+  let permission = {};
+  user.Permissions?.forEach((item: any) => {
+    permission = {
+      ...permission,
+      ...item.Menus,
+    };
+  });
+  // let roleList = getRoleList(roleData.Dep);
+
+  return {
+    user: {
+      ...user,
+      Permission: permission,
+      // roleList: roleList,
+    },
+    loading,
+  };
+};
+
+const getRoleList = (data: any) => {
+  let roleList: any = [];
+  (data || []).forEach((dep: any) => {
+    (dep.Role || []).forEach((role: any) => {
+      roleList.push(role);
+    });
+
+    if (dep.children) {
+      let res = getRoleList(dep.children);
+      roleList = res.concat(res);
+    }
+  });
+  return roleList;
+};
+export default useUser;

+ 32 - 0
src/models/xflow.js

@@ -0,0 +1,32 @@
+import { queryAuditList } from '@/services/boom';
+
+export default {
+  namespace: 'xflow',
+  state: {
+    OSSData: {},
+    flowDetail: { nodes: [], edges: [] },
+    auditList: [],
+    formData: [],
+  },
+
+  effects: {
+    *queryAuditList({ payload }, { call, put }) {
+      const response = yield call(queryAuditList, payload);
+      if (response) {
+        yield put({
+          type: 'save',
+          payload: { auditList: response.data },
+        });
+      }
+    },
+  },
+
+  reducers: {
+    save(state, action) {
+      return {
+        ...state,
+        ...action.payload,
+      };
+    },
+  },
+};

+ 48 - 30
src/pages/Flow/Audit.js

@@ -1,8 +1,11 @@
-import React, { useEffect, useRef, useMemo } from 'react';
+import React, { useEffect, useRef, useMemo, useState } from 'react';
 import { Button, Tabs } from 'antd';
-import { connect } from "umi";
+import { connect } from 'umi';
 import Flow from '@/components/Flow';
+import { PageContainer } from '@ant-design/pro-components';
 import AuditForm from '@/components/AuditForm';
+import { useModel } from '@umijs/max';
+
 const { TabPane } = Tabs;
 
 const FLOWID = 2;
@@ -16,11 +19,12 @@ function Audit(props) {
     formData,
     flowDetail,
     simpleFlowDteail,
-    currentUser,
     loading,
   } = props;
+  const [tabActiveKey, setTabActiveKey] = useState('1');
   const ref = useRef();
-  const permission = currentUser.Permission;
+  const {user} = useModel('userInfo');
+  const permission = user?.Permission || {};
 
   const curItem = useMemo(() => {
     let item = localStorage.getItem('currentAudit');
@@ -33,7 +37,7 @@ function Audit(props) {
       return 1;
     }
     // 判断是否为创建者
-    if (currentUser.IsSuper) {
+    if (user.IsSuper) {
       return 1;
     }
 
@@ -57,7 +61,7 @@ function Audit(props) {
     });
   }, []);
 
-  const onChange = values => {
+  const onChange = (values) => {
     dispatch({
       type: 'xflow/save',
       payload: {
@@ -91,29 +95,44 @@ function Audit(props) {
     });
   };
   return (
-    <div style={{ position: 'relative' }}>
-      <p>{curItem.name}</p>
-      <Tabs defaultActiveKey="1">
-        <TabPane tab="表单设计" key="1">
-          <AuditForm value={formData} onChange={values => onChange(values)} />
-        </TabPane>
-        <TabPane tab="流程控制" key="2">
-          <Flow
-            meta={{ type: 'edit', editMode, flowId: curItem.id }}
-            flowDetail={flowDetail}
-            ref={ref}
-          />
-        </TabPane>
-      </Tabs>
-      <Button
-        loading={loading['flow/saveAuditFlowInfo']}
-        type="primary"
-        onClick={handleSaveClick}
-        style={{ position: 'absolute', right: 0, top: 0 }}
-      >
-        保存
-      </Button>
-    </div>
+    <PageContainer
+      extra={[
+        <Button
+          key={1}
+          loading={loading['flow/saveAuditFlowInfo']}
+          type="primary"
+          onClick={handleSaveClick}
+        >
+          保存
+        </Button>,
+      ]}
+      header={{
+        title: curItem.name,
+      }}
+      tabActiveKey={tabActiveKey}
+      onTabChange={setTabActiveKey}
+      tabList={[
+        {
+          tab: '表单设计',
+          key: '1',
+        },
+        {
+          tab: '流程控制',
+          key: '2',
+        },
+      ]}
+    >
+      {tabActiveKey == 1 && (
+        <AuditForm value={formData} onChange={(values) => onChange(values)} />
+      )}
+      {tabActiveKey == 2 && (
+        <Flow
+          meta={{ type: 'edit', editMode, flowId: curItem.id }}
+          flowDetail={flowDetail}
+          ref={ref}
+        />
+      )}
+    </PageContainer>
   );
 }
 export default connect(({ flow, loading, user, xflow }) => ({
@@ -123,6 +142,5 @@ export default connect(({ flow, loading, user, xflow }) => ({
   formItems: xflow.formData,
   flowDetail: flow.flowDetail,
   formData: flow.formData,
-  currentUser: user.currentUser,
   simpleFlowDteail: flow.simpleFlowDteail,
 }))(Audit);

+ 9 - 14
src/pages/Flow/index.js

@@ -2,7 +2,6 @@ import React, { useState, useEffect } from 'react';
 import { Form, Button, Table } from 'antd';
 import { connect, useNavigate } from 'umi';
 import AuditModal from './AuditModal';
-import styles from './Audit.less';
 import { PageContainer } from '@ant-design/pro-components';
 
 function Audit(props) {
@@ -58,7 +57,7 @@ function Audit(props) {
         current: item.list,
       },
     });
-    navigate('/home/audit');
+    navigate('/flow/audit');
   };
 
   useEffect(() => {
@@ -68,18 +67,14 @@ function Audit(props) {
   }, []);
 
   return (
-    <PageContainer>
-      <div className={styles.box}>
-        <Button onClick={() => navigate(-1)}>返回</Button>
-        <Form layout="inline" name="basic" autoComplete="off" form={form}>
-          <Form.Item>
-            <Button onClick={() => changeVisible('audit', true)} type="primary">
-              新建流程
-            </Button>
-          </Form.Item>
-        </Form>
-      </div>
-
+    <PageContainer
+      title={null}
+      extra={[
+        <Button key={1} onClick={() => changeVisible('audit', true)} type="primary">
+          新建流程
+        </Button>,
+      ]}
+    >
       <Table
         loading={loading['flow/queryAuditList']}
         rowKey="id"

+ 144 - 136
src/pages/Flow/models/flow.js

@@ -1,50 +1,48 @@
 import {
   queryAuditList,
   addAudit,
-  addAuditNode,
-  addFlow,
-  queryBoomFlowDetail,
-  updateNode,
-  queryFlowList,
-  queryDingTemplateList,
-  saveAuditFlowInfo,
-  queryDepV2,
   queryProcessFlows,
-  queryDefaultBindClassify,
+  saveAuditFlowInfo,
+  // addAuditNode,
+  // addFlow,
+  // queryBoomFlowDetail,
+  // updateNode,
+  // queryFlowList,
+  // queryDingTemplateList,
+  // queryDepV2,
+  // queryDefaultBindClassify,
 } from '@/services/boom';
-import {
-  queryApproval,
-} from '@/services/approval';
-import { queryRole } from '@/services/SysAdmin';
+// import { queryApproval } from '@/services/approval';
+// import { queryRole } from '@/services/SysAdmin';
 import { message } from 'antd';
 
-function getDepUserTree(data) {
-  data.title = `${data.Name}`;
-  data.id = data.ID;
-  data.value = data.ID;
-  // data.selectable = false;
-  if (!data.children) data.children = new Array();
+// function getDepUserTree(data) {
+//   data.title = `${data.Name}`;
+//   data.id = data.ID;
+//   data.value = data.ID;
+//   // data.selectable = false;
+//   if (!data.children) data.children = new Array();
 
-  if (data.children) {
-    data.children.forEach(item => {
-      getDepUserTree(item);
-    });
-  }
+//   if (data.children) {
+//     data.children.forEach((item) => {
+//       getDepUserTree(item);
+//     });
+//   }
 
-  if (data.Users && data.Users.length !== 0) {
-    data.Users.forEach(item => {
-      item.title = item.CName;
-      item.id = item.ID + '||' + data.ID;
-      item.value = item.ID + '||' + data.ID;
-      // item.selectable = true;
-      item.DepId = data.ID;
-      data.children.push(item);
-    });
-  }
-  return data;
-}
+//   if (data.Users && data.Users.length !== 0) {
+//     data.Users.forEach((item) => {
+//       item.title = item.CName;
+//       item.id = item.ID + '||' + data.ID;
+//       item.value = item.ID + '||' + data.ID;
+//       // item.selectable = true;
+//       item.DepId = data.ID;
+//       data.children.push(item);
+//     });
+//   }
+//   return data;
+// }
 
-const getFlowDetail = data => {
+const getFlowDetail = (data) => {
   const groups = {
     top: {
       position: { name: 'top' },
@@ -111,14 +109,14 @@ const getFlowDetail = data => {
       strokeWidth: 1,
     },
   };
-  let nodes = data.nodes.map(item => {
+  let nodes = data.nodes.map((item) => {
     let node = { ...item };
     node.ports.groups = groups;
     node.parentKey = '1';
 
     return node;
   });
-  let edges = data.edges.map(item => {
+  let edges = data.edges.map((item) => {
     let edge = { ...item };
     try {
       edge.attrs = item.attr ? JSON.parse(item.attr) : attrs;
@@ -150,111 +148,31 @@ export default {
   },
 
   effects: {
-    *addFlow({ payload, callback }, { call, put }) {
-      const res = yield call(addFlow, payload);
-      if (res) {
-        message.success('添加成功');
-        callback && callback();
-        yield put({
-          type: 'queryFlowList',
-        });
-      }
-    },
-    *getRoleList({ payload }, { call, put }) {
-      const response = yield call(queryRole, payload);
-      if (response) {
-        yield put({
-          type: 'save',
-          payload: { roleList: response.data.list },
-        });
-      }
-    },
-    *queryBoomFlowDetail({ payload }, { call, put }) {
-      const data = yield call(queryBoomFlowDetail, payload);
-      console.log(data);
-      yield put({
-        type: 'save',
-        payload: { flowDetail: data },
-      });
-    },
-    *queryProject({ callback }, { call, put }) {
-      const response = yield call(queryApproval,{pageSize: 99999});
-      if (response) {
+    *queryAuditList({ payload }, { call, put }) {
+      try {
+        const response = yield call(queryAuditList, payload);
         yield put({
           type: 'save',
           payload: {
-            projectList: response.data.list,
+            auditList: response.data.map((item) => ({
+              ...item,
+              id: item.list.id,
+            })),
           },
         });
-      }
-    },
-    *queryFlowList({ payload }, { call, put }) {
-      const res = yield call(queryFlowList, payload);
-      yield put({
-        type: 'save',
-        payload: { flowList: res.data },
-      });
-    },
-    *updateNode({ payload, callback }, { call, put }) {
-      const data = yield call(updateNode, payload);
-      console.log(data);
-      message.success('修改成功');
-      callback && callback();
-    },
-    *queryAuditList({ payload }, { call, put }) {
-      const response = yield call(queryAuditList, payload);
-      if (response) {
-        yield put({
-          type: 'save',
-          payload: { auditList: response.data },
-        });
-      }
+      } catch (error) {}
     },
     *addAudit({ payload, callback }, { call, put }) {
-      const response = yield call(addAudit, payload);
-      if (response) {
+      try {
+        yield call(addAudit, payload);
         message.success('新增成功');
         callback && callback();
         yield put({
           type: 'queryAuditList',
           payload: {},
         });
-      }
-    },
-    *addAuditNode({ payload, callback }, { call, put }) {
-      const response = yield call(addAuditNode, payload);
-      if (response) {
-        message.success('操作成功');
-        callback && callback();
-      }
-    },
-    *queryDingTemplateList({ payload }, { call, put }) {
-      const response = yield call(queryDingTemplateList, payload);
-      if (response) {
-        yield put({
-          type: 'save',
-          payload: { templateList: response.data.result },
-        });
-      }
-    },
-    *saveAuditFlowInfo({ payload, callback }, { call, put }) {
-      const response = yield call(saveAuditFlowInfo, payload);
-      if (response) {
-        message.success('保存成功');
-        callback && callback();
-      }
-    },
-    *fetchDepV2({ payload, callback }, { call, put }) {
-      const response = yield call(queryDepV2, { pageSize: 999999 });
-      if (response) {
-        // const depUserTree = response.data?.list;
-        const depUserTree = response.data.list.map(item => {
-          return getDepUserTree(item);
-        });
-        yield put({
-          type: 'save',
-          payload: { depUserTree },
-        });
+      } catch (error) {
+        console.log(error);
       }
     },
     *queryProcessFlows({ payload }, { call, put }) {
@@ -272,12 +190,102 @@ export default {
         });
       }
     },
-    *queryDefaultBindClassify({ payload }, { call, put }) {
-      const data = yield call(queryDefaultBindClassify, payload);
-      if (data) {
-       
-      }
+    *saveAuditFlowInfo({ payload, callback }, { call, put }) {
+      try {
+        yield call(saveAuditFlowInfo, payload);
+        message.success('保存成功');
+        callback && callback();
+        yield put({
+          type: 'flow/queryProcessFlows',
+          payload: { ids: Number(payload.id) },
+        });
+      } catch (error) {}
     },
+    // *addFlow({ payload, callback }, { call, put }) {
+    //   const res = yield call(addFlow, payload);
+    //   if (res) {
+    //     message.success('添加成功');
+    //     callback && callback();
+    //     yield put({
+    //       type: 'queryFlowList',
+    //     });
+    //   }
+    // },
+    // *getRoleList({ payload }, { call, put }) {
+    //   const response = yield call(queryRole, payload);
+    //   if (response) {
+    //     yield put({
+    //       type: 'save',
+    //       payload: { roleList: response.data.list },
+    //     });
+    //   }
+    // },
+    // *queryBoomFlowDetail({ payload }, { call, put }) {
+    //   const data = yield call(queryBoomFlowDetail, payload);
+    //   console.log(data);
+    //   yield put({
+    //     type: 'save',
+    //     payload: { flowDetail: data },
+    //   });
+    // },
+    // *queryProject({ callback }, { call, put }) {
+    //   const response = yield call(queryApproval, { pageSize: 99999 });
+    //   if (response) {
+    //     yield put({
+    //       type: 'save',
+    //       payload: {
+    //         projectList: response.data.list,
+    //       },
+    //     });
+    //   }
+    // },
+    // *queryFlowList({ payload }, { call, put }) {
+    //   const res = yield call(queryFlowList, payload);
+    //   yield put({
+    //     type: 'save',
+    //     payload: { flowList: res.data },
+    //   });
+    // },
+    // *updateNode({ payload, callback }, { call, put }) {
+    //   const data = yield call(updateNode, payload);
+    //   console.log(data);
+    //   message.success('修改成功');
+    //   callback && callback();
+    // },
+    // *addAuditNode({ payload, callback }, { call, put }) {
+    //   const response = yield call(addAuditNode, payload);
+    //   if (response) {
+    //     message.success('操作成功');
+    //     callback && callback();
+    //   }
+    // },
+    // *queryDingTemplateList({ payload }, { call, put }) {
+    //   const response = yield call(queryDingTemplateList, payload);
+    //   if (response) {
+    //     yield put({
+    //       type: 'save',
+    //       payload: { templateList: response.data.result },
+    //     });
+    //   }
+    // },
+    // *fetchDepV2({ payload, callback }, { call, put }) {
+    //   const response = yield call(queryDepV2, { pageSize: 999999 });
+    //   if (response) {
+    //     // const depUserTree = response.data?.list;
+    //     const depUserTree = response.data.list.map((item) => {
+    //       return getDepUserTree(item);
+    //     });
+    //     yield put({
+    //       type: 'save',
+    //       payload: { depUserTree },
+    //     });
+    //   }
+    // },
+    // *queryDefaultBindClassify({ payload }, { call, put }) {
+    //   const data = yield call(queryDefaultBindClassify, payload);
+    //   if (data) {
+    //   }
+    // },
   },
 
   reducers: {

+ 115 - 0
src/pages/Home/index.js

@@ -0,0 +1,115 @@
+import React, { useState, useEffect, useMemo } from 'react';
+import { Card, Table, Empty, Button, Modal, message } from 'antd';
+import menuStyle from './index.less';
+import { connect, useNavigate } from 'umi';
+import { getToken } from '@/utils/utils';
+const noIcon = require('@/assets/UnityMenu/noIcon.png');
+function HomePage(props) {
+  let navigate = useNavigate();
+  const curMenu = [
+    {
+      id: 1,
+      name: '项目立项',
+      active: true,
+      click: () => {
+        window.open(` http://120.55.44.4:8899/#/purchase/home/approval/list?JWT-TOKEN=${getToken()}`)
+      },
+      Icon: require('@/assets/UnityMenu/project.png')
+    },
+    {
+      id: 2,
+      name: '合同管理',
+      active: true,
+      click: () => {
+
+      },
+      Icon: require('@/assets/UnityMenu/agreement.png')
+    },
+    {
+      id: 3,
+      name: 'OA审批',
+      active: true,
+      click: () => {
+
+      },
+      Icon: require('@/assets/UnityMenu/OA.png')
+    },
+    {
+      id: 4,
+      name: 'BOM清单',
+      active: true,
+      click: () => {
+        window.open(`http://120.55.44.4:8896/#/bom/home?JWT-TOKEN=${getToken()}`)
+      },
+      Icon: require('@/assets/UnityMenu/Bom.png')
+    },
+    {
+      id: 5,
+      name: '工时管理',
+      active: true,
+      click: () => {
+        window.open(`http://120.55.44.4:8899/#/purchase/home/work-hours?JWT-TOKEN=${getToken()}`)
+
+      },
+      Icon: require('@/assets/UnityMenu/time.png')
+    },
+    {
+      id: 6,
+      name: '供应商管理',
+      active: true,
+      click: () => {
+
+      },
+      Icon: require('@/assets/UnityMenu/Manufacturer.png')
+    },
+    {
+      id: 7,
+      name: '文档管理',
+      active: true,
+      click: () => {
+
+      },
+      Icon: require('@/assets/UnityMenu/transfer.png')
+    },
+    {
+      id: 8,
+      name: '系统管理',
+      active: true,
+      click: () => {
+
+      },
+      Icon: require('@/assets/UnityMenu/system.png')
+    },
+  ];
+  return (
+    <div className={menuStyle.background}>
+      <div className={menuStyle.menuContent}>
+        <div className={menuStyle.wrap}>
+          {curMenu.map(item => (
+            <div key={item.id} className={menuStyle.item}>
+              <div
+                onClick={() => item.click?.(item)}
+                className={menuStyle.menu}
+                style={item.active ? {} : { cursor: 'not-allowed' }}
+              >
+                <img className={menuStyle.pic} src={item.active ? item.Icon : require('@/assets/UnityMenu/newModel.png')} style={
+                  item.active ? {} : { cursor: 'not-allowed' }} />
+              </div>
+              <div style={{ marginTop: 22, width: 152, textAlign: 'center' }}>
+                <span
+                  onClick={() => item.click?.(item)}
+                  className={menuStyle.menuFriName}
+                  style={item.active ? {} : { color: '#6081B2', cursor: 'not-allowed' }}
+                >
+                  {item.name}
+                </span>
+              </div>
+            </div>
+          ))}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default HomePage;

+ 67 - 2
src/pages/Home/index.less

@@ -1,3 +1,68 @@
-.container {
-  padding-top: 80px;
+
+.background {
+  background-image: url(@/assets/UnityMenu/newBackground.jpg);
+  width: 100%;
+  height: 100vh;
+  background-size: cover;
+  background-repeat: no-repeat;
+  display: flex;
+  justify-content: center;
+  background-color: #122c63;
+  // align-items: flex-start;
+  :global {
+    .ant-popover-inner {
+      background: #0d1a2b;
+    }
+  }
+}
+.menu {
+  width: 152px;
+  height: 152px;
+  // background: linear-gradient(0deg, #285098, #1d3969);
+  // box-shadow: 0px 3px 0.16rem 2px rgba(0, 0, 0, 0.3), 0px 5px 0.39rem 0.1rem rgba(0, 0, 0, 0.1);
+  // border-radius: 50%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+}
+.menuContent {
+  height: 100%;
+  padding-top: 160px;
+  width: 1480px;
+  max-height: 100vh;
+  overflow-y: hidden;
+}
+.menuFriName {
+  font-size: 24px;
+  font-family: 'Microsoft YaHei UI'; /* Microsoft YaHei UI;*/
+  // font-weight: 400;
+  color: #bae3ff;
+  // line-height: 0.45rem;
+  // text-shadow: 0px 5px 14px rgba(0, 0, 0, 0.35), 0px 3px 12px rgba(0, 0, 0, 0.19);
+  cursor: pointer;
+  user-select: none;
+  letter-spacing: 2px;
+  text-align: center;
+  word-break: keep-all;
+}
+.wrap {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: start;
+  align-items: center;
+}
+.item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 292px;
+  height: 220px;
+  margin-bottom: 64px;
+}
+.pic {
+  width: 152px;
+  height: 152px;
+  background-size: cover;
+  background-repeat: no-repeat;
 }

+ 0 - 18
src/pages/Home/index.tsx

@@ -1,18 +0,0 @@
-import Guide from '@/components/Guide';
-import { trim } from '@/utils/format';
-import { PageContainer } from '@ant-design/pro-components';
-import { useModel } from '@umijs/max';
-import styles from './index.less';
-
-const HomePage: React.FC = () => {
-  const { name } = useModel('global');
-  return (
-    <PageContainer ghost>
-      <div className={styles.container}>
-        <Guide name={trim(name)} />
-      </div>
-    </PageContainer>
-  );
-};
-
-export default HomePage;

+ 3 - 2
src/pages/Login/index.less

@@ -1,7 +1,7 @@
 
 .main {
   width: 100%;
-  height: 100%;
+  height: 100vh;
   display: flex;
   justify-content: center;
   align-items: center;
@@ -18,9 +18,10 @@
 
 .content {
   width: 428px;
-  height: 300px;
+  min-height: 450px;
   border-radius: 8px;
   padding-top: 162px;
+  padding-bottom: 20px;
   background: #fff url('@/assets/login-box-top.png') no-repeat top center;
 
   @media screen and (max-width: 576px) {

+ 231 - 231
src/services/SysAdmin.js

@@ -1,235 +1,235 @@
 import {request }from 'umi';
 import { stringify } from 'qs';
 
-export async function queryRes(params) {
-  return request(`/res?${stringify(params)}`);
-}
-
-export async function queryMenu() {
-  return request(`/menu`);
-}
-
-export async function queryProjectMenu(params) {
-  return request(`/api/v2/user/project/menu/${params.ID}`);
-}
-
-export async function updateMenu(param = {}) {
-  return request(`/menu/update`, {
-    method: 'PUT',
-    body: param,
-  });
-}
-/**
- *
- * @param {object} param
- * @param {string} param.ParentCode 二级节点的编码
- * @param {string} param.Code 要增加的编码
- * @param {string} param.Name 要增加的名称
- * @returns
- */
-export async function checkMenu(param = {}) {
-  return request(`/check/menu/info?ParentCode=${param.ParentCode}&Name=${param.Name}`);
-}
-
-export async function addMenu(param) {
-  return request(`/menu/create`, {
-    method: 'POST',
-    body: param,
-  });
-}
-export async function removeMenu(param) {
-  return request(`/menu/delete/${param.ID}`, { method: 'DELETE' });
-}
-
-export async function addRoleRes(param) {
-  return request(`/role/res`, {
-    method: 'POST',
-    body: param,
-  });
-}
-
-export async function removeRes(params) {
-  return request(`/res/delete/${params.ID}`, { method: 'DELETE' });
-}
-
-export async function addRes(params) {
-  return request('/res/create', {
-    method: 'POST',
-    body: {
-      ...params,
-    },
-  });
-}
-
-export async function updateRes(params = {}, currentPage, pageSize) {
-  return request(`/res/update?currentPage=${currentPage}&pageSize=${pageSize}`, {
-    method: 'PUT',
-    body: {
-      ...params,
-    },
-  });
-}
-
 export async function queryRole(params) {
-  return request(`/role?${stringify(params)}`);
-}
-
-export async function queryProjectRole(params) {
-  return request(`/api/v2/project/roles/get?${stringify(params)}`);
-}
-
-export async function removeRole(params) {
-  return request(`/role/delete/${params.ID}`, { method: 'DELETE' });
-}
-
-export async function addRole(params) {
-  return request('/role/create', {
-    method: 'POST',
-    body: {
-      ...params,
-    },
-  });
-}
-
-export async function updateRole(params = {}, currentPage, pageSize) {
-  return request(`/role/update?currentPage=${currentPage}&pageSize=${pageSize}`, {
-    method: 'PUT',
-    body: {
-      ...params,
-    },
-  });
-}
-
-export async function queryUser(params) {
-  return request(`/user?${stringify(params)}`);
-}
-
-export async function queryUserV2(params) {
-  return request(`/api/v2/user?${stringify(params)}`);
-}
-
-export async function addUserRole(param) {
-  return request(`/user/role`, {
-    method: 'POST',
-    body: param,
-  });
-}
-
-export async function removeUser(params) {
-  return request(`/user/delete/${params.ID}`, { method: 'DELETE' });
-}
-
-export async function addUser(params) {
-  return request('/user/register', {
-    method: 'POST',
-    body: {
-      ...params,
-    },
-  });
-}
-
-export async function updateUser(params = {}, currentPage, pageSize) {
-  return request(`/user/update?currentPage=${currentPage}&pageSize=${pageSize}`, {
-    method: 'PUT',
-    body: {
-      ...params,
-    },
-  });
-}
-
-export async function queryDepRole(params) {
-  return request(`/api/v2/dep/role?${stringify(params)}`);
-}
-// 为部门设置角色
-export async function bindDepRole(params) {
-  return request(`/api/v2/dep/role`, {
-    method: 'POST',
-    body: params,
-  });
-}
-
-export async function queryUserDetail(user) {
-  return request(`/api/v2/user/detail/${user.ID}`);
-}
-// 为用户设置角色
-export async function setupDepRole(data) {
-  return request(`/api/v2/user/dep/role`, {
-    method: 'POST',
-    body: data,
-  });
-}
-
-export async function queryDep(params) {
-  return request(`/dep?${stringify(params)}`);
-}
-export async function queryDepV2(params) {
-  return request(`/api/v2/dep?${stringify(params)}`);
-}
-
-export async function queryDepUser(params) {
-  return request(`/api/v2/dep/user?${stringify(params)}`);
-}
-
-export async function removeDep(params) {
-  return request(`/dep/delete/${params.ID}`, {
-    method: 'DELETE',
-  });
-}
-
-export async function addDep(params) {
-  return request('/dep/create', {
-    method: 'POST',
-    body: {
-      ...params,
-    },
-  });
-}
-
-export async function updateDep(params = {}, currentPage, pageSize) {
-  return request(`/dep/update?currentPage=${currentPage}&pageSize=${pageSize}`, {
-    method: 'PUT',
-    body: {
-      ...params,
-    },
-  });
-}
-
-export async function queryRoleV2(params) {
-  return request(`/api/v2/project/role/get?${stringify(params)}`);
-}
-// 为项目设置roleType=1的角色
-export async function setupRoleV2(params) {
-  return request(`/api/v2/project/role/setup`, {
-    method: 'POST',
-    body: params,
-  });
-}
-// 为项目设置roleType=2,3,4的角色
-export async function setupRolesV2(params) {
-  return request(`/api/v2/project/roles/setup`, {
-    method: 'POST',
-    body: params,
-  });
-}
-export async function setupMenuV2(params) {
-  return request(`/api/v2/project/menu/setup`, {
-    method: 'POST',
-    body: params,
-  });
-}
-export async function menuMove(params = {}) {
-  return request(`/menu/move`, {
-    method: 'PUT',
-    body: params,
-  });
-}
-
-export async function queryFeedbackList(params = {}) {
-  return request(`/issue_feedback/list?${stringify(params)}`);
-}
-export async function updateFeedbackList(params = {}) {
-  return request(`/issue_feedback/status`, {
-    method: 'PUT',
-    body: params,
-  });
-}
+  return request(`/api/v1/role?${stringify(params)}`);
+}
+// export async function queryRes(params) {
+//   return request(`/res?${stringify(params)}`);
+// }
+
+// export async function queryMenu() {
+//   return request(`/menu`);
+// }
+
+// export async function queryProjectMenu(params) {
+//   return request(`/api/v2/user/project/menu/${params.ID}`);
+// }
+
+// export async function updateMenu(param = {}) {
+//   return request(`/menu/update`, {
+//     method: 'PUT',
+//     body: param,
+//   });
+// }
+// /**
+//  *
+//  * @param {object} param
+//  * @param {string} param.ParentCode 二级节点的编码
+//  * @param {string} param.Code 要增加的编码
+//  * @param {string} param.Name 要增加的名称
+//  * @returns
+//  */
+// export async function checkMenu(param = {}) {
+//   return request(`/check/menu/info?ParentCode=${param.ParentCode}&Name=${param.Name}`);
+// }
+
+// export async function addMenu(param) {
+//   return request(`/menu/create`, {
+//     method: 'POST',
+//     body: param,
+//   });
+// }
+// export async function removeMenu(param) {
+//   return request(`/menu/delete/${param.ID}`, { method: 'DELETE' });
+// }
+
+// export async function addRoleRes(param) {
+//   return request(`/api/v1/role/res`, {
+//     method: 'POST',
+//     body: param,
+//   });
+// }
+
+// export async function removeRes(params) {
+//   return request(`/res/delete/${params.ID}`, { method: 'DELETE' });
+// }
+
+// export async function addRes(params) {
+//   return request('/res/create', {
+//     method: 'POST',
+//     body: {
+//       ...params,
+//     },
+//   });
+// }
+
+// export async function updateRes(params = {}, currentPage, pageSize) {
+//   return request(`/res/update?currentPage=${currentPage}&pageSize=${pageSize}`, {
+//     method: 'PUT',
+//     body: {
+//       ...params,
+//     },
+//   });
+// }
+
+
+// export async function queryProjectRole(params) {
+//   return request(`/api/v2/project/roles/get?${stringify(params)}`);
+// }
+
+// export async function removeRole(params) {
+//   return request(`/api/v1/role/delete/${params.ID}`, { method: 'DELETE' });
+// }
+
+// export async function addRole(params) {
+//   return request('/api/v1/role/create', {
+//     method: 'POST',
+//     body: {
+//       ...params,
+//     },
+//   });
+// }
+
+// export async function updateRole(params = {}, currentPage, pageSize) {
+//   return request(`/api/v1/role/update?currentPage=${currentPage}&pageSize=${pageSize}`, {
+//     method: 'PUT',
+//     body: {
+//       ...params,
+//     },
+//   });
+// }
+
+// export async function queryUser(params) {
+//   return request(`/user?${stringify(params)}`);
+// }
+
+// export async function queryUserV2(params) {
+//   return request(`/api/v2/user?${stringify(params)}`);
+// }
+
+// export async function addUserRole(param) {
+//   return request(`/user/role`, {
+//     method: 'POST',
+//     body: param,
+//   });
+// }
+
+// export async function removeUser(params) {
+//   return request(`/user/delete/${params.ID}`, { method: 'DELETE' });
+// }
+
+// export async function addUser(params) {
+//   return request('/user/register', {
+//     method: 'POST',
+//     body: {
+//       ...params,
+//     },
+//   });
+// }
+
+// export async function updateUser(params = {}, currentPage, pageSize) {
+//   return request(`/user/update?currentPage=${currentPage}&pageSize=${pageSize}`, {
+//     method: 'PUT',
+//     body: {
+//       ...params,
+//     },
+//   });
+// }
+
+// export async function queryDepRole(params) {
+//   return request(`/api/v2/dep/role?${stringify(params)}`);
+// }
+// // 为部门设置角色
+// export async function bindDepRole(params) {
+//   return request(`/api/v2/dep/role`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+
+// export async function queryUserDetail(user) {
+//   return request(`/api/v2/user/detail/${user.ID}`);
+// }
+// // 为用户设置角色
+// export async function setupDepRole(data) {
+//   return request(`/api/v2/user/dep/role`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+
+// export async function queryDep(params) {
+//   return request(`/dep?${stringify(params)}`);
+// }
+// export async function queryDepV2(params) {
+//   return request(`/api/v2/dep?${stringify(params)}`);
+// }
+
+// export async function queryDepUser(params) {
+//   return request(`/api/v2/dep/user?${stringify(params)}`);
+// }
+
+// export async function removeDep(params) {
+//   return request(`/dep/delete/${params.ID}`, {
+//     method: 'DELETE',
+//   });
+// }
+
+// export async function addDep(params) {
+//   return request('/dep/create', {
+//     method: 'POST',
+//     body: {
+//       ...params,
+//     },
+//   });
+// }
+
+// export async function updateDep(params = {}, currentPage, pageSize) {
+//   return request(`/dep/update?currentPage=${currentPage}&pageSize=${pageSize}`, {
+//     method: 'PUT',
+//     body: {
+//       ...params,
+//     },
+//   });
+// }
+
+// export async function queryRoleV2(params) {
+//   return request(`/api/v2/project/role/get?${stringify(params)}`);
+// }
+// // 为项目设置roleType=1的角色
+// export async function setupRoleV2(params) {
+//   return request(`/api/v2/project/role/setup`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// // 为项目设置roleType=2,3,4的角色
+// export async function setupRolesV2(params) {
+//   return request(`/api/v2/project/roles/setup`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// export async function setupMenuV2(params) {
+//   return request(`/api/v2/project/menu/setup`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// export async function menuMove(params = {}) {
+//   return request(`/menu/move`, {
+//     method: 'PUT',
+//     body: params,
+//   });
+// }
+
+// export async function queryFeedbackList(params = {}) {
+//   return request(`/issue_feedback/list?${stringify(params)}`);
+// }
+// export async function updateFeedbackList(params = {}) {
+//   return request(`/issue_feedback/status`, {
+//     method: 'PUT',
+//     body: params,
+//   });
+// }

+ 105 - 104
src/services/approval.js

@@ -1,112 +1,113 @@
 import {request }from 'umi';
 import { stringify } from 'qs';
 
-export async function queryType() {
-  return request(`/api/v2/approval/type/dic`);
-}
-
-export async function queryFlow() {
-  return request(`/api/v2/approval/flow`);
-}
-
-export async function queryIndustry() {
-  return request(`/api/v2/approval/industry/dic`);
-}
-
-// 提交立项
-export async function createApproval(data) {
-  return request(`/api/v2/approval/record`, {
-    method: 'POST',
-    body: data,
-  });
-}
-
-// 更新立项
-export async function updateApproval(data) {
-  return request(`/api/v2/approval/record`, {
-    method: 'PUT',
-    body: data,
-  });
-}
-
-// 删除立项
-export async function deleteApproval(data) {
-  return request(`/api/v2/approval/record/${data.id}`, {
-    method: 'DELETE',
-  });
-}
-
-// 审批
-export async function authApproval(data) {
-  return request(`/api/v2/approval/auth`, {
-    method: 'POST',
-    body: data,
-  });
-}
-
-// 审批列表查询:获取当前用户可审批的立项列表
-export async function queryAuth(data) {
-  return request(`/api/v2/approval/list/auth?${stringify(data)}`);
-}
-
-// 查询立项 id=&pageSize=&currentPage=&user_id=
-export async function queryApproval(data) {
-  return request(`/api/v2/approval/record?${stringify(data)}`);
-}
-
-// 提交审核
-export async function submitAudit(data) {
-  return request(`/api/v2/approval/audit/submit`, {
-    method: 'POST',
-    body: data,
-  });
-}
-
 //获取部门结构
 export async function queryDepV2(params) {
   return request(`/api/v2/dep?${stringify(params)}`);
 }
 
-//添加项目成员
-export async function addMember(data) {
-  return request(`/api/v2/project_code/user`, {
-    method: 'POST',
-    body: data,
-  });
-}
-
-//获取项目成员
-export async function queryMember(params) {
-  return request(`/api/v2/project_code/user?${stringify(params)}`);
-}
-
-//转执行
-export async function startExecution(data) {
-  return request(`/api/v2/project_code/to_exe`, {
-    method: 'POST',
-    body: data,
-  });
-}
-
-//转运营
-export async function startOperate(data) {
-  return request(`/api/v2/project_code/to_opt`, {
-    method: 'POST',
-    body: data,
-  });
-}
-
-//转质保
-export async function startQuality(data) {
-  return request(`/api/v2/project_code/to_wty`, {
-    method: 'POST',
-    body: data,
-  });
-}
-
-//移除成员
-export async function deleteMember(data) {
-  return request(`/api/v2/project_code/user/${data.project_code_id}/${data.user_id}`, {
-    method: 'DELETE',
-  });
-}
+// export async function queryType() {
+//   return request(`/api/v2/approval/type/dic`);
+// }
+
+// export async function queryFlow() {
+//   return request(`/api/v2/approval/flow`);
+// }
+
+// export async function queryIndustry() {
+//   return request(`/api/v2/approval/industry/dic`);
+// }
+
+// // 提交立项
+// export async function createApproval(data) {
+//   return request(`/api/v2/approval/record`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+
+// // 更新立项
+// export async function updateApproval(data) {
+//   return request(`/api/v2/approval/record`, {
+//     method: 'PUT',
+//     body: data,
+//   });
+// }
+
+// // 删除立项
+// export async function deleteApproval(data) {
+//   return request(`/api/v2/approval/record/${data.id}`, {
+//     method: 'DELETE',
+//   });
+// }
+
+// // 审批
+// export async function authApproval(data) {
+//   return request(`/api/v2/approval/auth`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+
+// // 审批列表查询:获取当前用户可审批的立项列表
+// export async function queryAuth(data) {
+//   return request(`/api/v2/approval/list/auth?${stringify(data)}`);
+// }
+
+// // 查询立项 id=&pageSize=&currentPage=&user_id=
+// export async function queryApproval(data) {
+//   return request(`/api/v2/approval/record?${stringify(data)}`);
+// }
+
+// // 提交审核
+// export async function submitAudit(data) {
+//   return request(`/api/v2/approval/audit/submit`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+
+
+// //添加项目成员
+// export async function addMember(data) {
+//   return request(`/api/v2/project_code/user`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+
+// //获取项目成员
+// export async function queryMember(params) {
+//   return request(`/api/v2/project_code/user?${stringify(params)}`);
+// }
+
+// //转执行
+// export async function startExecution(data) {
+//   return request(`/api/v2/project_code/to_exe`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+
+// //转运营
+// export async function startOperate(data) {
+//   return request(`/api/v2/project_code/to_opt`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+
+// //转质保
+// export async function startQuality(data) {
+//   return request(`/api/v2/project_code/to_wty`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+
+// //移除成员
+// export async function deleteMember(data) {
+//   return request(`/api/v2/project_code/user/${data.project_code_id}/${data.user_id}`, {
+//     method: 'DELETE',
+//   });
+// }

+ 439 - 439
src/services/boom.js

@@ -1,473 +1,473 @@
-import { message } from 'antd';
-import {request }from 'umi';
+import { request } from 'umi';
 import { stringify } from 'qs';
 
-/**
-  project_id
-  version_id	大版本id
-  template_id	
-  template_node_id	查询某流程和某节点下最新版本的数据记录
-  node_id	查询某审批流程和某审批节点下最新版本的数据记录
- */
-export async function queryRecord(params) {
-  return request(`/api/v1/purchase/record?${stringify(params)}`);
-}
-//删除excel中单个sheet页
-export async function queryDelSheetRecord(params) {
-  const response = await request(`/api/v1/purchase/bom/del-purchase-excel-sheet?${stringify(params)}`);
-  if (response.code == 200) {
-    // message.success('删除成功');
-  }
-}
-
-// 查询全部工作流
-export async function queryFlowList(params) {
-  return request(`/api/v1/purchase/bom/flows?${stringify(params)}`);
-}
-
-// 根据节点id查询所有version
-export async function queryVserionByNode(params, signal) {
-  return request(`/api/v1/purchase/bom/flow/node?${stringify(params)}`, {
-    signal,
-  });
+export async function queryAuditList(params) {
+  return request(`/api/v1/purchase/flow/info?${stringify(params)}`);
 }
 
-export async function commitSheet(params) {
-  return request(`/api/v1/purchase/record`, {
-    method: 'POST',
-    body: params,
-  });
-}
-export async function approve(params) {
-  return request(`/api/v1/purchase/audit/status`, {
+export async function addAudit(data) {
+  return request(`/api/v1/purchase/flow/info`, {
     method: 'POST',
-    body: params,
+    data,
   });
 }
-export async function queryAuthority(params) {
-  const depId = localStorage.depId;
-  return request(`/api/v1/purchase/bom/user/excel/col?depId=${depId}`, {
-    method: 'POST',
-    body: params,
-  });
+export async function queryProcessFlows(params) {
+  let res = await request(
+    `/api/v1/purchase/process/get-flows?${stringify(params)}`,
+    {
+      method: 'GET',
+    },
+  );
+  return res.data;
 }
-export async function addBomComment(params) {
-  return request(`/api/v1/purchase/comment`, {
+export async function saveAuditFlowInfo(data) {
+  return request(`/api/v1/purchase/flow/info`, {
     method: 'POST',
-    body: params,
-  });
-}
-export async function queryBomComment(params) {
-  return request(`/api/v1/purchase/comment?${stringify(params)}`);
-}
+    data,
+  });
+}
+// /**
+//   project_id
+//   version_id	大版本id
+//   template_id
+//   template_node_id	查询某流程和某节点下最新版本的数据记录
+//   node_id	查询某审批流程和某审批节点下最新版本的数据记录
+//  */
+// export async function queryRecord(params) {
+//   return request(`/api/v1/purchase/record?${stringify(params)}`);
+// }
+// //删除excel中单个sheet页
+// export async function queryDelSheetRecord(params) {
+//   const response = await request(`/api/v1/purchase/bom/del-purchase-excel-sheet?${stringify(params)}`);
+//   if (response.code == 200) {
+//     // message.success('删除成功');
+//   }
+// }
 
-/**
- * 提交流转
-  "id":3, 当前流转文档id,必填
-  "project_id":46, 所属项目id
-  "template_id":1, 所属模板id ,必填
-  "template_node_id":34,所属节点id,必填
-  "next_template_id":1,跳转的下级业务模板id,必填
-  "next_template_node_id":2,跳转的下级业务节点id,必填
-  "flow_id":1, 跳转的下级审核流程id , 如果不为空,则说明流转的是审核节点,下级业务节点为审核通过后进入的业务节点
-  "node_id":1,跳转的下级审核节点id
-  "desc":"流转描述"
- */
-export async function submitNextNode(params) {
-  return request(`/api/v1/purchase/next/node/submit`, {
-    method: 'POST',
-    body: params,
-  });
-}
-export async function advanceSubmitNextNode(params) {
-  return request(`/api/v1/purchase/next/node/advance-submit`, {
-    method: 'POST',
-    body: params,
-  });
-}
+// // 查询全部工作流
+// export async function queryFlowList(params) {
+//   return request(`/api/v1/purchase/bom/flows?${stringify(params)}`);
+// }
 
-export async function queryDetail(params) {
-  let response = await request(`/api/v1/purchase/record?${stringify(params)}`);
-  let sheet = response.data;
-  sheet.data = JSON.parse(sheet.data || '[]');
-  sheet.data.forEach(item => {
-    item.config = JSON.parse(item.config || '{}');
-    item.celldata = JSON.parse(item.cell_data || '[]');
-    delete item.cell_data;
-  });
-  return sheet;
-}
-export async function queryHistoryDetail(params) {
-  return request(`/api/v1/purchase/record/history/detail?${stringify(params)}`);
-}
-export async function queryHistoryList(params) {
-  return request(`/api/v1/purchase/record/history?${stringify(params)}`);
-}
+// // 根据节点id查询所有version
+// export async function queryVserionByNode(params, signal) {
+//   return request(`/api/v1/purchase/bom/flow/node?${stringify(params)}`, {
+//     signal,
+//   });
+// }
 
-export async function queryBoomFlowList(params) {
-  return request(`/api/v1/purchase/bom/flows?${stringify(params)}`);
-}
-//请求历史版本
-export async function queryVersionsTree(params) {
-  return request(`/api/v1/purchase/record/version/tree?${stringify(params)}`);
-}
-//查询业务节点的审核记录
-export async function queryAuditExcel(params) {
-  return request(`/api/v1/purchase/audit/excel?${stringify(params)}`);
-}
-//查询审批节点的审核记录
-export async function queryAuditRecord(params) {
-  return request(`/api/v1/purchase/audit/record?${stringify(params)}`);
-}
-//查询表单数据接口
-export async function queryDingSchema(params) {
-  return request(`/api/v1/purchase/bom/ding/schema?${stringify(params)}`);
-}
-export async function queryDingInstanceDetail(params) {
-  let res = await request(`/api/v1/purchase/bom/ding/instance-detail`, {
-    method: 'POST',
-    body: params,
-  });
-  if (res.data.errcode != 0) {
-    message.error(res.data.errmsg);
-    throw new Error(res.data.errmsg);
-  }
-  return res;
-}
-export async function queryDingInstanceExecute(params) {
-  let res = await request(`/api/v1/purchase/bom/ding/instance-execute`, {
-    method: 'POST',
-    body: params,
-  });
-  if (res.data.errcode != 0) {
-    message.error('审批失败,请联系管理员。');
-    throw new Error(res.data.errmsg);
-  }
-  return res;
-}
-export async function queryListParentByUser(params) {
-  return request(`/api/v1/purchase/bom/ding/department/list-parent-by-user`, {
-    method: 'POST',
-    body: params,
-  });
-}
-/**
- * 查看项目流程列表
- * project_id
- */
-export async function queryProjectRecord(params) {
-  return request(`/api/v1/purchase/bom/project/record?${stringify(params)}`);
-}
-/** 查看版本列表
- *  project_id		
-    template_id		流程id
-    template_node_id	流程节点id
- */
-export async function queryVersionsList(params) {
-  return request(`/api/v1/purchase/record/versions?${stringify(params)}`);
-}
+// export async function commitSheet(params) {
+//   return request(`/api/v1/purchase/record`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// export async function approve(params) {
+//   return request(`/api/v1/purchase/audit/status`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// export async function queryAuthority(params) {
+//   const depId = localStorage.depId;
+//   return request(`/api/v1/purchase/bom/user/excel/col?depId=${depId}`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// export async function addBomComment(params) {
+//   return request(`/api/v1/purchase/comment`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// export async function queryBomComment(params) {
+//   return request(`/api/v1/purchase/comment?${stringify(params)}`);
+// }
 
-export async function queryBoomFlowDetail(params) {
-  let { data } = await request(`/api/v1/purchase/bom/flow/info?${stringify(params)}`);
-  const groups = {
-    top: {
-      position: { name: 'top' },
-      attrs: {
-        circle: {
-          r: 4,
-          magnet: true,
-          stroke: '#31d0c6',
-          strokeWidth: 2,
-          fill: '#fff',
-          style: { visibility: 'hidden' },
-        },
-      },
-      zIndex: 10,
-    },
-    right: {
-      position: { name: 'right' },
-      attrs: {
-        circle: {
-          r: 4,
-          magnet: true,
-          stroke: '#31d0c6',
-          strokeWidth: 2,
-          fill: '#fff',
-          style: { visibility: 'hidden' },
-        },
-      },
-      zIndex: 10,
-    },
-    bottom: {
-      position: { name: 'bottom' },
-      attrs: {
-        circle: {
-          r: 4,
-          magnet: true,
-          stroke: '#31d0c6',
-          strokeWidth: 2,
-          fill: '#fff',
-          style: { visibility: 'hidden' },
-        },
-      },
-      zIndex: 10,
-    },
-    left: {
-      position: { name: 'left' },
-      attrs: {
-        circle: {
-          r: 4,
-          magnet: true,
-          stroke: '#31d0c6',
-          strokeWidth: 2,
-          fill: '#fff',
-          style: { visibility: 'hidden' },
-        },
-      },
-      zIndex: 10,
-    },
-  };
-  const attrs = {
-    line: {
-      stroke: '#A2B1C3',
-      targetMarker: { name: 'block', width: 12, height: 8 },
-      strokeDasharray: '5 5',
-      strokeWidth: 1,
-    },
-  };
-  let nodes = data.Nodes.map(item => {
-    let node = {
-      ...item,
-      id: item.node_id,
-      renderKey: item.render_key,
-      zIndex: item.z_index,
-      isCustom: !!item.is_custom,
-      ports: JSON.parse(item.ports || '{}'),
-    };
-    node.ports.groups = groups;
-    node.parentKey = '1';
+// /**
+//  * 提交流转
+//   "id":3, 当前流转文档id,必填
+//   "project_id":46, 所属项目id
+//   "template_id":1, 所属模板id ,必填
+//   "template_node_id":34,所属节点id,必填
+//   "next_template_id":1,跳转的下级业务模板id,必填
+//   "next_template_node_id":2,跳转的下级业务节点id,必填
+//   "flow_id":1, 跳转的下级审核流程id , 如果不为空,则说明流转的是审核节点,下级业务节点为审核通过后进入的业务节点
+//   "node_id":1,跳转的下级审核节点id
+//   "desc":"流转描述"
+//  */
+// export async function submitNextNode(params) {
+//   return request(`/api/v1/purchase/next/node/submit`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// export async function advanceSubmitNextNode(params) {
+//   return request(`/api/v1/purchase/next/node/advance-submit`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
 
-    return node;
-  });
-  let edges = data.Edges.map(item => {
-    let edge = {
-      id: item.edge_id,
-      source: {
-        cell: item.source_cell,
-        port: item.source_port,
-      },
-      target: {
-        cell: item.target_cell,
-        port: item.target_port,
-      },
-    };
-    try {
-      edge.attrs = item.attr ? JSON.parse(item.attr) : attrs;
-    } catch (error) {
-      edge.attrs = attrs;
-    }
-    return edge;
-  });
-  return {
-    ...data,
-    nodes,
-    edges,
-  };
-}
-export async function updateNode(data) {
-  return request(`/api/v1/purchase/bom/flow/${data.templateId}/${data.nodeId}`, {
-    method: 'PUT',
-    body: data.body,
-  });
-}
-export async function addBoomFlow(data) {
-  return request(`/api/v1/purchase/bom/flow/info`, {
-    method: 'POST',
-    body: data,
-  });
-}
+// export async function queryDetail(params) {
+//   let response = await request(`/api/v1/purchase/record?${stringify(params)}`);
+//   let sheet = response.data;
+//   sheet.data = JSON.parse(sheet.data || '[]');
+//   sheet.data.forEach(item => {
+//     item.config = JSON.parse(item.config || '{}');
+//     item.celldata = JSON.parse(item.cell_data || '[]');
+//     delete item.cell_data;
+//   });
+//   return sheet;
+// }
+// export async function queryHistoryDetail(params) {
+//   return request(`/api/v1/purchase/record/history/detail?${stringify(params)}`);
+// }
+// export async function queryHistoryList(params) {
+//   return request(`/api/v1/purchase/record/history?${stringify(params)}`);
+// }
 
-export async function queryAuditList(params) {
-  return request(`/api/v1/purchase/flow/info?${stringify(params)}`);
-}
+// export async function queryBoomFlowList(params) {
+//   return request(`/api/v1/purchase/bom/flows?${stringify(params)}`);
+// }
+// //请求历史版本
+// export async function queryVersionsTree(params) {
+//   return request(`/api/v1/purchase/record/version/tree?${stringify(params)}`);
+// }
+// //查询业务节点的审核记录
+// export async function queryAuditExcel(params) {
+//   return request(`/api/v1/purchase/audit/excel?${stringify(params)}`);
+// }
+// //查询审批节点的审核记录
+// export async function queryAuditRecord(params) {
+//   return request(`/api/v1/purchase/audit/record?${stringify(params)}`);
+// }
+// //查询表单数据接口
+// export async function queryDingSchema(params) {
+//   return request(`/api/v1/purchase/bom/ding/schema?${stringify(params)}`);
+// }
+// export async function queryDingInstanceDetail(params) {
+//   let res = await request(`/api/v1/purchase/bom/ding/instance-detail`, {
+//     method: 'POST',
+//     body: params,
+//   });
+//   if (res.data.errcode != 0) {
+//     message.error(res.data.errmsg);
+//     throw new Error(res.data.errmsg);
+//   }
+//   return res;
+// }
+// export async function queryDingInstanceExecute(params) {
+//   let res = await request(`/api/v1/purchase/bom/ding/instance-execute`, {
+//     method: 'POST',
+//     body: params,
+//   });
+//   if (res.data.errcode != 0) {
+//     message.error('审批失败,请联系管理员。');
+//     throw new Error(res.data.errmsg);
+//   }
+//   return res;
+// }
+// export async function queryListParentByUser(params) {
+//   return request(`/api/v1/purchase/bom/ding/department/list-parent-by-user`, {
+//     method: 'POST',
+//     body: params,
+//   });
+// }
+// /**
+//  * 查看项目流程列表
+//  * project_id
+//  */
+// export async function queryProjectRecord(params) {
+//   return request(`/api/v1/purchase/bom/project/record?${stringify(params)}`);
+// }
+// /** 查看版本列表
+//  *  project_id
+//     template_id		流程id
+//     template_node_id	流程节点id
+//  */
+// export async function queryVersionsList(params) {
+//   return request(`/api/v1/purchase/record/versions?${stringify(params)}`);
+// }
 
-export async function addAudit(data) {
-  return request(`/api/v1/purchase/flow/info`, {
-    method: 'POST',
-    body: data,
-  });
-}
-export async function addFlow(data) {
-  return request(`/api/v1/purchase/bom/flow/info`, {
-    method: 'POST',
-    body: data,
-  });
-}
-/**
- *  [
-      {
-        "flow_id": 23,
-        "node": "主管",
-        "desc": "desc",
-        "auditor": 2,
-        "seq": 1,
-        "seq_relate": 0
-      }
-    ]
- */
-export async function addAuditNode(data) {
-  return request(`/api/v1/purchase/flow/info/${data.flowId}`, {
-    method: 'POST',
-    body: data.nodes,
-  });
-}
+// export async function queryBoomFlowDetail(params) {
+//   let { data } = await request(`/api/v1/purchase/bom/flow/info?${stringify(params)}`);
+//   const groups = {
+//     top: {
+//       position: { name: 'top' },
+//       attrs: {
+//         circle: {
+//           r: 4,
+//           magnet: true,
+//           stroke: '#31d0c6',
+//           strokeWidth: 2,
+//           fill: '#fff',
+//           style: { visibility: 'hidden' },
+//         },
+//       },
+//       zIndex: 10,
+//     },
+//     right: {
+//       position: { name: 'right' },
+//       attrs: {
+//         circle: {
+//           r: 4,
+//           magnet: true,
+//           stroke: '#31d0c6',
+//           strokeWidth: 2,
+//           fill: '#fff',
+//           style: { visibility: 'hidden' },
+//         },
+//       },
+//       zIndex: 10,
+//     },
+//     bottom: {
+//       position: { name: 'bottom' },
+//       attrs: {
+//         circle: {
+//           r: 4,
+//           magnet: true,
+//           stroke: '#31d0c6',
+//           strokeWidth: 2,
+//           fill: '#fff',
+//           style: { visibility: 'hidden' },
+//         },
+//       },
+//       zIndex: 10,
+//     },
+//     left: {
+//       position: { name: 'left' },
+//       attrs: {
+//         circle: {
+//           r: 4,
+//           magnet: true,
+//           stroke: '#31d0c6',
+//           strokeWidth: 2,
+//           fill: '#fff',
+//           style: { visibility: 'hidden' },
+//         },
+//       },
+//       zIndex: 10,
+//     },
+//   };
+//   const attrs = {
+//     line: {
+//       stroke: '#A2B1C3',
+//       targetMarker: { name: 'block', width: 12, height: 8 },
+//       strokeDasharray: '5 5',
+//       strokeWidth: 1,
+//     },
+//   };
+//   let nodes = data.Nodes.map(item => {
+//     let node = {
+//       ...item,
+//       id: item.node_id,
+//       renderKey: item.render_key,
+//       zIndex: item.z_index,
+//       isCustom: !!item.is_custom,
+//       ports: JSON.parse(item.ports || '{}'),
+//     };
+//     node.ports.groups = groups;
+//     node.parentKey = '1';
 
-export async function queryOSSData() {
-  return request(`/config/chart-template-img?destDir=public/bom`);
-}
+//     return node;
+//   });
+//   let edges = data.Edges.map(item => {
+//     let edge = {
+//       id: item.edge_id,
+//       source: {
+//         cell: item.source_cell,
+//         port: item.source_port,
+//       },
+//       target: {
+//         cell: item.target_cell,
+//         port: item.target_port,
+//       },
+//     };
+//     try {
+//       edge.attrs = item.attr ? JSON.parse(item.attr) : attrs;
+//     } catch (error) {
+//       edge.attrs = attrs;
+//     }
+//     return edge;
+//   });
+//   return {
+//     ...data,
+//     nodes,
+//     edges,
+//   };
+// }
+// export async function updateNode(data) {
+//   return request(`/api/v1/purchase/bom/flow/${data.templateId}/${data.nodeId}`, {
+//     method: 'PUT',
+//     body: data.body,
+//   });
+// }
+// export async function addBoomFlow(data) {
+//   return request(`/api/v1/purchase/bom/flow/info`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
 
-export async function queryRecordSheet(data) {
-  return request(`/api/v1/purchase/record/sheet?${stringify(data)}`, {
-    method: 'POST',
-    body: data,
-  });
-}
-export async function queryDingTemplateList() {
-  return request(`/api/v1/purchase/bom/ding/template/list`);
-}
+// export async function addFlow(data) {
+//   return request(`/api/v1/purchase/bom/flow/info`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+// /**
+//  *  [
+//       {
+//         "flow_id": 23,
+//         "node": "主管",
+//         "desc": "desc",
+//         "auditor": 2,
+//         "seq": 1,
+//         "seq_relate": 0
+//       }
+//     ]
+//  */
+// export async function addAuditNode(data) {
+//   return request(`/api/v1/purchase/flow/info/${data.flowId}`, {
+//     method: 'POST',
+//     body: data.nodes,
+//   });
+// }
 
-export async function queryDDdepList(data) {
-  let res = await request(`/api/v1/purchase/bom/ding/department-list`, {
-    method: 'POST',
-    body: data,
-  });
-  return res.data.result;
-}
+// export async function queryOSSData() {
+//   return request(`/config/chart-template-img?destDir=public/bom`);
+// }
 
-export async function queryDDProcessesForecast(data) {
-  let res = await request(`/api/v1/purchase/bom/ding/processes-forecast`, {
-    method: 'POST',
-    body: data,
-  });
-  if (res.data.message) {
-    // message.error(res.data.message);
-    throw new Error(res.data.message);
-  }
-  return res.data.result;
-}
+// export async function queryRecordSheet(data) {
+//   return request(`/api/v1/purchase/record/sheet?${stringify(data)}`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+// export async function queryDingTemplateList() {
+//   return request(`/api/v1/purchase/bom/ding/template/list`);
+// }
 
-export async function uploadFile(data) {
-  let res = await request(`/api/v1/purchase/bom/ding/upload-file`, {
-    method: 'POST',
-    body: data,
-    headers: {
-      ContentType: 'application/x-www-form-urlencoded',
-    },
-  });
-  if (!res.data.dentry) {
-    message.error(res.data.errmsg);
-    throw new Error(res.data.errmsg);
-  }
-  return res.data;
-}
+// export async function queryDDdepList(data) {
+//   let res = await request(`/api/v1/purchase/bom/ding/department-list`, {
+//     method: 'POST',
+//     body: data,
+//   });
+//   return res.data.result;
+// }
 
-export async function bindDDCode(userId, code) {
-  let res = await request(`/api/v1/purchase/bom/ding/set-ding-user-code?ucode=${userId}:${code}`, {
-    method: 'GET',
-  });
+// export async function queryDDProcessesForecast(data) {
+//   let res = await request(`/api/v1/purchase/bom/ding/processes-forecast`, {
+//     method: 'POST',
+//     body: data,
+//   });
+//   if (res.data.message) {
+//     // message.error(res.data.message);
+//     throw new Error(res.data.message);
+//   }
+//   return res.data.result;
+// }
 
-  return res.data;
-}
+// export async function uploadFile(data) {
+//   let res = await request(`/api/v1/purchase/bom/ding/upload-file`, {
+//     method: 'POST',
+//     body: data,
+//     headers: {
+//       ContentType: 'application/x-www-form-urlencoded',
+//     },
+//   });
+//   if (!res.data.dentry) {
+//     message.error(res.data.errmsg);
+//     throw new Error(res.data.errmsg);
+//   }
+//   return res.data;
+// }
 
-export async function saveAuditFlowInfo(data) {
-  return request(`/api/v1/purchase/flow/info`, {
-    method: 'POST',
-    body: data,
-  });
-}
+// export async function bindDDCode(userId, code) {
+//   let res = await request(`/api/v1/purchase/bom/ding/set-ding-user-code?ucode=${userId}:${code}`, {
+//     method: 'GET',
+//   });
 
-//获取部门结构
-export async function queryDepV2(params) {
-  return request(`/api/v2/dep?${stringify(params)}`);
-}
+//   return res.data;
+// }
 
-export async function queryProcessFlows(params) {
-  let res = await request(`/api/v1/purchase/process/get-flows?${stringify(params)}`, {
-    method: 'GET',
-  });
-  return res.data;
-}
+// //获取部门结构
+// export async function queryDepV2(params) {
+//   return request(`/api/v2/dep?${stringify(params)}`);
+// }
 
-export async function queryUserListByRoleID(params) {
-  let res = await request(`/api/v1/purchase/process/get-role-user?${stringify(params)}`, {
-    method: 'GET',
-  });
-  return res.data;
-}
+// export async function queryUserListByRoleID(params) {
+//   let res = await request(`/api/v1/purchase/process/get-role-user?${stringify(params)}`, {
+//     method: 'GET',
+//   });
+//   return res.data;
+// }
 
-//新增工作流时调用接口 给项目绑定默认分类列表
-//purchase/bom/default-bind-classify?project_id=1
-export async function queryDefaultBindClassify(params) {
-  let res = await request(`/api/v1/purchase/bom/default-bind-classify?${stringify(params)}`, {
-    method: 'GET',
-  });
-  return res.data;
-}
+// //新增工作流时调用接口 给项目绑定默认分类列表
+// //purchase/bom/default-bind-classify?project_id=1
+// export async function queryDefaultBindClassify(params) {
+//   let res = await request(`/api/v1/purchase/bom/default-bind-classify?${stringify(params)}`, {
+//     method: 'GET',
+//   });
+//   return res.data;
+// }
 
-//获取分类列表
-export async function queryClassify() {
-  let res = await request(`/api/v1/purchase/bom/get-classify`, {
-    method: 'GET',
-  });
-  return res.data;
-}
+// //获取分类列表
+// export async function queryClassify() {
+//   let res = await request(`/api/v1/purchase/bom/get-classify`, {
+//     method: 'GET',
+//   });
+//   return res.data;
+// }
 
-export async function queryBindClassify(params) {
-  let res = await request(`/api/v1/purchase/bom/get-bind-classify?${stringify(params)}`, {
-    method: 'GET',
-  });
-  return res.data;
-}
+// export async function queryBindClassify(params) {
+//   let res = await request(`/api/v1/purchase/bom/get-bind-classify?${stringify(params)}`, {
+//     method: 'GET',
+//   });
+//   return res.data;
+// }
 
-export async function queryAddBindClassify(data) {
-  return request(`/api/v1/purchase/bom/add-bind-classify`, {
-    method: 'POST',
-    body: data,
-  });
-}
+// export async function queryAddBindClassify(data) {
+//   return request(`/api/v1/purchase/bom/add-bind-classify`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
 
-export async function queryDelPurchaseExcel(params) {
-  let res = await request(`/api/v1/purchase/bom/del-purchase-excel?${stringify(params)}`, {
-    method: 'GET',
-  });
-  return res;
-}
-//提交流转存储表单审批人历史记录
-export async function querySaveBomForm(data) {
-  return request(`/api/v1/purchase/bom/save-bom-form`, {
-    method: 'POST',
-    body: data,
-  });
-}
-export async function queryGetBomForm(params) {
-  let res = await request(`/api/v1/purchase/bom/get-bom-form?${stringify(params)}`, {
-    method: 'GET',
-  });
-  return res;
-}
+// export async function queryDelPurchaseExcel(params) {
+//   let res = await request(`/api/v1/purchase/bom/del-purchase-excel?${stringify(params)}`, {
+//     method: 'GET',
+//   });
+//   return res;
+// }
+// //提交流转存储表单审批人历史记录
+// export async function querySaveBomForm(data) {
+//   return request(`/api/v1/purchase/bom/save-bom-form`, {
+//     method: 'POST',
+//     body: data,
+//   });
+// }
+// export async function queryGetBomForm(params) {
+//   let res = await request(`/api/v1/purchase/bom/get-bom-form?${stringify(params)}`, {
+//     method: 'GET',
+//   });
+//   return res;
+// }
 
-//章管家失败,重新申请用印
-export async function queryTrySeal(params) {
-  let res = await request(`/api/v1/purchase/bom/try-seal?${stringify(params)}`, {
-    method: 'GET',
-  });
-  return res;
-}
+// //章管家失败,重新申请用印
+// export async function queryTrySeal(params) {
+//   let res = await request(`/api/v1/purchase/bom/try-seal?${stringify(params)}`, {
+//     method: 'GET',
+//   });
+//   return res;
+// }
 
-export async function ChartTempOSSData(params) {
-  return request(`/api/v1/purchase/bom/contract-file/${params.projectId}`);
-}
-// 设置最终版本
-export async function setLastVersion(excelId) {
-  return request(`/api/v1/purchase/bom/set-last-version/${excelId}`);
-}
+// export async function ChartTempOSSData(params) {
+//   return request(`/api/v1/purchase/bom/contract-file/${params.projectId}`);
+// }
+// // 设置最终版本
+// export async function setLastVersion(excelId) {
+//   return request(`/api/v1/purchase/bom/set-last-version/${excelId}`);
+// }

+ 38 - 38
src/services/user.js

@@ -1,57 +1,57 @@
 import {request }from 'umi';
 
 export async function query() {
-  return request('/user');
+  return request('/api/v1/user');
 }
 
-export async function queryCurrent() {
-  return request('/user/current-user', { method: 'GET' });
+export async function queryDepList(userName) {
+  return request(`/api/v2/user/dep`, {
+    params: { userName },
+  });
+}
+export async function Login(data) {
+  return request('/api/v2/user/login', {
+    method: 'POST',
+    data,
+  });
 }
-
 export async function queryCurrentV2() {
   return request('/api/v2/user/current-user', { method: 'GET' });
 }
 export async function queryUserRole(userId) {
   return request('/api/v2/user/detail/' + userId, { method: 'GET' });
 }
+// export async function queryCurrent() {
+//   return request('/api/v1/user/current-user', { method: 'GET' });
+// }
 
-export async function queryUnreadNotification() {
-  return request('/notification/unread/', { method: 'GET' });
-}
 
-export async function SetNotificationRead(params) {
-  return request(`/notification/read/${params.ID}`, { method: 'PUT' });
-}
+// export async function queryUnreadNotification() {
+//   return request('/notification/unread/', { method: 'GET' });
+// }
 
-// export async function queryUserList(param) {
-//   return request(`/userIdsAndNames?JWT-TOKEN=${param.token}`)
+// export async function SetNotificationRead(params) {
+//   return request(`/notification/read/${params.ID}`, { method: 'PUT' });
 // }
 
-export async function bindQywxUserId(param) {
-  return request(`/user/qywx-userId?code=${param.code}&JWT-TOKEN=${param.token}`);
-}
+// // export async function queryUserList(param) {
+// //   return request(`/userIdsAndNames?JWT-TOKEN=${param.token}`)
+// // }
 
-export async function updateUser(param) {
-  return request(`/user/update`, {
-    method: 'PUT',
-    body: {
-      ...param,
-    },
-  });
-}
+// export async function bindQywxUserId(param) {
+//   return request(`/api/v1/user/qywx-userId?code=${param.code}&JWT-TOKEN=${param.token}`);
+// }
 
-//获取部门结构
-export async function queryDepV2(params) {
-  return request(`/api/v2/dep?${stringify(params)}`);
-}
-export async function queryDepList(userName) {
-  return request(`/api/v2/user/dep`, {
-    params: { userName },
-  });
-}
-export async function Login(data) {
-  return request('/api/v2/user/login', {
-    method: 'POST',
-    data,
-  });
-}
+// export async function updateUser(param) {
+//   return request(`/api/v1/user/update`, {
+//     method: 'PUT',
+//     body: {
+//       ...param,
+//     },
+//   });
+// }
+
+// //获取部门结构
+// export async function queryDepV2(params) {
+//   return request(`/api/v2/dep?${stringify(params)}`);
+// }

+ 413 - 15
yarn.lock

@@ -284,6 +284,138 @@
   resolved "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.2.tgz#3bb6f37a6b188056fe9e2f363b6aa735ed65d7ca"
   integrity sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==
 
+"@antv/g-webgpu-core@^0.5.5", "@antv/g-webgpu-core@^0.5.6":
+  version "0.5.6"
+  resolved "https://registry.npmmirror.com/@antv/g-webgpu-core/-/g-webgpu-core-0.5.6.tgz#68cde0b5d0b44b5794371c2523682f4734da3c6c"
+  integrity sha512-DPiH3GkAUiT0Q+LAKeImpI+IOQ/gP2w6HstYKivpFIpBPIvZ/9equM3icVrn1iDfDkZANVXQ1PppcO3xBv1ZTw==
+  dependencies:
+    eventemitter3 "^4.0.0"
+    gl-matrix "^3.1.0"
+    inversify "^5.0.1"
+    inversify-inject-decorators "^3.1.0"
+    probe.gl "^3.1.1"
+    reflect-metadata "^0.1.13"
+
+"@antv/g-webgpu-engine@^0.5.5":
+  version "0.5.6"
+  resolved "https://registry.npmmirror.com/@antv/g-webgpu-engine/-/g-webgpu-engine-0.5.6.tgz#be7c1bf8e4b1822d72a302d628034345e0577bbd"
+  integrity sha512-D311qYUefdEFwLayutIHqucrAY3cAGH3BdnXS37nq+0nsglrHcNP0Ab1YTinn9RihLoY3yXFTLzrYkJHJbZXDg==
+  dependencies:
+    "@antv/g-webgpu-core" "^0.5.6"
+    "@webgpu/glslang" "^0.0.15"
+    "@webgpu/types" "^0.0.31"
+    gl-matrix "^3.1.0"
+    hammerjs "^2.0.8"
+    inversify "^5.0.1"
+    inversify-inject-decorators "^3.1.0"
+    probe.gl "^3.1.1"
+    reflect-metadata "^0.1.13"
+    regl "^1.3.11"
+
+"@antv/g-webgpu@0.5.5":
+  version "0.5.5"
+  resolved "https://registry.npmmirror.com/@antv/g-webgpu/-/g-webgpu-0.5.5.tgz#003d411453ed03e7dd916bd6c6db26a2b53d1991"
+  integrity sha512-TxtBniINFq1jFGEPo46xjJfrbJbUqkFd5wmsRs3tcg/7J7xoldOP1kEadpI3AJG9knMYdE92VpILw1VPd6DgzQ==
+  dependencies:
+    "@antv/g-webgpu-core" "^0.5.5"
+    "@antv/g-webgpu-engine" "^0.5.5"
+    "@webgpu/types" "^0.0.31"
+    gl-matrix "^3.1.0"
+    gl-vec2 "^1.3.0"
+    hammerjs "^2.0.8"
+    inversify "^5.0.1"
+    inversify-inject-decorators "^3.1.0"
+    polyline-miter-util "^1.0.1"
+    polyline-normals "^2.0.2"
+    probe.gl "^3.1.1"
+    reflect-metadata "^0.1.13"
+
+"@antv/layout@^0.1.22":
+  version "0.1.31"
+  resolved "https://registry.npmmirror.com/@antv/layout/-/layout-0.1.31.tgz#458e26fc6fab13a9a47079fb3d7c7fa5740983b7"
+  integrity sha512-iz9i19dOJGiZr5xBWI5sfG+2K3QVMNAGOBrbjWKH2RGLvGpf2TSFySidhz0siDrcQA46cDsjLmGstezQdgeGzA==
+  dependencies:
+    "@antv/g-webgpu" "0.5.5"
+    "@dagrejs/graphlib" "2.1.4"
+    d3-force "^2.0.1"
+    ml-matrix "^6.5.0"
+
+"@antv/x6-react-components@^1.1.15":
+  version "1.1.20"
+  resolved "https://registry.npmmirror.com/@antv/x6-react-components/-/x6-react-components-1.1.20.tgz#aa925d71646542355f92d78f99362e80717960d2"
+  integrity sha512-HpQqjPCUo+jfcbfW2sr9oxuXMCxWnXxWvE8jXKJzvrlMNZ3kgfxNqMCRxwGi2QTCxLB3g/KYi5/n8kze8ui1/Q==
+  dependencies:
+    clamp "^1.0.1"
+    classnames "^2.2.6"
+    rc-dropdown "^3.0.0-alpha.0"
+    rc-util "^4.15.7"
+    react-color "2.17.1"
+    react-resize-detector "^7.0.0"
+    ua-parser-js "^0.7.20"
+
+"@antv/x6-react-shape@^1.5.2":
+  version "1.6.4"
+  resolved "https://registry.npmmirror.com/@antv/x6-react-shape/-/x6-react-shape-1.6.4.tgz#e7e9368ce6e0b896cc9882cb08f516406a955fb6"
+  integrity sha512-xjvEV0FuH/AC+MXfgliEroPzMzdPmx3hqiWbIaXq36BasghXUNutlyCKiDmT6DX0bL1IxJsKJGESV0QQBcMlow==
+
+"@antv/x6@^1.30.1":
+  version "1.34.13"
+  resolved "https://registry.npmmirror.com/@antv/x6/-/x6-1.34.13.tgz#d87df19b24d2005433b8c18289f8556f256a5530"
+  integrity sha512-gYFxh9Sd1UXPO0aO9LHclASacT6HKkG7AP9XQqRuuCcJYWQiZVRmTN1mYQf3lTZDdybdI6IisZp6zFoGjmFxig==
+  dependencies:
+    csstype "^3.0.3"
+    jquery "^3.5.1"
+    jquery-mousewheel "^3.1.13"
+    lodash-es "^4.17.15"
+    mousetrap "^1.6.5"
+    utility-types "^3.10.0"
+
+"@antv/xflow-core@1.0.55":
+  version "1.0.55"
+  resolved "https://registry.npmmirror.com/@antv/xflow-core/-/xflow-core-1.0.55.tgz#8d8d6c299702890aed0b9b1581bb09ad4400917c"
+  integrity sha512-FhjTstp/ZdO6mj8ERARJ6M9PWgikXvOpWwMTLCjc+i8vS4O3t4XL/fIu16MqJNuNdqfETcjJluHd06c32MTB/w==
+  dependencies:
+    "@antv/xflow-hook" "1.0.55"
+    classnames "^2.3.1"
+    immer "^9.0.7"
+    mana-common "^0.3.1"
+    mana-syringe "^0.2.2"
+    reflect-metadata "^0.1.13"
+    rxjs "^6.6.7"
+
+"@antv/xflow-extension@1.0.55":
+  version "1.0.55"
+  resolved "https://registry.npmmirror.com/@antv/xflow-extension/-/xflow-extension-1.0.55.tgz#ae022bac8167e6c460ad23e4b3f481d409a706fc"
+  integrity sha512-iHRfO/ae4/9xvC5xVFmA9eIFg813DQa06hTgTdxLlt0Aojnfa5VnsGrIrPQoDDQovCXG8SavMDlnLZUpa491GQ==
+  dependencies:
+    "@antv/xflow-core" "1.0.55"
+    "@antv/xflow-hook" "1.0.55"
+    mana-syringe "^0.2.2"
+    moment "^2.29.1"
+    rc-field-form "^1.22.0"
+    react-color "2.17.1"
+    reflect-metadata "^0.1.13"
+
+"@antv/xflow-hook@1.0.55":
+  version "1.0.55"
+  resolved "https://registry.npmmirror.com/@antv/xflow-hook/-/xflow-hook-1.0.55.tgz#d950df3727028cabd8c33afb7e55b9b4812d0e1a"
+  integrity sha512-NVBrezDue4wd32seaIx1OT5WONpZUhwEp+p86QRhPzO3mmb1qhVxbEqznXhtisxZeHitHFS33J7NqeH1sDFUtQ==
+  dependencies:
+    toposort "^2.0.2"
+
+"@antv/xflow@^1.0.55":
+  version "1.0.55"
+  resolved "https://registry.npmmirror.com/@antv/xflow/-/xflow-1.0.55.tgz#4f37876046c6a1fed4ed9a242234bb5cce4be887"
+  integrity sha512-1LRFZsDZDVuRwEYD0xFt7SGCbHducgXQ4GgPOzmaCMA5FMbQfZVpXhsOG4o/a9X+gKfYdpOELCLqpz7iykyArQ==
+  dependencies:
+    "@antv/layout" "^0.1.22"
+    "@antv/x6" "^1.30.1"
+    "@antv/x6-react-components" "^1.1.15"
+    "@antv/x6-react-shape" "^1.5.2"
+    "@antv/xflow-core" "1.0.55"
+    "@antv/xflow-extension" "1.0.55"
+    "@antv/xflow-hook" "1.0.55"
+
 "@babel/cli@^7.20.7":
   version "7.21.0"
   resolved "https://registry.npmmirror.com/@babel/cli/-/cli-7.21.0.tgz#1868eb70e9824b427fc607610cce8e9e7889e7e1"
@@ -1440,6 +1572,13 @@
   resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8"
   integrity sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==
 
+"@dagrejs/graphlib@2.1.4":
+  version "2.1.4"
+  resolved "https://registry.npmmirror.com/@dagrejs/graphlib/-/graphlib-2.1.4.tgz#86c70e4f073844a2f4ada254c8c7b88a6bdacdb1"
+  integrity sha512-QCg9sL4uhjn468FDEsb/S9hS2xUZSrv/+dApb1Ze5VKO96pTXKNJZ6MGhIpgWkc1TVhbVGH9/7rq/Mf8/jWicw==
+  dependencies:
+    lodash "^4.11.1"
+
 "@emotion/hash@^0.8.0":
   version "0.8.0"
   resolved "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
@@ -1825,6 +1964,11 @@
     kolorist "^1.6.0"
     local-pkg "^0.4.2"
 
+"@icons/material@^0.2.4":
+  version "0.2.4"
+  resolved "https://registry.npmmirror.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8"
+  integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==
+
 "@istanbuljs/load-nyc-config@^1.0.0":
   version "1.1.0"
   resolved "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
@@ -2006,6 +2150,28 @@
     schema-utils "^3.0.0"
     source-map "^0.7.3"
 
+"@probe.gl/env@3.6.0":
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/@probe.gl/env/-/env-3.6.0.tgz#33343fd9041a14d21374c1911826d4a2f9d9a35d"
+  integrity sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+
+"@probe.gl/log@3.6.0":
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/@probe.gl/log/-/log-3.6.0.tgz#c645bfd22b4769dc65161caa17f13bd2b231e413"
+  integrity sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+    "@probe.gl/env" "3.6.0"
+
+"@probe.gl/stats@3.6.0":
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/@probe.gl/stats/-/stats-3.6.0.tgz#a1bb12860fa6f40b9c028f9eb575d7ada0b4dbdd"
+  integrity sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+
 "@rc-component/context@^1.3.0":
   version "1.3.0"
   resolved "https://registry.npmmirror.com/@rc-component/context/-/context-1.3.0.tgz#608ccf0abcbec9406751b17a4b35db08e481c110"
@@ -2864,6 +3030,16 @@
     magic-string "^0.27.0"
     react-refresh "^0.14.0"
 
+"@webgpu/glslang@^0.0.15":
+  version "0.0.15"
+  resolved "https://registry.npmmirror.com/@webgpu/glslang/-/glslang-0.0.15.tgz#f5ccaf6015241e6175f4b90906b053f88483d1f2"
+  integrity sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q==
+
+"@webgpu/types@^0.0.31":
+  version "0.0.31"
+  resolved "https://registry.npmmirror.com/@webgpu/types/-/types-0.0.31.tgz#c05ec6e60024bf1836f31236ecd7677a969a2a2c"
+  integrity sha512-cvvCMSZBT4VsRNtt0lI6XQqvOIIWw6+NRUtnPUMDVDgsI4pCZColz3qzF5QcP9wIYOHEc3jssIBse8UWONKhlQ==
+
 acorn-jsx@^5.3.2:
   version "5.3.2"
   resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
@@ -3584,6 +3760,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
+clamp@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634"
+  integrity sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==
+
 classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2:
   version "2.3.2"
   resolved "https://registry.npmmirror.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
@@ -3967,7 +4148,7 @@ csso@^4.2.0:
   dependencies:
     css-tree "^1.1.2"
 
-csstype@^3.0.10, csstype@^3.0.2:
+csstype@^3.0.10, csstype@^3.0.2, csstype@^3.0.3:
   version "3.1.2"
   resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
   integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
@@ -3977,6 +4158,30 @@ current-script-polyfill@1.0.0:
   resolved "https://registry.npmmirror.com/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz#f31cf7e4f3e218b0726e738ca92a02d3488ef615"
   integrity sha512-qv8s+G47V6Hq+g2kRE5th+ASzzrL7b6l+tap1DHKK25ZQJv3yIFhH96XaQ7NGL+zRW3t/RDbweJf/dJDe5Z5KA==
 
+"d3-dispatch@1 - 2":
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf"
+  integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==
+
+d3-force@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/d3-force/-/d3-force-2.1.1.tgz#f20ccbf1e6c9e80add1926f09b51f686a8bc0937"
+  integrity sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==
+  dependencies:
+    d3-dispatch "1 - 2"
+    d3-quadtree "1 - 2"
+    d3-timer "1 - 2"
+
+"d3-quadtree@1 - 2":
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-2.0.0.tgz#edbad045cef88701f6fee3aee8e93fb332d30f9d"
+  integrity sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==
+
+"d3-timer@1 - 2":
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6"
+  integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==
+
 d@1, d@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
@@ -4652,6 +4857,11 @@ event-emitter@~0.3.5:
     d "1"
     es5-ext "~0.10.14"
 
+eventemitter3@^4.0.0:
+  version "4.0.7"
+  resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+  integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
 events@^3.0.0:
   version "3.3.0"
   resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
@@ -4972,6 +5182,16 @@ git-hooks-list@^3.0.0:
   resolved "https://registry.npmmirror.com/git-hooks-list/-/git-hooks-list-3.1.0.tgz#386dc531dcc17474cf094743ff30987a3d3e70fc"
   integrity sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==
 
+gl-matrix@^3.1.0:
+  version "3.4.3"
+  resolved "https://registry.npmmirror.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9"
+  integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==
+
+gl-vec2@^1.0.0, gl-vec2@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/gl-vec2/-/gl-vec2-1.3.0.tgz#83d472ed46034de8e09cbc857123fb6c81c51199"
+  integrity sha512-YiqaAuNsheWmUV0Sa8k94kBB0D6RWjwZztyO+trEYS8KzJ6OQB/4686gdrf59wld4hHFIvaxynO3nRxpk1Ij/A==
+
 glob-parent@^5.1.2, glob-parent@~5.1.2:
   version "5.1.2"
   resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -5096,6 +5316,11 @@ grapheme-splitter@^1.0.4:
   resolved "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
   integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
 
+hammerjs@^2.0.8:
+  version "2.0.8"
+  resolved "https://registry.npmmirror.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1"
+  integrity sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==
+
 handle-thing@^2.0.0:
   version "2.0.1"
   resolved "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
@@ -5337,6 +5562,11 @@ immer@^8.0.4:
   resolved "https://registry.npmmirror.com/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a"
   integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ==
 
+immer@^9.0.7:
+  version "9.0.21"
+  resolved "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
+  integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
+
 import-fresh@^3.0.0, import-fresh@^3.2.1:
   version "3.3.0"
   resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -5436,6 +5666,21 @@ invariant@^2.2.1, invariant@^2.2.4:
   dependencies:
     loose-envify "^1.0.0"
 
+inversify-inject-decorators@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/inversify-inject-decorators/-/inversify-inject-decorators-3.1.0.tgz#d9941080bad77cec8a65ee29d905e4d5d73e1e95"
+  integrity sha512-/seBlVp5bXrLQS3DpKEmlgeZL6C7Tf/QITd+IMQrbBBGuCbxb7k3hRAWu9XSreNpFzLgSboz3sClLSEmGwHphw==
+
+inversify@^5.0.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730"
+  integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ==
+
+is-any-array@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/is-any-array/-/is-any-array-2.0.0.tgz#e71bc13741537c06afac03c07885967ef56d8742"
+  integrity sha512-WdPV58rT3aOWXvvyuBydnCq4S2BM1Yz8shKxlEpk/6x+GX202XRvXOycEFtNgnHVLoc46hpexPFx8Pz1/sMS0w==
+
 is-arguments@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
@@ -5845,6 +6090,16 @@ jest-worker@^29.5.0:
     merge-stream "^2.0.0"
     supports-color "^8.0.0"
 
+jquery-mousewheel@^3.1.13:
+  version "3.1.13"
+  resolved "https://registry.npmmirror.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5"
+  integrity sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg==
+
+jquery@^3.5.1:
+  version "3.6.4"
+  resolved "https://registry.npmmirror.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f"
+  integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==
+
 js-sdsl@^4.1.4:
   version "4.4.0"
   resolved "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430"
@@ -6096,6 +6351,11 @@ locate-path@^6.0.0:
   dependencies:
     p-locate "^5.0.0"
 
+lodash-es@^4.17.15:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
 lodash.debounce@^4.0.8:
   version "4.0.8"
   resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -6121,7 +6381,7 @@ lodash.truncate@^4.4.2:
   resolved "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
   integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
 
-lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.20, lodash@^4.17.21:
+lodash@^4.0.1, lodash@^4.11.1, lodash@^4.17.11, lodash@^4.17.20, lodash@^4.17.21:
   version "4.17.21"
   resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -6186,6 +6446,18 @@ makeerror@1.0.12:
   dependencies:
     tmpl "1.0.5"
 
+mana-common@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/mana-common/-/mana-common-0.3.2.tgz#69cea7292fc081af3684f8a2b865cd27435f9296"
+  integrity sha512-1oylLR9CcyshQcTiBdM96HxIoaA413eudpo1INiOCwyZE554TDJNUD0zrIjmeBvw8CBAjukzaAHn2gn0hZphIg==
+
+mana-syringe@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/mana-syringe/-/mana-syringe-0.2.2.tgz#5bb973a778c9c91277e6f4fa3cfda8df618aa4ba"
+  integrity sha512-Sv5r0/PrQRq4pW+9lDicGsEPzPLkd1PwjTs5zHUV1I293S3alkBNyuSjktVeBploofH8MAMLd4DS2crwct48wg==
+  dependencies:
+    inversify "^5.0.1"
+
 map-obj@^1.0.0:
   version "1.0.1"
   resolved "https://registry.npmmirror.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
@@ -6196,6 +6468,11 @@ map-obj@^4.0.0:
   resolved "https://registry.npmmirror.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
   integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
 
+material-colors@^1.2.1:
+  version "1.2.6"
+  resolved "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46"
+  integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==
+
 mathml-tag-names@^2.1.3:
   version "2.1.3"
   resolved "https://registry.npmmirror.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
@@ -6331,11 +6608,47 @@ minimist-options@4.1.0:
     is-plain-obj "^1.1.0"
     kind-of "^6.0.3"
 
-moment@^2.24.0, moment@^2.29.2, moment@^2.29.4:
+ml-array-max@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/ml-array-max/-/ml-array-max-1.2.4.tgz#2373e2b7e51c8807e456cc0ef364c5863713623b"
+  integrity sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==
+  dependencies:
+    is-any-array "^2.0.0"
+
+ml-array-min@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/ml-array-min/-/ml-array-min-1.2.3.tgz#662f027c400105816b849cc3cd786915d0801495"
+  integrity sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==
+  dependencies:
+    is-any-array "^2.0.0"
+
+ml-array-rescale@^1.3.7:
+  version "1.3.7"
+  resolved "https://registry.npmmirror.com/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz#c4d129320d113a732e62dd963dc1695bba9a5340"
+  integrity sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==
+  dependencies:
+    is-any-array "^2.0.0"
+    ml-array-max "^1.2.4"
+    ml-array-min "^1.2.3"
+
+ml-matrix@^6.5.0:
+  version "6.10.4"
+  resolved "https://registry.npmmirror.com/ml-matrix/-/ml-matrix-6.10.4.tgz#babee344b20062d9c123aa801c2e5d0d0c7477f6"
+  integrity sha512-rUyEhfNPzqFsltYwvjNeYQXlYEaVea3KgzcJKJteQUj2WVAGFx9fLNRjtMR9mg2B6bd5buxlmkZmxM4hmO+SKg==
+  dependencies:
+    is-any-array "^2.0.0"
+    ml-array-rescale "^1.3.7"
+
+moment@^2.24.0, moment@^2.29.1, moment@^2.29.2, moment@^2.29.4:
   version "2.29.4"
   resolved "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
   integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
 
+mousetrap@^1.6.5:
+  version "1.6.5"
+  resolved "https://registry.npmmirror.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9"
+  integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==
+
 ms@2.1.2:
   version "2.1.2"
   resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@@ -6849,6 +7162,20 @@ point-in-polygon@^1.1.0:
   resolved "https://registry.npmmirror.com/point-in-polygon/-/point-in-polygon-1.1.0.tgz#b0af2616c01bdee341cbf2894df643387ca03357"
   integrity sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==
 
+polyline-miter-util@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/polyline-miter-util/-/polyline-miter-util-1.0.1.tgz#b693f2389ea0ded36a6bcf5ecd2ece4b6917d957"
+  integrity sha512-/3u91zz6mBerBZo6qnOJOTjv7EfPhKtsV028jMyj86YpzLRNmCCFfrX7IO9tCEQ2W4x45yc+vKOezjf7u2Nd6Q==
+  dependencies:
+    gl-vec2 "^1.0.0"
+
+polyline-normals@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/polyline-normals/-/polyline-normals-2.0.2.tgz#a1737e75d8c0dccb1a591f9cb27f09eef4b7d135"
+  integrity sha512-dpHrAi61ymhsB4N0XlNb3YpkKJeTFnXBXDWpeH8Ucstq0TUZrCN3YK4Jlgk8ofMWN25lhGC4wnxLMv+TUK8rig==
+  dependencies:
+    polyline-miter-util "^1.0.1"
+
 postcss-attribute-case-insensitive@^5.0.0:
   version "5.0.2"
   resolved "https://registry.npmmirror.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741"
@@ -7199,6 +7526,16 @@ pretty-error@^4.0.0:
     lodash "^4.17.20"
     renderkid "^3.0.0"
 
+probe.gl@^3.1.1:
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/probe.gl/-/probe.gl-3.6.0.tgz#e816234412b27a70b9be029cb82c8cf96cd72659"
+  integrity sha512-19JydJWI7+DtR4feV+pu4Mn1I5TAc0xojuxVgZdXIyfmTLfUaFnk4OloWK1bKbPtkgGKLr2lnbnCXmpZEcEp9g==
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+    "@probe.gl/env" "3.6.0"
+    "@probe.gl/log" "3.6.0"
+    "@probe.gl/stats" "3.6.0"
+
 process-nextick-args@~2.0.0:
   version "2.0.1"
   resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
@@ -7438,6 +7775,16 @@ rc-drawer@~6.1.0, rc-drawer@~6.1.1:
     rc-motion "^2.6.1"
     rc-util "^5.21.2"
 
+rc-dropdown@^3.0.0-alpha.0:
+  version "3.6.2"
+  resolved "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-3.6.2.tgz#d23b8b2762941ac39e665673946f67ca9c39118f"
+  integrity sha512-Wsw7GkVbUXADEs8FPL0v8gd+3mWQiydPFXBlr2imMScQaf8hh79pG9KrBc1DwK+nqHmYOpQfK2gn6jG2AQw9Pw==
+  dependencies:
+    "@babel/runtime" "^7.10.1"
+    classnames "^2.2.6"
+    rc-trigger "^5.0.4"
+    rc-util "^5.17.0"
+
 rc-dropdown@~4.0.0:
   version "4.0.1"
   resolved "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-4.0.1.tgz#f65d9d3d89750241057db59d5a75e43cd4576b68"
@@ -7448,19 +7795,19 @@ rc-dropdown@~4.0.0:
     rc-trigger "^5.3.1"
     rc-util "^5.17.0"
 
-rc-field-form@~1.27.0:
-  version "1.27.4"
-  resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.27.4.tgz#53600714af5b28c226c70d34867a8c52ccd64d44"
-  integrity sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==
+rc-field-form@^1.22.0, rc-field-form@~1.29.0:
+  version "1.29.1"
+  resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.29.1.tgz#798a3b66cfd30c46f08c0db95d04ac5a493a4582"
+  integrity sha512-LbspDMu1ei71LoAdot0QRcMQn3WyAwgAp/P4thqUFLOy0eQsbtLZN24a3KV7xdv/b9KAd/A4/T9apWz7YZqalQ==
   dependencies:
     "@babel/runtime" "^7.18.0"
     async-validator "^4.1.0"
     rc-util "^5.8.0"
 
-rc-field-form@~1.29.0:
-  version "1.29.1"
-  resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.29.1.tgz#798a3b66cfd30c46f08c0db95d04ac5a493a4582"
-  integrity sha512-LbspDMu1ei71LoAdot0QRcMQn3WyAwgAp/P4thqUFLOy0eQsbtLZN24a3KV7xdv/b9KAd/A4/T9apWz7YZqalQ==
+rc-field-form@~1.27.0:
+  version "1.27.4"
+  resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.27.4.tgz#53600714af5b28c226c70d34867a8c52ccd64d44"
+  integrity sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==
   dependencies:
     "@babel/runtime" "^7.18.0"
     async-validator "^4.1.0"
@@ -7899,7 +8246,7 @@ rc-upload@~4.3.0:
     classnames "^2.2.5"
     rc-util "^5.2.0"
 
-rc-util@^4.19.0:
+rc-util@^4.15.7, rc-util@^4.19.0:
   version "4.21.1"
   resolved "https://registry.npmmirror.com/rc-util/-/rc-util-4.21.1.tgz#88602d0c3185020aa1053d9a1e70eac161becb05"
   integrity sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==
@@ -7928,6 +8275,18 @@ rc-virtual-list@^3.2.0, rc-virtual-list@^3.4.13, rc-virtual-list@^3.4.8:
     rc-resize-observer "^1.0.0"
     rc-util "^5.15.0"
 
+react-color@2.17.1:
+  version "2.17.1"
+  resolved "https://registry.npmmirror.com/react-color/-/react-color-2.17.1.tgz#f114811c83f5d80a1bd1b80466c2f7ddcc58da9d"
+  integrity sha512-S+I6TkUKJaqfALLkAIfiCZ/MANQyy7dKkf7g9ZU5GTUy2rf8c2Rx62otyvADAviWR+6HRkzdf2vL1Qvz9goCLQ==
+  dependencies:
+    "@icons/material" "^0.2.4"
+    lodash "^4.17.11"
+    material-colors "^1.2.1"
+    prop-types "^15.5.10"
+    reactcss "^1.2.0"
+    tinycolor2 "^1.4.1"
+
 react-dom@18.1.0:
   version "18.1.0"
   resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f"
@@ -8012,6 +8371,13 @@ react-refresh@0.14.0, react-refresh@^0.14.0:
   resolved "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
   integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
 
+react-resize-detector@^7.0.0:
+  version "7.1.2"
+  resolved "https://registry.npmmirror.com/react-resize-detector/-/react-resize-detector-7.1.2.tgz#8ef975dd8c3d56f9a5160ac382ef7136dcd2d86c"
+  integrity sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw==
+  dependencies:
+    lodash "^4.17.21"
+
 react-router-dom@6.3.0:
   version "6.3.0"
   resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d"
@@ -8043,7 +8409,7 @@ react@18.1.0:
   dependencies:
     loose-envify "^1.1.0"
 
-reactcss@^1.2.3:
+reactcss@^1.2.0, reactcss@^1.2.3:
   version "1.2.3"
   resolved "https://registry.npmmirror.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd"
   integrity sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==
@@ -8123,6 +8489,11 @@ redux@^4.2.1:
   dependencies:
     "@babel/runtime" "^7.9.2"
 
+reflect-metadata@^0.1.13:
+  version "0.1.13"
+  resolved "https://registry.npmmirror.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+  integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
 reflect.getprototypeof@^1.0.2:
   version "1.0.3"
   resolved "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz#2738fd896fcc3477ffbd4190b40c2458026b6928"
@@ -8192,6 +8563,11 @@ regjsparser@^0.9.1:
   dependencies:
     jsesc "~0.5.0"
 
+regl@^1.3.11:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/regl/-/regl-1.7.0.tgz#0d185431044a356bf80e9b775b11b935ef2746d3"
+  integrity sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==
+
 relateurl@^0.2.7:
   version "0.2.7"
   resolved "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
@@ -8313,6 +8689,13 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
+rxjs@^6.6.7:
+  version "6.6.7"
+  resolved "https://registry.npmmirror.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
+  integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
+  dependencies:
+    tslib "^1.9.0"
+
 rxjs@^7.8.0:
   version "7.8.0"
   resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4"
@@ -9023,7 +9406,7 @@ tiny-glob@^0.2.9:
     globalyzer "0.1.0"
     globrex "^0.1.2"
 
-tinycolor2@^1.4.2:
+tinycolor2@^1.4.1, tinycolor2@^1.4.2:
   version "1.6.0"
   resolved "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e"
   integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
@@ -9055,12 +9438,17 @@ toggle-selection@^1.0.6:
   resolved "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
   integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
 
+toposort@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
+  integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==
+
 trim-newlines@^3.0.0:
   version "3.0.1"
   resolved "https://registry.npmmirror.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
   integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
 
-tslib@^1.8.1:
+tslib@^1.8.1, tslib@^1.9.0:
   version "1.14.1"
   resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@@ -9149,6 +9537,11 @@ typescript@^5.0.0:
   resolved "https://registry.npmmirror.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b"
   integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==
 
+ua-parser-js@^0.7.20:
+  version "0.7.35"
+  resolved "https://registry.npmmirror.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307"
+  integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==
+
 umi-request@^1.4.0:
   version "1.4.0"
   resolved "https://registry.npmmirror.com/umi-request/-/umi-request-1.4.0.tgz#ed0e54e47f043d2be06e691477f0890383f9dd8a"
@@ -9285,6 +9678,11 @@ utila@~0.4:
   resolved "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
   integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==
 
+utility-types@^3.10.0:
+  version "3.10.0"
+  resolved "https://registry.npmmirror.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b"
+  integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==
+
 v8-compile-cache@^2.3.0:
   version "2.3.0"
   resolved "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"