Browse Source

曝光后,从检查跳转到图像处理,体位列表显示曝光的缩略图,之前仍然显示体位图

sw 1 week ago
parent
commit
1810049e8f

+ 2 - 2
src/domain/mqttService.ts

@@ -2,7 +2,7 @@ import mqtt from 'mqtt';
 import { MQTT_BROKER_URL } from '../API/config';
 import emitter from '../utils/eventEmitter';
 
-interface MqttMessage {
+export interface MqttMessage {
   dcm?: string;
   message: string;
   sop?: string;
@@ -32,7 +32,7 @@ const handleMqttMessage = (message: MqttMessage) => {
     case 'TASK_Success':
       console.log('Task succeeded:', message);
       // Handle success, e.g., process DCM and thumbnail files
-      emitter.emit('TASK_SUCCESS');
+      emitter.emit('TASK_SUCCESS', message);
       break;
     case 'TASK_Failure':
       console.error('Task failed:', message.message);

+ 1 - 1
src/pages/exam/components/BodyPositionList.tsx

@@ -107,7 +107,7 @@ const BodyPositionList: React.FC<BodyPositionListProps> = ({
         dispatch(setSelectedBodyPosition(bodyPositions[0]));
       }
     };
-
+    if (!!bodyPositions && bodyPositions.length > 0) return; // 如果已经有体位信息,则不再重新获取
     fetchBodyPositions();
   }, [works, dispatch]);
 

+ 58 - 0
src/states/exam/bodyPositionListSlice.ts

@@ -2,6 +2,9 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit';
 import { View as BodyPosition } from '../../API/patient/viewActions';
 import { Work } from './examWorksCacheSlice';
 import { dview } from '@/domain/dview';
+import emitter from '@/utils/eventEmitter';
+import store from '@/states/store';
+import { MqttMessage } from '@/domain/mqttService';
 
 export interface ExtendedBodyPosition extends BodyPosition {
   patient_name: string;
@@ -31,6 +34,22 @@ const initialState: BodyPositionListState = {
   selectedBodyPosition: null,
 };
 
+emitter.on('TASK_SUCCESS', (message: MqttMessage) => {
+  console.log(
+    `[bodyPositionListSlice] TASK_SUCCESS received with message:`,
+    message
+  );
+  const { sop } = message;
+  if (sop) {
+    store.dispatch(
+      bodyPositionListSlice.actions.updateBodyPositionDview({
+        sopInstanceUid: sop,
+        msg: message,
+      })
+    );
+  }
+});
+
 const bodyPositionListSlice = createSlice({
   name: 'bodyPositionList',
   initialState,
@@ -86,6 +105,45 @@ const bodyPositionListSlice = createSlice({
         (bodyPosition) => bodyPosition.sop_instance_uid !== action.payload
       );
     },
+
+    updateBodyPositionDview: (
+      state,
+      action: PayloadAction<{ sopInstanceUid: string; msg: MqttMessage }>
+    ) => {
+      const { sopInstanceUid, msg } = action.payload;
+      const index = state.bodyPositions.findIndex(
+        (bp) => bp.sop_instance_uid === sopInstanceUid
+      );
+      if (index === -1) {
+        console.warn(
+          `[bodyPositionListSlice] updateBodyPositionDview: No body position found for SOP Instance UID ${sopInstanceUid}`
+        );
+        return;
+      }
+      console.log(
+        `[bodyPositionListSlice] updateBodyPositionDview: Updating body position for SOP Instance UID ${sopInstanceUid} with message ${JSON.stringify(msg)} `
+      );
+      const updatedBodyPosition = {
+        ...state.bodyPositions[index],
+        sop_instance_uid: sopInstanceUid,
+        dview: {
+          ...state.bodyPositions[index].dview,
+          PrimarySopUID: sopInstanceUid,
+          thumbnail_file: msg.thumbnail ?? '',
+          image_file: msg.dcm ?? '',
+          expose_status: 'Exposed',
+        } satisfies dview,
+      };
+      state.bodyPositions[index] = updatedBodyPosition;
+      console.log(
+        `[bodyPositionListSlice] updateBodyPositionDview: Updated body position:`,
+        updatedBodyPosition
+      );
+      // Ensure the selectedBodyPosition is updated if it matches the updated bodyPosition
+      if (state.selectedBodyPosition?.sop_instance_uid === sopInstanceUid) {
+        state.selectedBodyPosition = updatedBodyPosition;
+      }
+    },
   },
 });