BodyPositionDetail.tsx 4.0 KB

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