ImplementationDifferences.md 8.6 KB

健康数据模块 — 实现与设计功能差异清单

说明:本文件记录代码实现相对于设计稿(见同目录下的设计文档)在功能层面的差异。每项包括:差异描述、实际影响、建议修正、优先级,以及预留的“解决状态”字段(供后续对话中逐项标记)。


使用说明

  • 状态字段:[status],可取值 not-started / in-progress / resolved
  • 负责人/备注:在项下方 ownernotes 字段中填写负责人的姓名与处理备注。
  • 当项被解决时,请把 status 改为 resolved 并在 notes 中写明修改文件或提交说明(例如:修改了 X 文件,commit 123abc)。

概览

总体结论:项目已实现四个子模块(体格/血压/血糖/心率)的核心 CRUD、PO/VO/Mapper/Service/Controller、分页与字段校验。但在权限/角色、接口命名与方法、血糖枚举与录入模式、异常/响应语义、数据库迁移等方面存在功能性差异或未完全实现的设计要求。

下列条目按建议优先级排序(高 -> 低)。


Item A — 权限与多角色访问(高)

  • id: A
  • description: 设计稿要求患者只能访问自己的数据;医生可访问指定患者的数据;管理员可访问所有数据。当前实现仅基于 currentUserId 过滤,未实现医生/管理员的授权与跨患者访问策略。
  • impact: 医生/管理员无法按设计查看或代查患者数据,权限模型不完整,存在功能缺失。
  • recommendation:
    1. 在用户模型或 TokenService 中提供用户角色信息(patient/doctor/admin)。
    2. 在需要支持医生访问的接口中加入 patientId 参数,并在 Service 层校验当前用户角色是否有访问该 patientId 的权限(如医生会诊名单、授权表等)。
    3. 提供统一的权限工具(例如 SecurityUtils.getCurrentUser() 返回包含 id 与 role 的对象)。
  • priority: high
  • status: not-started
  • owner:
  • notes:

