瀏覽代碼

feat: 实现APR参数保存功能

- 添加修改APR参数API接口文档 (docs/DR.md)
- 新增AprParamsUpdateRequest和AprUpdateResponse接口定义 (src/API/exam/APRActions.ts)
- 实现updateAprParams函数用于调用后端API (src/API/exam/APRActions.ts)
- 在ContentAreaLarge组件中实现保存参数功能 (src/pages/exam/ContentAreaLarge.tsx)
- 添加updateAprParamsThunk用于处理APR参数更新 (src/states/exam/aprSlice.ts)
- 添加相应的状态管理和错误处理 (src/states/exam/aprSlice.ts)

修改的文件路径:
- docs/DR.md
- src/API/exam/APRActions.ts
- src/pages/exam/ContentAreaLarge.tsx
- src/states/exam/aprSlice.ts
sw 17 小時之前
父節點
當前提交
3ac6b92483
共有 4 個文件被更改,包括 141 次插入14 次删除
  1. 51 3
      docs/DR.md
  2. 33 1
      src/API/exam/APRActions.ts
  3. 30 9
      src/pages/exam/ContentAreaLarge.tsx
  4. 27 1
      src/states/exam/aprSlice.ts

+ 51 - 3
docs/DR.md

@@ -1922,7 +1922,55 @@ zh_CN
 ```
 
 
-## 15.9	获取APR设备信息
+## 15.9	修改APR参数
+
+> POST  /dr/api/v1/auth/protocol/apr/{id}
+### 接口说明
+> 修改APR参数
+### 地址参数(Path Variable)
+| 参数名称 | 默认值 | 描述 |
+| ------ | ------ | ------ |
+|id||apr_id|
+### 请求头
+| 参数名称 | 默认值 | 描述 |
+| ------ | ------ | ------ |
+|Authorization|Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTEyNzc5NzAsImlkIjoxLCJuYW1lIjoiYWRtaW4ifQ.ooTGwBXaNhtunbKbpqteWbjDwJLjnRmSIl80r5dp1pY||
+|Language||en_US 或 zh_CN|
+|Product|DROS|DROS 或 VETDROS|
+|Source|Electron|Electron 或 Browser 或 Android|
+### 请求体(Request Body)
+| 参数名称 | 数据类型 | 默认值 | 不为空 | 描述 |
+| ------ | ------ | ------ | ------ | ------ |
+| work_station_id|number||true|工作位|
+| patient_size|string||true|体型|
+| kV|number||true||
+| mA|number||true||
+| ms|number||true||
+| mAs|number||true||
+### 响应体
+● 200: OK 响应数据格式:JSON
+```json
+{
+	"code": "0x000000",
+	"data": {},
+	"description": "Success",
+	"solution": ""
+}
+```
+请求示例
+```
+{
+	"work_station_id": 0,
+	"patient_size": "Large",
+	"kV": 57.0,
+	"mA": 250.0,
+	"ms": 20.0,
+	"mAs": 5.0
+}
+```
+![  ](http://f1-xyj.fangdeco.cn/attachment/2025/10/14/2M7ZpU7fkZc/a39759c61f894a2eb043bd834f29eef4)
+
+## 15.10	获取APR设备信息
 
 > GET  /dr/api/v1/auth/protocol/apr/{id}/device
 ### 接口说明
@@ -1971,7 +2019,7 @@ zh_CN
 ```
 
 
-## 15.10	获取APR默认曝光参数
+## 15.11	获取APR默认曝光参数
 
 > GET  /dr/api/v1/auth/protocol/apr/{id}/tech
 ### 接口说明
