Procházet zdrojové kódy

feat(device): implement reset function to send reset command to generator

sw před 4 týdny
rodič
revize
cc531e5e7c

+ 31 - 0
src/API/exam/deviceActions.ts

@@ -0,0 +1,31 @@
+import axiosInstance from '../interceptor';
+
+/**
+ * 对所有设备的指令
+ */
+const generatorUri = 'DIOS/DEVICE/Generator';
+
+interface DeviceActionMessage {
+  deviceUri: string;
+  reqName: string;
+  reqParam: string;
+  reqTransaction: string;
+  reqClientID: string;
+}
+const resetAllDevices = async () => {
+  const resetGenerator: DeviceActionMessage = {
+    deviceUri: generatorUri,
+    reqName: 'RESET',
+    reqParam: ``,
+    reqTransaction: '',
+    reqClientID: '',
+  };
+
+  try {
+    await axiosInstance.post('/auth/device/action', resetGenerator);
+  } catch (error) {
+    console.error(`[重置所有设备出错 ] `, error);
+    throw error;
+  }
+};
+export { resetAllDevices };

+ 14 - 0
src/pages/exam/ContentAreaLarge.tsx

@@ -34,9 +34,13 @@ import { AppDispatch } from '@/states/store';
 import { useRef } from 'react';
 import Icon from '@/components/Icon';
 import ParaSettingCoordinator from '@/domain/exam/paraSettingCoordinator';
+import { resetDevices } from '@/states/device/deviceSlice';
 
 const ContentAreaLarge = () => {
   const dispatch = useDispatch<AppDispatch>();
+  const isResetting = useSelector(
+    (state: RootState) => state.device.status === 'loading'
+  );
   const store = useStore<RootState>();
   const aprConfig = useSelector((state: RootState) => state.apr.aprConfig);
   const bodysize = useSelector((state: RootState) => state.apr.bodysize);
@@ -64,6 +68,14 @@ const ContentAreaLarge = () => {
     dispatch(setCurrentExposureMode(value));
   };
 
+  const handleResetParameters = async () => {
+    try {
+      await dispatch(resetDevices());
+    } catch (error) {
+      console.error('Error resetting devices:', error);
+    }
+  };
+
   // 1. 正常在顶层用 useSelector 订阅
   const selectedBodyPosition = useSelector(
     (state: RootState) => state.bodyPositionList.selectedBodyPosition
@@ -230,6 +242,8 @@ const ContentAreaLarge = () => {
               />
             }
             title="重置参数"
+            onClick={handleResetParameters}
+            disabled={isResetting}
           />
         </Flex>
         <Divider />

+ 40 - 0
src/states/device/deviceSlice.ts

@@ -0,0 +1,40 @@
+import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
+import { resetAllDevices } from '../../API/exam/deviceActions';
+
+interface DeviceState {
+  status: 'idle' | 'loading' | 'succeeded' | 'failed';
+  error: string | null;
+}
+
+const initialState: DeviceState = {
+  status: 'idle',
+  error: null,
+};
+
+export const resetDevices = createAsyncThunk(
+  'device/resetDevices',
+  async () => {
+    await resetAllDevices();
+  }
+);
+
+const deviceSlice = createSlice({
+  name: 'device',
+  initialState,
+  reducers: {},
+  extraReducers: (builder) => {
+    builder
+      .addCase(resetDevices.pending, (state) => {
+        state.status = 'loading';
+      })
+      .addCase(resetDevices.fulfilled, (state) => {
+        state.status = 'succeeded';
+      })
+      .addCase(resetDevices.rejected, (state, action) => {
+        state.status = 'failed';
+        state.error = action.error.message || 'Failed to reset devices';
+      });
+  },
+});
+
+export default deviceSlice.reducer;

+ 2 - 0
src/states/store.ts

@@ -42,6 +42,7 @@ import panelSwitchForViewReducer from './panelSwitchSliceForView';
 import quotaModalReducer from './security/quotaModalSlice';
 import quotaReducer from './security/quotaSlice';
 import formReducer from './patient/register/formSlice';
+import deviceReducer from './device/deviceSlice';
 
 const store = configureStore({
   reducer: {
@@ -77,6 +78,7 @@ const store = configureStore({
     quotaModal: quotaModalReducer,
     quota: quotaReducer,
     form: formReducer,
+    device: deviceReducer,
   },
   middleware: (getDefaultMiddleware) =>
     getDefaultMiddleware().concat(