worklistToExam.ts
文件职责
提供从工作列表进入检查/处理的转换函数,支持单个任务进入检查和多个任务批量进入图像处理。
实现方式
通过异步函数从后端获取任务详情,构建完整的 Task 对象并缓存,然后切换业务流程或转换为体位列表。
核心公共函数:prepareWorksForExam
- 支持单个或多个 Task 的数据准备,使用 Promise.all 并行处理以提高性能,可供其他模块(如 middleware)复用。
实现思路
prepareWorksForExam(公共数据准备函数)
- 参数统一:接受单个 Task 或 Task 数组,统一转为数组处理
- 并行处理:使用 Promise.all 并行调用 fetchTaskDetails 获取所有任务的详细数据
- 数据转换:为每个任务构建完整的 Task 对象,展平 series/images 为 Views 数组
- 返回结果:返回包含完整 Views 数据的 Task 数组
- 性能优化:相比串行处理,并行获取多个任务详情可显著提升性能
- 可复用性:供 worklistToExam、middleware 等多个模块使用
worklistToExam(单任务进入检查)
- 调用公共函数:使用 prepareWorksForExam 准备数据(传入单个 Task)
- 解构结果:从返回的数组中解构第一个元素获取准备好的 Task
- 清空缓存:使用 clearWorks 清空旧的检查缓存
- 添加任务:将完整的 Task 添加到 examWorksCacheSlice
- 切换流程:设置业务流程为 exam,进入检查页面
worklistToProcess(批量任务进入处理)
- 清空缓存:先清空旧的工作缓存
- 批量处理:遍历选中的 StudyID 列表
- 获取基础信息:从 workEntities 中查找基础 Task 信息
- 获取详情:为每个任务调用 fetchTaskDetails 获取完整数据
- 构建 Task:合并基础信息和详情,构建完整 Task 对象
- 添加缓存:将每个 Task 添加到 examWorksCacheSlice
- 转换体位:调用 transformWorksToBodyPositions 将所有工作转换为体位列表
- 设置体位:dispatch setBodyPositions 更新体位列表状态
边界
输入边界
- ✅ worklistToExam 接收单个 Task 对象
- ✅ worklistToProcess 接收 StudyID 字符串数组
- ❌ 不验证输入数据的有效性
输出边界
- ✅ 清空并更新检查缓存
- ✅ 切换业务流程(worklistToExam)
- ✅ 更新体位列表(worklistToProcess)
- ❌ 不返回执行结果
- ❌ 不提供加载状态管理
职责边界
- ✅ 负责获取任务详细信息
- ✅ 负责构建完整的 Task 对象
- ✅ 负责管理检查缓存
- ✅ 负责批量任务的处理
- ✅ 提供公共的数据准备函数供其他模块使用(prepareWorksForExam)
- ❌ 不负责设备初始化
- ❌ 不负责图像的加载
- ❌ 不负责用户权限验证
涉及概念
数据准备公共化(prepareWorksForExam):将重复的数据获取和转换逻辑抽取为公共函数,提高代码复用性和可维护性
并行处理优化:使用 Promise.all 并行获取多个任务详情,相比串行处理可显著提升批量处理性能
灵活参数设计:prepareWorksForExam 支持单个或多个 Task 输入,自动适配不同场景的需求
未来扩展支持:函数设计上支持多选 study 进入检查的场景,为未来功能扩展奠定基础
工作列表到检查(worklistToExam):从任务清单选择任务进入检查流程
批量处理(worklistToProcess):选择多个已完成的任务批量进入图像处理流程
任务详情获取:通过 fetchTaskDetails API 获取包含 series 和 images 的完整任务数据
数据展平:使用 flatMap 将嵌套的 series/images 结构展平为 Views 数组
缓存管理:先清空旧缓存再添加新任务,确保缓存数据的准确性
体位列表转换:将多个工作的体位信息聚合转换为统一的体位列表格式
类型安全:使用 satisfies 确保构建的 dview 对象符合类型定义
跨模块复用:prepareWorksForExam 被 worklistToExam 和 businessFlowMiddleware 共同使用,避免代码重复
TODO 注释:代码注释提到在 worklistTable 中实现 fetchThunk 以显示 loading 状态