Selaa lähdekoodia

fix(dros): resolve study status display and filtering inconsistencies

Fix bug where history list incorrectly showed studies with 'arrived' status
Add study status filtering capability to DROS historylist
Ensure worklist and history views display corresponding studies based on status
dengdx 3 kuukautta sitten
vanhempi
commit
2cba9165ca
3 muutettua tiedostoa jossa 150 lisäystä ja 12 poistoa
  1. 12 12
      src/pages/patient/HistoryList.tsx
  2. 126 0
      src/states/patient/worklist/slices/history.ts
  3. 12 0
      src/states/store.ts

+ 12 - 12
src/pages/patient/HistoryList.tsx

@@ -5,8 +5,8 @@ import { FormattedMessage } from 'react-intl';
 import { useSelector, useDispatch } from 'react-redux';
 import {
   fetchWorkThunk,
-  workSelectionSlice,
-} from '../../states/patient/worklist/slices/workSlice';
+  historySelectionSlice,
+} from '../../states/patient/worklist/slices/history';
 import WorklistTable from './components/WorklistTable';
 import OperationPanel from './components/OperationPanel';
 import { RootState, AppDispatch } from '../../states/store';
@@ -20,21 +20,21 @@ const HistorylistPage: React.FC = () => {
   const [drawerVisible, setDrawerVisible] = useState(false);
 
   const dispatch: AppDispatch = useDispatch();
-  const filters = useSelector((state: RootState) => state.workFilters);
-  const page = useSelector((state: RootState) => state.workPagination.page);
+  const filters = useSelector((state: RootState) => state.historyFilters);
+  const page = useSelector((state: RootState) => state.historyPagination.page);
   const pageSize = useSelector(
-    (state: RootState) => state.workPagination.pageSize
+    (state: RootState) => state.historyPagination.pageSize
   );
   const selectedIds = useSelector(
-    (state: RootState) => state.workSelection.selectedIds
+    (state: RootState) => state.historySelection.selectedIds
   );
-  const worklistData = useSelector(
-    (state: RootState) => state.workEntities.data
+  const historylistData = useSelector(
+    (state: RootState) => state.historyEntities.data
   );
 
   useEffect(() => {
     console.log(
-      'Fetching worklist data with filters:',
+      'Fetching historylist data with filters:',
       filters,
       'page:',
       page,
@@ -48,7 +48,7 @@ const HistorylistPage: React.FC = () => {
     console.log('Row clicked:', JSON.stringify(record, null, 2));
     console.log('Selected IDs before:', record.StudyInstanceUID);
     dispatch(
-      workSelectionSlice.actions.setSelectedIds([record.StudyInstanceUID])
+      historySelectionSlice.actions.setSelectedIds([record.StudyInstanceUID])
     );
   };
 
@@ -65,7 +65,7 @@ const HistorylistPage: React.FC = () => {
       {screens.xs ? (
         <>
           <WorklistTable
-            worklistData={worklistData}
+            worklistData={historylistData}
             filters={filters}
             page={page}
             pageSize={pageSize}
@@ -102,7 +102,7 @@ const HistorylistPage: React.FC = () => {
             className="overflow-auto"
           >
             <WorklistTable
-              worklistData={worklistData}
+              worklistData={historylistData}
               filters={filters}
               page={page}
               pageSize={pageSize}

+ 126 - 0
src/states/patient/worklist/slices/history.ts

@@ -0,0 +1,126 @@
+import { createEntityListSlices } from '../../../list_template/createListSlices';
+import {
+  createFetchThunk,
+  createDeleteThunk,
+} from '../../../list_template/thunk.factory';
+import { work } from '../types/worklist';
+import { WorkFilter } from '../types/workfilter';
+import { PayloadAction } from '@reduxjs/toolkit';
+import {
+  setId,
+  setName,
+  setAccNo,
+  setStartTime,
+  setEndTime,
+  setStatus,
+  setPage,
+  setPageSize,
+} from '../slices/searchSlice';
+
+// Define the fetch thunk
+import { fetchTaskList } from '../../../../API/patient/workActions';
+
+export const fetchWorkThunk = createFetchThunk<WorkFilter, work>(
+  'worklist',
+  async ({ page, pageSize, filters }) => {
+    // const filtersEx: WorkFilter = { ...filters, status: 'Arrived' }
+    const { items, total } = await fetchTaskList(page, pageSize, filters);
+    return { data: items, total };
+  }
+);
+
+// Define the delete thunk
+const deleteWorkThunk = createDeleteThunk(
+  'worklist',
+  // eslint-disable-next-line
+  async (ids) => {
+    // todo 还没有实现API
+    // Implement the deleter function to delete worklist items
+    // await fetch(`/api/worklist`, {
+    //   method: 'DELETE',
+    //   headers: {
+    //     'Content-Type': 'application/json',
+    //   },
+    //   body: JSON.stringify({ ids }),
+    // });
+  }
+);
+const extraReducersForFilter = (builder) => {
+  builder.addCase(
+    setId.type,
+    (state: WorkFilter, action: PayloadAction<string>) => {
+      state.patient_id = action.payload;
+    }
+  );
+  builder.addCase(
+    setName.type,
+    (state: WorkFilter, action: PayloadAction<string>) => {
+      state.patient_name = action.payload;
+    }
+  );
+  builder.addCase(
+    setAccNo.type,
+    (state: WorkFilter, action: PayloadAction<string>) => {
+      state.access_number = action.payload;
+    }
+  );
+  builder.addCase(
+    setStartTime.type,
+    (state: WorkFilter, action: PayloadAction<string>) => {
+      state.start_time = action.payload;
+    }
+  );
+  builder.addCase(
+    setEndTime.type,
+    (state: WorkFilter, action: PayloadAction<string>) => {
+      state.end_time = action.payload;
+    }
+  );
+  builder.addCase(
+    setStatus.type,
+    (state: WorkFilter, action: PayloadAction<string>) => {
+      state.status = action.payload;
+    }
+  );
+  builder.addCase(
+    setPage.type,
+    (state: WorkFilter, action: PayloadAction<number>) => {
+      state.page = action.payload;
+    }
+  );
+  builder.addCase(
+    setPageSize.type,
+    (state: WorkFilter, action: PayloadAction<number>) => {
+      state.page_size = action.payload;
+    }
+  );
+};
+// Create the worklist slices
+const {
+  entitiesSlice,
+  filtersSlice,
+  paginationSlice,
+  selectionSlice,
+  uiSlice,
+} = createEntityListSlices<work, WorkFilter>(
+  'historylist',
+  fetchWorkThunk,
+  deleteWorkThunk,
+  extraReducersForFilter,
+  {
+    patient_id: '',
+    patient_name: '',
+    start_time: '',
+    end_time: '',
+    access_number: '',
+    status: 'Completed',
+    page: 1,
+    page_size: 10,
+  } satisfies WorkFilter
+);
+
+export const historyEntitiesSlice = entitiesSlice;
+export const historyFiltersSlice = filtersSlice;
+export const historyPaginationSlice = paginationSlice;
+export const historySelectionSlice = selectionSlice;
+export const historyUISlice = uiSlice;

+ 12 - 0
src/states/store.ts

@@ -25,6 +25,13 @@ import {
   workSelectionSlice,
   workUISlice,
 } from './patient/worklist/slices/workSlice';
+import {
+  historyEntitiesSlice,
+  historyFiltersSlice,
+  historyPaginationSlice,
+  historySelectionSlice,
+  historyUISlice,
+} from './patient/worklist/slices/history';
 import generatorMonitorReducer from './exam/generatorMonitorSlice';
 import largeScreenReducer from './exam/largeScreenSlice';
 
@@ -48,6 +55,11 @@ const store = configureStore({
     workPagination: workPaginationSlice.reducer,
     workSelection: workSelectionSlice.reducer,
     workUI: workUISlice.reducer,
+    historyEntities: historyEntitiesSlice.reducer,
+    historyFilters: historyFiltersSlice.reducer,
+    historyPagination: historyPaginationSlice.reducer,
+    historySelection: historySelectionSlice.reducer,
+    historyUI: historyUISlice.reducer,
     search: searchReducer,
     generatorMonitor: generatorMonitorReducer,
     largeScreen: largeScreenReducer,