import { forwardRef, useImperativeHandle, useMemo, useRef, useState, } from "react"; import { Col, Form, Input, message, Modal, Row, Select, Tabs, TabsProps, TreeSelect, } from "antd"; import LangInput from "@/components/LangInput"; import LangInputTextarea from "@/components/LangInputTextarea"; import { TableType } from "@/enum"; import { createColumn, createTable } from "@/utils"; import { TableItemType } from "@/type"; import { useModel, useRequest } from "umi"; import { // GetAllDesignTables, // GetAllBusinessTableColumns, // GetBusinessTablesByTableId, // ListLangByKey, GetCanUseTableList, ImportFromBusinessTables, } from "@/api"; import { validateTableCode, validateAliasName } from "@/utils/validator"; import { pick } from "lodash-es"; import CustomColorPicker from "@/components/CustomColorPicker"; export default forwardRef(function AddTable( props: { onChange: (tables: TableItemType[]) => void; }, ref ) { const [open, setOpen] = useState(false); const tableItemRef = useRef(); const { project, graph } = useModel("erModel"); const [tabActiveKey, setTabActiveKey] = useState("1"); const [form] = Form.useForm(); const [form1] = Form.useForm(); const [formModel, setFormModel] = useState(); const [hideAddTab, setHideAddTab] = useState(false); const [color, setColor] = useState(); useImperativeHandle(ref, () => ({ open: () => { // 获取当前模型类型 tableItemRef.current = createTable(project.type, project.id); setFormModel(tableItemRef.current.table); setOpen(true); setColor(undefined); }, openImportMode: () => { setTabActiveKey("2"); run({ type: project?.type }); setHideAddTab(true); setOpen(true); }, close: () => { setOpen(false); }, })); const { data, loading, run } = useRequest(GetCanUseTableList, { manual: true, }); // 可引入表列表 const treeData = useMemo(() => { const tableMap: Record = {}; data?.result ?.filter( (item: any) => // 过滤当前数据表类型及存在相同schemaName、aliasName的表 item?.type == project?.type // && !project.tables.find( // (tableItem) => // tableItem.table.schemaName === item.schemaName || // tableItem.table.aliasName === item.aliasName // ) ) ?.forEach((item: any) => { // 判断是否存在已引入的表 const hasTable = project.tables.find( (tableItem: TableItemType) => tableItem.table.schemaName === item.schemaName || tableItem.table.aliasName === item.aliasName ); const option = { key: item.id, title: `${item?.schemaName}(${item.name})`, value: item?.id, disabled: hasTable, 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.parentBusinessTableId], ...option, }; } else { tableMap[item.id] = { ...option, children: [], }; } } return; }); return Object.keys(tableMap).map((key) => tableMap[key]); }, [data]); const items: TabsProps["items"] = [ { key: "1", label: `新建`, children: (
handleChange("schemaName", e.target.value)} /> handleChange("aliasName", e.target.value)} /> handleChange("langNameList", lang)} /> handleChange("langDescriptionList", lang) } />
), }, { key: "2", label: `引入`, children: (
{color ? (
) : ( 随机生成,点击可选择颜色 )}
), }, ]; const handleChange = (key: string, value: any) => { formModel && setFormModel({ ...formModel, [key]: value, }); }; const [loadingColumns, setLoadingColumns] = useState(false); const handleOk = () => { // 新建 if (tabActiveKey === "1") { form.validateFields().then(() => { if (tableItemRef.current && formModel) { props.onChange([ { ...tableItemRef.current, table: formModel, }, ]); } form.resetFields(); setOpen(false); }); } // 引入 if (tabActiveKey === "2") { form1.validateFields().then(async () => { // 加载表格字段 const values = form1.getFieldsValue(); try { setLoadingColumns(true); if (values.table.length === 0) { message.error("请选择要引入的表"); return; } 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 ImportFromBusinessTables({ dataModelId: project.id, color, businessTables, }); console.log("导入结果:", res); const rect = graph?.getAllCellsBBox(); // 计算起始位置 默认往最后加 const startY = (rect?.height || 0) + (rect?.y || 0) + 20; props.onChange(res.result?.map((item: any) => { item.table.style = JSON.parse(item.table.style || '{}'); item.table.style.y = startY; return item })); form1.resetFields(); setOpen(false); } catch (err) { console.error(err); message.warning("引入失败"); } finally { setLoadingColumns(false); } }); } }; const handleChangeTableActiveKey = (key: string) => { setTabActiveKey(key); if (key === "2") { run({ type: project.type }); } }; return ( setOpen(false)} onOk={handleOk} okButtonProps={{ loading: loadingColumns, }} > (hideAddTab ? item.key === "2" : true))} activeKey={tabActiveKey} onChange={handleChangeTableActiveKey} /> ); });