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 axios from 'axios';
import PortCreateModal from './PortCreateModal';
import NetworkCardCreateModal from './NetworkCardCreateModal';
const { Panel } = Collapse;
const designTokens = {
colors: {
primary: {
main: '#667eea'
},
success: '#10b981',
error: '#ef4444',
warning: '#f59e0b'
}
};
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([
axios.get(`/api/network-cards/device/${deviceId}/with-ports`),
axios.get(`/api/network-cards/device/${deviceId}`)
]);
const cardsData = cardsResponse.data || [];
setCards(cardsData);
setNetworkCards(networkCardsResponse.data || []);
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 axios.delete(`/api/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 axios.delete(`/api/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