**心率数据功能设计文档** **概述**: 本文档描述系统中心率(Heart Rate)数据的上报、查询与删除能力,以及相关权限、审计与存储设计。对应代码位置:`src/main/java/.../controller/HeartRateDataController.java`、`service/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`。 **示例** - 添加请求示例: ```json { "heartRate": 72, "measureTime": "2025-11-20T08:30:00" } ``` - 查询(分页)请求示例: ```json { "pageNum": 1, "pageSize": 20, "startTime": "2025-11-01T00:00:00", "endTime": "2025-11-21T23:59:59" } ``` - 响应示例 (分页 `records` 片段): ```json { "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 范围限制等)。