Browse Source

注册后进入检查,能够初始化体位列表

dengdx 1 month ago
parent
commit
724d71adca

+ 3 - 1
src/domain/patient/registerToExam.ts

@@ -2,14 +2,16 @@ import { addWork } from '../../states/exam/examWorksCacheSlice';
 import { setBusinessFlow } from '../../states/BusinessFlowSlice';
 import { setBusinessFlow } from '../../states/BusinessFlowSlice';
 import mapToTask from './mapToTask';
 import mapToTask from './mapToTask';
 import store from '@/states/store';
 import store from '@/states/store';
+import { View } from '@/API/patient/viewActions';
 
 
-const registerToExam = async (registerData:any) => {
+const registerToExam = async (registerData:any,views?:View[]) => {
   const dispatch = store.dispatch;
   const dispatch = store.dispatch;
 
 
   try {
   try {
 
 
     // Save registration result to cache
     // Save registration result to cache
     const task = mapToTask(registerData);
     const task = mapToTask(registerData);
+    task.Views=views || [];
     dispatch(addWork(task));
     dispatch(addWork(task));
 
 
     // Step 3: Proceed to Examination
     // Step 3: Proceed to Examination

+ 49 - 7
src/pages/exam/components/BodyPositionList.tsx

@@ -1,27 +1,69 @@
-import React, { useState } from 'react';
+import React from 'react';
+import { useSelector, useDispatch } from 'react-redux';
+import { useEffect } from 'react';
+import { setBodyPositions } from '../../../states/exam/bodyPositionListSlice';
+import { RootState } from '../../../states/store';
 import { Button } from 'antd';
 import { Button } from 'antd';
 import { PlusOutlined } from '@ant-design/icons';
 import { PlusOutlined } from '@ant-design/icons';
 import ImageViewer from './ImageViewer';
 import ImageViewer from './ImageViewer';
+import { addBodyPosition } from '../../../states/exam/bodyPositionListSlice';
 
 
 interface BodyPositionListProps {
 interface BodyPositionListProps {
   layout: 'horizontal' | 'vertical';
   layout: 'horizontal' | 'vertical';
 }
 }
 
 
 const BodyPositionList: React.FC<BodyPositionListProps> = ({ layout }) => {
 const BodyPositionList: React.FC<BodyPositionListProps> = ({ layout }) => {
-  const [images, setImages] = useState<string[]>([]);
+  const dispatch = useDispatch();
+  const bodyPositions = useSelector((state: RootState) => state.bodyPositionList.bodyPositions);
+  const works = useSelector((state: RootState) => state.examWorksCache.works);
 
 
-  const addImage = () => {
-    setImages([...images, 'https://via.placeholder.com/150']);
+  const addBodyPositionClick = () => {
+    // dispatch(addBodyPosition({
+    //   view_name: 'New View',
+    //   view_description: 'Description of the new view',
+    //   view_icon_name: 'icon-name'
+    // }));
   };
   };
 
 
+  useEffect(() => {
+    alert(`${works.length} works found == ${works[0].Views.length} views in the first work`);
+    const bodyPositions = works.flatMap(work => work.Views).map(view => ({
+      internal_id: view.internal_id,
+      view_id: view.view_id,
+      view_name: view.view_name,
+      view_name_local: view.view_name_local,
+      view_other_name: view.view_other_name,
+      view_description: view.view_description,
+      view_position: view.view_position,
+      application: view.application,
+      anatomic_region: view.anatomic_region,
+      patient_type: view.patient_type,
+      body_part_id: view.body_part_id,
+      view_icon_name: view.view_icon_name,
+      view_big_icon_name: view.view_big_icon_name,
+      view_coach_name: view.view_coach_name,
+      modality: view.modality,
+      work_station_id: view.work_station_id,
+      apr_id: view.apr_id,
+      img_proc_id: view.img_proc_id,
+      sort: view.sort,
+      is_enabled: view.is_enabled,
+      product: view.product,
+      is_pre_install: view.is_pre_install,
+      procedure_id: view.procedure_id
+    }));
+    dispatch(setBodyPositions(bodyPositions));
+  }, [works, dispatch]);
+
   return (
   return (
     <div className={`body-position-list ${layout}`}>
     <div className={`body-position-list ${layout}`}>
-      {images.map((src, index) => (
-        <ImageViewer key={index} src={src} className="image-viewer-item" />
+      <div>{bodyPositions.length}</div>
+      {bodyPositions.map((bodyPosition, index) => (
+        <ImageViewer key={index} src={bodyPosition.view_icon_name} className="image-viewer-item" />
       ))}
       ))}
       <Button
       <Button
         icon={<PlusOutlined />}
         icon={<PlusOutlined />}
-        onClick={addImage}
+        onClick={addBodyPositionClick}
         className="add-button"
         className="add-button"
       />
       />
     </div>
     </div>

+ 6 - 5
src/pages/patient/register.tsx

@@ -20,6 +20,7 @@ import registerformSchema from '@/validation/patient/registerSchema';
 import registerToExam from '@/domain/patient/registerToExam';
 import registerToExam from '@/domain/patient/registerToExam';
 import dayjs from 'dayjs';
 import dayjs from 'dayjs';
 import utc from 'dayjs/plugin/utc';
 import utc from 'dayjs/plugin/utc';
+import { View } from '@/API/patient/viewActions';
 dayjs.extend(utc);
 dayjs.extend(utc);
 
 
 const { useBreakpoint } = Grid;
 const { useBreakpoint } = Grid;
@@ -30,7 +31,7 @@ const RegisterPage: React.FC = () => {
   const [form] = Form.useForm();
   const [form] = Form.useForm();
   const { selectedViews, currentPatientType } = useRegisterState();
   const { selectedViews, currentPatientType } = useRegisterState();
 
 
-const handleRegister = async (): Promise<{ success: boolean; data?: any }> => {
+const handleRegister = async (): Promise<{ success: boolean; data?: any; views?: View[] }> => {
   try {
   try {
     let values = form.getFieldsValue();
     let values = form.getFieldsValue();
     const formatDob = values.patient_dob
     const formatDob = values.patient_dob
@@ -48,7 +49,7 @@ const handleRegister = async (): Promise<{ success: boolean; data?: any }> => {
       // message.error(JSON.stringify(validateResult.error, null, 2));
       // message.error(JSON.stringify(validateResult.error, null, 2));
       console.log(JSON.stringify(validateResult.error, null, 2));
       console.log(JSON.stringify(validateResult.error, null, 2));
 
 
-      return { success: false };
+      return { success: false, views: [] as [] };
     }
     }
     const registerInfo: RegisterInfo = {
     const registerInfo: RegisterInfo = {
       ...values,
       ...values,
@@ -63,13 +64,13 @@ const handleRegister = async (): Promise<{ success: boolean; data?: any }> => {
     const response = await registerWork(registerInfo);
     const response = await registerWork(registerInfo);
     console.log('Work registered successfully:', response);
     console.log('Work registered successfully:', response);
     message.info('Work registered successfully');
     message.info('Work registered successfully');
-    return { success: true, data: response.data };
+    return { success: true, data: response.data, views: selectedViews };
   } catch (error) {
   } catch (error) {
     console.error('Error registering work:', error);
     console.error('Error registering work:', error);
     message.error(
     message.error(
       'Error registering work, please check the console for details.'
       'Error registering work, please check the console for details.'
     );
     );
-    return { success: false };
+    return { success: false, views: [] };
   }
   }
 };
 };
 
 
@@ -180,7 +181,7 @@ const handleRegister = async (): Promise<{ success: boolean; data?: any }> => {
         <Button type="default" onClick={async () => {
         <Button type="default" onClick={async () => {
           const registerResult = await handleRegister();
           const registerResult = await handleRegister();
           if (registerResult.success) {
           if (registerResult.success) {
-            await registerToExam(registerResult.data);
+            await registerToExam(registerResult.data,registerResult.views);
           }
           }
         }}>检查</Button>
         }}>检查</Button>
       </Space>
       </Space>

+ 26 - 0
src/states/exam/bodyPositionListSlice.ts

@@ -0,0 +1,26 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit';
+import {View as BodyPosition} from '../../API/patient/viewActions';
+
+interface BodyPositionListState {
+  bodyPositions: BodyPosition[];
+}
+
+const initialState: BodyPositionListState = {
+  bodyPositions: [],
+};
+
+const bodyPositionListSlice = createSlice({
+  name: 'bodyPositionList',
+  initialState,
+  reducers: {
+    addBodyPosition: (state, action: PayloadAction<BodyPosition>) => {
+      state.bodyPositions.push(action.payload);
+    },
+    setBodyPositions: (state, action: PayloadAction<BodyPosition[]>) => {
+      state.bodyPositions = action.payload;
+    },
+  },
+});
+
+export const { addBodyPosition, setBodyPositions } = bodyPositionListSlice.actions;
+export default bodyPositionListSlice.reducer;

+ 2 - 0
src/states/store.ts

@@ -8,6 +8,7 @@ import productReducer from './productSlice';
 import BusinessFlowReducer from './BusinessFlowSlice';
 import BusinessFlowReducer from './BusinessFlowSlice';
 import systemModeReducer from './systemModeSlice';
 import systemModeReducer from './systemModeSlice';
 import examWorksCacheReducer from './exam/examWorksCacheSlice';
 import examWorksCacheReducer from './exam/examWorksCacheSlice';
+import bodyPositionListReducer from './exam/bodyPositionListSlice';
 import {
 import {
   workEntitiesSlice,
   workEntitiesSlice,
   workFiltersSlice,
   workFiltersSlice,
@@ -27,6 +28,7 @@ const store = configureStore({
     BusinessFlow: BusinessFlowReducer,
     BusinessFlow: BusinessFlowReducer,
     systemMode: systemModeReducer,
     systemMode: systemModeReducer,
     examWorksCache: examWorksCacheReducer,
     examWorksCache: examWorksCacheReducer,
+    bodyPositionList: bodyPositionListReducer,
     workEntities: workEntitiesSlice.reducer,
     workEntities: workEntitiesSlice.reducer,
     workFilters: workFiltersSlice.reducer,
     workFilters: workFiltersSlice.reducer,
     workPagination: workPaginationSlice.reducer,
     workPagination: workPaginationSlice.reducer,