27 lines
3.3 KiB
Markdown
27 lines
3.3 KiB
Markdown
# COM6 更换使用老人
|
|||
|
|
|
||
|
|
两端原“更换使用老人”调用旧版直接转移接口;COM6 为 physical_confirm,旧接口应继续拒绝绕过设备确认。新增蓝牙转移流程保留该约束。
|
||
|
|
|
||
|
|
API 与网页已发布 `0.99.10-rc.device-transfer1`;小程序代码已完成,正式发布和 COM6 实物转移待验收。
|
||
|
|
|
||
|
|
## 实现
|
||
|
|
|
||
|
|
- 家属端先选择目标老人并检查绑定影响。`requires_physical_confirmation` 指示进入附近蓝牙流程;旧设备继续原直接转移方式。
|
||
|
|
- `ble-bind-tokens` 新增可选 `expected_binding_id`,与 `elder_id` 一起明确表示转移。缺少原绑定版本不能把普通添加误当转移。账号必须同时有原家庭及目标家庭管理权限。
|
||
|
|
- 申请期间原绑定、旧聊天归属和设备设置保持原值。现有 BLE `configure` 携带一次性令牌,仍需设备轻触确认和 DEVREQ1 设备签名。
|
||
|
|
- `device_ble_binding.binding_id` 在 PENDING 转移时固定原绑定,COMMITTED 时记录新绑定;普通添加仍从 NULL 开始。无需数据库迁移。
|
||
|
|
- 设备确认事务重新核对当前绑定及代次、两边权限、通话、有效命令、两类 OTA 和待确认 claim,关闭旧绑定后通过已有数据库 claim guard 建立新绑定。任一步失败全部回滚,不留下中间解绑状态。
|
||
|
|
- 与 callmemory 使用相同的设备事务锁,先取得通话锁,再按 twin/device 顺序锁定控制状态,防止检查空闲后并发开始通话。
|
||
|
|
- 旧绑定关闭和新绑定插入分别推进代次;持久化转移令牌的预期代次随之更新,使丢失响应和并发重试只返回同一结果。旧绑定回执不能恢复旧归属。
|
||
|
|
- 原语音服务身份复用,不重复注册。历史聊天仍属于原老人,后续聊天使用新老人。
|
||
|
|
- 两端都必须查询云端令牌最终状态,不能将蓝牙配置成功当作转移成功。选择了其他设备、绑定过期、权限变化和连接中断都有独立处理。
|
||
|
|
|
||
|
|
## 验证与边界
|
||
|
|
|
||
|
|
- onboarding 隔离数据库全包通过,包括同源网页登录令牌、缺少设备签名拒绝、原绑定保留、重复确认、过期、跨账号/设备/目标、源权限单独撤销、真实语音注册身份复用、四种活动通话状态、OTA pending/accepted、写入故障回滚及正在启动通话的并发锁检查。
|
||
|
|
- saas 和 callmemory 集成测试通过。
|
||
|
|
- 小程序 59 项相关测试通过,9 页 WXML、10 个 WXSS 原生编译通过。确认导航携带指定设备、原绑定和目标老人,不调用旧直接转移接口;重复点击、隐藏页面、冲突及蓝牙假成功均不误报完成。
|
||
|
|
- 网页候选 TypeScript/Vite 及 Linux API 构建通过。使用真实组件和模拟接口验证等待实体确认、云端完成和归属冲突提示;模拟页不进入生产构建。
|
||
|
|
- COM6 尚未实际更换老人;没有创建测试家庭或修改真实归属。需要用户登录家属账号选择目标老人并进行设备现场确认。小程序尚未确认正式发布。
|
||
|
|
- 发布清单:线上 release 的 `device-transfer-release.json`;9 个源码/契约文件增量覆盖,未做数据库迁移。候选 API/Web 构建、线上版本及资产哈希、匿名请求拒绝、其他服务容器不变检查通过。发布后 COM6 仍在线、绑定 1、音量 60、配置版本 12。
|