import React from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { Radio } from 'antd'; import { RootState, AppDispatch } from '../../../states/store'; import { updateSelectedPositions } from '../../../states/view/invertContrastSlice'; import { getExposedImageUrl, getViewIconUrl, getDcmImageUrl } from '../../../API/bodyPosition'; import { ExtendedBodyPosition } from '../../../states/exam/bodyPositionListSlice'; import { selectSelectedPositions } from '../../../states/view/invertContrastSlice'; /** * InvertContrastThumbnailList - 反色对比缩略图列表组件 * * 功能:显示当前检查的所有体位缩略图,支持单选用于反色对比 * 选择一个体位:左侧显示原图,右侧显示反色图 */ const InvertContrastThumbnailList: React.FC = () => { const dispatch = useDispatch(); // 获取所有体位 const bodyPositions = useSelector( (state: RootState) => state.bodyPositionList.bodyPositions ); // 获取当前选中的体位URLs const selectedPositions = useSelector(selectSelectedPositions); /** * 处理体位选择变更 - 单选模式,每次选择替换当前选择 */ const handlePositionSelect = (bodyPosition: ExtendedBodyPosition) => { const dcmUrl = getDcmImageUrl(bodyPosition.sop_instance_uid); // 单选模式:直接替换为当前选择的体位 dispatch(updateSelectedPositions({ positions: [dcmUrl] })); }; /** * 获取体位对应的图像URL */ const getPositionImageUrl = (bodyPosition: ExtendedBodyPosition): string => { return bodyPosition.dview.expose_status === 'Exposed' ? getExposedImageUrl(bodyPosition.sop_instance_uid) : getViewIconUrl(bodyPosition.view_icon_name); }; /** * 检查体位是否被选中 */ const isPositionSelected = (bodyPosition: ExtendedBodyPosition): boolean => { const dcmUrl = getDcmImageUrl(bodyPosition.sop_instance_uid); return selectedPositions.includes(dcmUrl); }; return (
选择对比体位
{bodyPositions.map((bodyPosition, index) => { const imageUrl = getPositionImageUrl(bodyPosition); const isSelected = isPositionSelected(bodyPosition); return (
handlePositionSelect(bodyPosition)} > {/* 单选按钮 */}
{/* 体位名称标签 */}
{bodyPosition.view_name}
{/* 缩略图 */}
{bodyPosition.view_name}
{/* 状态标签 */} {bodyPosition.dview.expose_status === 'Exposed' && (
{bodyPosition.dview.judged_status && ( {bodyPosition.dview.judged_status === 'Accept' ? '✓' : bodyPosition.dview.judged_status === 'Reject' ? '✗' : '?'} )}
)}
); })}
); }; export default InvertContrastThumbnailList;