/* * @Author: 赵伟 * @Date: 2024-04-16 13:58:08 * @Description: 模型部署列表 */ import CommonTableCell from '@/components/CommonTableCell'; import DateTableCell from '@/components/DateTableCell'; import KFIcon from '@/components/KFIcon'; import PageTitle from '@/components/PageTitle'; import { ModelDeploymentStatus, modelDeploymentStatusOptions } from '@/enums'; import { useCacheState } from '@/hooks/pageCacheState'; import { deleteModelDeploymentReq, getModelDeploymentListReq, stopModelDeploymentReq, } from '@/services/modelDeployment'; import themes from '@/styles/theme.less'; import { to } from '@/utils/promise'; import { modelDeploymentInfoKey, setSessionStorageItem } from '@/utils/sessionStorage'; import { modalConfirm } from '@/utils/ui'; import { useNavigate } from '@umijs/max'; import { App, Button, ConfigProvider, Input, Select, Table, type TablePaginationConfig, type TableProps, } from 'antd'; import { type SearchProps } from 'antd/es/input'; import classNames from 'classnames'; import { pick } from 'lodash'; import { useEffect, useState } from 'react'; import ModelDeploymentStatusCell from '../components/ModelDeployStatusCell'; import { ModelDeploymentData, ModelDeploymentOperationType } from '../types'; import styles from './index.less'; function ModelDeployment() { const navigate = useNavigate(); const { message } = App.useApp(); const [cacheState, setCacheState] = useCacheState(); const [searchStatus, setSearchStatus] = useState(cacheState?.searchStatus ?? ''); const [searchText, setSearchText] = useState(cacheState?.searchText); const [inputText, setInputText] = useState(cacheState?.searchText); const [tableData, setTableData] = useState([]); const [total, setTotal] = useState(0); const [pagination, setPagination] = useState( cacheState?.pagination ?? { current: 1, pageSize: 10, }, ); useEffect(() => { getModelDeploymentList(); }, [pagination, searchText, searchStatus]); // 获取模型部署列表 const getModelDeploymentList = async () => { const params: Record = { page: pagination.current!, size: pagination.pageSize, service_name: searchText, status: searchStatus, }; const [res] = await to(getModelDeploymentListReq(params)); if (res && res.data) { const { service_list = [], total = 0 } = res.data; setTableData(service_list); setTotal(total); } }; // 删除模型部署 const deleteModelDeploy = async (record: ModelDeploymentData) => { const params = pick(record, ['service_id', 'service_ins_id']); const [res] = await to(deleteModelDeploymentReq(params)); if (res) { message.success('删除成功'); // 如果是一页的唯一数据,删除时,请求第一页的数据 // 否则直接刷新这一页的数据 // 避免回到第一页 if (tableData.length > 1) { setPagination((prev) => ({ ...prev, current: 1, })); } else { getModelDeploymentList(); } } }; // 停止模型部署 const stopModelDeploy = async (record: ModelDeploymentData) => { const params = pick(record, ['service_id', 'service_ins_id']); const [res] = await to(stopModelDeploymentReq(params)); if (res) { message.success('操作成功'); getModelDeploymentList(); } }; // 搜索 const onSearch: SearchProps['onSearch'] = (value) => { setSearchText(value); }; // 处理删除 const handleModelDeployDelete = (record: ModelDeploymentData) => { modalConfirm({ title: '删除后,该模型部署将不可恢复', content: '是否确认删除?', onOk: () => { deleteModelDeploy(record); }, }); }; // 处理停止 const handleModelDeployStop = async (record: ModelDeploymentData) => { modalConfirm({ content: '是否确认停止?', onOk: () => { stopModelDeploy(record); }, }); }; // 创建、更新、重启模型部署 const createModelDeployment = ( type: ModelDeploymentOperationType, record?: ModelDeploymentData, ) => { setSessionStorageItem( modelDeploymentInfoKey, { ...record, operationType: type, }, true, ); setCacheState({ pagination, searchText, searchStatus, }); navigate(`/modelDeployment/create`); }; // 查看详情 const toDetail = (record: ModelDeploymentData) => { setSessionStorageItem(modelDeploymentInfoKey, record, true); setCacheState({ pagination, searchText, searchStatus, }); navigate(`/modelDeployment/info/${record.service_id}`); }; // 分页切换 const handleTableChange: TableProps['onChange'] = (pagination, _filters, _sorter, { action }) => { if (action === 'paginate') { setPagination(pagination); } // console.log(pagination, filters, sorter, action); }; const columns: TableProps['columns'] = [ { title: '序号', dataIndex: 'index', key: 'index', width: '20%', render(_text, _record, index) { return {(pagination.current! - 1) * pagination.pageSize! + index + 1}; }, }, { title: '服务名称', dataIndex: 'service_name', key: 'service_name', width: '20%', render: (text, record) => { return ( toDetail(record)}> {text} ); }, }, { title: '模型', dataIndex: ['model', 'show_value'], key: 'model', width: '20%', render: CommonTableCell(), }, { title: '状态', dataIndex: 'status', key: 'status', width: '20%', render: ModelDeploymentStatusCell, }, { title: '创建人', dataIndex: 'created_by', key: 'created_by', render: CommonTableCell(), width: '20%', }, { title: '更新时间', dataIndex: 'update_time', key: 'update_time', width: '20%', render: DateTableCell, }, { title: '操作', dataIndex: 'operation', width: 250, key: 'operation', render: (_: any, record: ModelDeploymentData) => (
{(record.status === ModelDeploymentStatus.Failed || record.status === ModelDeploymentStatus.Stopped) && ( )} {(record.status === ModelDeploymentStatus.Running || record.status === ModelDeploymentStatus.Init || record.status === ModelDeploymentStatus.Pending) && ( )}
), }, ]; return (
setInputText(e.target.value)} style={{ width: 300 }} value={inputText} allowClear />
`共${total}条`, }} onChange={handleTableChange} rowKey="service_id" /> ); } export default ModelDeployment;