**血压数据功能设计文档** **概述**: 本文档描述系统中血压(Blood Pressure)数据的上报、查询与删除能力,以及相关权限、审计与存储设计。对应代码位置:`src/main/java/.../controller/BloodPressureDataController.java`、`service/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` 验证 `boundUserId` 与 `patientUserId` 的绑定关系 - 若不存在绑定关系,返回错误 `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`。 **示例** - 添加请求示例: ```json { "systolicPressure": 120, "diastolicPressure": 80, "measureTime": "2025-11-20T08:00:00" } ``` - 查询(分页)请求示例: ```json { "pageNum": 1, "pageSize": 20, "startTime": "2025-11-01T00:00:00", "endTime": "2025-11-21T23:59:59" } ``` - 响应示例 (分页 `records` 片段): ```json { "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 合理性校验(不晚于服务器时间、历史数据限制) - 为绑定方查询添加柔性权限策略(只读/可注释等)