|
|
@@ -0,0 +1,137 @@
|
|
|
+**血压数据功能设计文档**
|
|
|
+
|
|
|
+**概述**: 本文档描述系统中血压(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 合理性校验(不晚于服务器时间、历史数据限制)
|
|
|
+ - 为绑定方查询添加柔性权限策略(只读/可注释等)
|