BodyPositionDetail.tsx 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import React, { useRef } from 'react';
  2. import { useSelector } from 'react-redux';
  3. import { Row, Col, Typography, Image, Flex } from 'antd';
  4. import { getViewIconUrl, getExposedImageUrl } from '@/API/bodyPosition';
  5. import CollimatorIcon from '../../../assets/imgs/Collimator_normal.png';
  6. import SidIcon from '../../../assets/imgs/SID.png';
  7. import { RootState } from '@/states/store';
  8. const { Title, Text } = Typography;
  9. const BodyPositionDetail: React.FC = () => {
  10. const bodyPositionDetail = useSelector(
  11. (state: RootState) => state.bodyPositionDetail
  12. );
  13. const wrapRef = useRef<HTMLDivElement>(null);
  14. // 🆕 根据曝光状态选择图像源
  15. const imageUrl = bodyPositionDetail.expose_status === 'Exposed'
  16. ? getExposedImageUrl(bodyPositionDetail.sop_instance_uid) // 已曝光:缩略图
  17. : getViewIconUrl(bodyPositionDetail.body_position_image); // 未曝光:示意图
  18. return (
  19. <Flex vertical className="h-full">
  20. {/* 第一行 : 患者姓名*/}
  21. <div className="text-center">
  22. <Title level={4}>{bodyPositionDetail.patient_name}</Title>
  23. </div>
  24. {/* 第二行 :患者id,登记号,study描述*/}
  25. <Row>
  26. <Col span={8}>
  27. <Text>Patient ID: {bodyPositionDetail.patient_id}</Text>
  28. </Col>
  29. <Col span={8}>
  30. <Text>
  31. Accession Number: {bodyPositionDetail.registration_number}
  32. </Text>
  33. </Col>
  34. <Col span={8}>
  35. <Text>Study Description: {bodyPositionDetail.study_description}</Text>
  36. </Col>
  37. </Row>
  38. {/* 第三行 :体位示意图或缩略图 🆕 修改此处 */}
  39. <Flex
  40. //flex={1} // 吃掉剩余宽高
  41. style={{ minHeight: 0 }} // 保险丝
  42. className="flex-grow"
  43. ref={wrapRef}
  44. >
  45. <div
  46. style={{
  47. // border: '1px solid red',
  48. // width: '500px',
  49. // height: '300px',
  50. width: '100%', // 随父容器宽
  51. //aspectRatio: '16 / 9', // 根据图片真实比例改,如 4/3、1/1 等
  52. backgroundImage: `url(${imageUrl})`, // 🆕 使用动态 imageUrl
  53. backgroundSize: 'contain', // cover 亦可
  54. backgroundPosition: 'center',
  55. backgroundRepeat: 'no-repeat',
  56. }}
  57. ></div>
  58. </Flex>
  59. {/* 第四行 :体位描述*/}
  60. <div className="text-center">
  61. <Text>View Description: {bodyPositionDetail.view_description}</Text>
  62. </div>
  63. {/* 第五行 :设备信息*/}
  64. <div className="flex flex-row items-center justify-center">
  65. <div className="text-center">
  66. <Image src={CollimatorIcon} alt="Logo" height={'100%'} />
  67. </div>
  68. <div className="text-center">
  69. <Text>Length: {bodyPositionDetail.collimator_length}</Text>
  70. </div>
  71. <div className="text-center ml-2">
  72. <Text>Width: {bodyPositionDetail.collimator_width}</Text>
  73. </div>
  74. </div>
  75. {/* 第六行 */}
  76. <Flex justify="center" align="center">
  77. <Image src={SidIcon} alt="Logo" className="mr-2" height={'100%'} />
  78. <Text>SID: {bodyPositionDetail.sid}</Text>
  79. </Flex>
  80. </Flex>
  81. );
  82. };
  83. export default BodyPositionDetail;