心率数据功能设计文档.md 5.4 KB

心率数据功能设计文档

概述: 本文档描述系统中心率(Heart Rate)数据的上报、查询与删除能力,以及相关权限、审计与存储设计。对应代码位置:src/main/java/.../controller/HeartRateDataController.javaservice/HeartRateDataService、数据库表 t_heart_rate_data(若尚未建立,请参考 docs/DB 中的数据字典)。

目标: 允许患者上报心率(次/分钟)测量值;允许绑定方(医生/家属)在存在绑定关系时查询患者心率数据;保证访问受限并记录必要审计日志。

接口清单:

  • 添加心率数据

    • 路径: POST /heart-rate/add
    • 描述: 患者上报一条心率测量记录。
    • 请求体: AddHeartRateDataRequest (application/json)
    • heartRate: Integer,心率(次/分钟),必填,范围 [30, 200]
    • measureTime: LocalDateTime,测量时间,必填
    • 响应: 标准 R 成功/失败返回;成功返回 200 OK 与 message ok
    • 校验: 使用注解验证(@NotNull, @Min, @Max)。
  • 分页查询心率数据(本人)

    • 路径: POST /heart-rate/list
    • 描述: 当前用户根据时间范围和分页参数查询自己的心率记录。
    • 请求体: BaseQueryRequest (application/json)
    • pageNum: 页码,默认 1
    • pageSize: 每页大小,默认 10
    • startTime, endTime: 可选时间范围
    • 响应: HeartRateDataPageResponse,包含分页 metadata 与 HeartRateDataResponse 列表。
  • 绑定方分页查询患者心率数据

    • 路径: POST /heart-rate/list-by-bound-user
    • 描述: 医生或家属等绑定方查询目标患者的心率记录(需有绑定关系)。
    • 参数: patientUserId (Long, 必填),bindingType (String, 可选),请求体 BaseQueryRequest
    • 权限检查流程:
    • 获取当前发起查询的用户 boundUserId(从 token / SecurityUtils)
    • 调用 UserBindingService.checkUserBinding 验证绑定关系
    • 若不存在绑定关系,返回 DATA_ACCESS_DENIED(无权访问)
    • 若存在且 bindingType 为空,则使用检查结果中的绑定类型
    • 审计: 在 Controller 中记录访问日志(logger.info),包含访问方、患者、时间范围与数据类型(type=heart_rate)。
    • 响应: 同 list,返回 HeartRateDataPageResponse
  • 删除心率数据

    • 路径: POST /heart-rate/delete
    • 描述: 根据记录 ID 删除心率数据(通常仅允许记录创建者或有权限的管理方删除,具体权限在 service 层实现)。
    • 请求体: DeleteHeartRateDataRequest,包含 id (String,必填)
    • 响应: 标准 R 成功/失败返回。

数据模型 (VO / PO)

  • 请求/响应 VO:

    • AddHeartRateDataRequest:
    • heartRate : Integer
    • measureTime : LocalDateTime
    • HeartRateDataResponse:
    • id : String
    • heartRate : Integer
    • measureTime : LocalDateTime
    • createTime : LocalDateTime
  • 持久化表: t_heart_rate_data(建议字段)

    • 建议字段: id, user_id, heart_rate, measure_time, create_time, update_time, deleted_flag

校验规则

  • heartRate 非空且在 30-200 次/分钟之间。
  • measureTime 非空且应不晚于服务器当前时间(service 层可加强校验)。

权限与访问控制

  • 上报数据: 需要登录(Token 校验),记录写入当前用户(user_id 从 token 中获取)。
  • 个人查询: 仅返回当前登录用户的数据。
  • 绑定方查询: 必须存在绑定关系(通过 UserBindingService.checkUserBinding),否则返回 DATA_ACCESS_DENIED
  • 删除操作: service 层应校验调用者是否为记录所有者或拥有管理权限。

审计与日志

  • list-by-bound-user 接口中记录访问日志:记录访问方 ID、患者 ID、数据类型(heart_rate)、查询时间范围。
  • 在新增/删除等关键操作处建议记录操作日志便于追溯。

错误码

  • 参考 ErrorCode 枚举:
    • PARAMETER_ERROR (1001):请求参数缺失或校验失败
    • SYSTEM_ERROR (1000):服务器内部错误
    • UNAUTHORIZED (1002):未授权(token 无效)
    • DATA_ACCESS_DENIED (4001):绑定方访问时无权限
    • DATA_NOT_FOUND (4000):删除/查询的记录不存在

服务与 Mapper 关系

  • Controller -> HeartRateDataService(负责业务校验、权限判断、持久化调用、分页查询实现)
  • Service -> Mapper (HeartRateDataMapper) 与 t_heart_rate_data 表交互

兼容性与注意事项

  • 时间字段使用 LocalDateTime,前端需按约定时区/格式发送(建议 ISO-8601)。
  • 分页返回使用 MyBatis-Plus Page,Controller 将其转换为页面友好格式 HeartRateDataPageResponse

示例

  • 添加请求示例:

    {
    "heartRate": 72,
    "measureTime": "2025-11-20T08:30:00"
    }
    
  • 查询(分页)请求示例:

    {
    "pageNum": 1,
    "pageSize": 20,
    "startTime": "2025-11-01T00:00:00",
    "endTime": "2025-11-21T23:59:59"
    }
    
  • 响应示例 (分页 records 片段):

    {
    "records": [
    {
      "id": "hr-001",
      "heartRate": 72,
      "measureTime": "2025-11-20T08:30:00",
      "createTime": "2025-11-20T08:35:00"
    }
    ],
    "total": 1,
    "size": 20,
    "current": 1
    }
    

后续建议

  • 在 Service 层补充更严格的校验与权限逻辑(删除权限、measureTime 范围限制等)。