Files
story/docs/device-account-first-20260918.md
T

33 lines
3.1 KiB
Markdown
Raw Normal View History

# 先添加设备,后绑定老人
2026-09-18 · 后端已上线版本 `0.94.0-rc.account1` · 数据库迁移 68。
小程序新增流程:登录客户账号 → 蓝牙配网并添加设备 → 设备列表显示“待绑定老人” → 创建家庭和老人 → 设备管理 → 绑定老人。
## 接口变化
- `POST /api/v1/mini/ble-device-state`:未归属的设备只要求同组织的有效客户账号,不要求家庭或老人。已有归属仍校验账号或家庭管理权限。`bound` 表示已有账号或老人归属。
- `POST /api/v1/mini/ble-bind-tokens`:只传工厂 `device_id` 即可申请账号归属令牌;显式传 `elder_id` 仍支持旧的一步绑定流程。
- `POST /api/v1/device/ble-bind`:保持原请求及成功响应的五个火山字段。设备实体确认后才建立账号归属;不会自动创建家庭、老人或开启聊天。
- `GET /api/v1/devices`:包含已添加到账号、尚未绑定老人的设备。这类设备的 `account_binding_id` 非空,`household_id`、`subject_id`、`subject_name` 为空字符串。可查询固件、在线状态、重新配网和移除。
- `POST /api/v1/mini/device-subject`:提交平台设备 UUID `device_id`、老人 UUID `elder_id`、列表返回的 `expected_account_binding_id`,并携带 `X-Request-ID`。要求当前账号拥有设备且有目标老人管理权限,不能跨组织。相同归属版本和老人可重试。
- 绑定老人时原账号归属转为已有家庭设备绑定,并复用火山注册身份;不会再次注册火山。
- 只有老人绑定完成后才可聊天;没有老人时聊天接口仍返回 `409 DEVICE_UNBOUND`。
- 移除设备沿用 `binding-impact` / `binding-change`。旧令牌立即失效,再次添加需要设备实体确认。恢复出厂须先解除账号/家庭归属。
## 验证
- 独立 PostgreSQL 和 Redis 容器,完整执行迁移 1–68;未在业务数据库中制造测试家庭、老人或设备绑定。
- 集成覆盖:无家庭账号添加、设备列表可见性、其他账号拒绝、竞争令牌失效、并发重试、后建家庭老人、真实 Mini 鉴权后的老人分配、相同分配重试、火山只注册一次、无老人聊天拒绝、移除与旧令牌重放拒绝。
- 小程序 101 项测试、9 页 WXML / 10 个 WXSS 编译通过。
- 网页 API 类型生成与 TypeScript 检查通过。
- 后端 onboarding、saas、httpapi、devicereset、callmemory 集成测试通过。
- 线上原问题账号(家庭数量为 0)只读验证通过:设备状态检查允许继续,设备仍未绑定。线上未创建测试家庭、老人或设备归属。
- API、worker、callbacks 已切换至新版本,数据库迁移 68 状态正常;小程序代码已完成,尚未上传发布。
## 客户端更新
小程序代码位于 `C:\Users\19926\WeChatProjects\voicelink`。旧小程序仍包含提交前的老人校验,需要更新小程序版本才能使用新流程。现有设备 BLE 消息和设备 HTTP 接口不变,无需为本次流程调整重新烧录。
数据库回退脚本在已有账号设备归属时拒绝删除数据;运行版本回退必须先评估新增归属,不能仅切回旧后端。