import React, { useEffect, useState } from 'react'; import { Modal, Select, Form, Input, InputNumber, message, Button, Radio } from 'antd'; import { getDimensionList, getModelList, savePlugin } from './service'; import { DimensionType, ModelType, ParamTypeEnum, ParseModeEnum, PluginType, FunctionParamFormItemType, PluginTypeEnum, } from './type'; import { getLeafList, uuid } from '@/utils/utils'; import styles from './style.less'; import { PLUGIN_TYPE_MAP } from './constants'; import { DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import { isArray } from 'lodash'; const FormItem = Form.Item; const { TextArea } = Input; type Props = { detail?: PluginType; onSubmit: (values: any) => void; onCancel: () => void; }; const DetailModal: React.FC = ({ detail, onSubmit, onCancel }) => { const [modelList, setModelList] = useState([]); const [modelDimensionList, setModelDimensionList] = useState>({}); const [confirmLoading, setConfirmLoading] = useState(false); const [pluginType, setPluginType] = useState(); const [functionName, setFunctionName] = useState(); const [functionParams, setFunctionParams] = useState([]); const [examples, setExamples] = useState<{ id: string; question?: string }[]>([]); const [filters, setFilters] = useState([]); const [form] = Form.useForm(); const initModelList = async () => { const res = await getModelList(); setModelList([{ id: -1, name: '默认' }, ...getLeafList(res.data)]); }; useEffect(() => { initModelList(); }, []); const initModelDimensions = async (params: any) => { const modelIds = params .filter((param: any) => !!param.modelId) .map((param: any) => param.modelId); const res = await Promise.all(modelIds.map((modelId: number) => getDimensionList(modelId))); setModelDimensionList( modelIds.reduce((result: Record, modelId: number, index: number) => { result[modelId] = res[index].data.list; return result; }, {}), ); }; useEffect(() => { if (detail) { const { paramOptions } = detail.config || {}; const height = paramOptions?.find( (option: any) => option.paramType === 'FORWARD' && option.key === 'height', )?.value; form.setFieldsValue({ ...detail, url: detail.config?.url, height, }); if (paramOptions?.length > 0) { const params = paramOptions.filter( (option: any) => option.paramType !== ParamTypeEnum.FORWARD, ); setFilters(params); initModelDimensions(params); } setPluginType(detail.type); const parseModeObj = JSON.parse(detail.parseModeConfig || '{}'); setFunctionName(parseModeObj.name); const { properties } = parseModeObj.parameters || {}; setFunctionParams( properties ? Object.keys(properties).map((key: string, index: number) => { return { id: `${index}`, name: key, type: properties[key].type, description: properties[key].description, }; }) : [], ); setExamples( parseModeObj.examples ? parseModeObj.examples.map((item: string, index: number) => ({ id: index, question: item, })) : [], ); } }, [detail]); const layout = { labelCol: { span: 4 }, wrapperCol: { span: 20 }, }; const getFunctionParam = (description: string) => { return { name: functionName, description, parameters: { type: 'object', properties: functionParams .filter((param) => !!param.name?.trim()) .reduce((acc, cur) => { acc[cur.name || ''] = { type: cur.type, description: cur.description, }; return acc; }, {}), required: functionParams.filter((param) => !!param.name?.trim()).map((param) => param.name), }, examples: examples .filter((example) => !!example.question?.trim()) .map((example) => example.question), }; }; const onOk = async () => { const values = await form.validateFields(); setConfirmLoading(true); let paramOptions = isArray(filters) ? filters?.filter( (filter) => typeof filter === 'object' && (filter.paramType !== null || filter.value != null), ) : []; paramOptions = paramOptions.concat([ { paramType: ParamTypeEnum.FORWARD, key: 'height', value: values.height || undefined, }, ]); const config = { url: values.url, paramOptions, }; await savePlugin({ ...values, id: detail?.id, modelList: isArray(values.modelList) ? values.modelList : [values.modelList], config: JSON.stringify(config), parseModeConfig: JSON.stringify(getFunctionParam(values.pattern)), }); setConfirmLoading(false); onSubmit(values); message.success(detail?.id ? '编辑成功' : '新建成功'); }; const updateDimensionList = async (value: number) => { if (modelDimensionList[value]) { return; } const res = await getDimensionList(value); setModelDimensionList({ ...modelDimensionList, [value]: res.data.list }); }; return (
{ setFunctionName(e.target.value); }} placeholder="请输入函数名称,只能包含因为字母和下划线" allowClear />