Bläddra i källkod

fix: 修复急诊模式下空白页面问题 (handleEmergencyOperation.ts, businessFlowMiddlewareLogic.ts)

- 在 handleEmergencyOperation.ts 中使用 guest token 设置临时用户信息
- 在 businessFlowMiddlewareLogic.ts 中添加急诊模式判断,跳过表单验证
- 解决从登录界面点击急诊按钮后无法进入检查页面的问题
sw 1 vecka sedan
förälder
incheckning
260c3d7747
2 ändrade filer med 79 tillägg och 37 borttagningar
  1. 29 10
      src/domain/patient/handleEmergencyOperation.ts
  2. 50 27
      src/states/businessFlowMiddlewareLogic.ts

+ 29 - 10
src/domain/patient/handleEmergencyOperation.ts

@@ -3,6 +3,7 @@ import { registerWork } from '../../API/patient/workActions';
 import { setSystemMode, SystemMode } from '../../states/systemModeSlice';
 import { addWork } from '../../states/exam/examWorksCacheSlice';
 import { setBusinessFlow } from '../../states/BusinessFlowSlice';
+import { setUserInfo } from '../../states/user_info';
 import mapToTask from './mapToTask';
 import store from '@/states/store';
 
@@ -10,14 +11,36 @@ const handleEmergencyOperation = async () => {
   const dispatch = store.dispatch;
 
   try {
+    // Step 1: Get guest token from product slice
+    const state = store.getState();
+    const guestToken = state.product.guest;
+
+    if (!guestToken) {
+      throw new Error('Guest token not available');
+    }
+
+    // Step 2: Set system mode to Emergency
     dispatch(setSystemMode(SystemMode.Emergency));
-    // Step 1: Generate Registration Information
+
+    // Step 3: Set temporary user info with guest token
+    // This allows the app to render BasicLayout while using guest token for API calls
+    dispatch(
+      setUserInfo({
+        token: guestToken,
+        expire: Date.now() + 24 * 60 * 60 * 1000, // 24 hours expiry
+        uid: -1, // Special uid to identify emergency mode
+        name: 'Emergency User',
+        avatar: '',
+      })
+    );
+
+    // Step 4: Generate Registration Information
     const registrationInfo = generateRegistrationInfo();
     if (!registrationInfo) {
       throw new Error('Failed to generate registration information');
     }
 
-    // Step 2: Register Emergency Work
+    // Step 5: Register Emergency Work
     const registrationResult = await registerWork(registrationInfo);
     if (!registrationResult || registrationResult.code !== '0x000000') {
       throw new Error(
@@ -28,21 +51,17 @@ const handleEmergencyOperation = async () => {
       `Emergency registration result: ${JSON.stringify(registrationResult)}`
     );
 
-    // Switch system mode back to normal
-    // dispatch(setSystemMode(SystemMode.Normal));
-
-    // Save registration result to cache
+    // Step 6: Save registration result to cache
     const task = mapToTask(registrationResult.data);
     dispatch(addWork(task));
 
-    // Step 3: Proceed to Examination
+    // Step 7: Proceed to Examination
     dispatch(setBusinessFlow('exam'));
   } catch (error) {
-    // dispatch(setSystemMode(SystemMode.Normal));
+    // Clean up emergency state on error
+    dispatch(setSystemMode(SystemMode.Unkonwn));
     console.error('Error in handleEmergencyOperation:', error);
     throw error;
-  } finally {
-    // dispatch(setSystemMode(SystemMode.Normal));
   }
 };
 

+ 50 - 27
src/states/businessFlowMiddlewareLogic.ts

@@ -111,39 +111,62 @@ const businessFlowMiddlewareLogic: Middleware =
 
       // 进入检查前,如果是从register来的,则判断数据合法性,执行注册等逻辑
       if (currentKey === 'register') {
-        const result = await executeRegisterLogic(store);
+        const systemMode = (store.getState() as RootState).systemMode.mode;
 
-        if (!result.success) {
+        // 如果是急诊模式,跳过验证(急诊流程已经完成注册)
+        if (systemMode === 'Emergency') {
           console.log(
-            '[businessFlowMiddleware] Register validation failed, blocking entry to exam'
+            '[businessFlowMiddleware] Emergency mode, skipping register validation'
           );
-          return; // 阻止进入exam
-        }
-        try {
-          await registerToExam(result.data!);
-          const state = store.getState();
-          const works = state.examWorksCache.works;
-          await transformWorksToBodyPositions(works)
-            .then((bodyPositions) => {
-              store.dispatch(setBodyPositions(bodyPositions));
-            })
-            .catch((error) => {
-              console.error(
-                '[businessFlowMiddleware] Transform works to body positions failed:',
-                error
-              );
-              return; // 阻止进入exam
-            });
-        } catch (_error) {
+          // 急诊模式下仍需要准备 body positions
+          try {
+            const state = store.getState();
+            const works = state.examWorksCache.works;
+            const bodyPositions = await transformWorksToBodyPositions(works);
+            store.dispatch(setBodyPositions(bodyPositions));
+          } catch (error) {
+            console.error(
+              '[businessFlowMiddleware] Failed to prepare body positions:',
+              error
+            );
+            return; // 阻止进入exam
+          }
+        } else {
+          // 正常注册流程,需要验证
+          const result = await executeRegisterLogic(store);
+
+          if (!result.success) {
+            console.log(
+              '[businessFlowMiddleware] Register validation failed, blocking entry to exam'
+            );
+            return; // 阻止进入exam
+          }
+          try {
+            await registerToExam(result.data!);
+            const state = store.getState();
+            const works = state.examWorksCache.works;
+            await transformWorksToBodyPositions(works)
+              .then((bodyPositions) => {
+                store.dispatch(setBodyPositions(bodyPositions));
+              })
+              .catch((error) => {
+                console.error(
+                  '[businessFlowMiddleware] Transform works to body positions failed:',
+                  error
+                );
+                return; // 阻止进入exam
+              });
+          } catch (_error) {
+            console.log(
+              '[businessFlowMiddleware] Register validation failed',
+              _error
+            );
+            return; // 阻止进入exam
+          }
           console.log(
-            '[businessFlowMiddleware] Register validation failed',
-            _error
+            '[businessFlowMiddleware] Register validation succeeded, proceeding to exam'
           );
-          return; // 阻止进入exam
         }
-        console.log(
-          '[businessFlowMiddleware] Register validation succeeded, proceeding to exam'
-        );
       }
       prepare();
       return next(action);