验证状态:已源码核验、未联调(无 app 调用图);本页为流程编排页,不复制正本字段表,各步骤的协议契约、完成判据与错误出口以其链接的正本页为准(核验基线同各正本页:源码归纳 @ 2026-09-14)。
串起 App 扫码 / 蓝牙配对绑定向导的完整写链路:凭授权码发起绑定 → 授权码 V1/V2 校验 → 库存租户守卫 → 占用与归属转移判定 → 刷新列表。绑定是投影复制而非设备搬运:绑定为当前用户个人空间建立新的设备直接拥有投影,设备库存租户 pcm 侧的库存投影不因此转移。
pcm 有库存投影(库存由平台维护,App 无法自行入库)。/v1/retail 第二代无 bind 对应物;字段级事实见其链接的清单层)。deviceNo 与 authorizationCode,生成公式见概念页与正本页。注意两者依赖不同:V1 依赖当前登录用户名参与运算——同一台设备对不同用户算出的 V1 授权码不同;V2 为 32 位二维码 / 蓝牙通用格式,只依赖设备号。该值的生成算法属于内部实现,不在文档披露范围,具体生成方式请与开发人员沟通确认。deviceNo、authorizationCode 与可选 force(省略按 false)。force=true 的设备强制绑定(显式强制请求,即使授权码未变化也重建设备归属)与合法授权码变化(设备侧已换码,新授权码与已存投影不一致)。触发时服务端先终止同一物理设备在全部非库存租户中的旧投影与活跃分享并通知相关用户,再为当前个人空间创建新投影(平台顺序合同:退场对账先于新投影创建;对账失败则整个绑定失败,不留半旧半新的投影组合)。平台只记录触发方式,不迁移旧租户数据。status=200 且 data.state=bind、data.tenantId 为当前租户,表示投影已建立。重新拉取设备列表确认——新客户端用查询个人空间设备列表(V1 视图),或第一代查询个人空间设备列表。四类业务失败出口(均为 HTTP 200 + status=422 族,error 为异常消息原文;判定口径见错误响应差异):
Illegal authorization code):V1 严格比对不匹配,或 V2 判定命中但总长≠32 位 / 校验码不符。恢复:核对授权码来源与输入——V1 注意当前登录用户名参与运算(换账号绑同一台设备授权码不同),V2 注意大小写规则(前缀 / 后缀忽略大小写、校验码忽略大小写比较)。Inventory tenant cannot perform device binding):当前租户为设备库存租户 pcm。零售 App 用户的当前租户是用户个人空间租户,正常调用面不会触发;若出现说明凭据或环境异常,应检查登录态而不是重试绑定。旧 app 文档的「Tenant id is default」错误码已随库存租户 default→pcm 迁移失效,不要按它分支。The data collection device does not exist):设备号在库无任何投影行或无 pcm 库存行(未入库、设备号有误,或设备投影已退场)。恢复:核对设备号与设备入库状态。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 族)。归属转移的退场对账时序、通知到达延迟与设备侧换码后的旧码失效窗口均无联调佐证(正本「已知缺口」),对上列错误码之外应保留未知码兜底分支。