import React, { useState } from 'react'; import { Button, Table, Space, Form, Input, Select, message, Modal, Card, Row, Col, Typography, Badge } from 'antd'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import axios from 'axios'; import dayjs from 'dayjs'; import 'dayjs/locale/zh-cn'; import type { ZichanInfo, DeviceInstance, DeviceType, } from '../share/monitorTypes.ts'; import { DeviceProtocolType, } from '../share/monitorTypes.ts'; import { EnableStatus, DeleteStatus, } from '../share/types.ts'; import { DeviceInstanceAPI , DeviceTypeAPI, ZichanAPI} from './api/index.ts'; const { Title } = Typography; // 设备管理页面 export const DeviceInstancesPage = () => { const [form] = Form.useForm(); const [formMode, setFormMode] = useState<'create' | 'edit'>('create'); const [modalVisible, setModalVisible] = useState(false); const [selectedId, setSelectedId] = useState(null); const [pagination, setPagination] = useState({ current: 1, pageSize: 10, total: 0 }); // 获取设备列表 const { data, isLoading, refetch } = useQuery({ queryKey: ['deviceInstances', pagination.current, pagination.pageSize], queryFn: async () => { try { const response = await DeviceInstanceAPI.getDeviceInstances({ page: pagination.current, limit: pagination.pageSize }); setPagination(prev => ({ ...prev, total: response.pagination.total })); return response.data; } catch (error) { message.error('获取设备列表失败'); return []; } } }); // 获取设备类型 const { data: deviceTypes = [] } = useQuery({ queryKey: ['deviceTypesAll'], queryFn: async () => { try { const response = await DeviceTypeAPI.getDeviceTypes({ pageSize: 100 }) return response.data; } catch (error) { message.error('获取设备类型失败'); return []; } } }); // 获取可用资产 const { data: zichanList = [] } = useQuery({ queryKey: ['zichanListAll'], queryFn: async () => { try { const response = await ZichanAPI.getZichanList({ limit: 500 }) // 筛选出未分配给设备的资产 const deviceInstances = data || []; const usedAssetIds = deviceInstances.map((d: DeviceInstance) => d.id); return response.data.filter( (z: ZichanInfo) => !usedAssetIds.includes(z.id) ); } catch (error) { message.error('获取可用资产失败'); return []; } } }); const queryClient = useQueryClient(); // 提交表单 const { mutate: submitForm, isPending: isSubmitting } = useMutation({ mutationFn: async (values: Partial) => { const deviceData = { ...values, }; if (formMode === 'create') { return DeviceInstanceAPI.createDeviceInstance(deviceData); } else { return DeviceInstanceAPI.updateDeviceInstance(selectedId!, deviceData); } }, onSuccess: () => { message.success(formMode === 'create' ? '创建成功' : '更新成功'); setModalVisible(false); refetch(); form.resetFields(); }, onError: () => { message.error(formMode === 'create' ? '创建失败' : '更新失败'); } }); // 删除设备 const { mutate: deleteDevice, isPending: isDeleting } = useMutation({ mutationFn: async (id: number) => { return DeviceInstanceAPI.deleteDeviceInstance(id); }, onSuccess: () => { message.success('删除成功'); refetch(); }, onError: () => { message.error('删除失败'); } }); // 处理表单提交 const handleSubmit = (values: Partial) => { submitForm({ ...values, is_enabled: values.is_enabled ?? EnableStatus.ENABLED, is_deleted: DeleteStatus.NOT_DELETED }); }; // 处理编辑 const handleEdit = (record: DeviceInstance) => { setSelectedId(record.id); setFormMode('edit'); form.setFieldsValue({ ...record }); setModalVisible(true); }; // 处理删除 const handleDelete = (id: number) => { Modal.confirm({ title: '确认删除', content: '确定要删除这个设备吗?', okText: '确认', cancelText: '取消', onOk: () => deleteDevice(id) }); }; // 处理添加 const handleAdd = () => { setFormMode('create'); setSelectedId(null); form.resetFields(); setModalVisible(true); }; // 处理页码变化 const handlePageChange = (page: number, pageSize?: number) => { setPagination({ ...pagination, current: page, pageSize: pageSize || pagination.pageSize }); }; const columns = [ { title: 'ID', dataIndex: 'id', key: 'id', width: 80 }, { title: '设备类型', dataIndex: 'type_id', key: 'type_id', render: (typeId: number) => { const deviceType = deviceTypes.find((t: DeviceType) => t.id === typeId); return deviceType ? deviceType.name : `未知类型(${typeId})`; } }, { title: '通信协议', dataIndex: 'protocol', key: 'protocol' }, { title: '通信地址', dataIndex: 'address', key: 'address' }, { title: '采集间隔(秒)', dataIndex: 'collect_interval', key: 'collect_interval' }, { title: '最后采集时间', dataIndex: 'last_collect_time', key: 'last_collect_time', render: (date: string) => date ? dayjs(date).format('YYYY-MM-DD HH:mm:ss') : '-' }, { title: '状态地址', dataIndex: 'status_address', key: 'status_address' }, { title: '连接配置', dataIndex: 'connection_config', key: 'connection_config' }, { title: '状态', dataIndex: 'is_enabled', key: 'is_enabled', render: (status: number) => ( ) }, { title: '操作', key: 'action', render: (_: any, record: DeviceInstance) => ( ) } ]; return (
设备管理 setModalVisible(false)} footer={null} width={700} >
{formMode === 'create' && (
)} ); };