소스 검색

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 달 전
부모
커밋
2cba9165ca
3개의 변경된 파일150개의 추가작업 그리고 12개의 파일을 삭제
  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,