/* * @Author: 赵伟 * @Date: 2024-04-16 13:58:08 * @Description: 创建服务版本 */ import CodeSelect from '@/components/CodeSelect'; import PageTitle from '@/components/PageTitle'; import ResourceSelect, { ResourceSelectorType, requiredValidator, type ParameterInputObject, } from '@/components/ResourceSelect'; import SubAreaTitle from '@/components/SubAreaTitle'; import { useComputingResource } from '@/hooks/resource'; import { createServiceVersionReq, getServiceInfoReq, updateServiceVersionReq, } from '@/services/modelDeployment'; import { changePropertyName } from '@/utils'; import { to } from '@/utils/promise'; import SessionStorage from '@/utils/sessionStorage'; import { modalConfirm } 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, Select } 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; }; function CreateServiceVersion() { const navigate = useNavigate(); const [form] = Form.useForm(); const [resourceStandardList, filterResourceStandard] = useComputingResource(); const [operationType, setOperationType] = useState(ServiceOperationType.Create); const [lastPage, setLastPage] = useState(CreateServiceVersionFrom.ServiceInfo); const { message } = App.useApp(); // const [serviceInfo, setServiceInfo] = useState(undefined); 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, codeConfig, envVariables; if (res.model && typeof res.model === 'object') { model = changePropertyName(res.model, { show_value: 'showValue' }); // 接口返回是数据没有 value 值,但是 form 需要 value model.value = model.showValue; } if (res.code_config && typeof res.code_config === 'object') { codeConfig = changePropertyName(res.code_config, { show_value: 'showValue' }); // 接口返回是数据没有 value 值,但是 form 需要 value codeConfig.value = codeConfig.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', 'code_config', 'env_variables'), model: model, code_config: codeConfig, env_variables: envVariables, }; form.setFieldsValue(formData); } return () => { SessionStorage.removeItem(SessionStorage.serviceVersionInfoKey); }; }, []); useEffect(() => { getServiceInfo(); }, []); // 获取服务详情 const getServiceInfo = async () => { const [res] = await to(getServiceInfoReq(serviceId)); if (res && res.data) { // setServiceInfo(res.data); form.setFieldsValue({ service_name: res.data.service_name, }); } }; // 创建版本 const createServiceVersion = async (formData: FormData) => { const envList = formData['env_variables']; const image = formData['image']; const model = formData['model']; const codeConfig = formData['code_config']; const envVariables = envList?.reduce((acc, cur) => { acc[cur.key] = cur.value; return acc; }, {} as Record); // 根据后台要求,修改表单数据 const object = { ...omit(formData, ['replicas', 'env_variables', 'image', 'model', 'code_config']), replicas: Number(formData.replicas), env_variables: envVariables, image: image.value, model: changePropertyName( pick(model, ['id', 'name', 'version', 'path', 'identifier', 'owner', 'showValue']), { showValue: 'show_value' }, ), code_config: codeConfig ? changePropertyName(pick(codeConfig, ['code_path', 'branch', 'showValue']), { showValue: 'show_value', }) : undefined, 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(`/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) => ( = {index === fields.length - 1 && ( )} ))} {fields.length === 0 && ( )} )}
); } export default CreateServiceVersion;