INTEGRATION SOLUTION · V0.1

哈尔滨膳质舍上禾体检一体机对接方案

手机号确认会员关系,设备测量完成后主动上传;Token 与无 Token 两种模式统一兼容。

状态:待 Jack 审核设备:SH-V20日期:2026-08-25

1. 方案结论

设备不建会员档案,用户测量前输入手机号,设备把手机号放入 V3.06 协议的 userID,测量完成后主动上传。康比特只使用标准化手机号匹配会员;deviceNo 只用于设备鉴权、来源记录和项目归属,不参与会员身份匹配。

Token 模式

设备先获取访问令牌,上传时携带 X-Access-Token

无 Token 模式

设备不取令牌,直接上传;仅对明确配置为 NONE 的登记设备开放。

关键规则:两种模式共用结果接口,但由设备档案固定选择;无效或缺失 Token 不得自动降级。

2. 已确认事实与边界

已确认

  • 设备不建立会员档案。
  • 用户输入11位手机号,作为 userID
  • 上传地址配置在设备端。
  • 测量完成后设备主动上传。
  • 访问令牌可选,两种模式都要兼容。
  • recordNo为测量唯一编号。

V3.06技术口径

  • datas[]兼容单条和多条。
  • 网络恢复后补传失败报告整体数据。
  • 整体数据包含已经上传的字段。
  • 同一报告复用session并合并指标。
  • V3.06字段全部接收并写raw。

匹配与处理边界

3. 总体流程

输入手机号 → 完成测量 → Token / 无 Token → POST 结果

deviceNo 完成设备鉴权 → 幂等判断 → 手机号匹配

同一请求和事务内直接写原始报文、测量会话、健康指标 → 返回结果

4. 双模式兼容设计

设备档案

字段说明
device_no设备编号
store_id所属商城/租户,必须与回调域名上下文一致
auth_modeTOKENNONE
app_id / app_secret_hashToken 模式凭据
status设备启停状态

Token 模式

  • POST /openapi/v1/shanghe/token 获取令牌。
  • Token 绑定设备并设置有效期。
  • 缺失或失效返回 2001
  • Token 与设备不一致返回 1000
  • 绝不自动降级。

无 Token 模式

  • 仅允许 auth_mode=NONE 的登记设备。
  • 必须使用 HTTPS。
  • 出口 IP 稳定时叠加白名单。
  • 未登记或停用设备返回 1000
  • 是兼容能力,不是默认安全推荐。

模式切换

由后台设备档案控制并与现场配置同步;保留变更人、时间和原因。从无 Token 切换到 Token 时先完成取 Token 测试,不在请求处理中自动探测模式。

5. 结果接口与手机号匹配

POST /openapi/v1/shanghe/measurements
Content-Type: application/json; charset=utf-8
X-Access-Token: 可选,仅 Token 模式必填

协议指标多为字符串,且可能为空或不传。接入层先保留原始值,再按指标定义转换,不能因某个选配字段缺失拒绝整批报文。

匹配键

normalized_mobile

会员身份只按标准化手机号查询。deviceNotenant_idorg_id 只作为设备鉴权、数据来源和项目归属信息保存,不能参与会员匹配。手机号去空格、短横线及可识别的中国国家码,保留字符串并在日志中脱敏。

匹配结果处理
唯一有效会员写有效会话、raw、健康指标和体重业务
没有会员ai_user_id=0、is_valid=0 无效会话和raw
多个会员写无效会话和raw,禁止自动归属
手机号无效写无效会话和raw
会员已停用写无效会话和raw

身份边界:这是用户声明手机号,不是短信验证或实名验证;不能仅凭这次关联自动执行高风险医疗干预。

6. 接收、应答与幂等

接口在同一个请求中完成结构校验、设备鉴权、幂等判断、手机号匹配、原始报文保存、测量会话和健康指标写入。现场通常1条,但服务端必须循环全部 datas[],不能只处理 datas[0]

recode场景
1000设备无权访问、未登记、停用或 Token 与设备不一致
2000报文已可靠接收,包括会员未匹配但无效会话和raw已保存
2001Token 模式下 Token 缺失或失效
4000JSON 或基础结构错误
5000无法解析或无法可靠保存

报告幂等与补传合并

报告键:vendor=shanghe + device_no + record_no
payload摘要:device_no + record_no + 当前measurement完整内容

同步事务

BEGIN
计算 vendor + raw_hash 并匹配手机号
唯一匹配:写有效会话、raw、批量指标
无法匹配:写 ai_user_id=0、is_valid=0 无效会话和raw
COMMIT → 返回 recode=2000

未匹配会话不写健康指标、体重、积分或营养业务。实施前验证目标表允许 ai_user_id=0,且业务查询均过滤 is_valid=1

单条/多条兼容

7. 数据库存储与对应关系

复用现有统一健康数据模型,不新增专用上传接收表。未匹配原始结果也使用无效会话和raw保存。

数据用途表/服务使用方式
手机号匹配会员zhct.user按标准化手机号查询有效记录,取得 ai_user_id
员工有效性辅助核验zhct.staff通过 ai_user_id 核验,不参与手机号匹配
一次完整测量ydy_measurement_session一条 datas[] 元素生成一个会话;未匹配时 ai_user_id=0、is_valid=0
厂家原始报文ydy_measurement_session_raw保存匹配或未匹配的完整原始 JSON
单项健康指标ydy_health_record只有匹配成功时写入
指标字典ydy_health_metric维护编码、名称、单位、类型和分段能力
体重趋势UserWeight 服务只有匹配成功时同步身高、体重、BMI和测量日期
设备鉴权ydy_health_device(按配置需要决定)设备、Token模式、凭据摘要和启停状态

手机号到健康数据

