# 重试发送任务功能实现文档 ## 功能概述 实现了传输队列中的【重试发送任务】功能,允许用户选择失败的发送任务并重新提交到后端执行。 ## 一、涉及的参与者 ### 1. 页面层(Page Layer) - **OutputlistPage** (`src/pages/patient/OutputList.tsx`) - 主容器页面,负责展示传输队列 - 管理表格、分页和操作面板 - 维护任务选中状态 ### 2. 组件层(Component Layer) - **OutputOperationPanel** (`src/pages/patient/components/OutputOperationPanel.tsx`) - 操作面板容器组件 - **OutputActionPanel** (`src/pages/patient/components/OutputActionPanel.tsx`) - 包含重试和删除操作按钮 - 实现重试按钮的点击处理逻辑 ### 3. 状态管理层(State Management Layer) - **sendJobSlice** (`src/states/output/sendJob/slices/sendJobSlice.ts`) - `retrySendJobThunk`: 重试任务的异步 Thunk - `createRetryHandlers`: 处理重试结果的 handlers - **Redux Store** - `sendJobSelection.selectedIds`: 维护选中的任务 IDs - `sendJobEntities.data`: 存储任务数据 ### 4. API 层(API Layer) - **sendJobActions** (`src/API/output/sendJobActions.ts`) - `retrySendTask(taskId)`: 调用后端重试接口 - `RetrySendTaskRequest`: 请求参数类型 - `RetrySendTaskResponse`: 响应数据类型 ### 5. 领域模型层(Domain Layer) - **SendJob** (`src/domain/output/sendJob.ts`) - 任务实体模型 - 包含 `task_id`、`status`、`retry_count` 等字段 ## 二、实现修改清单 ### 2.1 API 层修改 **文件:** `src/API/output/sendJobActions.ts` #### 修改内容: 1. **修改请求参数接口** ```typescript // 修改前 export interface RetrySendTaskRequest { instance_uid: string; } // 修改后 export interface RetrySendTaskRequest { task_id: string; } ``` 2. **修改 retrySendTask 函数** ```typescript // 修改前 export const retrySendTask = async ( instanceUid: string ): Promise => { const response = await axiosInstance.post( '/auth/scp/store_reply', { instance_uid: instanceUid } ); // ... } // 修改后 export const retrySendTask = async ( taskId: string ): Promise => { const response = await axiosInstance.post( '/auth/scp/store_reply', { task_id: taskId } ); // ... } ``` ### 2.2 状态管理层修改 **文件:** `src/states/output/sendJob/slices/sendJobSlice.ts` #### 修改内容: 1. **简化 retrySendJobThunk 参数** ```typescript // 修改前 export const retrySendJobThunk = createAsyncThunk( 'sendJob/retry', async ({ taskId, instanceUid }: { taskId: string; instanceUid: string }) => { const result = await retrySendTask(instanceUid); return { taskId, result }; } ); // 修改后 export const retrySendJobThunk = createAsyncThunk( 'sendJob/retry', async (taskId: string) => { const result = await retrySendTask(taskId); return { taskId, result }; } ); ``` ### 2.3 组件层修改 **文件:** `src/pages/patient/components/OutputActionPanel.tsx` #### 修改内容: 1. **添加必要的导入** ```typescript import { message } from 'antd'; import { useAppDispatch, useAppSelector } from '@/states/store'; import { retrySendJobThunk } from '@/states/output/sendJob/slices/sendJobSlice'; ``` 2. **添加重试处理逻辑** ```typescript const OutputActionPanel: React.FC = () => { const dispatch = useAppDispatch(); const selectedIds = useAppSelector((state) => state.sendJobSelection.selectedIds); // 处理重试按钮点击 const handleRetry = async () => { // 校验是否有选中的任务 if (selectedIds.length === 0) { message.warning('请先选择要重试的任务'); return; } try { // 遍历选中的任务,逐个调用重试 API const retryPromises = selectedIds.map((taskId) => dispatch(retrySendJobThunk(taskId)).unwrap() ); await Promise.all(retryPromises); message.success(`成功提交 ${selectedIds.length} 个重试任务`); } catch (error) { console.error('重试任务失败:', error); message.error('重试任务失败,请稍后再试'); } }; return ( // ... ); }; ``` 3. **添加按钮点击事件** ```typescript