import React, { useState, useEffect, useCallback } from 'react';
import {
Table,
Button,
Space,
Tag,
Tooltip,
Popconfirm,
Empty,
Spin,
Badge,
Collapse,
Card,
} from 'antd';
import {
PlusOutlined,
DeleteOutlined,
ReloadOutlined,
ApiOutlined,
CloudServerOutlined,
FolderOutlined,
} from '@ant-design/icons';
import api from '../api';
import PortCreateModal from './PortCreateModal';
import NetworkCardCreateModal from './NetworkCardCreateModal';
import { designTokens } from '../config/theme';
const { Panel } = Collapse;
function NetworkCardPanel({ deviceId, deviceName, onRefresh, refreshTrigger }) {
const [cards, setCards] = useState([]);
const [networkCards, setNetworkCards] = useState([]);
const [loading, setLoading] = useState(false);
const [createPortModalVisible, setCreatePortModalVisible] = useState(false);
const [createCardModalVisible, setCreateCardModalVisible] = useState(false);
const [selectedCard, setSelectedCard] = useState(null);
const [expandedCards, setExpandedCards] = useState([]);
const fetchData = useCallback(async () => {
if (!deviceId) return;
try {
setLoading(true);
const [cardsResponse, networkCardsResponse] = await Promise.all([
api.get(`/network-cards/device/${deviceId}/with-ports`),
api.get(`/network-cards/device/${deviceId}`),
]);
const cardsData = cardsResponse.data || cardsResponse || [];
setCards(cardsData);
setNetworkCards(networkCardsResponse.data || networkCardsResponse || []);
const initialExpanded = cardsData
.filter(card => card.ports && card.ports.length > 0)
.map(card => card.nicId);
setExpandedCards(initialExpanded);
} catch (error) {
console.error('获取网卡数据失败:', error);
setCards([]);
setNetworkCards([]);
} finally {
setLoading(false);
}
}, [deviceId]);
useEffect(() => {
fetchData();
}, [fetchData, refreshTrigger]);
const handleDeleteCard = useCallback(
async card => {
try {
await api.delete(`/network-cards/${card.nicId}`);
import('antd').then(({ message }) => message.success('网卡删除成功'));
fetchData();
onRefresh?.();
} catch (error) {
import('antd').then(({ message }) =>
message.error(error.response?.data?.error || '网卡删除失败')
);
}
},
[fetchData, onRefresh]
);
const handleDeletePort = useCallback(
async port => {
try {
await api.delete(`/device-ports/${port.portId}`);
import('antd').then(({ message }) => message.success('端口删除成功'));
fetchData();
onRefresh?.();
} catch (error) {
import('antd').then(({ message }) => message.error('端口删除失败'));
}
},
[fetchData, onRefresh]
);
const handleCreateCardSuccess = useCallback(() => {
fetchData();
onRefresh?.();
}, [fetchData, onRefresh]);
const handleCreatePortSuccess = useCallback(() => {
fetchData();
onRefresh?.();
}, [fetchData, onRefresh]);
const handleExpand = nicId => {
setExpandedCards(prev => {
if (prev.includes(nicId)) {
return prev.filter(id => id !== nicId);
}
return [...prev, nicId];
});
};
const getStatusTag = status => {
const config = {
free: { color: 'success', text: '空闲' },
occupied: { color: 'processing', text: '占用' },
fault: { color: 'error', text: '故障' },
normal: { color: 'success', text: '正常' },
warning: { color: 'warning', text: '警告' },
offline: { color: 'default', text: '离线' },
};
const { color, text } = config[status] || { color: 'default', text: status };
return