datas[n].userID(手机号)
→ zhct.user.mobile
→ zhct.user.ai_user_id
→ ydy_measurement_session.ai_user_id
→ ydy_health_record.ai_user_id + session_id

未命中、重复命中或 ai_user_id 无效时,写无效会话和raw,不能写入其他会员的健康数据。

新增:设备配置表 ydy_health_device

字段组字段说明
设备vendor, device_no, store_id, mac_addr, device_model唯一识别设备并绑定商城
来源unit_no, unit_name仅作来源记录
鉴权auth_mode, app_id, app_secret_hash, token_ttl兼容 TOKEN/NONE,不保存明文密钥
控制status设备启停
生命周期is_delete, create_by, create_time, update_time项目标准字段
UNIQUE KEY uk_vendor_device (vendor, device_no)
KEY idx_status_auth (status, auth_mode)

测量会话写入

ydy_measurement_session 字段写入值
ai_user_id手机号匹配出的会员ID
event_typemeasurement
start_time/end_time上禾 measureTime
source_platform/vendorvendor_api / shanghe
device_type/device_modelbody_scale / deviceModel;沿用现有小程序最新体脂查询条件
raw_hash设备、记录号和报文摘要组合
business_context/is_validhealth / 1

全字段接收与核心指标映射

V3.06普通字段完整写raw,核心指标写标准健康记录;wave/ecgImg解码后复用现有Upload服务,按商户设置自动走阿里云OSS或本地存储,数据库和raw保存附件URL、file_id、storage、大小、SHA-256和MIME,不保存大段Base64。

上禾字段含义康比特落点单位
height身高heightcm
weight体重weightkg
bmiBMIbmi-
fatRate体脂率bfp%
muscle肌肉量muscle_masskg
idealWeight理想体重weight_targetkg
sbp/dbp/hr血压/心率标准健康指标mmHg/bpm
pi血氧灌注指数perfusion_index-
wave/ecgImg波形/心电图ydy_measurement_asset + yoshop_upload_fileURL
zwtqq坐位体前屈最佳值sit_and_reachcm

protein 在上禾协议中是“蛋白质量 kg”,不能误写到现有表示百分比的 protein 指标,应使用 protein_mass

正常范围、状态和分段

数值字段写 ydy_health_record.value_n 正常范围与 _s 原始状态先完整保存在 raw 表。统一状态转换为 LOW/NORMAL/HIGH/ABNORMAL/UNKNOWN,血氧等专用枚举按指标单独配置。

分段字段metric_codesegment
fatTrunk / fatLeftArm / fatRightArm / fatLeftLeg / fatRightLegbodyfat_masstrunk / left_arm / right_arm / left_leg / right_leg
muscleTrunk / muscleLeftArm / muscleRightArm / muscleLeftLeg / muscleRightLegmuscle_mass对应部位
上述部位的 *Ratebfpmuscle对应部位

小程序读取

  1. measureTime 日期写 yoshop_user_weight:无则新增、有则更新,只允许实际测量时间较新的记录更新当日体重。
  2. 最新测量同步更新员工档案身高体重和智慧餐厅员工;旧补传不覆盖当前值。
  3. 上禾计入每日首次体重积分,同日任何来源已加分时不重复。
  4. 当天最新测量刷新推荐能量;历史补传不刷新今天推荐能量。
  5. 会话使用 device_type=body_scale,所有厂家统一按实际测量时间取最新。
  6. 附属业务失败不影响已保存成功的统一体测会话和指标。

8. 安全与隐私

设备与接口

  • 正式环境只用 HTTPS。
  • 密钥不写日志、仓库或明文存储。
  • Token 绑定设备并设置有效期。
  • 限制报文大小、频率并保留审计。

会员与健康数据

  • 手机号使用安全索引并脱敏展示。
  • 原始报文受权限控制并设置保留期限。
  • 未匹配结果不得写入任何会员健康档案。
  • 小程序不返回厂家原始报文。

9. 联调与上线

类别必须覆盖
鉴权合法 Token、缺失/过期 Token、设备不一致、无 Token 登记设备、未登记/停用设备、禁止自动降级
身份手机号唯一、不存在、重复、无效、不同设备上传同一手机号
可靠性首次部分数据、网络恢复整体报告、完全重复、单条/多条 datas、延迟和乱序
数据V3.06全部字段raw留存,新增字段及可结构化指标逐项核验
  1. 登记设备、租户、机构和鉴权模式。
  2. 部署 Token 接口与统一结果接口。
  3. 分别联调 Token、无 Token。
  4. 验证手机号匹配和无效会话保存。
  5. 完成重复、延迟、幂等和单条/多条测试。
  6. 小范围试运行后正式启用。

10. 请审核的5项决策

  1. 只以标准化手机号作为会员匹配方式,deviceNo 仅用于鉴权和来源记录。
  2. 结果接口兼容 TOKENNONE,模式由设备档案固定,禁止自动降级。
  3. 未匹配时写 ai_user_id=0、is_valid=0 无效会话和raw,不新增专用接收表。
  4. 无 Token 模式仅作为兼容能力,正式环境优先 Token。
  5. 为语义不同或现有字典缺失的指标新增标准编码,禁止错误复用同名指标。

11. 证据状态

直接材料:上禾 V3.06 为当前开发基线,明确网络恢复整体补传,并新增理想体重、灌注指数、容积波形和坐位体前屈。现有代码已验证会员和统一健康业务复用路径。

数据库门禁:隔离环境只读核验发现raw.data为TEXT、会话缺少报告唯一索引、每日体重缺少同日复合唯一约束。正式持久化前必须确认版本SQL并核验无效会话查询边界;不得绕过门禁。

兼容核验:zwtqqs 与示例 zwtqq2/zwtqq3 均需测试,V3.06全字段raw容量和指标upsert必须通过。