Browse Source

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 2 days ago
parent
commit
2cba9165ca
3 changed files with 150 additions and 12 deletions
  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,