You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

246 lines
7.2 KiB
TypeScript

/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-30 10:02:29
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-07-22 11:40:49
* @FilePath: \general-ai-platform-web\src\pages\Business\DeviceGroup\components\modelSetting.tsx
* @Description: 业务模型部署
* @交互说明
* 1、业务模型部署列表的分页展示
* 2、配置参数功能
*/
import TableActionCard from '@/components/TableActionCard';
import { apiEntityNodesDeviceModels } from '@/services/business/entity';
import { isSuccessApi } from '@/utils/forApi';
import type { ProColumns } from '@ant-design/pro-components';
import { ProList, ProTable } from '@ant-design/pro-components';
import { FormattedMessage } from '@umijs/max';
import { Button } from 'antd';
import { proTableDefaultOptions } from '../../../../../config/defaultTable';
import { useEffect, useState } from 'react';
// import CreateForm from './components/createForm';
import CreateModelParams from './createModelParams';
type ModelSettingProps = {
info: Record<string, any>;
commInfo: Record<string, any>;
nodeInfo: Record<string, any>;
};
const ModelSetting: React.FC<ModelSettingProps> = (props) => {
/**state */
const [modelData, setModelData] = useState<Record<string, any>[]>([]); // 列表数据
// const intl = useIntl();
const [createModalOpen, setCreateModalOpen] = useState<boolean>(false);
// const [categoryFkIdIds, setCategoryFkIdIds] = useState([]);
// 动态设置每页数量
const [currentRow, setCurrentRow] = useState<Record<string, any>>({});
/**配置参数 */
const handleCreateModal = () => {
setCreateModalOpen(!createModalOpen);
};
// 业务模型列表信息
const columns: ProColumns<Record<string, any>>[] = [
{
title: <FormattedMessage id="base_model.table.list.name" defaultMessage="基础模型名称" />,
dataIndex: 'model_name',
hideInSearch: true,
key: 'fixedName',
fixed: 'left',
width: '30%',
},
{
title: <FormattedMessage id="base_model.table.list.version" defaultMessage="版本" />,
dataIndex: 'model_version',
hideInSearch: true,
width: '20%',
},
{
title: (
<FormattedMessage id="base_model.table.list.runtimeLibFile" defaultMessage="运行库镜像" />
),
dataIndex: 'model_hub_image',
hideInSearch: true,
render: (dom, record) => {
return (
<div>
{record.model_hub_image ? (
dom
) : (
<div className={`gn_list_type_tag flex items-center justify-center active2`}>
<span className="dot"></span>
<span>
<FormattedMessage
id="base_model.table.list.undeployed.runtimeLibFile"
defaultMessage="未部署"
/>
</span>
</div>
)}
</div>
);
},
},
{
title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="操作" />,
dataIndex: 'option',
valueType: 'option',
fixed: 'right',
key: 'option',
render: (_, record) => [
<TableActionCard
key="TableActionCardRef"
renderActions={[
{
key: 'setConfig',
renderDom: (
<Button
key="setConfig"
type="link"
size="small"
onClick={() => {
setCurrentRow({
...record,
base_model_id: record.model_id,
busi_model_id: record?.parentInfo?.busi_model_id,
});
handleCreateModal();
}}
>
<FormattedMessage
id="base_model.table.list.action.config"
defaultMessage="配置参数"
/>
</Button>
),
},
]}
></TableActionCard>,
],
},
];
// 将数据组装成reactDom
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function toListDomByData(record) {
let startList = [...record];
let finalList = startList.map((item) => ({
content: (
<div>
<div className="gn_list_card_title pb-[12px]">
<span></span>
<span>{item?.busi_model_name}</span>
</div>
<ProTable
{...proTableDefaultOptions}
className="gn_pro_table mb-[16px]"
// headerTitle={
// <div>
// <span></span>
// <span>{item.name}</span>
// </div>
// }
cardProps={{
bodyStyle: { padding: 0, margin: 0 },
}}
// 标题栏
search={false}
options={{ fullScreen: false, setting: false, density: false, reload: false }}
rowKey="model_id"
onDataSourceChange={(data) => {
console.log(data, 'onDataSourceChange_data');
}}
pagination={false}
columnsState={{
persistenceKey: 'algorithm_model_list',
persistenceType: 'localStorage',
}}
dataSource={item.base_models.map((baseModelItem) => {
const { base_models, ...restInfo } = item;
console.log(base_models, 'base_models');
baseModelItem.parentInfo = restInfo;
return baseModelItem;
})}
columns={columns}
/>
</div>
),
}));
setModelData(finalList);
console.log(finalList, 'toListDomByData_finalList');
}
// api
async function fetchData() {
const resp = await apiEntityNodesDeviceModels({
pageNo: 1,
pageSize: 100,
device_id: props.info.device_id,
});
if (isSuccessApi(resp)) {
toListDomByData(resp.data.data);
}
}
function reloadList() {
fetchData();
}
//
useEffect(() => {
console.log(props.info, 'useEffect_info');
fetchData();
}, [props.info]);
return (
<div className="dg_modelSetting_page">
<ProList<{ title: string }>
{...proTableDefaultOptions}
itemLayout="vertical"
itemCardProps={{
ghost: true,
bodyStyle: { padding: 0, margin: 0 },
style: {
width: '100%',
border: 0,
},
}}
cardProps={{
style: { padding: 0, margin: 0 }, // 设置卡片的内外边距为 0
bodyStyle: {
padding: 0,
margin: 0,
height: 'calc(100vh - 420px)',
overflow: 'scroll',
},
}}
rowKey="model_id"
dataSource={modelData}
pagination={false}
rowSelection={false}
metas={{
content: {
style: { margin: 0, padding: 0 },
},
}}
/>
<CreateModelParams
createModalOpen={createModalOpen}
handleModal={handleCreateModal}
info={currentRow}
deviceInfo={props.info}
commInfo={props.commInfo}
nodeInfo={props.nodeInfo}
reload={reloadList}
/>
</div>
);
};
export default ModelSetting;