|
@@ -1,10 +1,11 @@
|
|
|
-import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
|
+import { createSlice, PayloadAction, Middleware } from '@reduxjs/toolkit';
|
|
|
import { View as BodyPosition } from '../../API/patient/viewActions';
|
|
|
-import { Work } from './examWorksCacheSlice';
|
|
|
+import { Work, addWork } from './examWorksCacheSlice';
|
|
|
import { dview } from '@/domain/dview';
|
|
|
import emitter from '@/utils/eventEmitter';
|
|
|
import store from '@/states/store';
|
|
|
import { MqttMessage } from '@/domain/mqttService';
|
|
|
+import { fetchViewDetail } from '@/API/patient/viewActions';
|
|
|
/**
|
|
|
* ExtendedBodyPosition即包含体位模块信息,又包含体位实例信息,也包括study(work)信息
|
|
|
*/
|
|
@@ -52,6 +53,50 @@ emitter.on('TASK_SUCCESS', (message: MqttMessage) => {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+const transformWorksToBodyPositions = async (
|
|
|
+ works: Work[]
|
|
|
+): Promise<ExtendedBodyPosition[]> => {
|
|
|
+ return await Promise.all(
|
|
|
+ works.flatMap((work) =>
|
|
|
+ work.Views.map(async (view) => {
|
|
|
+ const viewDetail = await fetchViewDetail(view.view_id);
|
|
|
+ return {
|
|
|
+ ...viewDetail,
|
|
|
+ collimator_length:
|
|
|
+ viewDetail.config_object.DX.CollimatorSizeLength || 0,
|
|
|
+ collimator_width:
|
|
|
+ viewDetail.config_object.DX.CollimatorSizeWidth || 0,
|
|
|
+ sid: '', // todo 这里还缺少值的来源
|
|
|
+ patient_name: work.PatientName,
|
|
|
+ patient_id: work.PatientID,
|
|
|
+ registration_number: work.AccessionNumber,
|
|
|
+ study_description: work.StudyDescription,
|
|
|
+ body_position_image: viewDetail.view_icon_name,
|
|
|
+ work: work,
|
|
|
+ study_instance_uid: work.StudyInstanceUID,
|
|
|
+ sop_instance_uid: view.PrimarySopUID,
|
|
|
+ dview: view,
|
|
|
+ };
|
|
|
+ })
|
|
|
+ )
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
+const worksListenerMiddleware: Middleware = (store) => (next) => (action) => {
|
|
|
+ const result = next(action);
|
|
|
+
|
|
|
+ if (addWork.match(action)) {
|
|
|
+ const state = store.getState();
|
|
|
+ const works = state.examWorksCache.works;
|
|
|
+ transformWorksToBodyPositions(works).then((bodyPositions) => {
|
|
|
+ store.dispatch(setBodyPositions(bodyPositions));
|
|
|
+ store.dispatch(setSelectedBodyPosition(bodyPositions[0] || null));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+};
|
|
|
+
|
|
|
const bodyPositionListSlice = createSlice({
|
|
|
name: 'bodyPositionList',
|
|
|
initialState,
|
|
@@ -158,3 +203,4 @@ export const {
|
|
|
removeBodyPositionBySopInstanceUid,
|
|
|
} = bodyPositionListSlice.actions;
|
|
|
export default bodyPositionListSlice.reducer;
|
|
|
+export { worksListenerMiddleware };
|