# 自动接受图像功能实现文档 ## 概述 本文档描述了在曝光成功后自动接受图像的功能实现。该功能通过监听MQTT消息,在图像处理完成并成功后自动调用接受图像接口。 ## 需求背景 在DR系统的检查流程中,当曝光完成并成功处理图像后,系统需要自动接受该图像,避免手动操作,提高工作效率。 ## 实现位置 **文件**: `src/domain/mqttService.ts` **修改内容**: 在 `handleMqttMessage` 函数的 `TASK_Success` 分支中添加自动接受逻辑 ## 技术方案 ### 1. MQTT消息流程 ``` 曝光触发 ↓ 图像采集 ↓ 图像处理 (多个阶段) ↓ MQTT 推送进度状态 - TASK_RecvRaw (已获取原图) - TASK_RecvMask (已获取mask) - TASK_RecvEnhance (已完成增强) - TASK_RecvForeground (已获取前景mask) - TASK_RecvApply (已完成遮罩mask) - TASK_Success (成功存储dcm) ✨ ↓ 自动接受图像 ``` ### 2. 关键消息格式 **Topic**: `MODULE/TASK/IMGPROC/PROGRESS` **消息结构**: ```typescript interface MqttMessage { dcm?: string; // dcm文件名 message: string; // 消息内容 sop?: string; // SOP实例UID (图像ID) status: string; // 状态 thumbnail?: string; // 缩略图文件名 } ``` **成功消息示例**: ```json { "dcm": "20250801150247.dcm", "message": "", "sop": "20250801150247", "status": "TASK_Success", "thumbnail": "20250801150247.webp" } ``` ### 3. 代码实现 #### 3.1 导入依赖 ```typescript import { judgeImage } from '../API/exam/judgeImage'; ``` #### 3.2 自动接受逻辑 在 `TASK_Success` 分支中添加: ```typescript case 'TASK_Success': console.log('Task succeeded:', message); // Handle success, e.g., process DCM and thumbnail files emitter.emit('TASK_SUCCESS', message); emitter.emit('ACQUISITION_SUCCESS'); // 自动接受图像 if (message.sop) { judgeImage(message.sop, true) .then(() => { console.log(`图像 ${message.sop} 已自动接受`); }) .catch((error) => { console.error(`自动接受图像失败:`, error); }); } break; ``` ## 功能特点 ### ✅ 优点 1. **时机准确**: 在图像处理完全成功后立即接受 2. **无侵入性**: 不影响现有的事件触发逻辑 3. **错误隔离**: 接受失败不影响其他功能继续执行 4. **日志完整**: 成功和失败都有详细日志记录 5. **异步处理**: 使用Promise处理,不阻塞主流程 ### 📋 工作流程 1. 用户触发曝光 2. 系统进行图像采集和处理 3. 后端通过MQTT推送处理进度 4. 当收到 `TASK_Success` 状态时: - 触发现有的成功事件 - **自动调用接受图像API** - 记录操作日志 5. 图像状态更新为"已接受" ## API调用详情 ### 接口信息 - **端点**: `POST /api/v1/auth/task/inspection/judge` - **参数**: - `instance_uid`: 图像的SOP实例UID (从MQTT消息的 `sop` 字段获取) - `accept`: true (固定为接受) ### 调用示例 ```typescript // 从MQTT消息中提取SOP实例UID const sopInstanceUid = message.sop; // 例如: "20250801150247" // 调用接受图像API await judgeImage(sopInstanceUid, true); ``` ## 错误处理 ### 可能的错误场景 1. **网络错误**: 无法连接到后端服务器 2. **认证失败**: Token无效或过期 3. **SOP为空**: MQTT消息中没有sop字段 4. **服务器错误**: 后端处理失败 ### 错误处理策略 - 所有错误都会被捕获并记录到控制台 - 错误不会中断MQTT消息处理流程 - 不会影响现有事件的触发(`TASK_SUCCESS`, `ACQUISITION_SUCCESS`) ## 测试验证 ### 测试步骤 1. 启动系统并登录 2. 进入检查页面 3. 触发曝光操作 4. 观察控制台日志: ``` Task succeeded: {dcm: "xxx.dcm", sop: "xxx", status: "TASK_Success", ...} 图像 xxx 已自动接受 ``` 5. 确认图像状态已更新为"已接受" ### 验证点 - ✅ 曝光成功后自动调用接受接口 - ✅ 控制台显示接受成功日志 - ✅ 图像状态正确更新 - ✅ 错误情况下不影响其他功能 ## 相关文件 - `src/domain/mqttService.ts` - MQTT消息处理(实现位置) - `src/API/exam/judgeImage.ts` - 接受/拒绝图像API - `docs/DR.md` - 后端API文档(第37、38节) ## 后续优化建议 ### 可选功能 1. **可配置开关**: 在系统设置中提供"自动接受图像"的开关选项 2. **条件接受**: 根据图像质量评分决定是否自动接受 3. **通知提示**: 自动接受后给用户显示Toast提示 4. **统计记录**: 记录自动接受的成功率和失败原因 ### 配置化示例 如果需要添加开关控制: ```typescript // 在Redux状态中添加配置 interface ExamSettings { autoAcceptImage: boolean; } // 在MQTT处理中检查配置 if (message.sop && getState().exam.settings.autoAcceptImage) { judgeImage(message.sop, true) .then(() => console.log(`图像 ${message.sop} 已自动接受`)) .catch((error) => console.error(`自动接受图像失败:`, error)); } ``` ## 注意事项 1. 确保 `judgeImage` API已正确实现并测试 2. MQTT消息的 `sop` 字段必须是有效的SOP实例UID 3. 自动接受在曝光成功后立即执行,无法撤销 4. 如果需要手动审核图像质量,应禁用此功能 ## 版本历史 - **v1.0** (2025-10-13): 初始实现,在TASK_Success时自动接受图像 --- *文档创建时间: 2025年10月13日* *最后更新: 2025年10月13日*