01 · 核心决策
最新实施调整:按用户最小改动要求,后台沿用现有日志规则,取消下文原方案的后台二维码脱敏,公共日志配置和中间件已恢复。二维码请求参数可能被记录,真实设备密钥不记录。
两种入口都支持:输入手机号匹配成功即自动关联;直接检测后扫码则关联登录本人。手机号未匹配到也能扫码关联,无需重新检测。手机号已关联的报告,本人再扫码打开同一报告,其他人不能覆盖归属。
app_secret_hash。02 · 已验证事实
| 事实 | 真实证据 | 设计影响 |
|---|---|---|
| 四个模块分四次上传 | 真实设备回调及线上只读日志 | 不能依赖全量完成标志 |
| 四次上传共用同一 recordNo、匿名 userID、deviceNo、measureTime | raw 快照与数据库回读 | 可归并成一个 session |
| 右臂报文重复左臂数据 | 右臂真实报文 | 按 metric + segment 幂等 upsert |
| 每次扫码 q 完全相同 | 微信小程序启动参数 | 一个二维码对应整次会话 |
| 只有 scancode_time 随扫码变化 | 10:21、10:22、10:25 启动参数 | 只能辅助审计,不能作为可信凭证 |
| 未匹配数据当前 raw-only | 现有代码与 session/raw/record 回读 | 认领时必须回放 raw |
03 · 目标流程
建立/更新检测 session,保存 raw,并建立 PENDING 认领索引。
pages/index/index 取得完整 options.q;未登录先登录。小程序提交完整 URL;后台取设备密钥、RC4 解密、验证设备/租户/时间并唯一匹配 session。
行锁事务中绑定当前登录人员,回放当前全部 raw,生成已有模块指标。
相同 recordNo 的人体成分和血压继续沿用已认领人员,无需再次扫码。
同一人员重复扫码打开同一报告;其他人员扫描明确冲突。
04 · 业务规则
| ID | 规则 |
|---|---|
| BR-001 | vendor + deviceNo + recordNo 对应一个 session 和至多一个有效认领。 |
| BR-002 | 一个或部分模块均可认领,未测模块不导致整份报告失败。 |
| BR-003 | 匿名 userID 只关联厂家会话,不能当手机号或系统人员 ID。 |
| BR-004 | 人员归属只取服务端鉴权得到的当前登录用户。 |
| BR-005 | 零条或多条候选均拒绝自动绑定,禁止猜“最近一条”。 |
| BR-006 | 认领后续传必须同时匹配 claim 外部标识,才沿用 ai_user_id。 |
| BR-007 | 同用户重复扫码幂等;不同用户禁止覆盖。 |
| BR-008 | 人员资料以系统档案为准,设备姓名/性别/年龄只保留 raw。 |
| BR-009 | 指标按 session_id + metric_code + segment_key 幂等写入。 |
| BR-010 | 手机号模式和现有设备鉴权行为保持兼容。 |
05 · 二维码协议与密钥管理
timeMillis_rawData_deviceID_Sex_Age_UserID
- 小程序只做一次 URL 解码并提交完整 URL。
- 后台校验固定前缀
https://szs.yyangpt.cn/haerbin/。 - 密文可包含
/、+、=,不能按最后一个斜杠截取。 - Base64 严格解码;RC4 使用与设备一致的 UTF-8 密钥。
- RC4 不带认证,必须与真实回调会话、设备、匿名标识、时间和认领状态交叉验证。
设备密钥
每台设备生成独立 32 位 [A-Za-z0-9_] 密钥,通过 U 盘根目录的 svh/upanconfig.sh 写入 qrCodeSecretKey=<密钥>。
服务端保存
| 字段 | 用途 |
|---|---|
qr_secret_ciphertext | AES-256-GCM 加密后的 RC4 设备密钥包 |
qr_secret_key_version | 主密钥版本,用于轮换 |
AES 主密钥只保存在服务器环境变量或 KMS。正式 SQL 只建字段,不包含任何真实密钥。
06 · 数据设计
新增 ydy_measurement_claim,将匿名定位、认领状态和审计从 raw JSON 中独立出来。
| 对象 | 职责 |
|---|---|
ydy_health_device | 设备、租户、Token 鉴权、二维码密钥密文与版本 |
ydy_measurement_session | 一次检测会话及最终 ai_user_id/is_valid |
ydy_measurement_session_raw | 各模块原始快照和认领回放来源 |
ydy_measurement_claim | deviceNo、匿名 userID、recordNo、状态、认领人、有效期和密文指纹 |
ydy_health_record | 认领后结构化指标 |
ydy_staff / 现有体重路径 | 只复用现有已确认的身高体重同步逻辑 |
唯一键建议 vendor + session_id;定位索引建议 external_user_id + device_no + measure_time。正式 SQL 版本由发布负责人确认。
07 · API 契约
既有上传接口
POST /api/shanghe.callback/result
外部协议不变。匿名首条建立 PENDING claim;已认领会话后续上传按 claim 外部标识沿用身份。
新增小程序认领接口
POST /api/shanghe.claim/bind
Access-Token: <当前登录令牌>
{
"qrUrl": "https://szs.yyangpt.cn/haerbin/<完整密文>",
"scancodeTime": 1788747677
}
qrUrl 必填;scancodeTime 可选。请求禁止出现 targetUserId、aiUserId 或手机号。
| 结果 | 处理 |
|---|---|
| CLAIMED / ALREADY_CLAIMED | 返回同一 session 和已测模块 |
| RESULT_NOT_READY | 客户端在有限窗口重试 |
| QR_INVALID / QR_EXPIRED | 停止重试,提示重新检测或扫码 |
| DEVICE_UNAVAILABLE | 拒绝并记录安全审计 |
| CLAIM_AMBIGUOUS | 拒绝猜测,进入排查 |
| CLAIMED_BY_OTHER / CLAIM_CONFLICT | 禁止覆盖 |
接口登记位置:AI运动营养师 / 上禾体检一体机。
08 · 系统改造
发布顺序
- 数据库结构。
- 服务端主密钥配置、设备密钥密文和后端代码。
- Apifox 联调与自动化。
- 小程序发布。
- 最后通过 U 盘配置设备密钥,执行真机验收。
09 · 异常、事务与回滚
- 结果未落库:返回可重试,不创建空认领。
- 密文、设备、时间或租户不合法:拒绝且业务数据不变。
- 并发认领:claim/session 行锁,仅一个用户成功。
- 认领事务失败:回滚 claim、session 和 health_record;raw 始终保留。
- 跨库身高体重附属同步在核心事务提交后执行,失败记录 WARN,不撤销健康报告。
- 功能回滚通过开关停用认领;上传继续 raw-only,不删除已产生的 claim 和已认领报告。
10 · 验收与测试
| 场景 | 通过标准 | 证据 |
|---|---|---|
| 单模块认领 | 首条 raw 后可认领并生成对应指标 | API + DB |
| 部分后续追加 | 认领后人体成分/血压自动归入同一人员 | 日志 + DB + 真机 |
| 未登录扫码 | 登录后自动恢复,无需再次扫码 | E2E 录像 |
| 重复扫码 | 同用户幂等;无重复指标、同步和积分副作用 | 自动化 + DB |
| 并发抢占 | 仅一人成功,另一人明确冲突 | 并发集成测试 |
| 右臂重复左臂 | 左臂不重复,右臂按 right_arm 保存 | 唯一性查询 |
| 非法/过期/跨租户 | 拒绝且所有业务表不变 | 安全测试 |
| 手机号模式 | 既有自动匹配和结构化不回归 | 回归测试 |
| 两入口兼容 | 手机号成功后本人扫码幂等、他人扫码拒绝;手机号未匹配后可扫码关联 | 真机 + 集成测试 |
| 真机协议闭环 | 解密 deviceID/UserID 与回调字段关系明确 | 厂家样例 + 真机对照 |
建议性能目标:正常认领 p95 ≤ 800ms、错误率 < 0.1%;最终阈值需技术负责人结合现网容量确认。
11 · P0 待确认项
| ID | 问题 | 建议 |
|---|---|---|
| Q-001 | 二维码 deviceID/UserID 与回调字段的确切关系 | 配置真实密钥后做一条真机对照 |
| Q-002 | UserID 是否二次 Base64;rawData 是否含下划线 | 厂家样例与实测共同确认 |
| Q-003 | 二维码有效期 | 建议 30 分钟,由产品确认 |
| Q-004 | 认领成功后的精确跳转页 | 建议对应日期的体重档案/检测报告 |
12 · 请审核这些决策
- 第一条模块上传后即可认领。
- 同一二维码只认领一个 session,后续模块自动追加。
- 同用户重复扫码幂等,不同用户禁止覆盖。
- 设备级密钥加密存储,真实值不进入 Git。
- 新增独立的
ydy_measurement_claim,不扫描 raw JSON 猜测。 - 确认二维码有效期、未就绪等待时间和认领后跳转页。
- 确认手机号模式和既有指标映射完全兼容。
完整 AI 可执行方案、字段明细、AC 编号和测试矩阵:shanghe-qrcode-claim-solution.md