import editExperimentIcon from '@/assets/img/edit-experiment.png'; import KFModal from '@/components/KFModal'; import { DataSource, ResourceType, ResourceVersionData, resourceConfig, type ResourceData, } from '@/pages/Dataset/config'; import { to } from '@/utils/promise'; import { InfoCircleOutlined } from '@ant-design/icons'; import { Form, Input, ModalProps, Select } from 'antd'; import { pick } from 'lodash'; import { useEffect, useState } from 'react'; import styles from './index.less'; type FormData = { id: number; version: string; version_desc: string; }; interface ExportModelModalProps extends Omit { resourceType: ResourceType; pipelineId: number; // 流水线 id experimentId: number; // 实验 id experimentName: string; // 实验 name experimentInsId: number; // 实验实例 id pipelineNodeId: string; // 流水线节点 id path: string; // 文件路径 onOk: () => void; } function ExportModelModal({ resourceType, pipelineId, experimentId, experimentName, experimentInsId, pipelineNodeId, path, onOk, ...rest }: ExportModelModalProps) { const [form] = Form.useForm(); const [resources, setResources] = useState([]); const [versions, setVersions] = useState([]); const config = resourceConfig[resourceType]; const layout = { labelCol: { span: 24 }, wrapperCol: { span: 24 }, }; useEffect(() => { // 获取数据集、模型列表 const requestResourceList = async () => { const params = { page: 0, size: 1000, is_public: false, // 个人 }; const [res] = await to(config.getList(params)); if (res && res.data) { setResources(res.data.content || []); } }; requestResourceList(); }, [config]); // 获取选中的数据集、模型 const getSelectedResource = (id: number | undefined) => { if (id) { return resources.find((item) => item.id === id); } return undefined; }; // 版本 tooltip const getTooltip = () => { const id = form.getFieldValue('id'); const resource = getSelectedResource(id); const name = resource?.name ?? ''; const versionNames = versions.map((item: ResourceVersionData) => item.name).join('、'); const tooltip = versions.length > 0 ? `${name}有以下版本:\n${versionNames}\n注意不能重复` : undefined; return tooltip; }; // 处理数据集、模型选择变化 const handleResourceChange = (id: number | undefined) => { if (id) { getRecourceVersions(id); } else { setVersions([]); } }; // 获取数据集、模型版本列表 const getRecourceVersions = async (id: number) => { const resource = getSelectedResource(id); if (!resource) { return; } const [res] = await to(config.getVersions(pick(resource, ['identifier', 'owner']))); if (res && res.data) { setVersions(res.data); } }; // 提交 const hanldeFinish = (formData: FormData) => { exportToResource(formData); }; // 导出到数据集、模型 const exportToResource = async (formData: FormData) => { const id = form.getFieldValue('id'); const resource = getSelectedResource(id); const params = { ...formData, identifier: resource?.identifier, owner: resource?.owner, is_public: resource?.is_public, name: resource?.name, [config.sourceParamKey]: DataSource.HandExport, train_task: { workflow_id: pipelineId, experiment_id: experimentId, name: experimentName, ins_id: experimentInsId, task_id: pipelineNodeId, }, [config.filePropKey]: [ { url: path, }, ], }; const [res] = await to(config.addVersion(params)); if (res) { onOk(); } }; return (
, } : undefined } rules={[ { required: true, message: `请输入${config.name}版本` }, { validator: (_, value) => { if (value && versions.map((item) => item.name).includes(value)) { return Promise.reject(`${config.name}版本已存在`); } else { return Promise.resolve(); } }, }, ]} >
); } export default ExportModelModal;