血压数据功能设计文档.md 6.0 KB

血压数据功能设计文档

概述: 本文档描述系统中血压(Blood Pressure)数据的上报、查询与删除能力,以及相关权限、审计与存储设计。对应代码位置:src/main/java/.../controller/BloodPressureDataController.javaservice/BloodPressureDataService、数据库表 t_blood_pressure_data

目标: 为患者提供上报个人血压(收缩压/舒张压)数据的能力,并允许绑定方(医生/家属)在存在绑定关系时查询患者数据,同时保证访问审计与必要的权限校验。

接口清单:

  • 添加血压数据

    • 路径: POST /blood-pressure/add
    • 描述: 患者上报一条血压测量记录。
    • 请求体: AddBloodPressureDataRequest (application/json)
    • systolicPressure: Integer,收缩压(mmHg),必填,范围 [60, 250]
    • diastolicPressure: Integer,舒张压(mmHg),必填,范围 [40, 150]
    • measureTime: LocalDateTime,测量时间,必填
    • 响应: 标准 R 成功/失败返回。成功返回 200 OK 与 message ok
    • 校验: 请求字段使用注解验证(@NotNull, @Min, @Max)。
  • 分页查询血压数据(本人)

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

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

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

数据模型 (VO / PO)

  • 请求/响应 VO:

    • AddBloodPressureDataRequest:
    • systolicPressure : Integer
    • diastolicPressure : Integer
    • measureTime : LocalDateTime
    • BloodPressureDataResponse:
    • id : String
    • systolicPressure : Integer
    • diastolicPressure : Integer
    • measureTime : LocalDateTime
    • createTime : LocalDateTime
  • 持久化表: t_blood_pressure_data(参见 docs/DB/t_blood_pressure_data.txt

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

校验规则

  • systolicPressure 非空且在 60-250 mmHg 之间。
  • diastolicPressure 非空且在 40-150 mmHg 之间。
  • measureTime 非空且不晚于当前时间(可在 service 层严格校验)。

权限与访问控制

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

审计与日志

  • list-by-bound-user 接口中记录访问日志:记录访问方 ID、患者 ID、数据类型(blood_pressure)、查询时间范围。
  • 在新增/删除等数据变更点建议写入操作日志用于审计。

错误码

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

服务与 Mapper 关系

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

兼容性与注意事项

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

示例

  • 添加请求示例:

    {
    "systolicPressure": 120,
    "diastolicPressure": 80,
    "measureTime": "2025-11-20T08:00:00"
    }
    
  • 查询(分页)请求示例:

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

    {
    "records": [
    {
      "id": "bp-001",
      "systolicPressure": 120,
      "diastolicPressure": 80,
      "measureTime": "2025-11-20T08:00:00",
      "createTime": "2025-11-20T08:05:00"
    }
    ],
    "total": 1,
    "size": 20,
    "current": 1
    }
    

后续建议

  • 在 Service 层补充:
    • 删除权限检查(仅允许记录所有者或管理员删除)
    • measureTime 合理性校验(不晚于服务器时间、历史数据限制)
    • 为绑定方查询添加柔性权限策略(只读/可注释等)