@@ -2034,7 +2082,7 @@ zh_CN
 ```
 
 
-## 15.11	通过厚度获取APR
+## 15.12	通过厚度获取APR
 
 > GET  /dr/api/v1/auth/protocol/thickness/{thickness}/apr
 ### 接口说明

+ 33 - 1
src/API/exam/APRActions.ts

@@ -15,6 +15,22 @@ export interface AprConfig {
   ms: number;
 }
 
+export interface AprParamsUpdateRequest {
+  work_station_id: number;
+  patient_size: string;
+  kV: number;
+  mA: number;
+  ms: number;
+  mAs: number;
+}
+
+export interface AprUpdateResponse {
+  code: string;
+  data: object;
+  description: string;
+  solution: string;
+}
+
 interface AprSub {
   work_station_id: number;
   patient_size: string;
@@ -89,7 +105,23 @@ const getAprByThickness = async (thickness: number): Promise<AprConfig> => {
   return response.data.data;
 };
 
-export { getAprDetails, getAprExposureParams, getAprByThickness };
+const updateAprParams = async (
+  id: string,
+  request: AprParamsUpdateRequest
+): Promise<AprUpdateResponse> => {
+  try {
+    const response = await axiosInstance.post(
+      `auth/protocol/apr/${id}`,
+      request
+    );
+    return response.data;
+  } catch (error) {
+    console.error(`更新APR参数失败:`, error);
+    throw error;
+  }
+};
+
+export { getAprDetails, getAprExposureParams, getAprByThickness, updateAprParams };
 
 interface DeviceActionMessage {
   deviceUri: string;

+ 30 - 9
src/pages/exam/ContentAreaLarge.tsx

@@ -12,7 +12,7 @@ import {
 } from 'antd';
 import ErrorMessage from '@/components/ErrorMessage';
 import { patientSizes, PatientSize } from '../../states/patientSize';
-import { WorkstationTypeLabels } from '../../states/workstation';
+import { WorkstationTypeLabels, WorkstationType } from '../../states/workstation';
 import { FormattedMessage } from 'react-intl';
 import { useSelector, useDispatch, useStore } from 'react-redux';
 import { deleteBodyPosition } from '../../API/patient/viewActions';
@@ -29,7 +29,10 @@ import {
   setWorkstation,
   setThickness,
   setIsAECEnabled,
+  updateAprParamsThunk,
 } from '../../states/exam/aprSlice';
+import { workstationIdFromWorkstation } from '../../states/workstation';
+import { AprParamsUpdateRequest } from '../../API/exam/APRActions';
 import BodyPositionList from './components/BodyPositionList';
 import BodyPositionDetail from './components/BodyPositionDetail';
 import { AppDispatch } from '@/states/store';
@@ -170,14 +173,32 @@ const ContentAreaLarge = () => {
     }
 
     try {
-      // TODO: 实现保存参数 API 调用
-      // 需要调用后端 API 保存当前的 APR 参数到选中的体位
-      // 参数包括:aprConfig (kV, mA, ms, mAs 等)
-      // API 端点待定
-      console.log('保存参数功能待实现,当前 APR 配置:', aprConfig);
-      console.log('选中体位:', selectedBodyPosition.sop_instance_uid);
-      
-      message.info('保存参数功能开发中');
+      // 获取工作站ID - 将字符串转换为WorkstationType枚举
+      const workstationType = workstation as WorkstationType;
+      const workStationId = workstationIdFromWorkstation(
+        workstationType,
+        productName
+      );
+
+      // 构建请求参数
+      const request: AprParamsUpdateRequest = {
+        work_station_id: workStationId,
+        patient_size: bodysize,
+        kV: aprConfig.kV,
+        mA: aprConfig.mA,
+        ms: aprConfig.ms,
+        mAs: aprConfig.mAs,
+      };
+
+      // 调用 updateAprParamsThunk
+      await dispatch(
+        updateAprParamsThunk({
+          id: selectedBodyPosition.view_id,
+          request,
+        })
+      ).unwrap();
+
+      message.success('参数保存成功');
     } catch (err) {
       console.error('保存参数失败:', err);
       message.error('保存参数失败');

+ 27 - 1
src/states/exam/aprSlice.ts

@@ -1,6 +1,6 @@
 /* eslint-disable */
 import { createSlice, PayloadAction, Middleware, createAsyncThunk } from '@reduxjs/toolkit';
-import { AprConfig, getAprExposureParams, getAprByThickness, SetAPR } from '../../API/exam/APRActions';
+import { AprConfig, getAprExposureParams, getAprByThickness, SetAPR, updateAprParams, AprParamsUpdateRequest, AprUpdateResponse } from '../../API/exam/APRActions';
 import { workstationIdFromWorkstation, WorkstationType } from '../workstation';
 import { ExtendedBodyPosition, setSelectedBodyPosition } from '../exam/bodyPositionListSlice';
 import { initializeProductState } from '../productSlice';
@@ -241,6 +241,18 @@ const aprSlice = createSlice({
           state.workstation = WorkstationType.Free;
           console.log('自动设置 workstation 为 Free (VETDROS 环境)');
         }
+      })
+      .addCase(updateAprParamsThunk.pending, (state) => {
+        console.log('Updating APR parameters...');
+        state.isPending = true;
+      })
+      .addCase(updateAprParamsThunk.fulfilled, (state, action) => {
+        console.log('APR parameters updated successfully:', action.payload);
+        state.isPending = false;
+      })
+      .addCase(updateAprParamsThunk.rejected, (state, action) => {
+        console.error('Failed to update APR parameters', action.error);
+        state.isPending = false;
       });
   },
 });
@@ -430,10 +442,24 @@ export const decThickness = createAsyncThunk<number, number>('apr/decThickness',
   return amount;
 });
 
+// 定义 updateAprParamsThunk 的 payload 类型
+interface UpdateAprParamsPayload {
+  id: string;
+  request: AprParamsUpdateRequest;
+}
+
 export const setExposureModeThunk = createAsyncThunk<string, string>('apr/setExposureMode', async (mode: string) => {
   return mode;
 });
 
+// 创建新的 thunk 用于更新 APR 参数
+export const updateAprParamsThunk = createAsyncThunk<AprUpdateResponse, UpdateAprParamsPayload>(
+  'apr/updateAprParams',
+  async ({ id, request }) => {
+    return await updateAprParams(id, request);
+  }
+);
+
 export const {
   setAprConfig,
   setBodysize,