import React, { useState, useEffect } from 'react'; import { Row, Col, Button, Drawer, Grid } from 'antd'; import { SettingOutlined } from '@ant-design/icons'; import { FormattedMessage } from 'react-intl'; import { useSelector, useDispatch } from 'react-redux'; import { useRisAutoSync } from '@/hooks/useRisAutoSync'; import { fetchWorkThunk, workSelectionSlice, workPaginationSlice, workFiltersSlice, } from '../../states/patient/worklist/slices/workSlice'; import { updateThumbnailsFromWorkSelection } from '../../states/patient/worklist/slices/thumbnailListSlice'; import WorklistTable from './components/WorklistTable'; import OperationPanel from './components/OperationPanel'; import ThumbnailList from './components/ThumbnailList'; import GenericPagination from '../../components/GenericPagination'; import PatientPortraitFloat from './components/PatientPortraitFloat'; import { RootState, AppDispatch } from '../../states/store'; import { Task } from '@/domain/work'; import worklistToExam from '../../domain/patient/worklistToExam'; import { columnConfigService } from '@/config/tableColumns'; import { ColumnConfig } from '@/config/tableColumns/types/columnConfig'; import { useMultiSelection } from '@/hooks/useMultiSelection'; const { useBreakpoint } = Grid; const WorklistPage: React.FC = () => { const screens = useBreakpoint(); const [drawerVisible, setDrawerVisible] = useState(false); const [columnConfig, setColumnConfig] = useState([]); // 新增:列配置状态 const [selectedPatientForPortrait, setSelectedPatientForPortrait] = useState(null); // 照片显示用的选中患者 // 启用RIS自动同步(在后台静默运行) useRisAutoSync(); const dispatch: AppDispatch = useDispatch(); const filters = useSelector((state: RootState) => state.workFilters); const page = useSelector((state: RootState) => state.workPagination.page); const pageSize = useSelector( (state: RootState) => state.workPagination.pageSize ); const selectedIds = useSelector( (state: RootState) => state.workSelection.selectedIds ); const selectedSecondaryIds = useSelector( // 获取次要选中ID列表 (state: RootState) => state.workSelection.selectedSecondaryIds ); const worklistData = useSelector( (state: RootState) => state.workEntities.data ); // 新增:获取列配置 useEffect(() => { columnConfigService .getColumnConfig('worklist') .then((config) => { setColumnConfig(config.columns); }) .catch((error) => { console.error('Failed to load worklist column config:', error); // 失败时使用空配置,表格会显示所有列 setColumnConfig([]); }); }, []); // 同步分页状态到过滤器 useEffect(() => { console.log('[worklist] Syncing pagination to filters:', { page, pageSize, }); dispatch( workFiltersSlice.actions.setFilters({ page, page_size: pageSize, }) ); }, [dispatch, page, pageSize]); useEffect(() => { console.log( '[worklist] Fetching worklist data with filters:', filters, 'page:', page, 'pageSize:', pageSize ); dispatch(fetchWorkThunk({ page, pageSize, filters })); }, [dispatch, page, pageSize, filters]); // 使用多选 Hook const { handleRowClick } = useMultiSelection({ selectedIds, selectedSecondaryIds, onSelectionChange: (newIds,secondNewIds) => { console.log('Selected IDs changed:', newIds,secondNewIds); // 如果只有一个选中项,设置选中患者用于显示照片 if (newIds.length === 1) { const selectedRecord = worklistData.find(item => item.StudyID === newIds[0]&&item.entry_id===secondNewIds?.[0]); if (selectedRecord) { setSelectedPatientForPortrait(selectedRecord); } } else { // 多选时清空患者照片 setSelectedPatientForPortrait(null); } // 更新 Redux 状态(用于其他功能) dispatch(workSelectionSlice.actions.setSelectedIds(newIds)); dispatch(workSelectionSlice.actions.setSelectedSecondaryIds(secondNewIds??[])); dispatch(updateThumbnailsFromWorkSelection(newIds)); }, enableMultiSelect: true, }); // 处理行点击事件(兼容现有功能) const handleRowClickInternal = (record: Task, event?: React.MouseEvent) => { handleRowClick(record, event || {} as React.MouseEvent); }; const handleRowDoubleClick = (record: Task) => { console.log( '[WorklistTable] Row double-clicked:', JSON.stringify(record, null, 2) ); worklistToExam(record); }; return (
{/* 患者照片浮动组件 */} setSelectedPatientForPortrait(null)} /> {screens.xs ? ( <>
state.workPagination} entitiesSelector={(state) => state.workEntities} paginationActions={workPaginationSlice.actions} className="border-t" />
); }; export default WorklistPage;