Browse Source

feat: 完成思维导图接口对接

liaojiaxing 5 months ago
parent
commit
7d1d29efdc

+ 5 - 5
apps/designer/src/api/index.ts

@@ -3,11 +3,11 @@ import { request } from "umi";
 export type commonParams = {
   currentPage: number;
   pageSize: number;
-  orderByProperty: string;
-  Ascending: boolean;
-  totalPage: number;
-  totalCount: number;
-  filters: any[];
+  orderByProperty?: string;
+  Ascending?: boolean;
+  totalPage?: number;
+  totalCount?: number;
+  filters?: any[];
 };
 
 /**

+ 8 - 8
apps/designer/src/events/flowEvent.ts

@@ -90,30 +90,30 @@ export const handleGraphEvent = (graph: Graph) => {
 
 export const handleGraphApiEvent = (graph: Graph) => {
   graph.on("cell:added", (args) => {
-    const graphId = localStorage.getItem("projectId");
+    const graphId = sessionStorage.getItem("projectId");
     const data = args.cell.toJSON();
     graphId && AddFlowchartElement({
       ...data,
-      graphId
+      graphId,
+      tools: ''
     });
   });
 
   graph.on("cell:change:*", debounce((args: EventArgs["cell:change:*"]) => {
     if(args.cell?.data?.isPage) return;
     
-    const graphId = localStorage.getItem("projectId");
+    const graphId = sessionStorage.getItem("projectId");
     const data = args.cell.toJSON();
     graphId && EditFlowchartElement({
       ...data,
-      graphId
+      graphId,
+      tools: ''
     });
   }, 500));
 
   graph.on("cell:removed", (args) => {
-    const graphId = localStorage.getItem("projectId");
-    const data = args.cell.toJSON();
-    graphId && data?.id && DeleteFlowchartElement({
-      id: data.id
+    DeleteFlowchartElement({
+      id: args.cell.id
     });
   });
 };

+ 34 - 10
apps/designer/src/events/mindMapEvent.ts

@@ -1,4 +1,4 @@
-import { Graph, Cell, Node, Edge } from "@antv/x6";
+import { Graph, Cell, Node, Edge, EventArgs } from "@antv/x6";
 import { BorderSize, StructureType, TopicType } from "@/enum";
 import {
   addTopic,
@@ -11,6 +11,8 @@ import { selectTopic } from "@/utils/mindmapHander";
 import { uuid } from "@/utils";
 import { getTheme } from "@/pages/mindmap/theme";
 import { traverseNode } from "@/utils/mindmapHander";
+import { EditMindMapElement, AddMindMapElement } from "@/api/systemDesigner";
+import { debounce } from "lodash-es"
 
 enum positionType {
   left = "left",
@@ -232,11 +234,11 @@ export const bindMindMapEvents = (
     // 本地缓存更新不会重新渲染
     if (args.cell.id.includes("-border")) {
       updateTopic(args.current.origin, { border: current }, (info) => {
-        localStorage.setItem("minMapProjectInfo", JSON.stringify(info));
+        sessionStorage.setItem("mindMapProjectInfo", JSON.stringify(info));
       });
     } else {
       updateTopic(args.cell.id, current, (info) => {
-        localStorage.setItem("minMapProjectInfo", JSON.stringify(info));
+        sessionStorage.setItem("mindMapProjectInfo", JSON.stringify(info));
       });
     }
   });
@@ -250,11 +252,9 @@ export const bindMindMapEvents = (
     })
   });
 
-  graph.on("node:change:position", (args) => {
+  graph.on("node:change:position", debounce((args) => {
     const { current } = args;
-    console.log('修改位置:')
-
-    if (args.cell.isNode() && !args.cell.data.parentId && args.cell.data.type !== TopicType.main) {
+    if (args.cell.isNode() && !args.cell.data?.parentId && args.cell.data.type !== TopicType.main) {
       updateTopic(
         args.cell.id,
         { ...args.cell.data, x: current?.x, y: current?.y },
@@ -263,8 +263,14 @@ export const bindMindMapEvents = (
           setMindProjectInfo && setMindProjectInfo(info);
         }
       );
+      EditMindMapElement({
+        ...args.cell.data,
+        ...args.current,
+        graphId: sessionStorage.getItem("projectId"),
+        tools: ''
+      });
     }
-  });
+  }, 500));
 
   /**
    * 连接线更改
@@ -301,6 +307,18 @@ export const bindMindMapEvents = (
       );
     }
   });
+
+  // 修改主题 传给后端
+  graph.on("node:change:*", (args: EventArgs["node:change:*"]) => {
+    const graphId = sessionStorage.getItem("projectId");
+    if(graphId && !args.current?.parentId && args.key === "data") {
+      EditMindMapElement({
+        ...args.current,
+        graphId,
+        tools: ''
+      });
+    }
+  });
 };
 
 const canBeFreeNode = (x: number, y: number, node: Node): boolean => {
@@ -498,7 +516,7 @@ export const topicDragHander = (
   if (indicatorNode) graph.removeCell(indicatorNode);
   indicatorEdge = undefined;
   indicatorNode = undefined;
-  // 1、 获取位置的地方附件是否有节点
+  // 1、 获取位置的地方是否有节点
   const nodes = graph.getNodes();
   nodes.forEach((targetNode) => {
     // 目标节点是自己、自己的后代、节点不做处理
@@ -634,7 +652,7 @@ const handleSwitchPosition = (
   } else {
     const id = uuid();
     // 成为自由节点
-    mindmapProjectInfo.topics.push({
+    const freeTopic = {
       ...source,
       id,
       children: (source.children || []).map((item) => {
@@ -654,6 +672,12 @@ const handleSwitchPosition = (
         };
         return item;
       }),
+    };
+
+    mindmapProjectInfo.topics.push(freeTopic);
+    AddMindMapElement({
+      ...freeTopic,
+      graphId: sessionStorage.getItem("projectId"),
     });
   }
 

+ 0 - 1
apps/designer/src/index.d.ts

@@ -1,3 +1,2 @@
 declare module 'insert-css';
-declare module 'lodash-es';
 declare module '@antv/hierarchy';

+ 2 - 2
apps/designer/src/models/appModel.ts

@@ -77,9 +77,9 @@ export default function appModel() {
         [key]: value
       }
     });
-    if(localStorage.getItem("projectId")) {
+    if(sessionStorage.getItem("projectId")) {
       EditGraph({
-        id: localStorage.getItem("projectId"),
+        id: sessionStorage.getItem("projectId"),
         [key]: value
       });
     }

+ 33 - 11
apps/designer/src/models/graphModel.ts

@@ -11,7 +11,7 @@ import { Export } from "@antv/x6-plugin-export";
 import { useModel } from "umi";
 import "@/components/PageContainer";
 import { handleGraphEvent, handleGraphApiEvent } from "@/events/flowEvent";
-import { pageMenu, nodeMenu } from "@/utils/contentMenu";
+import { pageMenu, nodeMenu, edgeMenu } from "@/utils/contentMenu";
 import { bindKeys } from "@/utils/fastKey";
 import { useSessionStorageState } from "ahooks";
 
@@ -69,23 +69,45 @@ export default function GraphModel() {
 
   const initCells = (cells: Cell.Properties[]) => {
     if (graphRef.current) {
+      // 添加节点
       (cells || []).forEach((item) => {
-        if (item.shape === "edge") {
-          // graphRef.current?.addEdge({
-          //   ...item,
-          //   data: JSON.parse(item?.data),
-          //   tools: JSON.parse((item?.tools as unknown as string) || "{}"),
-          //   source: JSON.parse(item?.source),
-          //   target: JSON.parse(item?.target),
-          // });
-        } else {
+        if (item.shape !== "edge")  {
           graphRef.current?.addNode({
             ...item,
             data: JSON.parse(item?.data),
-            tools: JSON.parse((item?.tools as unknown as string) || "{}"),
+            ports: JSON.parse(item?.ports  || "{}"),
+            size: JSON.parse(item?.size || "{}"),
+            position: JSON.parse(item?.position || "{}"),
+            tools: [{
+              name: "contextmenu",
+              args: {
+                menu: nodeMenu,
+              },
+            }]
           });
         }
       });
+      // 添加边
+      (cells || []).forEach((item) => {
+        if (item.shape === "edge") {
+          graphRef.current?.addEdge({
+            ...item,
+            data: JSON.parse(item?.data),
+            attrs: JSON.parse(item?.attrs as unknown as string || "{}"),
+            source: JSON.parse(item?.source),
+            target: JSON.parse(item?.target),
+            // router: JSON.parse(item?.router || "{}"),
+            tools: [
+              {
+                name: "contextmenu",
+                args: {
+                  menu: edgeMenu,
+                },
+              },
+            ]
+          });
+        }
+      })
 
       graphRef.current.on("cell:change:*", handleChangeAll);
       addPageNode();

+ 11 - 24
apps/designer/src/models/mindMapModel.ts

@@ -11,14 +11,13 @@ import { Clipboard } from "@antv/x6-plugin-clipboard";
 import { MindMapProjectInfo } from "@/types";
 import { bindMindMapEvents } from "@/events/mindMapEvent";
 import { useSessionStorageState } from "ahooks";
-import { addTopic, renderMindMap } from "@/pages/mindmap/mindMap";
+import { renderMindMap } from "@/pages/mindmap/mindMap";
 import { TopicType } from "@/enum";
 import { isEqual, cloneDeep } from "lodash-es";
 import { bindMindmapKeys } from "@/utils/fastKey";
 import { handleCreateCorrelationEdge } from "@/utils/mindmapHander";
 import { Dnd } from "@antv/x6-plugin-dnd";
 import { EditGraph } from "@/api/systemDesigner";
-import { topicData } from "@/config/data";
 export default function mindMapModel() {
   const [rightToobarActive, setRightToolbarActive] = useState<string>();
   // 格式刷启用
@@ -47,31 +46,19 @@ export default function mindMapModel() {
   // 监听页面设置更新数据
   useEffect(() => {
     const pageSetting = mindProjectInfo?.pageSetting;
-    if(localStorage.getItem("projectId") && pageSetting) {
+    if(sessionStorage.getItem("projectId") && pageSetting) {
       EditGraph({
-        id: localStorage.getItem("projectId"),
-        ...pageSetting
+        id: sessionStorage.getItem("projectId"),
+        ...pageSetting,
+        langNameList: [
+          {
+            name: "zh-CN",
+            value: mindProjectInfo.name
+          }
+        ]
       });
     }
-  }, [mindProjectInfo?.pageSetting]);
-
-  // 添加中心主题
-  useEffect(() => {
-    if(mindProjectInfo?.topics && !mindProjectInfo.topics.length) {
-      addTopic(TopicType.main, setMindProjectInfo, undefined, {
-        label: "中心主题",
-        fill: {
-          ...topicData.fill,
-          color1: "#30304D",
-        },
-        text: {
-          ...topicData.text,
-          fontSize: 30,
-          color: "#fff",
-        },
-      });
-    }
-  }, [mindProjectInfo?.topics])
+  }, [mindProjectInfo?.pageSetting, mindProjectInfo?.name]);
 
   const flagRef = useRef(false);
   useEffect(() => {

+ 1 - 1
apps/designer/src/pages/flow/components/MenuBar/index.tsx

@@ -77,7 +77,7 @@ export default function MenuBar() {
         },
       });
 
-      const id = localStorage.getItem("projectId");
+      const id = sessionStorage.getItem("projectId");
       if (id) {
         EditGraph({
           id,

+ 1 - 1
apps/designer/src/pages/flow/index.tsx

@@ -43,7 +43,7 @@ export default function HomePage() {
   useEffect(() => {
     if (params?.id) {
       run({ id: params.id });
-      localStorage.setItem("projectId", params.id);
+      sessionStorage.setItem("projectId", params.id);
     }
   }, []);
 

+ 55 - 7
apps/designer/src/pages/home/All.tsx

@@ -1,6 +1,15 @@
 import React, { useState } from "react";
 import { ProCard, ProTable, PageContainer } from "@ant-design/pro-components";
-import { Card, Col, Row, Button, Input, Breadcrumb } from "antd";
+import {
+  Card,
+  Col,
+  Row,
+  Button,
+  Input,
+  Breadcrumb,
+  Empty,
+  Pagination,
+} from "antd";
 import { history, useRequest } from "umi";
 import { AppstoreOutlined, MenuOutlined } from "@ant-design/icons";
 import { FlowchartMindMapList } from "@/api/systemDesigner";
@@ -11,8 +20,9 @@ import defaultMindImg from "@/assets/image/mindmap.png";
 export default function All() {
   const [display, setDisplay] = useState("card");
   const [dataSource, setDataSource] = useState<any[]>([]);
+  const [total, setTotal] = useState(0);
   const handleToEdit = (record: any) => {
-    if(record.type === GraphType.mindmap) {
+    if (record.type === GraphType.mindmap) {
       history.push(`/mindmap/${record.id}`);
     } else {
       history.push(`/flow/${record.id}`);
@@ -20,15 +30,20 @@ export default function All() {
   };
 
   const { loading, run } = useRequest(FlowchartMindMapList, {
+    defaultParams: [
+      {
+        currentPage: 1,
+        pageSize: 10,
+      },
+    ],
     onSuccess: (res) => {
       setDataSource(res?.result?.model || []);
+      setTotal(res?.result?.totalCount || 0);
     },
   });
 
   // 打开文件夹
-  const handleOpenFolder = () => {
-
-  };
+  const handleOpenFolder = () => {};
 
   return (
     <>
@@ -120,8 +135,12 @@ export default function All() {
                         cover={
                           <img
                             style={{ height: 200, objectFit: "cover" }}
-                            alt="example"
-                            src={item?.coverImage || (item.type === GraphType.mindmap ? defaultMindImg : defaultFlowImg)}
+                            src={
+                              item?.coverImage ||
+                              (item.type === GraphType.mindmap
+                                ? defaultMindImg
+                                : defaultFlowImg)
+                            }
                           />
                         }
                         onClick={() => handleToEdit(item)}
@@ -148,9 +167,26 @@ export default function All() {
                   );
                 })}
               </Row>
+              <div className="flex justify-end py-16px">
+                <Pagination
+                  total={total}
+                  defaultCurrent={1}
+                  pageSize={10}
+                  pageSizeOptions={["10", "20", "30"]}
+                  onChange={(page, pageSize) => {
+                    run({
+                      currentPage: page,
+                      pageSize: pageSize,
+                    });
+                  }}
+                  hideOnSinglePage
+                />
+              </div>
+              {dataSource.length == 0 ? <Empty description="暂无数据" /> : null}
             </>
           ) : (
             <ProTable
+              loading={loading}
               columns={[
                 {
                   title: "名称",
@@ -169,6 +205,18 @@ export default function All() {
               dataSource={dataSource}
               rowKey={"id"}
               search={false}
+              pagination={{
+                total: total,
+                pageSize: 10,
+                defaultCurrent: 1,
+                pageSizeOptions: ["10", "20", "30"],
+                onChange: (page, pageSize) => {
+                  run({
+                    currentPage: page,
+                    pageSize: pageSize,
+                  });
+                },
+              }}
             />
           )}
         </ProCard>

+ 6 - 1
apps/designer/src/pages/home/Recently.tsx

@@ -1,6 +1,6 @@
 import React, { useState } from "react";
 import { ProCard, ProTable, PageContainer } from "@ant-design/pro-components";
-import { Card, Col, Row, Button, Input, Breadcrumb } from "antd";
+import { Card, Col, Row, Button, Input, Breadcrumb, Empty } from "antd";
 import { history, useRequest } from "umi";
 import { AppstoreOutlined, MenuOutlined } from "@ant-design/icons";
 import { FlowchartMindMapList } from "@/api/systemDesigner";
@@ -115,6 +115,11 @@ export default function Recently() {
                   );
                 })}
               </Row>
+              {
+                dataSource.length == 0 ?
+                <Empty description="暂无数据" />
+                : null
+              }
             </>
           ) : (
             <ProTable

+ 43 - 4
apps/designer/src/pages/mindmap/index.tsx

@@ -9,7 +9,10 @@ import Footer from "./components/Footer";
 import Config from "./components/Config";
 import SvgComponent from "./components/SvgComponent";
 import { FlowchartMindMapInfo } from "@/api/systemDesigner";
-import { defaultProject } from "@/config/data";
+import { defaultProject, topicData } from "@/config/data";
+import { TopicItem } from "@/types";
+import { addTopic } from "./mindMap";
+import { TopicType } from "@/enum";
 
 export default function MindMap() {
   const { rightToobarActive, initMindMap, setMindProjectInfo } = useModel("mindMapModel");
@@ -24,9 +27,46 @@ export default function MindMap() {
     manual: true,
   });
 
+  const transData = (item: any): TopicItem => {
+    return {
+      ...item,
+      edge: JSON.parse(item.edge),
+      fill: JSON.parse(item.fill),
+      links: JSON.parse(item.links),
+      text: JSON.parse(item.text),
+      stroke: JSON.parse(item.stroke),
+      children: JSON.parse(item.children),
+      ...(item?.extraModules ? { extraModules: JSON.parse(item.extraModules) } : {}),
+      ...(item?.icons ? { icons: JSON.parse(item.icons) } : {}),
+      ...(item?.tags ? { icons: JSON.parse(item.tags) } : {}),
+      ...(item?.href ? { icons: JSON.parse(item.href) } : {}),
+      ...(item?.links ? { icons: JSON.parse(item.links) } : {}),
+      ...(item?.summary ? { icons: JSON.parse(item.summary) } : {}),
+      ...(item?.summary ? { icons: JSON.parse(item.summary) } : {}),
+    }
+  }
+
   useEffect(() => {
     if (!data) return;
     const graphInfo = data?.result?.graph || {};
+    const topics = (data?.result?.elements || []).map((item: any) => transData(item));
+    if(!topics.length) {
+      const mainTopic = addTopic(TopicType.main, setMindProjectInfo, undefined, {
+        label: "中心主题",
+        fill: {
+          ...topicData.fill,
+          color1: "#30304D",
+        },
+        text: {
+          ...topicData.text,
+          fontSize: 30,
+          color: "#fff",
+        },
+      });
+      if(mainTopic) {
+        topics.push(mainTopic);
+      }
+    }
     setMindProjectInfo({
       name: graphInfo.name,
       desc: graphInfo?.desc || "",
@@ -46,8 +86,7 @@ export default function MindMap() {
         showWatermark: graphInfo?.showWatermark || defaultProject.pageSetting.showWatermark,
         watermarkText: graphInfo?.watermarkText || defaultProject.pageSetting.watermarkText,
       },
-      // TODO: 元素转树形结构
-      topics: []
+      topics
     });
   }, [data]);
 
@@ -56,7 +95,7 @@ export default function MindMap() {
   useEffect(() => {
     if (params?.id) {
       run({ id: params.id });
-      localStorage.setItem("projectId", params.id);
+      sessionStorage.setItem("projectId", params.id);
     }
   }, []);
 

+ 4 - 4
apps/designer/src/pages/mindmap/mindMap.tsx

@@ -265,7 +265,7 @@ const createBorderComponent = (
 const updateNode = (node: Node, graph: Graph) => {
   const oldCell = graph.getCellById(node.id);
   if (oldCell.isNode()) {
-    oldCell.setData(node.data);
+    oldCell.setData(node.data, { deep: false});
     oldCell.position(node.position().x, node.position().y);
     oldCell.setSize(node.size().width, node.size().height);
     // oldCell.setAttrs(node.attrs);
@@ -322,11 +322,11 @@ export const addTopic = (
   }
 
   setMindProjectInfo(projectInfo);
-  if(localStorage.getItem("projectId")) {
+  if(sessionStorage.getItem("projectId") && !topic.parentId) {
     AddMindMapElement({
       ...topic,
-      graphId: localStorage.getItem("projectId"),
-    })
+      graphId: sessionStorage.getItem("projectId"),
+    });
   }
   
   return topic;

+ 9 - 0
apps/designer/src/utils/mindmapHander.tsx

@@ -11,6 +11,7 @@ import { exportImage } from "@/components/ExportImage";
 import TopicBorder from "@/components/mindMap/Border";
 import SummaryBorder from "@/components/mindMap/SummaryBorder";
 import { openInsertImageModal } from "@/components/ImageModal";
+import { DeleteMindMapElement } from "@/api/systemDesigner";
 
 export const selectTopic = (graph: Graph, topic?: TopicItem) => {
   if (topic?.id) {
@@ -120,11 +121,19 @@ export const deleteTopics = (
   const filterTopics = (list: TopicItem[]): TopicItem[] => {
     const result: TopicItem[] = [];
     for (const item of list) {
+      if(ids.includes(item.id) && item.type === TopicType.main) {
+        item.children = [];
+      }
       if (!ids.includes(item.id) || item.type === TopicType.main) {
         if (item.children?.length) {
           item.children = filterTopics(item.children);
         }
         result.push(item);
+      } else {
+        if(!item.parentId && !item.isSummary) {
+          // 删除自由主题
+          DeleteMindMapElement({id: item.id});
+        }
       }
     }
     return result;

+ 1 - 0
package.json

@@ -47,6 +47,7 @@
     "@codemirror/lang-xml": "^6.1.0",
     "@codemirror/lang-yaml": "^6.1.1",
     "@emotion/css": "^11.13.0",
+    "@types/lodash-es": "^4.17.12",
     "@uiw/react-codemirror": "^4.23.3",
     "@unocss/cli": "^0.62.3",
     "ahooks": "^3.8.1",

+ 28 - 16
pnpm-lock.yaml

@@ -13,7 +13,7 @@ importers:
         version: 5.4.0(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-components':
         specifier: ^2.7.15
-        version: 2.7.15(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+        version: 2.7.15(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@antv/hierarchy':
         specifier: ^0.6.14
         version: 0.6.14
@@ -95,6 +95,9 @@ importers:
       '@emotion/css':
         specifier: ^11.13.0
         version: 11.13.0
+      '@types/lodash-es':
+        specifier: ^4.17.12
+        version: 4.17.12
       '@uiw/react-codemirror':
         specifier: ^4.23.3
         version: 4.23.3(@babel/runtime@7.25.6)(@codemirror/autocomplete@6.18.1)(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.1)(codemirror@6.0.1)(react-dom@18.3.1)(react@18.3.1)
@@ -131,7 +134,7 @@ importers:
     devDependencies:
       '@umijs/plugins':
         specifier: ^4.3.19
-        version: 4.3.19(@babel/core@7.25.2)(antd@5.20.5)(dva@2.5.0-beta.2)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+        version: 4.3.19(@babel/core@7.25.2)(@types/lodash-es@4.17.12)(antd@5.20.5)(dva@2.5.0-beta.2)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       prettier:
         specifier: ^3.3.3
         version: 3.3.3
@@ -401,7 +404,7 @@ packages:
     transitivePeerDependencies:
       - react-dom
 
-  /@ant-design/pro-components@2.7.15(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
+  /@ant-design/pro-components@2.7.15(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
     resolution: {integrity: sha512-M30R93pGVvHsaQ65rwmrI4kQqTv8mCAmwxGZNDYIOoZs78syJlLKLNoYSb/eKY0L+h78QfXbXHckQzTXp577mA==}
     peerDependencies:
       antd: ^4.24.15 || ^5.11.2
@@ -409,14 +412,14 @@ packages:
       react-dom: '>=17.0.0'
     dependencies:
       '@ant-design/pro-card': 2.8.7(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
-      '@ant-design/pro-descriptions': 2.5.50(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+      '@ant-design/pro-descriptions': 2.5.50(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-field': 2.16.0(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
-      '@ant-design/pro-form': 2.29.0(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+      '@ant-design/pro-form': 2.29.0(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-layout': 7.19.12(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
-      '@ant-design/pro-list': 2.5.66(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+      '@ant-design/pro-list': 2.5.66(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-provider': 2.14.9(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-skeleton': 2.1.13(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
-      '@ant-design/pro-table': 3.16.6(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+      '@ant-design/pro-table': 3.16.6(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-utils': 2.15.17(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@babel/runtime': 7.25.6
       antd: 5.20.5(react-dom@18.3.1)(react@18.3.1)
@@ -426,14 +429,14 @@ packages:
       - '@types/lodash-es'
       - rc-field-form
 
-  /@ant-design/pro-descriptions@2.5.50(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
+  /@ant-design/pro-descriptions@2.5.50(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
     resolution: {integrity: sha512-X5L9MN5vVgN6p5jP4oGIYGeIdW3cEojX7pXhD4CcIjfBabxlsYE6XB5XNqrdV8osuJXVK0iBw+nFGUeIMdOqOg==}
     peerDependencies:
       antd: ^4.24.15 || ^5.11.2
       react: '>=17.0.0'
     dependencies:
       '@ant-design/pro-field': 2.16.0(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
-      '@ant-design/pro-form': 2.29.0(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+      '@ant-design/pro-form': 2.29.0(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-provider': 2.14.9(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-skeleton': 2.1.13(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-utils': 2.15.17(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
@@ -469,7 +472,7 @@ packages:
     transitivePeerDependencies:
       - react-dom
 
-  /@ant-design/pro-form@2.29.0(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
+  /@ant-design/pro-form@2.29.0(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
     resolution: {integrity: sha512-StDH1B5z4bmHimi0D4P/mXmRHivn2gcyeF0DFTr4o6xDE1Tfm0YRrJlfMzoYdd7B8WV/CvxwiDXxMZJ+TD1aMw==}
     peerDependencies:
       '@types/lodash-es': ^4.17.12
@@ -487,6 +490,7 @@ packages:
       '@ant-design/pro-utils': 2.15.17(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@babel/runtime': 7.25.6
       '@chenshuai2144/sketch-color': 1.0.9(react@18.3.1)
+      '@types/lodash-es': 4.17.12
       '@umijs/use-params': 1.0.9(react@18.3.1)
       antd: 5.20.5(react-dom@18.3.1)(react@18.3.1)
       classnames: 2.5.1
@@ -524,7 +528,7 @@ packages:
       swr: 2.2.5(react@18.3.1)
       warning: 4.0.3
 
-  /@ant-design/pro-list@2.5.66(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
+  /@ant-design/pro-list@2.5.66(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
     resolution: {integrity: sha512-llqIDj3SJwx6ZlvD20ou/LwqESjOvp0twaiH10CoW/OHtkRTnJypvg/R+xgpCTfKd5ExYlAwhE5jKUHFpM/qiA==}
     peerDependencies:
       antd: ^4.24.15 || ^5.11.2
@@ -534,7 +538,7 @@ packages:
       '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-card': 2.8.7(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-field': 2.16.0(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
-      '@ant-design/pro-table': 3.16.6(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+      '@ant-design/pro-table': 3.16.6(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-utils': 2.15.17(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@babel/runtime': 7.25.6
       antd: 5.20.5(react-dom@18.3.1)(react@18.3.1)
@@ -576,7 +580,7 @@ packages:
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
 
-  /@ant-design/pro-table@3.16.6(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
+  /@ant-design/pro-table@3.16.6(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
     resolution: {integrity: sha512-6QY8fACTGEg45fkEalF8y1wyQwWRotl8LjLFJa/NT1Uc3ErucFkbHBcjJSy+4cJBPvldhNh42IwwGpS15FagVQ==}
     peerDependencies:
       antd: ^4.24.15 || ^5.11.2
@@ -587,7 +591,7 @@ packages:
       '@ant-design/icons': 5.4.0(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-card': 2.8.7(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-field': 2.16.0(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
-      '@ant-design/pro-form': 2.29.0(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+      '@ant-design/pro-form': 2.29.0(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-provider': 2.14.9(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/pro-utils': 2.15.17(antd@5.20.5)(react-dom@18.3.1)(react@18.3.1)
       '@babel/runtime': 7.25.6
@@ -3876,6 +3880,14 @@ packages:
     resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
     dev: true
 
+  /@types/lodash-es@4.17.12:
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+    dependencies:
+      '@types/lodash': 4.17.13
+
+  /@types/lodash@4.17.13:
+    resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
+
   /@types/minimatch@5.1.2:
     resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
     dev: true
@@ -4847,7 +4859,7 @@ packages:
       tsx: 3.12.2
     dev: false
 
-  /@umijs/plugins@4.3.19(@babel/core@7.25.2)(antd@5.20.5)(dva@2.5.0-beta.2)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
+  /@umijs/plugins@4.3.19(@babel/core@7.25.2)(@types/lodash-es@4.17.12)(antd@5.20.5)(dva@2.5.0-beta.2)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1):
     resolution: {integrity: sha512-79D24drW6s6x24M+dgeBUBNGAxW1OT2G4bRMw2zs6zotb8RuA8QJ5KftZ3+57TX0Uie6mK3+12N6fc+KDtqo9w==}
     dependencies:
       '@ahooksjs/use-request': 2.8.15(react@18.3.1)
@@ -4855,7 +4867,7 @@ packages:
       '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/icons': 4.8.3(react-dom@18.3.1)(react@18.3.1)
       '@ant-design/moment-webpack-plugin': 0.0.3
-      '@ant-design/pro-components': 2.7.15(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
+      '@ant-design/pro-components': 2.7.15(@types/lodash-es@4.17.12)(antd@5.20.5)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)
       '@tanstack/react-query': 4.36.1(react-dom@18.3.1)(react@18.3.1)
       '@tanstack/react-query-devtools': 4.36.1(@tanstack/react-query@4.36.1)(react-dom@18.3.1)(react@18.3.1)
       '@umijs/bundler-utils': 4.3.19