Browse Source

添加患者类型的获取与存储相关的逻辑

dengdx 2 months ago
parent
commit
e4f91c19ee
2 changed files with 120 additions and 0 deletions
  1. 54 0
      src/API/patientType.ts
  2. 66 0
      src/states/patientTypeSlice.ts

+ 54 - 0
src/API/patientType.ts

@@ -0,0 +1,54 @@
+import axios from 'axios';
+
+export interface PatientTypeParams {
+  is_enabled?: string;
+}
+
+export interface PatientType {
+  id: string;
+  patient_type_id: string;
+  patient_type_name: string;
+  patient_type_local: string;
+  patient_type_description: string;
+  sort: number;
+  is_enabled: boolean;
+  product: string;
+  is_pre_install: boolean;
+}
+
+export interface PatientTypeResponse {
+  code: string;
+  description: string;
+  solution: string;
+  data: {
+    patient_type_list: PatientType[];
+  };
+}
+
+export async function fetchPatientTypes(
+  params: PatientTypeParams,
+  token: string,
+  language = 'en',
+  product = 'DROS',
+  source = 'Electron'
+): Promise<PatientType[]> {
+  const response = await axios.get('/auth/protocol/patient_type', {
+    params,
+    headers: {
+      Authorization: `Bearer ${token}`,
+      Language: language,
+      Product: product,
+      Source: source,
+    },
+  });
+  // 兼容接口返回结构
+  if (
+    response.data &&
+    response.data.code === '0x000000' &&
+    response.data.data &&
+    Array.isArray(response.data.data.patient_type_list)
+  ) {
+    return response.data.data.patient_type_list;
+  }
+  return [];
+}

+ 66 - 0
src/states/patientTypeSlice.ts

@@ -0,0 +1,66 @@
+import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
+import {
+  fetchPatientTypes,
+  PatientType,
+  PatientTypeParams,
+} from '../API/patientType';
+import { AxiosError } from 'axios';
+
+interface PatientTypeState {
+  items: PatientType[];
+  loading: boolean;
+  error: string | null;
+}
+
+const initialState: PatientTypeState = {
+  items: [],
+  loading: false,
+  error: null,
+};
+
+export const getPatientTypes = createAsyncThunk(
+  'patientType/getPatientTypes',
+  async (
+    { params, token }: { params: PatientTypeParams; token: string },
+    { rejectWithValue }
+  ) => {
+    try {
+      const data = await fetchPatientTypes(params, token);
+      return data;
+    } catch (err: unknown) {
+      let errorMessage = 'Failed to fetch patient types';
+      if (
+        err &&
+        typeof err === 'object' &&
+        'message' in err &&
+        typeof (err as AxiosError).message === 'string'
+      ) {
+        errorMessage = (err as AxiosError).message;
+      }
+      return rejectWithValue(errorMessage);
+    }
+  }
+);
+
+const patientTypeSlice = createSlice({
+  name: 'patientType',
+  initialState,
+  reducers: {},
+  extraReducers: (builder) => {
+    builder
+      .addCase(getPatientTypes.pending, (state) => {
+        state.loading = true;
+        state.error = null;
+      })
+      .addCase(getPatientTypes.fulfilled, (state, action) => {
+        state.loading = false;
+        state.items = action.payload;
+      })
+      .addCase(getPatientTypes.rejected, (state, action) => {
+        state.loading = false;
+        state.error = action.payload as string;
+      });
+  },
+});
+
+export default patientTypeSlice.reducer;