import React, { useState } from 'react'; import { Button, Table, Space, Form, Input, Select, message, Modal, Card, Row, Col, Typography, Badge } from 'antd'; import { useQuery } from '@tanstack/react-query'; import dayjs from 'dayjs'; import 'dayjs/locale/zh-cn'; import type { ZichanInfo, RackInfo, RackServer } from '../share/monitorTypes.ts'; import { ServerType, ServerTypeNameMap } from '../share/monitorTypes.ts'; import { EnableStatus } from '../share/types.ts' import { RackAPI, RackServerAPI , ZichanAPI} from './api/index.ts'; const { Title } = Typography; // 机柜服务器管理页面 export const RackServerPage = () => { const [form] = Form.useForm(); const [formMode, setFormMode] = useState<'create' | 'edit'>('create'); const [editingId, setEditingId] = useState(null); const [modalVisible, setModalVisible] = useState(false); const [isLoading, setIsLoading] = useState(false); const [searchParams, setSearchParams] = useState({ page: 1, limit: 10, rack_id: undefined as number | undefined, server_type: undefined as string | undefined }); // 获取机柜列表用于下拉选择 const { data: rackOptions = [] } = useQuery({ queryKey: ['rackOptions'], queryFn: async () => { try { const response = await RackAPI.getRackList({ limit: 100 }); return response.data.map((rack: RackInfo) => ({ label: `${rack.rack_name || ''} (${rack.rack_code || ''})`, value: rack.id })); } catch (error) { console.error('获取机柜列表失败:', error); return []; } } }); // 获取资产列表用于下拉选择 const { data: assetOptions = [] } = useQuery({ queryKey: ['assetOptions'], queryFn: async () => { try { const response = await ZichanAPI.getZichanList({ limit: 100 }); return response.data.map((asset: ZichanInfo) => ({ label: `${asset.asset_name || ''} (ID:${asset.id})`, value: asset.id })); } catch (error) { console.error('获取资产列表失败:', error); return []; } } }); // 服务器类型选项 const serverTypeOptions = [ { label: ServerTypeNameMap[ServerType.STANDARD], value: ServerType.STANDARD }, { label: ServerTypeNameMap[ServerType.NETWORK], value: ServerType.NETWORK }, { label: ServerTypeNameMap[ServerType.STORAGE], value: ServerType.STORAGE }, { label: ServerTypeNameMap[ServerType.SPECIAL], value: ServerType.SPECIAL } ]; // 查询机柜服务器列表 const { data: rackServerResult = { data: [], pagination: { total: 0, current: 1, pageSize: 10 } }, isLoading: isFetching, refetch } = useQuery({ queryKey: ['rackServers', searchParams], queryFn: () => RackServerAPI.getRackServerList(searchParams), }); // 提取数据和分页信息 const rackServerList = rackServerResult.data || []; const pagination = rackServerResult.pagination || { total: 0, current: 1, pageSize: 10 }; // 处理表单提交 const handleSubmit = async (values: Partial) => { try { setIsLoading(true); if (formMode === 'create') { await RackServerAPI.createRackServer(values); message.success('机柜服务器创建成功'); } else { if (editingId) { await RackServerAPI.updateRackServer(editingId, values); message.success('机柜服务器更新成功'); } } setModalVisible(false); refetch(); } catch (error: any) { message.error(error.response?.data?.error || '操作失败'); } finally { setIsLoading(false); } }; // 处理编辑 const handleEdit = async (id: number) => { try { setIsLoading(true); const data = await RackServerAPI.getRackServer(id); form.setFieldsValue(data); setEditingId(id); setFormMode('edit'); setModalVisible(true); } catch (error: any) { message.error(error.response?.data?.error || '获取机柜服务器详情失败'); } finally { setIsLoading(false); } }; // 处理删除 const handleDelete = async (id: number) => { try { await RackServerAPI.deleteRackServer(id); message.success('机柜服务器删除成功'); refetch(); } catch (error: any) { message.error(error.response?.data?.error || '删除机柜服务器失败'); } }; // 处理搜索 const handleSearch = (values: any) => { setSearchParams({ ...searchParams, page: 1, // 重置为第一页 rack_id: values.rack_id, server_type: values.server_type }); }; // 处理页码变化 const handlePageChange = (page: number, pageSize?: number) => { setSearchParams({ ...searchParams, page, limit: pageSize || 10 }); }; // 处理新增 const handleAdd = () => { form.resetFields(); setFormMode('create'); setEditingId(null); setModalVisible(true); }; // 表格列定义 const columns = [ { title: 'ID', dataIndex: 'id', key: 'id', width: 60 }, { title: '机柜', dataIndex: 'rack_id', key: 'rack_id', render: (rackId: number) => { const rack = rackOptions.find((r: any) => r.value === rackId); return rack ? rack.label : `ID:${rackId}`; } }, { title: '资产', dataIndex: 'asset_id', key: 'asset_id', render: (assetId: number) => { const asset = assetOptions.find((a: any) => a.value === assetId); return asset ? asset.label : `ID:${assetId}`; } }, { title: '起始U位', dataIndex: 'start_position', key: 'start_position' }, { title: '占用U数', dataIndex: 'size', key: 'size' }, { title: '服务器类型', dataIndex: 'server_type', key: 'server_type', render: (type: ServerType) => ServerTypeNameMap[type] || '未知类型' }, { title: '状态', dataIndex: 'is_disabled', key: 'is_disabled', render: (status: EnableStatus) => ( ) }, { title: '创建时间', dataIndex: 'created_at', key: 'created_at', render: (date: string) => date ? dayjs(date).format('YYYY-MM-DD HH:mm:ss') : '-' }, { title: '操作', key: 'action', width: 200, render: (_: any, record: RackServer) => ( ) } ]; return (
机柜服务器管理
`共 ${total} 条记录` }} /> setModalVisible(false)} footer={null} width={700} >
(String(option?.label ?? '')).toLowerCase().includes(input.toLowerCase()) } /> 正常 禁用 ); };