Files
story/docs/device-account-first-20260918.md
Codex Local bf1233d5df
ci / verify (push) Canceled after 0s
feat: expand companion platform, device controls, and memoir workflows
Add customer and operator login, BLE provisioning, device fleet controls, call memory, memoir generation, and refreshed family and maintenance portals. Include API contracts, migrations, firmware sources, tests, assets, and deployment documentation.
2026-10-08 10:06:44 +08:00

33 lines
3.1 KiB
Markdown

# 先添加设备,后绑定老人
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 接口不变,无需为本次流程调整重新烧录。
数据库回退脚本在已有账号设备归属时拒绝删除数据;运行版本回退必须先评估新增归属,不能仅切回旧后端。