Browse Source

添加急诊进检查的实现,还需要完善

dengdx 2 months ago
parent
commit
be36de3fde

+ 2 - 0
src/API/interceptor.ts

@@ -10,6 +10,8 @@ const axiosInstance = axios.create({
 axiosInstance.interceptors.request.use(
   (config) => {
     const state = store.getState();
+    console.log(`当前系统模式:${state.systemMode.mode}`);
+
     const token =
       state.systemMode.mode === SystemMode.Emergency
         ? state.product.guest

+ 11 - 3
src/API/patient/workActions.ts

@@ -62,7 +62,7 @@ export interface RegisterInfo {
   views: View[];
 }
 
-interface RegisterWorkResponse {
+export interface RegisterWorkResponse {
   code: string;
   description: string;
   solution: string;
@@ -165,9 +165,17 @@ const registerWork = async (
   work: RegisterInfo
 ): Promise<RegisterWorkResponse> => {
   console.log('Work object:', JSON.stringify(work, null, 2));
+  try {
+    const response = await axiosInstance.post('/auth/study', work);
+    // response.data.code
+    console.log(`0000${JSON.stringify(response)}`);
 
-  const response = await axiosInstance.post('/auth/study', work);
-  return response.data;
+    return response.data;
+  } catch (error) {
+    console.warn(`注册出错:${error}`);
+
+    throw error;
+  }
 };
 
 const fetchTaskList = async (

+ 44 - 0
src/domain/patient/handleEmergencyOperation.ts

@@ -0,0 +1,44 @@
+import generateRegistrationInfo from './registrationGenerator';
+import { registerWork } from '../../API/patient/workActions';
+import { setSystemMode, SystemMode } from '../../states/systemModeSlice';
+import { addWork } from '../../states/exam/examWorksCacheSlice';
+import { setBusinessFlow } from '../../states/BusinessFlowSlice';
+import mapToTask from './mapToTask';
+import store from '@/states/store';
+
+const handleEmergencyOperation = async () => {
+  const dispatch = store.dispatch;
+
+  try {
+    dispatch(setSystemMode(SystemMode.Emergency));
+    // Step 1: Generate Registration Information
+    const registrationInfo = generateRegistrationInfo();
+    if (!registrationInfo) {
+      throw new Error('Failed to generate registration information');
+    }
+
+    // Step 2: Register Emergency Work
+    const registrationResult = await registerWork(registrationInfo);
+    if (!registrationResult) {
+      throw new Error('Failed to register emergency work');
+    }
+
+    // Switch system mode back to normal
+    dispatch(setSystemMode(SystemMode.Normal));
+
+    // Save registration result to cache
+    const task = mapToTask(registrationResult.data);
+    dispatch(addWork(task));
+
+    // Step 3: Proceed to Examination
+    dispatch(setBusinessFlow('exam'));
+  } catch (error) {
+    dispatch(setSystemMode(SystemMode.Normal));
+    console.error('Error in handleEmergencyOperation:', error);
+    throw error;
+  } finally {
+    dispatch(setSystemMode(SystemMode.Normal));
+  }
+};
+
+export default handleEmergencyOperation;

+ 44 - 0
src/domain/patient/mapToTask.ts

@@ -0,0 +1,44 @@
+import { Task, RegisterWorkResponse } from '../../API/patient/workActions';
+
+const mapToTask = (data: RegisterWorkResponse['data']): Task => {
+  return {
+    StudyInstanceUID: data.study_instance_uid,
+    StudyID: data.study_id,
+    SpecificCharacterSet: data.specific_character_set,
+    AccessionNumber: data.accession_number,
+    PatientID: data.patient_id,
+    PatientName: data.patient_name,
+    DisplayPatientName: data.patient_name,
+    PatientSize: data.patient_size,
+    PatientAge: data.patient_age,
+    PatientSex: data.patient_sex,
+    AdmittingTime: data.admitting_time || '',
+    RegSource: data.reg_source,
+    StudyStatus: data.study_status,
+    RequestedProcedureID: '',
+    PerformedProtocolCodeValue: '',
+    PerformedProtocolCodeMeaning: '',
+    PerformedProcedureStepID: '',
+    StudyDescription: data.study_description,
+    StudyStartDatetime: data.study_start_datetime || '',
+    ScheduledProcedureStepStartDate:
+      data.scheduled_procedure_step_start_date || '',
+    StudyLock: data.study_lock,
+    OperatorID: data.operator_name,
+    Modality: data.modality,
+    Views: [],
+    Thickness: data.thickness,
+    PatientType: data.patient_type,
+    StudyType: data.study_type,
+    QRCode: '',
+    IsExported: data.is_exported,
+    IsEdited: data.is_edited,
+    WorkRef: '',
+    IsAppended: data.is_appended,
+    CreationTime: '',
+    MappedStatus: data.mapped_status,
+    IsDelete: false,
+  };
+};
+
+export default mapToTask;

+ 2 - 0
src/pages/demo/AppInitializer.tsx

@@ -2,6 +2,7 @@ import React, { useEffect } from 'react';
 import { useDispatch, useSelector } from 'react-redux';
 import { getPatientTypes } from '@/states/patientTypeSlice';
 import { getBodyParts } from '@/states/bodyPartSlice';
+import { initializeProductState } from '@/states/productSlice';
 import type { RootState, AppDispatch } from '@/states/store';
 
 interface AppInitializerProps {
@@ -21,6 +22,7 @@ const AppInitializer: React.FC<AppInitializerProps> = ({ onInitialized }) => {
             params: {},
           })
         );
+        await dispatch(initializeProductState());
       }
       onInitialized();
     };

+ 2 - 1
src/pages/security/Login.tsx

@@ -4,6 +4,7 @@ import loginBrand from 'src/assets/imgs/login-brand.jpeg';
 import { useDispatch } from 'react-redux';
 import { login as loginApi } from '../../API/security/userActions';
 import { setUserInfo, type UserInfoState } from '../../states/user_info'; // 同时导入 setUserInfo 和类型 UserInfoState
+import handleEmergencyOperation from '../../domain/patient/handleEmergencyOperation';
 
 const Login: React.FC = () => {
   const [form] = Form.useForm();
@@ -95,9 +96,9 @@ const Login: React.FC = () => {
                 <Col span={12}>
                   <Button
                     type="primary"
-                    htmlType="submit"
                     size="large"
                     className="w-full"
+                    onClick={handleEmergencyOperation}
                   >
                     急诊
                   </Button>

+ 31 - 0
src/states/exam/examWorksCacheSlice.ts

@@ -0,0 +1,31 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit';
+import { Task as Work } from '../../API/patient/workActions';
+
+interface ExamWorksCacheState {
+  works: Work[];
+}
+
+const initialState: ExamWorksCacheState = {
+  works: [],
+};
+
+const examWorksCacheSlice = createSlice({
+  name: 'examWorksCache',
+  initialState,
+  reducers: {
+    addWork: (state, action: PayloadAction<Work>) => {
+      state.works.push(action.payload);
+    },
+    removeWork: (state, action: PayloadAction<string>) => {
+      state.works = state.works.filter(
+        (work) => work.AccessionNumber !== action.payload
+      );
+    },
+    clearWorks: (state) => {
+      state.works = [];
+    },
+  },
+});
+
+export const { addWork, removeWork, clearWorks } = examWorksCacheSlice.actions;
+export default examWorksCacheSlice.reducer;

+ 2 - 0
src/states/store.ts

@@ -7,6 +7,7 @@ import selectionReducer from './patient/register/SelectionTypeSlice';
 import productReducer from './productSlice';
 import BusinessFlowReducer from './BusinessFlowSlice';
 import systemModeReducer from './systemModeSlice';
+import examWorksCacheReducer from './exam/examWorksCacheSlice';
 import {
   workEntitiesSlice,
   workFiltersSlice,
@@ -25,6 +26,7 @@ const store = configureStore({
     product: productReducer,
     BusinessFlow: BusinessFlowReducer,
     systemMode: systemModeReducer,
+    examWorksCache: examWorksCacheReducer,
     workEntities: workEntitiesSlice.reducer,
     workFilters: workFiltersSlice.reducer,
     workPagination: workPaginationSlice.reducer,