体格数据功能设计文档
概述: 本文档描述系统中体格(Physical)数据的上报、查询与删除能力,以及相关权限、审计与存储设计。对应代码位置:src/main/java/.../controller/PhysicalDataController.java、service/PhysicalDataService、数据库表 t_physical_data。
目标: 允许患者上报身高/体重等体格测量值,系统可计算并返回 BMI;允许绑定方(医生/家属)在存在绑定关系时查询患者体格数据;保证访问受限并记录审计日志以便追溯。
接口清单:
添加体格数据
POST /physical/addAddPhysicalDataRequest (application/json)R 成功/失败返回。@NotNull, @DecimalMin, @DecimalMax),并在 service 层校验合理时间窗口。分页查询体格数据(本人)
POST /physical/listBaseQueryRequest (application/json)PhysicalDataPageResponse,包含分页 metadata 与 PhysicalDataResponse 列表(含 bmi 字段)。绑定方分页查询患者体格数据
POST /physical/list-by-bound-userpatientUserId (Long, 必填),bindingType (String, 可选),请求体 BaseQueryRequestboundUserId(从 token / SecurityUtils)UserBindingService.checkUserBinding 验证绑定关系DATA_ACCESS_DENIEDbindingType 为空,则从检查结果中使用绑定类型list,返回 PhysicalDataPageResponse。删除体格数据
POST /physical/deleteDeletePhysicalDataRequest,包含 id (Long,必填)R 成功/失败返回。数据模型 (VO / PO)
请求/响应 VO:
AddPhysicalDataRequest:height : BigDecimal (cm)weight : BigDecimal (kg)measureTime : LocalDateTimePhysicalDataResponse:id : Stringheight : BigDecimalweight : BigDecimalbmi : BigDecimalmeasureTime : LocalDateTimecreateTime : LocalDateTime持久化表: t_physical_data(建议字段)
id, user_id, height_cm, weight_kg, bmi, measure_time, create_time, update_time, deleted_flag 等校验规则
height 非空且 100-250 cm。weight 非空且 20-300 kg。measureTime 非空且不晚于服务器当前时间(service 层可增强校验)。权限与访问控制
UserBindingService.checkUserBinding),否则返回 DATA_ACCESS_DENIED。审计与日志
list-by-bound-user 接口中记录访问日志:记录访问方 ID、患者 ID、数据类型(physical)、查询时间范围。错误码
ErrorCode 枚举:
PARAMETER_ERROR (1001):请求参数缺失或校验失败SYSTEM_ERROR (1000):服务器内部错误UNAUTHORIZED (1002):未授权(token 无效)DATA_ACCESS_DENIED (4001):绑定方访问时无权限DATA_NOT_FOUND (4000):删除/查询的记录不存在服务与 Mapper 关系
PhysicalDataService(负责业务校验、权限判断、持久化调用、分页查询实现)PhysicalDataMapper) 与 t_physical_data 表交互兼容性与注意事项
LocalDateTime,前端需按约定时区/格式发送(建议 ISO-8601)。Page,Controller 将其转换为页面友好格式 PhysicalDataPageResponse。示例
添加请求示例:
{
"height": 170.5,
"weight": 65.2,
"measureTime": "2025-11-20T09:00:00"
}
查询(分页)请求示例:
{
"pageNum": 1,
"pageSize": 20,
"startTime": "2025-11-01T00:00:00",
"endTime": "2025-11-21T23:59:59"
}
响应示例 (分页 records 片段):
{
"records": [
{
"id": "phy-001",
"height": 170.5,
"weight": 65.2,
"bmi": 22.43,
"measureTime": "2025-11-20T09:00:00",
"createTime": "2025-11-20T09:05:00"
}
],
"total": 1,
"size": 20,
"current": 1
}
后续建议