import React, { useEffect } from "react"; import { EditableProTable, ProColumns } from "@ant-design/pro-components"; import type { ColumnItem } from "@/type"; import { createColumn } from "@/utils"; import { DataType } from "@/enum"; import { DATA_TYPE_OPTIONS } from "@/constants"; import { Button, Input, InputNumber, message, Switch, Tooltip, Upload, UploadFile, } from "antd"; import LangInput from "./LangInput"; import { validateColumnCode } from "@/utils/validator"; import VariableModal from "./VariableModal"; import ColumnVariableModal from "./ColumnVariableModal"; import { FormInstance } from "antd/lib"; import { DownloadOutlined, InfoCircleOutlined, UploadOutlined, } from "@ant-design/icons"; import { parseExcel } from "@/utils/parseExcel"; import ImportResultModal from "./ImportResultModal"; export default function TableEdit(props: { tableId?: string; data: any[]; modelId?: string; onChange?: (data: readonly ColumnItem[]) => void; }) { const [editableKeys, setEditableRowKeys] = React.useState([]); const [dataSource, setDataSource] = React.useState( props.data ); const boxRef = React.useRef(null); const importResultRef = React.useRef<{ open: (data: any[], columns: readonly ColumnItem[]) => void; }>(); useEffect(() => { props.onChange?.(dataSource); }, [dataSource]); const DefaultValueComp = ({ value, onChange, }: { value?: string; onChange?: (value: string) => void; }) => { return (
{ onChange?.(e.target.value); }} />
+变量 } onOk={(val) => onChange?.(val)} /> +字段 } onOk={(val) => onChange?.(val)} />
); }; const LengthComp = ({ value, onChange, model, form, rowKey, }: { value?: string; onChange?: (value: string) => void; model: ColumnItem; form: FormInstance; rowKey?: React.Key | React.Key[]; }) => { return ( form.setFieldValue([rowKey || "", "precision"], value) } /> form.setFieldValue([rowKey || "", "scale"], value) } /> ); }; const columns: ProColumns[] = [ { title: "字段代码", dataIndex: "schemaName", valueType: "text", width: 150, formItemProps: { rules: [ { required: true, message: "请输入字段名称", }, { max: 50, message: "字段名称不能超过50个字符", }, validateColumnCode, ], }, }, { title: "字段名称", dataIndex: "langName", valueType: "text", width: 150, render: (_dom, entity) => { return ( entity.langNameList?.find( (item: Record) => item.name === "zh-CN" )?.value || "-" ); }, renderFormItem: (_schema, config, form) => { const model = config.record; const rowKey = config.recordKey; console.log(model); return ( { form.setFieldValue([rowKey || "", "langNameList"], langValue); form.setFieldValue([rowKey || "", "langName"], ""); }} /> ); }, }, { title: "类型", dataIndex: "type", valueType: "select", width: 120, fieldProps: (form, { rowKey }) => { return { options: DATA_TYPE_OPTIONS, onChange: () => { form.setFieldValue([rowKey || "", "maxLength"], undefined); form.setFieldValue([rowKey || "", "scale"], undefined); form.setFieldValue([rowKey || "", "precision"], undefined); }, }; }, formItemProps: { rules: [ { required: true, message: "请选择类型", }, ], }, }, { title: "长度", dataIndex: "maxLength", valueType: "digit", width: 120, fieldProps: { precision: 0, }, render: (text, record) => { return record.type === DataType.Decimal ? `${record.precision},${record.scale}` : text; }, renderFormItem: (_schema, config, form) => { const model = config.record; const rowKey = config.recordKey; return model.type === DataType.Nvarchar ? ( ) : model.type === DataType.Decimal ? ( ) : ( "-" ); }, }, { title: "必填", dataIndex: "isRequired", valueType: "switch", render: (text, record) => { return ; }, width: 80, }, { title: "唯一", dataIndex: "isUnique", valueType: "switch", render: (text, record) => { return ; }, width: 80, }, { title: "默认值", dataIndex: "defaultValue", valueType: "text", width: 150, renderFormItem() { return ; }, }, { title: "字符集", dataIndex: "chartset", valueType: "text", width: 120, renderFormItem: (_schema, config) => { return config.record.type === DataType.Nvarchar ? ( ) : null; }, }, { title: "内容", dataIndex: "whereInputContent", valueType: "text", width: 120, renderFormItem: (_schema, config) => { return config.record.type === DataType.Nvarchar ? ( ) : null; }, }, { title: "描述", dataIndex: "memo", valueType: "textarea", width: 120, renderFormItem: () => { return ; }, }, { title: "预定义字段", dataIndex: "isPreDefined", renderText: (text, record) => { return record.isPreDefined ? "是" : "否"; }, }, { title: "操作", valueType: "option", width: 120, render: (_text, record, _, action) => record.isPreDefined ? [] : [ { action?.startEditable?.(record.id); }} > 编辑 , { setDataSource( dataSource.filter((item) => item.id !== record.id) ); }} > 删除 , ], }, ]; const handleAdd = () => { return createColumn(props?.tableId, dataSource.length + 1); }; // 上传字段模版文件 const handleUpload = (file: UploadFile) => { message.loading("正在解析文件...", 0); parseExcel(file) .then((res) => { console.log("加载数据:", res); const list = res?.["表单字段"]; message.destroy(); if (!list || !list.length) { message.warning("当前文件无字段数据,请检查"); } else { importResultRef.current?.open(list, dataSource); } }) .catch((err) => { console.error("加载数据失败:", err); message.error("文件解析失败"); message.destroy(); }); }; const handleChangeColumn = (list: ColumnItem[]) => { setDataSource(list); }; return (
[

填写规范:

1、字段名第一位必须为大写字母,之后的对象可以字母大小写,数字或下划线;

2、Nvarchar类型长度最大不可以超过4000;

3、Decimal类型精度的填写方式:总精度,有效小数位,eg: 18,6;

4、Int、Datetime等类型长度需填写为0;

} > , , handleUpload(file)} > , ]} /> ); }