import React, { useEffect } from 'react'; import { Layout, Button, Checkbox, Typography, List, Spin, Alert, message } from 'antd'; import { ArrowLeftOutlined, ReloadOutlined } from '@ant-design/icons'; import { useDispatch, useSelector } from 'react-redux'; import { switchToOperationPanel } from '@/states/patient/worklist/slices/historyPanelSwitchSlice'; import { fetchPacsNodesThunk, toggleNodeSelection, selectAllNodes, deselectAllNodes, } from '@/states/output/pacsNode/pacsNodeSlice'; import { RootState, AppDispatch } from '@/states/store'; import Icon from '@/components/Icon'; const { Header, Content, Footer } = Layout; const { Title } = Typography; const SendImagePage = () => { const dispatch = useDispatch(); // 从Redux获取PACS节点状态 const { nodes, loading, error, selectedNodeIds } = useSelector( (state: RootState) => state.pacsNode ); // 组件挂载时获取PACS节点列表 useEffect(() => { dispatch(fetchPacsNodesThunk()); }, [dispatch]); // 返回操作面板 const handleReturn = () => { dispatch(switchToOperationPanel()); }; // 切换节点选中状态 const handleNodeToggle = (nodeId: number) => { dispatch(toggleNodeSelection(nodeId)); }; // 全选/取消全选 const handleSelectAll = (checked: boolean) => { if (checked) { dispatch(selectAllNodes()); } else { dispatch(deselectAllNodes()); } }; // 重新加载节点列表 const handleReload = () => { dispatch(fetchPacsNodesThunk()); }; // 发送图像 const handleSend = () => { if (selectedNodeIds.length === 0) { message.warning('请至少选择一个PACS节点'); return; } // TODO: 实现实际的发送图像功能 message.info(`准备发送到 ${selectedNodeIds.length} 个节点`); console.log('Selected node IDs:', selectedNodeIds); }; // 是否全选 const isAllSelected = nodes.length > 0 && nodes.filter(node => node.is_enabled).every(node => selectedNodeIds.includes(node.id) ); // 是否部分选中 const isIndeterminate = selectedNodeIds.length > 0 && !isAllSelected; return ( {/* 顶部导航栏 */}
{/* 主体内容 */} {/* 错误提示 */} {error && ( 重试 } /> )} {/* 加载状态 */} {loading && (
)} {/* 节点列表 */} {!loading && !error && ( <> {nodes.length === 0 ? ( ) : ( <> {/* 全选复选框 */}
handleSelectAll(e.target.checked)} > 全选 ({selectedNodeIds.length}/{nodes.filter(n => n.is_enabled).length})
{/* PACS节点列表 */} ( handleNodeToggle(node.id)} disabled={!node.is_enabled} >
{node.name} {node.is_default && ( [默认] )} {!node.is_enabled && ( [已禁用] )}
{node.address}:{node.port} | AET: {node.aet}
)} /> )} )}
{/* 底部按钮 */}
); }; export default SendImagePage;