Item B — API 路径与请求方法不一致(中)

  • id: B
  • description: 设计文档定义了接口路径如 /physical-data/*, /blood-glucose-data/*, /heart-rate-data/* 等;实现中为 /physical, /blood-glucose, /heart-rate 等短路径。BMI 在文档为 GET /physical-data/bmi,实现为 POST /physical/bmi
  • impact: 前端与文档将无法直接对接,GET/POST 差异会影响缓存/语义。
  • recommendation: 选取一种统一策略:
    • 方案 1(推荐):让代码遵循设计文档的路径与方法(修改 Controller 的 RequestMapping 与方法);
    • 方案 2:如果更倾向于保持当前实现,则把 API 文档更新为与代码一致。
  • priority: medium
  • status: not-started
  • owner:
  • notes:

Item C — 血糖枚举与录入模型差异(中)

  • id: C
  • description: 设计稿里 BloodGlucoseType 包含 integer code、unit、normalRange、显示顺序等元数据,并且设计示例支持一次提交多时间点(多个字段);实现中枚举使用 String code,且 API 以每条记录一个 type+value 的方式接收数据。
  • impact: 前端无法直接从后端获得参考范围/单位/显示顺序信息;若业务需要一次性提交多时间点数据(按天表单),当前接口不支持。
  • recommendation:
    • 如果按当前单条记录模型继续:扩展枚举 BloodGlucoseType 增加 unitnormalRangegetOrderedTypes() 等方法,并提供一个枚举元数据的 API 端点供前端获取显示信息;
    • 如果需要支持批量提交:新增 batch API(例如 POST /blood-glucose-data/batch)和相应 VO,在服务端做批量插入与校验。
  • priority: medium
  • status: not-started
  • owner:
  • notes:

Item D — 返回/错误语义与异常处理不统一(中)

  • id: D
  • description: 设计文档期望返回格式使用语义化字符串 code(例如 SUCCESS, PARAM_ERROR),而代码中 R 主要使用数值(如 200、500)。Controller 中部分地方使用局部 try/catch 导致全局异常处理器不一致地被绕过。同时 CustomException 在代码中被修改为 RuntimeException
  • impact: 前端/集成方可能无法根据文档预期解析 code。局部 try/catch 会导致错误响应格式不统一。
  • recommendation:
    • 统一响应格式(两选一):
    • R 返回设计稿中语义化 code(修改 R & CustomExceptionHandler);或
    • 在文档中确认并改为 numeric-style code,然后统一文档与实现;
    • 移除不必要的 Controller 层 try/catch(或仅保留用于捕获同步业务错误),让异常通过全局 CustomExceptionHandler 处理以保证统一格式。
    • 审核并确认 CustomException 是否应为 checked 或 unchecked(团队约定)。
  • priority: medium
  • status: not-started
  • owner:
  • notes:

Item E — AuthInterceptor 与 SecurityUtils 的对齐(高/已实现)

  • id: E
  • description: 设计中拦截器会把用户 ID 放入 request attribute(currentUserId)。我已实现 SecurityUtils.getCurrentUserId() 并替换了分散实现,AuthInterceptor 代码确认了写入 currentUserId
  • impact: 基础用户 ID 获取机制已统一,但仍需确认拦截器在所有部署环境中都启用并写入该 attribute;若拦截器改动需同步 SecurityUtils。
  • recommendation:
    • 将属性 key currentUserId 作为常量(例如 SecurityConstants.CURRENT_USER_ID)并在拦截器与工具类中引用;
    • 为 SecurityUtils 增加回退策略(如从 Authorization header 解 token)以增强健壮性。
  • priority: high
  • status: resolved
  • owner: (已实现)
  • notes: SecurityUtils 新增并已替换四处 service impl 与 WeChatController 的读取点;请确认是否需要常量化 key 或增加回退策略。

Item F — 数据库建表脚本与迁移(中)

  • id: F
  • description: 设计稿提供了 CREATE TABLE 语句,但仓库内未发现 Flyway/Liquibase 等自动迁移脚本。
  • impact: 部署时需要手动建表或外部脚本,降低自动化与可重复部署能力。
  • recommendation: 添加 Flyway 或 Liquibase 的迁移脚本(db/migration)并将建表 SQL 列入迁移历史;在 CI/CD 中执行迁移以保证环境一致。
  • priority: medium
  • status: not-started
  • owner:
  • notes:

Item G — 枚举元数据/显示顺序缺失(低)

  • id: G
  • description: 设计里建议提供 getOrderedTypes()、单位、参考范围等;实现的枚举未包含这些额外元数据。
  • impact: 前端无法自动获得显示顺序或参考范围,需要在多个地方硬编码,降低一致性。
  • recommendation: 扩展 BloodGlucoseType 枚举以包含 unitnormalRangegetOrderedTypes(),并暴露一个元数据 API(例如 GET /meta/blood-glucose-types)。
  • priority: low
  • status: not-started
  • owner:
  • notes:

Item H — 关键业务校验缺失(低-中)

  • id: H
  • description: 设计提到若干业务校验(如血压高低压关系、重复记录策略、异常预警等),但实现仅包含基础字段范围校验,缺少业务层面规则。
  • impact: 可能导致错误数据被录入(例如收缩压 < 舒张压未校验),或未对重复/异常进行预警/处理。
  • recommendation: 在 Service 层补充以下校验:
    • 血压:收缩压 >= 舒张压;
    • 重复提交:同一用户、同一类型、同一测量时间窗内的去重或提示策略;
    • 异常值预警:当值超出临床阈值时触发告警或返回明确业务码。
  • priority: low-to-medium
  • status: not-started
  • owner:
  • notes:

Item I — 文档与代码不同步(低)

  • id: I
  • description: 多处代码与设计文档在路径、方法、响应格式上存在不一致(汇总见上)。
  • impact: 影响前后端协作和 API 测试;造成审查/维护成本。
  • recommendation: 决定以代码为准还是以文档为准并执行一次一致性同步(我可按选择自动生成更新的文档或批量修改 Controller 路径)。
  • priority: low
  • status: not-started
  • owner:
  • notes:

后续流程建议

  1. 先解决高优先级项(A、E),确保权限/认证/用户上下文准确;
  2. 再统一异常/响应语义(C)与 API 路径(B);
  3. 然后补充枚举元数据/批量录入(G、C)与业务校验(H);
  4. 最后完善迁移脚本与文档(F、I)。

如果你确认这个清单,我会把它放入版本库(已保存到本文件),并可以在你选定的条目上逐一开始实现 —— 请回复你想先解决的项(例如 先做 A先做 C 和 B)。


文件生成:docs/DevDesign/HealthData/ImplementationDifferences.md