import KFModal from '@/components/KFModal'; import { ServiceRunStatus } from '@/enums'; import { useComputingResource } from '@/hooks/resource'; import { type ServiceVersionData } from '@/pages/ModelDeployment/types'; import { getServiceVersionCompareReq } from '@/services/modelDeployment'; import { isEmpty } from '@/utils'; import { to } from '@/utils/promise'; import { Typography, type ModalProps } from 'antd'; import classNames from 'classnames'; import { useEffect, useMemo, useState } from 'react'; import { statusInfo } from '../ModelDeployStatusCell'; import styles from './index.less'; type CompareData = { differences: Record; version1: ServiceVersionData; version2: ServiceVersionData; }; type ServiceVersionDataKey = keyof ServiceVersionData; type FiledType = { key: ServiceVersionDataKey; text: string; format?: (data: any) => any; }; interface VersionCompareModalProps extends Omit { version1: string; version2: string; } // 格式化环境变量 const formatEnvText = (env: Record) => { if (!env || Object.keys(env).length === 0) { return '--'; } return Object.entries(env) .map(([key, value]) => `${key} = ${value}`) .join(','); }; function VersionCompareModal({ version1, version2, ...rest }: VersionCompareModalProps) { const [compareData, setCompareData] = useState(undefined); const getResourceDescription = useComputingResource()[2]; const fields: FiledType[] = useMemo( () => [ { key: 'service_name', text: '服务名称', }, { key: 'run_state', text: '状态', format: (data: any) => { return data ? statusInfo[data as ServiceRunStatus].text : '--'; }, }, { key: 'image', text: '镜像', }, { key: 'code_config', text: '代码配置', format: (data: any) => { return data?.show_value; }, }, { key: 'model', text: '模型', format: (data: any) => { return data?.show_value; }, }, { key: 'resource', text: '资源规格', format: getResourceDescription, }, { key: 'replicas', text: '副本数', }, { key: 'mount_path', text: '挂载路径', }, { key: 'url', text: '服务URL', }, { key: 'env_variables', text: '环境变量', format: formatEnvText, }, { key: 'description', text: '描述', }, ], [getResourceDescription], ); useEffect(() => { getServiceVersionCompare(); }, []); // 获取对比数据 const getServiceVersionCompare = async () => { const params = { id1: version1, id2: version2, }; const [res] = await to(getServiceVersionCompareReq(params)); if (res && res.data) { setCompareData(res.data); } }; const { version1: v1 = {} as ServiceVersionData, version2: v2 = {} as ServiceVersionData, differences = {}, } = compareData || {}; const isDifferent = (key: ServiceVersionDataKey) => { const keys = Object.keys(differences); return keys.includes(key); }; return (
基础版本号
{fields.map(({ key, text }) => (
{text}
))}
{v1.version}
{fields.map(({ key, format }) => { const text = format ? format(v1[key]) : v1[key]; return (
{isEmpty(text) ? '--' : text}
); })}
{v2.version}
{fields.map(({ key, format }) => { const text = format ? format(v2[key]) : v2[key]; return (
{isEmpty(text) ? '--' : text}
); })}
); } export default VersionCompareModal;