Browse Source

完善实现:注册成功后,初始化本地数据,不遗漏sop instance uid;体位删除成功后,体位列表中移除对应的体位

dengdx 1 week ago
parent
commit
686159846a

+ 1 - 0
src/domain/dview.ts

@@ -9,4 +9,5 @@ export interface dview {
   procedure_id: string;
   procedure_id: string;
   view_description: string;
   view_description: string;
   view_type: string;
   view_type: string;
+  PrimarySopUID: string;
 }
 }

+ 17 - 1
src/domain/patient/mapToTask.ts

@@ -1,7 +1,11 @@
 import { RegisterWorkResponseData } from '../../API/patient/workActions';
 import { RegisterWorkResponseData } from '../../API/patient/workActions';
 import { Task } from '../work';
 import { Task } from '../work';
+import { Series } from '../series';
+import { XImage } from '../xImage';
+import { dview } from '../dview';
 
 
 const mapToTask = (data: RegisterWorkResponseData): Task => {
 const mapToTask = (data: RegisterWorkResponseData): Task => {
+  console.log(`mapToTask--data:${JSON.stringify(data)}`);
   return {
   return {
     StudyInstanceUID: data.study_instance_uid,
     StudyInstanceUID: data.study_instance_uid,
     StudyID: data.study_id,
     StudyID: data.study_id,
@@ -27,7 +31,19 @@ const mapToTask = (data: RegisterWorkResponseData): Task => {
     StudyLock: data.study_lock,
     StudyLock: data.study_lock,
     OperatorID: data.operator_name,
     OperatorID: data.operator_name,
     Modality: data.modality,
     Modality: data.modality,
-    Views: [],
+    Views: data.series.flatMap<dview>(
+      (series: Series) =>
+        series.images.map<dview>((image: XImage) => ({
+          view_id: image.view_id,
+          series_instance_uid: series.series_instance_uid,
+          study_instance_uid: data.study_instance_uid,
+          study_id: data.study_id,
+          procedure_id: series.procedure_id,
+          view_description: image.view_description,
+          view_type: '',
+          PrimarySopUID: image.sop_instance_uid ?? '4444',
+        })) as dview[]
+    ),
     Thickness: data.thickness,
     Thickness: data.thickness,
     PatientType: data.patient_type,
     PatientType: data.patient_type,
     StudyType: data.study_type,
     StudyType: data.study_type,

+ 16 - 13
src/domain/patient/registerToExam.ts

@@ -3,8 +3,9 @@ import { setBusinessFlow } from '../../states/BusinessFlowSlice';
 import mapToTask from './mapToTask';
 import mapToTask from './mapToTask';
 import store from '@/states/store';
 import store from '@/states/store';
 import { RegisterWorkResponseData } from '@/API/patient/workActions';
 import { RegisterWorkResponseData } from '@/API/patient/workActions';
-import { Series } from '@/domain/series';
-import { XImage } from '@/domain/xImage';
+// import { Series } from '@/domain/series';
+// import { XImage } from '@/domain/xImage';
+// import { dview } from '@/domain/dview';
 
 
 const registerToExam = async (registerData: RegisterWorkResponseData) => {
 const registerToExam = async (registerData: RegisterWorkResponseData) => {
   const dispatch = store.dispatch;
   const dispatch = store.dispatch;
@@ -12,17 +13,19 @@ const registerToExam = async (registerData: RegisterWorkResponseData) => {
   try {
   try {
     // Save registration result to cache
     // Save registration result to cache
     const task = mapToTask(registerData);
     const task = mapToTask(registerData);
-    task.Views = registerData.series.flatMap((series: Series) =>
-      series.images.map((image: XImage) => ({
-        view_id: image.view_id,
-        series_instance_uid: series.series_instance_uid,
-        study_instance_uid: registerData.study_instance_uid,
-        study_id: registerData.study_id,
-        procedure_id: series.procedure_id,
-        view_description: image.view_description,
-        view_type: '',
-      }))
-    );
+    // task.Views = registerData.series.flatMap<dview>((series: Series) =>
+    //   series.images.map<dview>((image: XImage) => ({
+    //     view_id: image.view_id,
+    //     series_instance_uid: series.series_instance_uid,
+    //     study_instance_uid: registerData.study_instance_uid,
+    //     study_id: registerData.study_id,
+    //     procedure_id: series.procedure_id,
+    //     view_description: image.view_description,
+    //     view_type: '',
+    //     PrimarySopUID: image.sop_instance_id
+    //   }))
+    // );
+    console.log(`注册进入检查,task详情:${JSON.stringify(task)}`);
     dispatch(addWork(task));
     dispatch(addWork(task));
 
 
     // Step 3: Proceed to Examination
     // Step 3: Proceed to Examination

+ 5 - 1
src/domain/xImage.ts

@@ -1,5 +1,9 @@
+/**
+ * 注册时,从服务返回的数据,XImage是返回数据的一部分,本质上表达的是个view
+ * todo 需要移动到API中,不应该在domain中定义
+ */
 export interface XImage {
 export interface XImage {
-  sop_instance_id: string;
+  sop_instance_uid: string;
   series_instance_uid: string;
   series_instance_uid: string;
   study_instance_uid: string;
   study_instance_uid: string;
   secondary_sop_uid: string;
   secondary_sop_uid: string;

+ 23 - 8
src/pages/exam/ContentAreaLarge.tsx

@@ -8,6 +8,7 @@ import {
   Switch,
   Switch,
   Divider,
   Divider,
   Tooltip,
   Tooltip,
+  message,
 } from 'antd';
 } from 'antd';
 import {
 import {
   DeleteOutlined,
   DeleteOutlined,
@@ -22,7 +23,10 @@ import { FormattedMessage } from 'react-intl';
 import { useSelector, useDispatch, useStore } from 'react-redux';
 import { useSelector, useDispatch, useStore } from 'react-redux';
 import { deleteBodyPosition } from '../../API/patient/viewActions';
 import { deleteBodyPosition } from '../../API/patient/viewActions';
 import { copyPositionThunk } from '../../states/exam/examWorksCacheSlice';
 import { copyPositionThunk } from '../../states/exam/examWorksCacheSlice';
-import { setByIndex } from '../../states/exam/bodyPositionListSlice';
+import {
+  removeBodyPositionBySopInstanceUid,
+  setByIndex,
+} from '../../states/exam/bodyPositionListSlice';
 import { RootState } from '../../states/store';
 import { RootState } from '../../states/store';
 import {
 import {
   setAprConfig,
   setAprConfig,
@@ -208,18 +212,29 @@ const ContentAreaLarge = () => {
                   style={{ width: '100%' }}
                   style={{ width: '100%' }}
                   icon={<DeleteOutlined />}
                   icon={<DeleteOutlined />}
                   onClick={async () => {
                   onClick={async () => {
-                    const selectedBodyPosition = useSelector(
-                      (state: RootState) =>
-                        state.bodyPositionList.selectedBodyPosition
+                    const selectedBodyPosition =
+                      store.getState().bodyPositionList.selectedBodyPosition;
+                    console.log(
+                      `选中的体位:${JSON.stringify(selectedBodyPosition)}`
                     );
                     );
                     if (
                     if (
                       selectedBodyPosition &&
                       selectedBodyPosition &&
                       selectedBodyPosition.sop_instance_uid
                       selectedBodyPosition.sop_instance_uid
                     ) {
                     ) {
-                      await deleteBodyPosition(
-                        selectedBodyPosition.sop_instance_uid
-                      );
-                      dispatch(setByIndex(0));
+                      try {
+                        await deleteBodyPosition(
+                          selectedBodyPosition.sop_instance_uid
+                        );
+                        dispatch(
+                          removeBodyPositionBySopInstanceUid(
+                            selectedBodyPosition.sop_instance_uid
+                          )
+                        );
+                        dispatch(setByIndex(0));
+                      } catch (error) {
+                        console.error('Error deleting body position:', error);
+                        message.error('Failed to delete body position');
+                      }
                     }
                     }
                   }}
                   }}
                 />
                 />

+ 2 - 0
src/pages/exam/components/BodyPositionList.tsx

@@ -69,6 +69,7 @@ const BodyPositionList: React.FC<BodyPositionListProps> = ({ layout }) => {
       alert(
       alert(
         `${works.length} works found == ${works[0].Views.length} views in the first work`
         `${works.length} works found == ${works[0].Views.length} views in the first work`
       );
       );
+      console.log(`体位信息:${JSON.stringify(works)}`);
       const bodyPositions: ExtendedBodyPosition[] = await Promise.all(
       const bodyPositions: ExtendedBodyPosition[] = await Promise.all(
         works.flatMap((work) =>
         works.flatMap((work) =>
           work.Views.map(async (view) => {
           work.Views.map(async (view) => {
@@ -88,6 +89,7 @@ const BodyPositionList: React.FC<BodyPositionListProps> = ({ layout }) => {
               body_position_image: viewDetail.view_icon_name,
               body_position_image: viewDetail.view_icon_name,
               work: work,
               work: work,
               study_instance_uid: work.StudyInstanceUID,
               study_instance_uid: work.StudyInstanceUID,
+              sop_instance_uid: view.PrimarySopUID,
             };
             };
           })
           })
         )
         )

+ 11 - 1
src/states/exam/bodyPositionListSlice.ts

@@ -13,7 +13,7 @@ export interface ExtendedBodyPosition extends BodyPosition {
   collimator_width: number | string;
   collimator_width: number | string;
   sid: string;
   sid: string;
   work: Work;
   work: Work;
-  sop_instance_uid?: string;
+  sop_instance_uid: string;
   series_instance_uid?: string;
   series_instance_uid?: string;
   study_instance_uid?: string;
   study_instance_uid?: string;
   secondary_sop_uid?: string;
   secondary_sop_uid?: string;
@@ -72,6 +72,15 @@ const bodyPositionListSlice = createSlice({
         state.bodyPositions.push(newBodyPosition);
         state.bodyPositions.push(newBodyPosition);
       }
       }
     },
     },
+
+    removeBodyPositionBySopInstanceUid: (
+      state,
+      action: PayloadAction<string>
+    ) => {
+      state.bodyPositions = state.bodyPositions.filter(
+        (bodyPosition) => bodyPosition.sop_instance_uid !== action.payload
+      );
+    },
   },
   },
 });
 });
 
 
@@ -81,5 +90,6 @@ export const {
   setSelectedBodyPosition,
   setSelectedBodyPosition,
   setByIndex,
   setByIndex,
   addViewsToBodyPosition,
   addViewsToBodyPosition,
+  removeBodyPositionBySopInstanceUid,
 } = bodyPositionListSlice.actions;
 } = bodyPositionListSlice.actions;
 export default bodyPositionListSlice.reducer;
 export default bodyPositionListSlice.reducer;