tatus 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. diff --git a/src/states/exam/examWorksCacheSlice.ts b/src/states/exam/examWorksCacheSlice.ts
  2. index faff66a..58ce8de 100644
  3. --- a/src/states/exam/examWorksCacheSlice.ts
  4. +++ b/src/states/exam/examWorksCacheSlice.ts
  5. @@ -1,8 +1,11 @@
  6. import { createSlice, PayloadAction, createAsyncThunk } from '@reduxjs/toolkit';
  7. import { Task as Work } from '@/domain/work';
  8. import { copyImage } from '@/API/patient/workActions';
  9. +import { appendBodyPositionToStudy, AppendViewRequest } from '@/API/exam/appendBodyPosition';
  10. import { dview } from '@/domain/dview';
  11. -import { addViewsToBodyPosition } from './bodyPositionListSlice';
  12. +import { addViewsToBodyPosition, addBodyPosition } from './bodyPositionListSlice';
  13. +import { ExtendedBodyPosition } from './bodyPositionListSlice';
  14. +import { fetchViewDetail } from '@/API/patient/viewActions';
  15. import { message } from 'antd';
  16. 
  17. interface ExamWorksCacheState {
  18. @@ -52,23 +55,91 @@ export const { addWork, removeWork, clearWorks, setLoading, addDviews } =
  19. examWorksCacheSlice.actions;
  20. export const copyPositionThunk = createAsyncThunk(
  21. 'examWorksCache/copyPosition',
  22. - async ({ instanceUid }: { instanceUid: string }, { dispatch }) => {
  23. + async ({ instanceUid }: { instanceUid: string }, { dispatch, getState }) => {
  24. dispatch(setLoading(true));
  25. try {
  26. - const dviews: dview[] = await copyImage(instanceUid);
  27. - // const dviews: dview[] = response.data.series.flatMap((series: any) =>
  28. - // series.images.map((image: any) => ({
  29. - // view_id: image.view_id,
  30. - // series_instance_uid: image.series_instance_uid,
  31. - // study_instance_uid: image.study_instance_uid,
  32. - // study_id: image.study_id,
  33. - // procedure_id: series.procedure_id,
  34. - // view_description: image.view_description,
  35. - // view_type: image.view_id // Assuming view_type is the same as view_id
  36. - // }))
  37. - // );
  38. - dispatch(addDviews({ instanceUid, dviews }));
  39. - dispatch(addViewsToBodyPosition({ instanceUid, dviews }));
  40. + // 获取当前选中的体位信息
  41. + const state = getState() as any;
  42. + const selectedBodyPosition = state.bodyPositionList.selectedBodyPosition;
  43. +
  44. + if (!selectedBodyPosition) {
  45. + throw new Error('未找到选中的体位信息');
  46. + }
  47. +
  48. + // 构建追加体位的请求
  49. + const request: AppendViewRequest = {
  50. + study_id: selectedBodyPosition.work.StudyID,
  51. + views: [{
  52. + view_id: selectedBodyPosition.view_id,
  53. + procedure_id: selectedBodyPosition.procedure_id || '',
  54. + }],
  55. + };
  56. +
  57. + console.log('[copyPositionThunk] Copying position with request:', request);
  58. +
  59. + // 调用追加体位接口
  60. + const response = await appendBodyPositionToStudy(request);
  61. +
  62. + // 处理响应,将新创建的体位添加到状态管理中
  63. + const newBodyPositions: ExtendedBodyPosition[] = [];
  64. +
  65. + for (const series of response.data.series) {
  66. + for (const image of series.images) {
  67. + // 获取完整的 view 详情
  68. + const viewDetail = await fetchViewDetail(image.view_id);
  69. +
  70. + const dviewData: dview = {
  71. + view_id: image.view_id,
  72. + series_instance_uid: image.series_instance_uid,
  73. + study_instance_uid: image.study_instance_uid,
  74. + study_id: image.study_id,
  75. + procedure_id: series.procedure_id,
  76. + view_description: image.view_description,
  77. + view_type: image.view_id,
  78. + PrimarySopUID: image.sop_instance_uid,
  79. + thumbnail_file: image.image_file_path,
  80. + image_file: image.image_file_path,
  81. + image_file_path: image.image_file_path,
  82. + expose_status: 'Unexposed',
  83. + judged_status: image.judged_status,
  84. + };
  85. +
  86. + const extendedBodyPosition: ExtendedBodyPosition = {
  87. + ...viewDetail,
  88. + collimator_length:
  89. + viewDetail.config_object.DX?.CollimatorSizeLength ||
  90. + viewDetail.config_object?.Common?.CollimatorSizeLength ||
  91. + 0,
  92. + collimator_width:
  93. + viewDetail.config_object.DX?.CollimatorSizeWidth ||
  94. + viewDetail.config_object?.Common?.CollimatorSizeWidth ||
  95. + 0,
  96. + sid: '',
  97. + patient_name: selectedBodyPosition.patient_name,
  98. + patient_id: selectedBodyPosition.patient_id,
  99. + registration_number: selectedBodyPosition.registration_number,
  100. + study_description: selectedBodyPosition.study_description,
  101. + body_position_image: viewDetail.view_icon_name,
  102. + work: selectedBodyPosition.work,
  103. + study_instance_uid: selectedBodyPosition.study_instance_uid,
  104. + sop_instance_uid: image.sop_instance_uid,
  105. + series_instance_uid: image.series_instance_uid,
  106. + secondary_sop_uid: image.secondary_sop_uid,
  107. + study_id: image.study_id,
  108. + dview: dviewData,
  109. + };
  110. +
  111. + newBodyPositions.push(extendedBodyPosition);
  112. + }
  113. + }
  114. +
  115. + // 将新体位添加到 bodyPositionList
  116. + for (const bodyPosition of newBodyPositions) {
  117. + dispatch(addBodyPosition(bodyPosition));
  118. + }
  119. +
  120. + message.success(`复制体位成功`);
  121. +
  122. } catch (error) {
  123. console.error('Error in copyPositionThunk:', error);
  124. message.error(`复制体位失败 ${error.message}`, 3);