AddModel.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import React, { useRef, useMemo } from "react";
  2. import { Modal, Input, Form, message, TreeSelect } from "antd";
  3. import { SaveDataModel, GetCanUseTableList } from "@/api";
  4. import { TableType } from "@/enum";
  5. import { ProjectInfo, TableItemType } from "@/type";
  6. import { DEFAULT_SETTING } from "@/constants";
  7. import CustomColorPicker from "@/components/CustomColorPicker";
  8. import { useRequest, useModel } from "umi";
  9. import { pick } from "lodash-es";
  10. export default React.forwardRef(function AddModel(
  11. props: { onChange?: (val: string | ProjectInfo) => void },
  12. ref
  13. ) {
  14. const [open, setOpen] = React.useState(false);
  15. const [color, setColor] = React.useState<string>();
  16. const [form] = Form.useForm();
  17. const type = React.useRef<TableType>();
  18. const editInfo = useRef<ProjectInfo>();
  19. const folderRef = useRef<string>();
  20. const { project } = useModel("erModel");
  21. React.useImperativeHandle(ref, () => {
  22. return {
  23. open: (tableType: TableType, folder?: string) => {
  24. folderRef.current = folder;
  25. editInfo.current = undefined;
  26. type.current = tableType;
  27. setOpen(true);
  28. form.resetFields();
  29. run({
  30. type: tableType,
  31. });
  32. },
  33. edit: (info: ProjectInfo) => {
  34. editInfo.current = info;
  35. form.setFieldsValue(info);
  36. setOpen(true);
  37. },
  38. };
  39. });
  40. const {
  41. data,
  42. loading: loadingOptions,
  43. run,
  44. } = useRequest(GetCanUseTableList, {
  45. manual: true,
  46. });
  47. // 可引入表列表
  48. const treeData = useMemo(() => {
  49. const tableMap: Record<string, any> = {};
  50. data?.result
  51. ?.filter(
  52. (item: any) =>
  53. // 过滤当前数据表类型及存在相同schemaName、aliasName的表
  54. item?.type == project?.type
  55. )
  56. ?.forEach((item: any) => {
  57. const option = {
  58. key: item.id,
  59. title: `${item?.schemaName}(${item.name})`,
  60. value: item?.id,
  61. selectable: !item.parentBusinessTableId,
  62. };
  63. // 子表
  64. if (item.parentBusinessTableId) {
  65. if (tableMap[item.parentBusinessTableId]) {
  66. tableMap[item.parentBusinessTableId].children.push(option);
  67. } else {
  68. tableMap[item.parentBusinessTableId] = {
  69. children: [option],
  70. };
  71. }
  72. } else {
  73. // 主表
  74. if (tableMap[item.id]) {
  75. tableMap[item.id] = {
  76. ...tableMap[item.id],
  77. ...option,
  78. };
  79. } else {
  80. tableMap[item.id] = {
  81. ...option,
  82. children: [],
  83. };
  84. }
  85. }
  86. return;
  87. });
  88. return Object.keys(tableMap).map((key) => tableMap[key]);
  89. }, [data]);
  90. const handleSubmit = () => {
  91. form.validateFields().then(async (values) => {
  92. if (editInfo.current) {
  93. const erDataModel = {
  94. ...editInfo.current,
  95. ...values,
  96. table: undefined
  97. }
  98. const params = {
  99. erDataModel
  100. };
  101. // 编辑
  102. await SaveDataModel(params);
  103. message.success("编辑成功");
  104. props.onChange?.(erDataModel);
  105. setOpen(false);
  106. } else {
  107. // 新增
  108. const erDataModel = {
  109. ...values,
  110. directory: folderRef.current,
  111. type: type.current,
  112. setting: JSON.stringify(DEFAULT_SETTING),
  113. table: undefined,
  114. }
  115. const businessTables =
  116. data?.result
  117. ?.filter((item: any) => values?.table?.includes(item.id))
  118. ?.map((item: any) => {
  119. return pick(item, [
  120. "aliasName",
  121. "schemaName",
  122. "id",
  123. "parentBusinessTableId",
  124. ]);
  125. }) || [];
  126. const res = await SaveDataModel({
  127. erDataModel,
  128. importFromBusinessTablesDto: {
  129. businessTables,
  130. color,
  131. }
  132. });
  133. message.success("创建成功");
  134. props.onChange?.(res?.result);
  135. setOpen(false);
  136. }
  137. });
  138. };
  139. return (
  140. <Modal
  141. open={open}
  142. width={440}
  143. title={editInfo.current ? "编辑模型" : "创建模型"}
  144. onCancel={() => setOpen(false)}
  145. onOk={handleSubmit}
  146. >
  147. <Form<{ name: string; description: string }>
  148. layout="vertical"
  149. form={form}
  150. >
  151. <Form.Item
  152. label="模型名称"
  153. name="name"
  154. rules={[
  155. { required: true, message: "请输入模型名称,长度50以内!", max: 50 },
  156. ]}
  157. >
  158. <Input placeholder="请输入模型名称" />
  159. </Form.Item>
  160. <Form.Item name="description" label="模型描述">
  161. <Input.TextArea placeholder="请输入模型描述" />
  162. </Form.Item>
  163. {!editInfo.current && (
  164. <>
  165. <Form.Item label="选择表" name="table">
  166. <TreeSelect
  167. multiple
  168. treeCheckable
  169. allowClear
  170. placeholder="请选择"
  171. loading={loadingOptions}
  172. treeData={treeData}
  173. />
  174. </Form.Item>
  175. <Form.Item label="颜色" name="color">
  176. <CustomColorPicker onChange={setColor}>
  177. {color ? (
  178. <div
  179. className="rounded-4px cus-btn w-32px h-32px bg-#eee flex-none cursor-pointer shadow-inner"
  180. style={{ background: color || "#eee" }}
  181. ></div>
  182. ) : (
  183. <span className="bg-#eee px-5px py-3px rounded-4px cursor-pointer text-12px text-#666">
  184. 随机生成,点击可选择颜色
  185. </span>
  186. )}
  187. </CustomColorPicker>
  188. </Form.Item>
  189. </>
  190. )}
  191. </Form>
  192. </Modal>
  193. );
  194. });