/* * @Author: 赵伟 * @Date: 2024-04-16 13:58:08 * @Description: 创建服务版本 */ import PageTitle from '@/components/PageTitle'; import ParameterSelect from '@/components/ParameterSelect'; import ResourceSelect, { ResourceSelectorType, requiredValidator, type ParameterInputObject, } from '@/components/ResourceSelect'; import SubAreaTitle from '@/components/SubAreaTitle'; import { createServiceVersionReq, getServiceInfoReq, updateServiceVersionReq, } from '@/services/modelDeployment'; import { changePropertyName } from '@/utils'; import { to } from '@/utils/promise'; import SessionStorage from '@/utils/sessionStorage'; import { removeFormListItem } from '@/utils/ui'; import { MinusCircleOutlined, PlusCircleOutlined, PlusOutlined } from '@ant-design/icons'; import { useNavigate, useParams } from '@umijs/max'; import { App, Button, Col, Flex, Form, Input, InputNumber, Row } from 'antd'; import { omit, pick } from 'lodash'; import { useEffect, useState } from 'react'; import { CreateServiceVersionFrom, ServiceOperationType, ServiceVersionData } from '../types'; import styles from './index.less'; // 表单数据 export type FormData = { service_name: string; // 服务名称 version: string; // 服务版本 description: string; // 描述 model: ParameterInputObject; // 模型 image: ParameterInputObject; // 镜像 // code_config: ParameterInputObject; // 代码 resource: string; // 资源规格 replicas: string; // 副本数量 mount_path: string; // 模型路径 env_variables: { key: string; value: string }[]; // 环境变量 }; type ServiceVersionCache = ServiceVersionData & { operationType: ServiceOperationType; lastPage: CreateServiceVersionFrom; }; // 参数表单数据 export type FormEnvVariable = { key: string; // 参数名 value: string; // 参数值 }; function CreateServiceVersion() { const navigate = useNavigate(); const [form] = Form.useForm(); const [operationType, setOperationType] = useState(ServiceOperationType.Create); const [lastPage, setLastPage] = useState(CreateServiceVersionFrom.ServiceInfo); const { message } = App.useApp(); const [versionInfo, setVersionInfo] = useState(undefined); const params = useParams(); const serviceId = params.serviceId; // 因为没有服务版本详情接口,需要从缓存中获取 useEffect(() => { const res: ServiceVersionCache | undefined = SessionStorage.getItem( SessionStorage.serviceVersionInfoKey, true, ); if (res) { setOperationType(res.operationType); setLastPage(res.lastPage); setVersionInfo(res); let model, envVariables; // 模型 if (res.model && typeof res.model === 'object') { model = changePropertyName(res.model, { show_value: 'showValue' }); // 接口返回是数据没有 value 值,但是 form 需要 value model.value = model.showValue; } // 环境变量 if (res.env_variables && typeof res.env_variables === 'object') { envVariables = Object.entries(res.env_variables).map(([key, value]) => ({ key, value, })); } const formData = { ...omit(res, 'model', 'env_variables'), model: model, env_variables: envVariables, }; form.setFieldsValue(formData); } return () => { SessionStorage.removeItem(SessionStorage.serviceVersionInfoKey); }; }, [form]); useEffect(() => { // 获取服务详情,设置服务名称 const getServiceInfo = async () => { const [res] = await to(getServiceInfoReq(serviceId)); if (res && res.data) { form.setFieldsValue({ service_name: res.data.service_name, }); } }; getServiceInfo(); }, [serviceId, form]); // 创建版本 const createServiceVersion = async (formData: FormData) => { const envList = formData['env_variables']; const model = formData['model']; const envVariables = envList?.reduce((acc, cur) => { acc[cur.key] = cur.value; return acc; }, {} as Record); // 根据后台要求,修改表单数据 const object = { ...omit(formData, ['replicas', 'env_variables', 'model']), replicas: Number(formData.replicas), env_variables: envVariables, model: changePropertyName( pick(model, ['id', 'name', 'version', 'path', 'identifier', 'owner', 'showValue']), { showValue: 'show_value' }, ), service_id: serviceId, }; const params = operationType === ServiceOperationType.Create ? { ...object, deploy_type: 'web', } : { id: versionInfo?.id, rerun: operationType === ServiceOperationType.Restart ? true : false, deployment_name: versionInfo?.deployment_name, ...object, }; const request = operationType === ServiceOperationType.Create ? createServiceVersionReq : updateServiceVersionReq; const [res] = await to(request(params)); if (res) { message.success('操作成功'); if (lastPage === CreateServiceVersionFrom.ServiceInfo) { navigate(-1); } else { navigate(`/dataset/modelDeployment/serviceInfo/${serviceId}`, { replace: true }); } } }; // 提交 const handleSubmit = (values: FormData) => { createServiceVersion(values); }; // 取消 const cancel = () => { navigate(-1); }; const disabled = operationType !== ServiceOperationType.Create; let buttonText = '新建'; let title = '新增服务版本'; if (operationType === ServiceOperationType.Update) { title = '更新服务版本'; buttonText = '更新'; } else if (operationType === ServiceOperationType.Restart) { title = '重启服务版本'; buttonText = '重启'; } return (
{/* */} {(fields, { add, remove }) => ( <> {fields.map(({ key, name, ...restField }, index) => ( { if (!value) { return Promise.reject(new Error('请输入变量名')); } if (!/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value)) { return Promise.reject( new Error( '变量名只支持字母、数字、下划线、中横线并且必须以字母或下划线开头', ), ); } // 判断不能重名 const list = form .getFieldValue('env_variables') .filter( (item: FormEnvVariable | undefined) => item !== undefined && item !== null, ); const names = list.map((item: FormEnvVariable) => item.key); if (new Set(names).size !== names.length) { return Promise.reject(new Error('名称不能重复')); } return Promise.resolve(); }, }, ]} > = {index === fields.length - 1 && ( )} ))} {fields.length === 0 && ( )} )}
); } export default CreateServiceVersion;