|
|
@@ -0,0 +1,124 @@
|
|
|
+[1mdiff --git a/src/states/exam/examWorksCacheSlice.ts b/src/states/exam/examWorksCacheSlice.ts[m
|
|
|
+[1mindex faff66a..58ce8de 100644[m
|
|
|
+[1m--- a/src/states/exam/examWorksCacheSlice.ts[m
|
|
|
+[1m+++ b/src/states/exam/examWorksCacheSlice.ts[m
|
|
|
+[36m@@ -1,8 +1,11 @@[m
|
|
|
+ import { createSlice, PayloadAction, createAsyncThunk } from '@reduxjs/toolkit';[m
|
|
|
+ import { Task as Work } from '@/domain/work';[m
|
|
|
+ import { copyImage } from '@/API/patient/workActions';[m
|
|
|
+[32m+[m[32mimport { appendBodyPositionToStudy, AppendViewRequest } from '@/API/exam/appendBodyPosition';[m
|
|
|
+ import { dview } from '@/domain/dview';[m
|
|
|
+[31m-import { addViewsToBodyPosition } from './bodyPositionListSlice';[m
|
|
|
+[32m+[m[32mimport { addViewsToBodyPosition, addBodyPosition } from './bodyPositionListSlice';[m
|
|
|
+[32m+[m[32mimport { ExtendedBodyPosition } from './bodyPositionListSlice';[m
|
|
|
+[32m+[m[32mimport { fetchViewDetail } from '@/API/patient/viewActions';[m
|
|
|
+ import { message } from 'antd';[m
|
|
|
+ [m
|
|
|
+ interface ExamWorksCacheState {[m
|
|
|
+[36m@@ -52,23 +55,91 @@[m [mexport const { addWork, removeWork, clearWorks, setLoading, addDviews } =[m
|
|
|
+ examWorksCacheSlice.actions;[m
|
|
|
+ export const copyPositionThunk = createAsyncThunk([m
|
|
|
+ 'examWorksCache/copyPosition',[m
|
|
|
+[31m- async ({ instanceUid }: { instanceUid: string }, { dispatch }) => {[m
|
|
|
+[32m+[m[32m async ({ instanceUid }: { instanceUid: string }, { dispatch, getState }) => {[m
|
|
|
+ dispatch(setLoading(true));[m
|
|
|
+ try {[m
|
|
|
+[31m- const dviews: dview[] = await copyImage(instanceUid);[m
|
|
|
+[31m- // const dviews: dview[] = response.data.series.flatMap((series: any) =>[m
|
|
|
+[31m- // series.images.map((image: any) => ({[m
|
|
|
+[31m- // view_id: image.view_id,[m
|
|
|
+[31m- // series_instance_uid: image.series_instance_uid,[m
|
|
|
+[31m- // study_instance_uid: image.study_instance_uid,[m
|
|
|
+[31m- // study_id: image.study_id,[m
|
|
|
+[31m- // procedure_id: series.procedure_id,[m
|
|
|
+[31m- // view_description: image.view_description,[m
|
|
|
+[31m- // view_type: image.view_id // Assuming view_type is the same as view_id[m
|
|
|
+[31m- // }))[m
|
|
|
+[31m- // );[m
|
|
|
+[31m- dispatch(addDviews({ instanceUid, dviews }));[m
|
|
|
+[31m- dispatch(addViewsToBodyPosition({ instanceUid, dviews }));[m
|
|
|
+[32m+[m[32m // 获取当前选中的体位信息[m
|
|
|
+[32m+[m[32m const state = getState() as any;[m
|
|
|
+[32m+[m[32m const selectedBodyPosition = state.bodyPositionList.selectedBodyPosition;[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m if (!selectedBodyPosition) {[m
|
|
|
+[32m+[m[32m throw new Error('未找到选中的体位信息');[m
|
|
|
+[32m+[m[32m }[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m // 构建追加体位的请求[m
|
|
|
+[32m+[m[32m const request: AppendViewRequest = {[m
|
|
|
+[32m+[m[32m study_id: selectedBodyPosition.work.StudyID,[m
|
|
|
+[32m+[m[32m views: [{[m
|
|
|
+[32m+[m[32m view_id: selectedBodyPosition.view_id,[m
|
|
|
+[32m+[m[32m procedure_id: selectedBodyPosition.procedure_id || '',[m
|
|
|
+[32m+[m[32m }],[m
|
|
|
+[32m+[m[32m };[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m console.log('[copyPositionThunk] Copying position with request:', request);[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m // 调用追加体位接口[m
|
|
|
+[32m+[m[32m const response = await appendBodyPositionToStudy(request);[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m // 处理响应,将新创建的体位添加到状态管理中[m
|
|
|
+[32m+[m[32m const newBodyPositions: ExtendedBodyPosition[] = [];[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m for (const series of response.data.series) {[m
|
|
|
+[32m+[m[32m for (const image of series.images) {[m
|
|
|
+[32m+[m[32m // 获取完整的 view 详情[m
|
|
|
+[32m+[m[32m const viewDetail = await fetchViewDetail(image.view_id);[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m const dviewData: dview = {[m
|
|
|
+[32m+[m[32m view_id: image.view_id,[m
|
|
|
+[32m+[m[32m series_instance_uid: image.series_instance_uid,[m
|
|
|
+[32m+[m[32m study_instance_uid: image.study_instance_uid,[m
|
|
|
+[32m+[m[32m study_id: image.study_id,[m
|
|
|
+[32m+[m[32m procedure_id: series.procedure_id,[m
|
|
|
+[32m+[m[32m view_description: image.view_description,[m
|
|
|
+[32m+[m[32m view_type: image.view_id,[m
|
|
|
+[32m+[m[32m PrimarySopUID: image.sop_instance_uid,[m
|
|
|
+[32m+[m[32m thumbnail_file: image.image_file_path,[m
|
|
|
+[32m+[m[32m image_file: image.image_file_path,[m
|
|
|
+[32m+[m[32m image_file_path: image.image_file_path,[m
|
|
|
+[32m+[m[32m expose_status: 'Unexposed',[m
|
|
|
+[32m+[m[32m judged_status: image.judged_status,[m
|
|
|
+[32m+[m[32m };[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m const extendedBodyPosition: ExtendedBodyPosition = {[m
|
|
|
+[32m+[m[32m ...viewDetail,[m
|
|
|
+[32m+[m[32m collimator_length:[m
|
|
|
+[32m+[m[32m viewDetail.config_object.DX?.CollimatorSizeLength ||[m
|
|
|
+[32m+[m[32m viewDetail.config_object?.Common?.CollimatorSizeLength ||[m
|
|
|
+[32m+[m[32m 0,[m
|
|
|
+[32m+[m[32m collimator_width:[m
|
|
|
+[32m+[m[32m viewDetail.config_object.DX?.CollimatorSizeWidth ||[m
|
|
|
+[32m+[m[32m viewDetail.config_object?.Common?.CollimatorSizeWidth ||[m
|
|
|
+[32m+[m[32m 0,[m
|
|
|
+[32m+[m[32m sid: '',[m
|
|
|
+[32m+[m[32m patient_name: selectedBodyPosition.patient_name,[m
|
|
|
+[32m+[m[32m patient_id: selectedBodyPosition.patient_id,[m
|
|
|
+[32m+[m[32m registration_number: selectedBodyPosition.registration_number,[m
|
|
|
+[32m+[m[32m study_description: selectedBodyPosition.study_description,[m
|
|
|
+[32m+[m[32m body_position_image: viewDetail.view_icon_name,[m
|
|
|
+[32m+[m[32m work: selectedBodyPosition.work,[m
|
|
|
+[32m+[m[32m study_instance_uid: selectedBodyPosition.study_instance_uid,[m
|
|
|
+[32m+[m[32m sop_instance_uid: image.sop_instance_uid,[m
|
|
|
+[32m+[m[32m series_instance_uid: image.series_instance_uid,[m
|
|
|
+[32m+[m[32m secondary_sop_uid: image.secondary_sop_uid,[m
|
|
|
+[32m+[m[32m study_id: image.study_id,[m
|
|
|
+[32m+[m[32m dview: dviewData,[m
|
|
|
+[32m+[m[32m };[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m newBodyPositions.push(extendedBodyPosition);[m
|
|
|
+[32m+[m[32m }[m
|
|
|
+[32m+[m[32m }[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m // 将新体位添加到 bodyPositionList[m
|
|
|
+[32m+[m[32m for (const bodyPosition of newBodyPositions) {[m
|
|
|
+[32m+[m[32m dispatch(addBodyPosition(bodyPosition));[m
|
|
|
+[32m+[m[32m }[m
|
|
|
+[32m+[m
|
|
|
+[32m+[m[32m message.success(`复制体位成功`);[m
|
|
|
+[32m+[m
|
|
|
+ } catch (error) {[m
|
|
|
+ console.error('Error in copyPositionThunk:', error);[m
|
|
|
+ message.error(`复制体位失败 ${error.message}`, 3);[m
|