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

/*
* @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;