import React from 'react'; import { Drawer, Descriptions, Tag, Progress, Button, Space } from 'antd'; import { CloudServerOutlined, ThunderboltOutlined, RightOutlined, EyeOutlined, } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import { RACK_STATUS_COLORS } from '../canvas/CanvasConstants'; const statusMap = { active: { text: '在用', color: 'blue' }, maintenance: { text: '维护中', color: 'orange' }, inactive: { text: '停用', color: 'default' }, }; const RackDetailPanel = ({ rack, visible, onClose }) => { const navigate = useNavigate(); if (!rack) return null; const statusInfo = statusMap[rack.status] || { text: rack.status, color: 'default' }; const utilization = rack.utilization != null ? Math.round(rack.utilization * 100) : 0; const powerPercent = rack.maxPower > 0 ? Math.round(((rack.currentPower || 0) / rack.maxPower) * 100) : 0; const handleView3D = () => { navigate('/visualization-3d', { state: { rackId: rack.rackId } }); }; const handleViewDevices = () => { navigate('/devices', { state: { rackId: rack.rackId } }); }; return ( {rack.name} } placement="right" width={360} open={visible} onClose={onClose} extra={ } > {rack.rackId} {statusInfo.text} {rack.rowPos != null && rack.colPos != null ? `第${rack.rowPos + 1}排 第${rack.colPos + 1}列` : '未分配'} {rack.facing || 'front'} {rack.height}U {rack.deviceCount || 0} 台
U位使用率
`${rack.usedU || 0}/${rack.totalU || rack.height || 0}U`} />
功率
`${rack.currentPower || 0}/${rack.maxPower || 0}W`} />
); }; export default RackDetailPanel;