验证状态:已源码核验、未联调(无 app 调用图);本页为流程编排页,不复制正本字段表,各步骤的协议契约、完成判据与错误出口以其链接的正本页为准(核验基线同各正本页:源码归纳 @ 2026-09-14)。

绑定设备

串起 App 扫码 / 蓝牙配对绑定向导的完整写链路:凭授权码发起绑定 → 授权码 V1/V2 校验 → 库存租户守卫 → 占用与归属转移判定 → 刷新列表。绑定是投影复制而非设备搬运:绑定为当前用户个人空间建立新的设备直接拥有投影,设备库存租户 pcm 侧的库存投影不因此转移。

前置条件

  • 已完成注册与登录:有效 JWT,当前租户为用户个人空间租户。
  • 已读账号与个人空间:设备投影三态、设备绑定授权码 (authorizationCode) 的 V1/V2 格式、设备归属转移绑定与设备强制绑定的区别。
  • 目标设备已入库:设备号在设备库存租户 pcm 有库存投影(库存由平台维护,App 无法自行入库)。
  • 绑定入口只有第一代端点,端点身份与全量契约见正本页绑定设备到个人空间/v1/retail 第二代无 bind 对应物;字段级事实见其链接的清单层)。

主路径

  1. 取得设备号与授权码:App 扫码或蓝牙配对取得 deviceNoauthorizationCode,生成公式见概念页与正本页。注意两者依赖不同:V1 依赖当前登录用户名参与运算——同一台设备对不同用户算出的 V1 授权码不同;V2 为 32 位二维码 / 蓝牙通用格式,只依赖设备号。该值的生成算法属于内部实现,不在文档披露范围,具体生成方式请与开发人员沟通确认。
  2. 发起绑定:调用绑定设备到个人空间,body 携带 deviceNoauthorizationCode 与可选 force(省略按 false)。
  3. 服务端校验链(顺序见正本页「错误与边界」):授权码按格式自动识别(满足 V2 判定条件按 V2 校验,否则一律按 V1 严格比对)→ 库存租户禁绑守卫 → 设备存在性 → 占用与归属转移判定。任一步失败即中止,出口见下节。
  4. 归属转移对账(如触发):两类触发——force=true设备强制绑定(显式强制请求,即使授权码未变化也重建设备归属)与合法授权码变化(设备侧已换码,新授权码与已存投影不一致)。触发时服务端先终止同一物理设备在全部非库存租户中的旧投影与活跃分享并通知相关用户,再为当前个人空间创建新投影(平台顺序合同:退场对账先于新投影创建;对账失败则整个绑定失败,不留半旧半新的投影组合)。平台只记录触发方式,不迁移旧租户数据。
  5. 完成判据与刷新status=200data.state=binddata.tenantId 为当前租户,表示投影已建立。重新拉取设备列表确认——新客户端用查询个人空间设备列表(V1 视图),或第一代查询个人空间设备列表

失败与恢复

四类业务失败出口(均为 HTTP 200 + status=422 族,error 为异常消息原文;判定口径见错误响应差异):

  1. 授权码非法Illegal authorization code):V1 严格比对不匹配,或 V2 判定命中但总长≠32 位 / 校验码不符。恢复:核对授权码来源与输入——V1 注意当前登录用户名参与运算(换账号绑同一台设备授权码不同),V2 注意大小写规则(前缀 / 后缀忽略大小写、校验码忽略大小写比较)。
  2. 库存租户禁绑Inventory tenant cannot perform device binding):当前租户为设备库存租户 pcm。零售 App 用户的当前租户是用户个人空间租户,正常调用面不会触发;若出现说明凭据或环境异常,应检查登录态而不是重试绑定。旧 app 文档的「Tenant id is default」错误码已随库存租户 defaultpcm 迁移失效,不要按它分支。
  3. 设备不存在The data collection device does not exist):设备号在库无任何投影行或无 pcm 库存行(未入库、设备号有误,或设备投影已退场)。恢复:核对设备号与设备入库状态。
  4. 占用冲突The data acquisition device has been bound(唯一直接拥有投影就在当前租户、授权码未变化——重复绑定);The data acquisition device has been bound by someone else(直接拥有投影在他人租户,或存在其他非库存投影 / 唯一索引冲突)。恢复:需要共享则请原属主发起分享(见分享设备);确需夺回归属,走设备归属转移绑定——force=true 或设备侧更换授权码后携新码重试(后果:原属主与全部接收方同时失去设备,见解绑与解除分享与概念页)。

通用出口:认证失败族(HTTP 200 + status=1000,重新登录);Bean Validation 失败(deviceNo / authorizationCode 缺失或超长)走请求校验出口(HTTP 400 / status=1002 族)。归属转移的退场对账时序、通知到达延迟与设备侧换码后的旧码失效窗口均无联调佐证(正本「已知缺口」),对上列错误码之外应保留未知码兜底分支。

收尾

  • 绑定成功后重新拉取设备列表;归属转移会异步通知受影响用户(原属主、分享目标)刷新列表,多端在线场景应触发各自刷新,不要假设旧租户数据迁移。
  • 绑定不是设备上线:三路连接状态经设备列表 / MQTT 读取(语义见两代列表正本页)。
  • 后续流程:分享给他人见分享设备;设备退场先读解绑与解除分享——自有设备走解绑,分享来的设备走解除分享,两者不可混用。