import React, { useRef, useMemo } from "react"; import { Modal, Input, Form, message, TreeSelect } from "antd"; import { SaveDataModel, GetCanUseTableList } from "@/api"; import { TableType } from "@/enum"; import { ProjectInfo, TableItemType } from "@/type"; import { DEFAULT_SETTING } from "@/constants"; import CustomColorPicker from "@/components/CustomColorPicker"; import { useRequest, useModel } from "umi"; import { pick } from "lodash-es"; export default React.forwardRef(function AddModel( props: { onChange?: (val: string | ProjectInfo) => void }, ref ) { const [open, setOpen] = React.useState(false); const [color, setColor] = React.useState(); const [form] = Form.useForm(); const type = React.useRef(); const editInfo = useRef(); const folderRef = useRef(); const { project } = useModel("erModel"); React.useImperativeHandle(ref, () => { return { open: (tableType: TableType, folder?: string) => { folderRef.current = folder; editInfo.current = undefined; type.current = tableType; setOpen(true); form.resetFields(); run({ type: tableType, }); }, edit: (info: ProjectInfo) => { editInfo.current = info; form.setFieldsValue(info); setOpen(true); }, }; }); const { data, loading: loadingOptions, run, } = useRequest(GetCanUseTableList, { manual: true, }); // 可引入表列表 const treeData = useMemo(() => { const tableMap: Record = {}; data?.result ?.filter( (item: any) => // 过滤当前数据表类型及存在相同schemaName、aliasName的表 item?.type == project?.type ) ?.forEach((item: any) => { const option = { key: item.id, title: `${item?.schemaName}(${item.name})`, value: item?.id, selectable: !item.parentBusinessTableId, }; // 子表 if (item.parentBusinessTableId) { if (tableMap[item.parentBusinessTableId]) { tableMap[item.parentBusinessTableId].children.push(option); } else { tableMap[item.parentBusinessTableId] = { children: [option], }; } } else { // 主表 if (tableMap[item.id]) { tableMap[item.id] = { ...tableMap[item.id], ...option, }; } else { tableMap[item.id] = { ...option, children: [], }; } } return; }); return Object.keys(tableMap).map((key) => tableMap[key]); }, [data]); const handleSubmit = () => { form.validateFields().then(async (values) => { if (editInfo.current) { const erDataModel = { ...editInfo.current, ...values, table: undefined } const params = { erDataModel }; // 编辑 await SaveDataModel(params); message.success("编辑成功"); props.onChange?.(erDataModel); setOpen(false); } else { // 新增 const erDataModel = { ...values, directory: folderRef.current, type: type.current, setting: JSON.stringify(DEFAULT_SETTING), table: undefined, } const businessTables = data?.result ?.filter((item: any) => values?.table?.includes(item.id)) ?.map((item: any) => { return pick(item, [ "aliasName", "schemaName", "id", "parentBusinessTableId", ]); }) || []; const res = await SaveDataModel({ erDataModel, importFromBusinessTablesDto: { businessTables, color, } }); message.success("创建成功"); props.onChange?.(res?.result); setOpen(false); } }); }; return ( setOpen(false)} onOk={handleSubmit} > layout="vertical" form={form} > {!editInfo.current && ( <> {color ? (
) : ( 随机生成,点击可选择颜色 )}
)}
); });