BodyPositionDetail.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. import { FormattedMessage } from 'react-intl';
  9. const { Title, Text } = Typography;
  10. const BodyPositionDetail: React.FC = () => {
  11. const bodyPositionDetail = useSelector(
  12. (state: RootState) => state.bodyPositionDetail
  13. );
  14. const wrapRef = useRef<HTMLDivElement>(null);
  15. // 🆕 根据曝光状态选择图像源
  16. const imageUrl = bodyPositionDetail.expose_status === 'Exposed'
  17. ? getExposedImageUrl(bodyPositionDetail.sop_instance_uid) // 已曝光:缩略图
  18. : getViewIconUrl(bodyPositionDetail.body_position_image); // 未曝光:示意图
  19. return (
  20. <Flex vertical className="h-full">
  21. {/* 第一行 : 患者姓名*/}
  22. <div className="text-center">
  23. <Title level={4}>{bodyPositionDetail.patient_name}</Title>
  24. </div>
  25. {/* 第二行 :患者id,登记号,study描述*/}
  26. <Row>
  27. <Col span={8}>
  28. <Text>
  29. <FormattedMessage
  30. id="exam.bodyPositionDetail.patientId"
  31. defaultMessage="患者编号"
  32. />
  33. : {bodyPositionDetail.patient_id}
  34. </Text>
  35. </Col>
  36. <Col span={8}>
  37. <Text>
  38. <FormattedMessage
  39. id="exam.bodyPositionDetail.accessionNumber"
  40. defaultMessage="登记号"
  41. />
  42. : {bodyPositionDetail.registration_number}
  43. </Text>
  44. </Col>
  45. <Col span={8}>
  46. <Text>
  47. <FormattedMessage
  48. id="exam.bodyPositionDetail.studyDescription"
  49. defaultMessage="备注"
  50. />
  51. : {bodyPositionDetail.study_description}
  52. </Text>
  53. </Col>
  54. </Row>
  55. {/* 第三行 :体位示意图或缩略图 🆕 修改此处 */}
  56. <Flex
  57. //flex={1} // 吃掉剩余宽高
  58. style={{ minHeight: 0 }} // 保险丝
  59. className="flex-grow"
  60. ref={wrapRef}
  61. >
  62. <div
  63. style={{
  64. // border: '1px solid red',
  65. // width: '500px',
  66. // height: '300px',
  67. width: '100%', // 随父容器宽
  68. //aspectRatio: '16 / 9', // 根据图片真实比例改,如 4/3、1/1 等
  69. backgroundImage: `url(${imageUrl})`, // 🆕 使用动态 imageUrl
  70. backgroundSize: 'contain', // cover 亦可
  71. backgroundPosition: 'center',
  72. backgroundRepeat: 'no-repeat',
  73. }}
  74. ></div>
  75. </Flex>
  76. {/* 第四行 :体位描述*/}
  77. <div className="text-center">
  78. <Text>
  79. <FormattedMessage
  80. id="exam.bodyPositionDetail.viewDescription"
  81. defaultMessage="视图描述"
  82. />
  83. : {bodyPositionDetail.view_description}
  84. </Text>
  85. </div>
  86. {/* 第五行 :设备信息*/}
  87. <div className="flex flex-row items-center justify-center">
  88. <div className="text-center">
  89. <Image src={CollimatorIcon} alt="Logo" height={'100%'} />
  90. </div>
  91. <div className="text-center">
  92. <Text>
  93. <FormattedMessage id="Length" defaultMessage="长" />:
  94. {bodyPositionDetail.collimator_length}
  95. </Text>
  96. </div>
  97. <div className="text-center ml-2">
  98. <Text>
  99. <FormattedMessage id="Width" defaultMessage="宽" />:
  100. {bodyPositionDetail.collimator_width}
  101. </Text>
  102. </div>
  103. </div>
  104. {/* 第六行 */}
  105. <Flex justify="center" align="center">
  106. <Image src={SidIcon} alt="Logo" className="mr-2" height={'100%'} />
  107. <Text>SID: {bodyPositionDetail.sid}</Text>
  108. </Flex>
  109. </Flex>
  110. );
  111. };
  112. export default BodyPositionDetail;