BodyPositionActionButtons.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import React, { useState } from 'react';
  2. import { useSelector, useDispatch } from 'react-redux';
  3. import { Button, Tooltip, message } from 'antd';
  4. import { useIntl } from 'react-intl';
  5. import { RootState, AppDispatch } from '../../../states/store';
  6. import { deleteBodyPosition } from '../../../API/patient/viewActions';
  7. import { copyPositionThunk } from '../../../states/exam/examWorksCacheSlice';
  8. import {
  9. removeBodyPositionBySopInstanceUid,
  10. setByIndex,
  11. } from '../../../states/exam/bodyPositionListSlice';
  12. import Icon from '@/components/Icon';
  13. import AppendViewModal from './AppendViewModal';
  14. const BodyPositionActionButtons: React.FC = () => {
  15. const intl = useIntl();
  16. const dispatch = useDispatch<AppDispatch>();
  17. const selectedBodyPosition = useSelector(
  18. (state: RootState) => state.bodyPositionList.selectedBodyPosition
  19. );
  20. const bodyPositions = useSelector(
  21. (state: RootState) => state.bodyPositionList.bodyPositions
  22. );
  23. const [isAppendModalOpen, setIsAppendModalOpen] = useState(false);
  24. const addBodyPositionClick = (): void => {
  25. console.log('[BodyPositionActionButtons] Add button clicked');
  26. console.log(
  27. '[BodyPositionActionButtons] selectedBodyPosition:',
  28. selectedBodyPosition
  29. );
  30. if (!selectedBodyPosition) {
  31. message.warning('请先选择一个体位');
  32. return;
  33. }
  34. console.log('[BodyPositionActionButtons] Opening append modal');
  35. setIsAppendModalOpen(true);
  36. };
  37. const handleDelete = async () => {
  38. if (!selectedBodyPosition) {
  39. message.warning('请先选择一个体位');
  40. return;
  41. }
  42. // 检查体位数量,至少保留一个
  43. if (bodyPositions.length <= 1) {
  44. message.warning('至少需要保留一个体位,无法删除');
  45. return;
  46. }
  47. console.log(
  48. `选中的体位:${JSON.stringify(selectedBodyPosition)}`
  49. );
  50. if (selectedBodyPosition.sop_instance_uid) {
  51. try {
  52. await deleteBodyPosition(selectedBodyPosition.sop_instance_uid);
  53. dispatch(
  54. removeBodyPositionBySopInstanceUid(
  55. selectedBodyPosition.sop_instance_uid
  56. )
  57. );
  58. dispatch(setByIndex(0));
  59. message.success('体位删除成功');
  60. } catch (error) {
  61. console.error('Error deleting body position:', error);
  62. message.error('删除体位失败');
  63. }
  64. }
  65. };
  66. const handleCopy = () => {
  67. const instanceUid =
  68. selectedBodyPosition?.study_instance_uid ?? '';
  69. console.log('Copying position for instance UID:', instanceUid);
  70. console.log(
  71. `${JSON.stringify(selectedBodyPosition)}`
  72. );
  73. if (instanceUid) {
  74. dispatch(copyPositionThunk({ instanceUid }));
  75. } else {
  76. message.warning('无法获取体位信息');
  77. }
  78. };
  79. return (
  80. <>
  81. <div className="flex justify-center gap-2">
  82. <Tooltip title={intl.formatMessage({ id: 'exam.action.addMorePositions' })}>
  83. <Button
  84. style={{ width: '1.5rem', height: '1.5rem' }}
  85. icon={
  86. <Icon
  87. module="module-exam"
  88. name="btn_AppendView"
  89. userId="base"
  90. theme="default"
  91. size="2x"
  92. state="normal"
  93. style={{fontSize: '48px'}}
  94. />
  95. }
  96. onClick={addBodyPositionClick}
  97. />
  98. </Tooltip>
  99. <Tooltip title={intl.formatMessage({ id: 'exam.action.deletePosition' })}>
  100. <Button
  101. style={{ width: '1.5rem', height: '1.5rem' }}
  102. icon={
  103. <Icon
  104. module="module-exam"
  105. name="btn_DeleteView"
  106. userId="base"
  107. theme="default"
  108. size="2x"
  109. state="normal"
  110. />
  111. }
  112. onClick={handleDelete}
  113. />
  114. </Tooltip>
  115. <Tooltip title={intl.formatMessage({ id: 'exam.action.copyPosition' })}>
  116. <Button
  117. style={{ width: '1.5rem', height: '1.5rem' }}
  118. icon={
  119. <Icon
  120. module="module-exam"
  121. name="btn_Copy"
  122. userId="base"
  123. theme="default"
  124. size="2x"
  125. state="normal"
  126. />
  127. }
  128. onClick={handleCopy}
  129. />
  130. </Tooltip>
  131. </div>
  132. <AppendViewModal
  133. open={isAppendModalOpen}
  134. onCancel={() => setIsAppendModalOpen(false)}
  135. onSuccess={() => {
  136. setIsAppendModalOpen(false);
  137. }}
  138. />
  139. </>
  140. );
  141. };
  142. export default BodyPositionActionButtons;