|
@@ -30,21 +30,23 @@ import {
|
|
|
} 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: (value: TableItemType) => void;
|
|
|
+ onChange: (tables: TableItemType[]) => void;
|
|
|
},
|
|
|
ref
|
|
|
) {
|
|
|
const [open, setOpen] = useState(false);
|
|
|
const tableItemRef = useRef<TableItemType>();
|
|
|
- const { project } = useModel("erModel");
|
|
|
+ const { project, graph } = useModel("erModel");
|
|
|
const [tabActiveKey, setTabActiveKey] = useState("1");
|
|
|
const [form] = Form.useForm();
|
|
|
const [form1] = Form.useForm();
|
|
|
const [formModel, setFormModel] = useState<TableItemType["table"]>();
|
|
|
const [hideAddTab, setHideAddTab] = useState(false);
|
|
|
+ const [color, setColor] = useState<string>();
|
|
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
|
open: () => {
|
|
@@ -52,6 +54,7 @@ export default forwardRef(function AddTable(
|
|
|
tableItemRef.current = createTable(project.type, project.id);
|
|
|
setFormModel(tableItemRef.current.table);
|
|
|
setOpen(true);
|
|
|
+ setColor(undefined);
|
|
|
},
|
|
|
openImportMode: () => {
|
|
|
setTabActiveKey("2");
|
|
@@ -74,17 +77,24 @@ export default forwardRef(function AddTable(
|
|
|
?.filter(
|
|
|
(item: any) =>
|
|
|
// 过滤当前数据表类型及存在相同schemaName、aliasName的表
|
|
|
- item?.type == project?.type
|
|
|
- // && !project.tables.find(
|
|
|
- // (tableItem) =>
|
|
|
- // tableItem.table.schemaName === item.schemaName ||
|
|
|
- // tableItem.table.aliasName === item.aliasName
|
|
|
- // )
|
|
|
+ item?.type == project?.type
|
|
|
+ // && !project.tables.find(
|
|
|
+ // (tableItem) =>
|
|
|
+ // tableItem.table.schemaName === item.schemaName ||
|
|
|
+ // tableItem.table.aliasName === item.aliasName
|
|
|
+ // )
|
|
|
)
|
|
|
?.map((item: any) => {
|
|
|
+ // 判断是否存在已引入的表
|
|
|
+ const hasTable = project.tables.find(
|
|
|
+ (tableItem: TableItemType) =>
|
|
|
+ tableItem.table.schemaName === item.schemaName ||
|
|
|
+ tableItem.table.aliasName === item.aliasName
|
|
|
+ );
|
|
|
return {
|
|
|
label: `${item?.schemaName}(${item.name})`,
|
|
|
value: item?.id,
|
|
|
+ disabled: hasTable,
|
|
|
};
|
|
|
}) || [];
|
|
|
|
|
@@ -189,11 +199,26 @@ export default forwardRef(function AddTable(
|
|
|
rules={[{ required: true, message: "请选择表" }]}
|
|
|
>
|
|
|
<Select
|
|
|
+ mode="multiple"
|
|
|
placeholder="请选择"
|
|
|
loading={loading}
|
|
|
options={tableOptions}
|
|
|
/>
|
|
|
</Form.Item>
|
|
|
+ <Form.Item label="颜色" name="color">
|
|
|
+ <CustomColorPicker onChange={setColor}>
|
|
|
+ {color ? (
|
|
|
+ <div
|
|
|
+ className="rounded-4px cus-btn w-32px h-32px bg-#eee flex-none cursor-pointer shadow-inner"
|
|
|
+ style={{ background: color || "#eee" }}
|
|
|
+ ></div>
|
|
|
+ ) : (
|
|
|
+ <span className="bg-#eee px-5px py-3px rounded-4px cursor-pointer text-12px text-#666">
|
|
|
+ 随机生成,点击可选择颜色
|
|
|
+ </span>
|
|
|
+ )}
|
|
|
+ </CustomColorPicker>
|
|
|
+ </Form.Item>
|
|
|
</Form>
|
|
|
</div>
|
|
|
),
|
|
@@ -211,7 +236,8 @@ export default forwardRef(function AddTable(
|
|
|
// 获取引入的表转换成模型表
|
|
|
const getNewTableByTable = async (
|
|
|
tableData: any,
|
|
|
- columns: any[]
|
|
|
+ columns: any[],
|
|
|
+ tableOther: Record<string, any> = {}
|
|
|
): Promise<TableItemType> => {
|
|
|
const newTable = createTable(project.type, project.id);
|
|
|
const langKeyList: string[] = [];
|
|
@@ -226,6 +252,7 @@ export default forwardRef(function AddTable(
|
|
|
langKeyList.push(item.langName);
|
|
|
}
|
|
|
});
|
|
|
+
|
|
|
// 获取全部多语言数据
|
|
|
const langList = await Promise.all(
|
|
|
[...new Set(langKeyList)].map((key) =>
|
|
@@ -251,6 +278,7 @@ export default forwardRef(function AddTable(
|
|
|
{ name: "zh-CN", value: descName?.["zh-CN"] || "" },
|
|
|
{ name: "en", value: descName?.["en"] || "" },
|
|
|
],
|
|
|
+ ...tableOther,
|
|
|
},
|
|
|
// 字段数据
|
|
|
tableColumnList: columns.map((item) => {
|
|
@@ -275,10 +303,12 @@ export default forwardRef(function AddTable(
|
|
|
if (tabActiveKey === "1") {
|
|
|
form.validateFields().then(() => {
|
|
|
if (tableItemRef.current && formModel) {
|
|
|
- props.onChange({
|
|
|
- ...tableItemRef.current,
|
|
|
- table: formModel,
|
|
|
- });
|
|
|
+ props.onChange([
|
|
|
+ {
|
|
|
+ ...tableItemRef.current,
|
|
|
+ table: formModel,
|
|
|
+ },
|
|
|
+ ]);
|
|
|
}
|
|
|
form.resetFields();
|
|
|
setOpen(false);
|
|
@@ -291,8 +321,8 @@ export default forwardRef(function AddTable(
|
|
|
const values = form1.getFieldsValue();
|
|
|
try {
|
|
|
setLoadingColumns(true);
|
|
|
- const resArr = await Promise.all([
|
|
|
- GetBusinessTablesByTableId(values.table),
|
|
|
+ const requestList = values.table.map((tableId: string) => [
|
|
|
+ GetBusinessTablesByTableId(tableId),
|
|
|
GetAllBusinessTableColumns({
|
|
|
currentPage: 1,
|
|
|
pageSize: 2000,
|
|
@@ -303,23 +333,73 @@ export default forwardRef(function AddTable(
|
|
|
filters: [
|
|
|
{
|
|
|
name: "BusinessTableId",
|
|
|
- value: values.table,
|
|
|
+ value: tableId,
|
|
|
},
|
|
|
],
|
|
|
}),
|
|
|
]);
|
|
|
- if (resArr[0]?.result?.[0]) {
|
|
|
- const tableItem = await getNewTableByTable(
|
|
|
- resArr[0]?.result?.[0],
|
|
|
- resArr[1]?.result?.model || []
|
|
|
- );
|
|
|
- props.onChange(tableItem);
|
|
|
- console.log(tableItem);
|
|
|
- form1.resetFields();
|
|
|
- setOpen(false);
|
|
|
- } else {
|
|
|
- message.error("获取数据失败");
|
|
|
+ if (requestList.length === 0) {
|
|
|
+ message.error("请选择要引入的表");
|
|
|
+ return;
|
|
|
}
|
|
|
+ const resArr = await Promise.allSettled(
|
|
|
+ (requestList as Promise<any>[]).flat(1)
|
|
|
+ );
|
|
|
+
|
|
|
+ const tableMap: Record<string, any> = {};
|
|
|
+ resArr.forEach((res) => {
|
|
|
+ if (res.status === "fulfilled") {
|
|
|
+ const value = res.value?.result;
|
|
|
+ // 表格数据
|
|
|
+ if (Array.isArray(value) && value[0]) {
|
|
|
+ tableMap[value[0].id] = {
|
|
|
+ table: value[0],
|
|
|
+ tableColumnList: [],
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ // 字段数据
|
|
|
+ const model = res.value?.result?.model;
|
|
|
+ const tableId = model?.[0]?.businessTableId;
|
|
|
+ if (tableId) {
|
|
|
+ if (tableMap[tableId]) {
|
|
|
+ tableMap[tableId].tableColumnList = model;
|
|
|
+ } else {
|
|
|
+ tableMap[tableId] = {
|
|
|
+ table: {},
|
|
|
+ tableColumnList: model,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ const rect = graph?.getAllCellsBBox();
|
|
|
+ // 计算起始位置 默认往最后加
|
|
|
+ const startY = (rect?.height || 0) + (rect?.y || 0) + 20;
|
|
|
+ const result = Object.keys(tableMap).map(async (key, index) => {
|
|
|
+ const table = await getNewTableByTable(
|
|
|
+ tableMap[key].table,
|
|
|
+ tableMap[key].tableColumnList
|
|
|
+ );
|
|
|
+ table.table.style.y = startY;
|
|
|
+ table.table.style.x =
|
|
|
+ 100 + index * (project.setting.tableWidth + 20);
|
|
|
+ if (color) {
|
|
|
+ table.table.style.color = color;
|
|
|
+ }
|
|
|
+ return table;
|
|
|
+ });
|
|
|
+
|
|
|
+ const newTables = await Promise.all(result);
|
|
|
+
|
|
|
+ props.onChange(newTables);
|
|
|
+ console.log(newTables);
|
|
|
+ form1.resetFields();
|
|
|
+ setOpen(false);
|
|
|
+ } catch (err) {
|
|
|
+ console.error(err);
|
|
|
+ message.warning("引入失败");
|
|
|
} finally {
|
|
|
setLoadingColumns(false);
|
|
|
}
|
|
@@ -347,7 +427,7 @@ export default forwardRef(function AddTable(
|
|
|
}}
|
|
|
>
|
|
|
<Tabs
|
|
|
- items={items.filter(item => hideAddTab ? item.key === '2' : true)}
|
|
|
+ items={items.filter((item) => (hideAddTab ? item.key === "2" : true))}
|
|
|
activeKey={tabActiveKey}
|
|
|
onChange={handleChangeTableActiveKey}
|
|
|
/>
|