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.

388 lines
12 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* @Author: donghao donghao@supervision.ltd
* @Date: 2024-04-22 15:23:36
* @LastEditors: donghao donghao@supervision.ltd
* @LastEditTime: 2024-06-19 11:42:02
* @FilePath: \general-ai-platform-web\src\pages\Business\DeviceGroup\components\deviceList.tsx
* @Description: 设备节点设置 关键词 deviceGroupdg
* @交互说明
* 1、设备列表分页展示、新建、编辑、删除
* 2、基础模型配置参数配置
* 3、设备分类分类标记不可删除
* 待定:
* 是否需要编辑
*/
import InnerPageBack from '@/components/Back/innerPageBack';
import TableActionCard from '@/components/TableActionCard';
import {
apiDeviceClassification,
apiDeviceClassificationAdd,
apiDeviceClassificationDelete,
} from '@/services/business/device';
import {
apiEntityNodesDeviceDelete,
apiEntityNodesDeviceInfo,
apiEntityNodesDeviceList,
} from '@/services/business/entity';
import { isSuccessApi } from '@/utils/forApi';
import { ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, message } from 'antd';
import React, { useEffect, useRef, useState } from 'react';
import { proTablePaginationOptions } from '../../../../../config/defaultTable';
import CategorizeUpdate from '@/components/CategorizeUpdate';
import IsDelete from '@/components/TableActionCard/isDelete';
import CreateDeviceForm from './createDeviceForm';
import UpdateDeviceForm from './updateDeviceForm';
import ModelSetting from './modelSetting';
type DeviceListProps = {
commInfo: Record<string, any>;
nodeInfo: Record<string, any>;
};
const DeviceList: React.FC<DeviceListProps> = (props) => {
/**state */
const access = useAccess();
// eslint-disable-next-line react-hooks/rules-of-hooks
const intl = useIntl();
const actionRef = useRef<ActionType>();
const [createModalOpen, setCreateModalOpen] = useState<boolean>(false);
const [updateModalOpen, setUpdateModalOpen] = useState<boolean>(false); // 编辑窗口是否打开
const [currentRow, setCurrentRow] = useState<Record<string, any>>({});
// 动态设置每页数量
const [currentPageSize, setCurrentPageSize] = useState<number>(10);
// 设置分类
const [deviceTypeOpen, setDeviceTypeOpen] = useState<boolean>(false);
// 设置行业类别
const handleSetDeviceType = () => {
setDeviceTypeOpen(!deviceTypeOpen);
};
// 基础模型设置 isSettingOpen
const [isSettingOpen, setIsSettingOpen] = useState<boolean>(false);
/**新增 编辑 删除 */
// 新增
const handleCreateModal = () => {
setCreateModalOpen(!createModalOpen);
};
// 编辑
const handleUpdateModal = () => {
setUpdateModalOpen(!updateModalOpen);
};
// 设备节点信息
async function loadDetail(record) {
const resp = await apiEntityNodesDeviceInfo({ device_id: record?.id });
if (isSuccessApi(resp) && resp?.data) {
setCurrentRow({ ...resp?.data, device_id: record?.id });
}
}
function reloadList() {
actionRef.current?.reload();
}
// 筛选查询
useEffect(() => {
if (actionRef && props?.nodeInfo) {
reloadList();
setIsSettingOpen(false);
}
}, [actionRef, props.nodeInfo]);
const columns: ProColumns<Record<string, any>>[] = [
{
title: <FormattedMessage id="device_group_list.table.list.name" defaultMessage="设备名称" />,
dataIndex: 'name',
hideInSearch: true,
// width: 80,
// key: 'fixedName',
// fixed: 'left',
},
{
title: (
<FormattedMessage id="device_group_list.table.list.deviceType" defaultMessage="设备类型" />
),
dataIndex: 'classification',
hideInSearch: true,
// width: 120,
},
// TODO 待定模型部署使用什么字段
{
title: (
<FormattedMessage id="device_group_list.table.list.isEnable" defaultMessage="模型部署" />
),
dataIndex: 'isEnable',
hideInSearch: true,
// width: 80,
render: (dom, record) => {
return (
<div
className={`gn_list_type_tag flex items-center justify-center ${
record.isEnable ? 'active1' : 'active2'
}`}
>
<span className="dot"></span>
<span>
{record.isEnable ? (
<FormattedMessage
id="device_group_list.table.list.deployed.isEnable"
defaultMessage="已部署"
/>
) : (
<FormattedMessage
id="device_group_list.table.list.undeployed.isEnable"
defaultMessage="未部署"
/>
)}
</span>
</div>
);
},
},
{
title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="操作" />,
dataIndex: 'option',
valueType: 'option',
fixed: 'right',
key: 'option',
render: (_, record) => [
<TableActionCard
key="TableActionCardRef"
renderActions={[
{
key: 'setModel',
renderDom: (
<Button
key="setModel"
type="link"
size="small"
onClick={() => {
setCurrentRow({ ...record, device_id: record.id });
setIsSettingOpen(true);
}}
>
<FormattedMessage
id="device_group_list.table.list.action.setModel"
defaultMessage="基础模型配置"
/>
</Button>
),
},
{
key: 'updateDetail',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
loadDetail(record);
setUpdateModalOpen(true);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="编辑" />
</Button>
),
},
{
key: 'destroy',
renderDom: (
<IsDelete
deleteApi={() => {
console.log('删除成功');
apiEntityNodesDeviceDelete({ device_id: record.id }).then(() => {
message.success(
intl.formatMessage({
id: 'common.action.success',
defaultMessage: '$$$',
}),
);
reloadList();
});
}}
></IsDelete>
),
},
]}
></TableActionCard>,
],
},
];
/**设备分类 */
return (
<div className="dg_deviceList_wrap">
<ProTable
style={{
display: isSettingOpen ? 'none' : 'block',
}}
className="gn_pro_table"
cardProps={{
bodyStyle: { padding: 0 },
}}
//
toolBarRender={() => [
<Access
accessible={access.canUpdate(history.location.pathname)}
key={`${history.location.pathname}-add`}
>
<div className="mb-[16px] ">
<Button
className="mr-[12px]"
type="primary"
key="add"
onClick={() => {
setCreateModalOpen(true);
}}
>
<FormattedMessage
id="device_group_list.table.list.action.new"
defaultMessage="新建"
/>
</Button>
<Button
key="deviceType"
onClick={() => {
handleSetDeviceType();
}}
>
<FormattedMessage
id="device_group_list.table.list.action.deviceType"
defaultMessage="设备分类"
/>
</Button>
</div>
</Access>,
]}
search={false}
// scroll={{ y: proTableCommonOptions.commscrollY, x: proTableCommonOptions.commscrollX }}
options={{ fullScreen: false, setting: false, density: false, reload: false }}
actionRef={actionRef}
rowKey="id"
onDataSourceChange={(data) => {
console.log(data, 'onDataSourceChange_data');
}}
pagination={{
...proTablePaginationOptions,
pageSize: currentPageSize,
onChange: (pageNo, pageSize) => setCurrentPageSize(pageSize),
}}
columnsState={{
persistenceKey: 'algorithm_model_list',
persistenceType: 'localStorage',
}}
request={async (params = {}) => {
const { current, ...rest } = params;
const reqParams = {
pageNo: current,
node_id: props.nodeInfo.id,
...rest,
};
if (!reqParams.node_id) {
return { data: [], success: true };
}
let resp = await apiEntityNodesDeviceList({ ...reqParams });
console.log(resp, 'apiEntityNodesDeviceList_resp');
return {
data: resp.data?.data,
success: resp.success,
total: resp.data.count,
current: current,
pageSize: currentPageSize,
};
}}
columns={columns}
/>
{isSettingOpen ? (
<>
<InnerPageBack
backType="custom"
toBack={() => {
setIsSettingOpen(false);
}}
size={16}
title="模型列表"
></InnerPageBack>
<ModelSetting info={currentRow}></ModelSetting>
</>
) : (
<></>
)}
<CreateDeviceForm
createModalOpen={createModalOpen}
handleModal={handleCreateModal}
commInfo={props.commInfo}
nodeInfo={props.nodeInfo}
reload={reloadList}
/>
<UpdateDeviceForm
updateModalOpen={updateModalOpen}
handleModal={handleUpdateModal}
values={currentRow}
commInfo={props.commInfo}
nodeInfo={props.nodeInfo}
reload={reloadList}
/>
<CategorizeUpdate
visible={deviceTypeOpen}
handleModal={handleSetDeviceType}
values={{ deviceType: [{ name: '', value: '' }] }}
apiRequest={async () => {
let resp = await apiDeviceClassification();
return {
data: resp.data,
};
}}
beforeCloseRequest={async (params, successRes) => {
let resp = await apiDeviceClassificationDelete({ id: params.id });
if (isSuccessApi(resp)) {
successRes(resp);
} else {
message.error(resp.meta.message);
}
}}
beforeAddRequest={async (params, successRes) => {
let resp = await apiDeviceClassificationAdd({ name: params });
if (isSuccessApi(resp)) {
successRes(resp);
} else {
message.error(resp.meta.message);
}
}}
modalFormProps={{
categorizeFormProps: {
label: (
<FormattedMessage
id="device_group_list.table.list.action.deviceType"
defaultMessage="设备分类"
/>
),
name: 'deviceType',
},
categorizeModelProps: {
title: intl.formatMessage({
id: 'device_group_list.table.list.action.setDeviceType',
defaultMessage: '新建',
}),
},
}}
/>
</div>
);
};
export default DeviceList;