feat: add Z12/Z13 bind APIs, stock import, and sync docs
Enable auto default sync channels on agent activate, bind-code/phone confirm flows, publish ALTER, and align admin/yuheng docs with the production bind path.
This commit is contained in:
155
联调后修改意见-宇恒松离线.md
155
联调后修改意见-宇恒松离线.md
@@ -7,6 +7,9 @@
|
||||
> 再修订:2026-08-04 晚(§5.5 Z8f 本机镜像已通;§5.5.2 Z8g SyncPage)
|
||||
> 再修订:2026-08-04(§5.7 **Z10 空表双侧建齐**;§0/§1/§5.4 现状回写)
|
||||
> 再修订:2026-08-05(§5.6 **Z9e/Z9f 存量 import 必须扫库**;`coerce_fields` 复现)
|
||||
> 再修订:2026-08-05(智建落实 **Z9e/Z9f、Z8g、Z11a/b**;Z12/Z13 仍待)
|
||||
> 再修订:2026-08-05(智建落实 **Z12a/b/c/e、Z13a–c-1** API;Z12c-2/Z13d–e 待宇恒;绑定码控制台 UI 可后补)
|
||||
> 再修订:2026-08-05(`宇恒-松离线数据同步使用文档.md`、`docs/数据同步-开通说明.md` 对齐 Z12/Z13 生产路径)
|
||||
> 来源:宇恒客户端 `yuhengyihao_client` ↔ 本机智建 `127.0.0.1:8180`(gateway)/ `:8888`(platform)
|
||||
> 依据:`松离线-dbsync方案-最终版.md`、`宇恒-松离线数据同步使用文档.md`
|
||||
|
||||
@@ -16,13 +19,14 @@
|
||||
|
||||
| 级别 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| **硬改(阻塞宇恒上线)** | **无**(松离线主路径) | Z1–Z7、**Z9**、**Z10a/b(智建 API)** 已落实;主路径可上线 |
|
||||
| **硬改(阻塞宇恒上线)** | **无**(松离线主路径) | Z1–Z7、**Z9(含存量扫库)**、**Z10a/b** 已落实;主路径可上线 |
|
||||
| **原建议项 2.1–2.5** | **智建侧基本已落实** | 见 §2 对照表;接口请保持兼容 |
|
||||
| **用户自助 Z1–Z7** | **已落实** | Z2 宇恒复测通过;Z7 Binding 可读名已合入(需宇恒 ensure 时带 `database_name`/`display_name`) |
|
||||
| **Z8 模块↔本机库+智能体库** | **大部分落实** | Z8a/b/c/e 智建;**Z8f 宇恒本机 `模块·名·资源` 已可管+可 sync**;**Z8d 路径已通**;**Z8g** 展示增强仍待智建(P1,非硬阻塞)见 §5.5.2 |
|
||||
| **Z9 模块导入默认能力(方案 A)** | **新建已落实;存量未闭环** | Z9a–d 发布时兜底;**Z9e/Z9f 必须做**:旧模块未再发布仍会 `operation import not allowed`(2026-08-05 再复现),见 §5.6 |
|
||||
| **Z8 模块↔本机库+智能体库** | **大部分落实** | Z8a–f;**Z8g 展示已落实**(模块名 + 策略表文案);见 §5.5.2 |
|
||||
| **Z9 模块导入默认能力(方案 A)** | **已落实(含存量)** | Z9a–f:启动扫库 + 一键开启导入 + 读路径内存兜底;见 §5.6 |
|
||||
| **Z10 空表双侧建齐** | **智建 API 已落实;宇恒待接** | `schema/ensure` + `schema` + pull `columns`;**Z10c 待宇恒** sync 周期调用,见 §5.7 |
|
||||
| **Z11 蓝图↔库列一致** | **待智建** | 增字段未迁 Postgres → 导入 42703;见 §5.8 |
|
||||
| **Z11 蓝图↔库列一致** | **智建已落实** | 发布自动 `ADD COLUMN IF NOT EXISTS`;导入 42703 可读提示;见 §5.8 |
|
||||
| **Z12/Z13 开通/绑定 UX** | **智建 API 已落实;宇恒待接** | Z12a/b/c/e、Z13 绑定码+同号确认 API 已合入;**Z13d/e 待宇恒**;见 §5.9–5.10;**Z12d 通道 ID 可复制已有** |
|
||||
| **仍建议关注** | 性能/运维 | SQLite remote **高并发 push** 易锁;agent 宜单库串行 drain(属宇恒用法,非平台硬改) |
|
||||
|
||||
宇恒对照脚本:
|
||||
@@ -54,7 +58,15 @@
|
||||
5. 鉴权:管理员 JWT(含「数据同步」)、智能体 Token,或**登录用户 JWT**(须本人 Binding + `online_db_id`)均可调 agent API
|
||||
6. 错误体优先带可读 `message`;忙/上游失败宜带 `retryable: true`(502/503)
|
||||
|
||||
演示账号联调可用:`phone=13800000001` / `demo123`(超管快捷号见控制台;另见 seed `13531041945`)。
|
||||
**联调账号(写入约定,勿再用错租户 / 勿用超管号)**
|
||||
|
||||
| 环境 | 用途 | 登录 | 说明 |
|
||||
|------|------|------|------|
|
||||
| 本机 / 演示公司 | 租户 1 演示 | `13800000001` / `demo123` | 仅本机联调;**不要**拿去推生产「宇信达」通道 |
|
||||
| **生产 · 宇信达** | 公司管理 / 同号绑定联调 | **`13531041944`**(密码由开通时设定) | **专用联调号**;智建须在「宇信达」成员/管理员中写入此手机;宇恒 `YXD_SYNC_LOGIN_PHONE` 与 Z13 同号确认均以此号为准 |
|
||||
| 平台超管(禁止联调) | 控制台「填入超管手机」 | `13531041945` / `ljk_admin` | **最顶级管理员**;seed `ensureDevPhone(ljk_admin)`;**禁止**用作同步登录 / 绑定联调,会与公司账号冲突 |
|
||||
|
||||
> **智建待办**:生产「宇信达」写入成员手机 **`13531041944`**(公司管理员即可),勿再把同步联调绑到 `13531041945`。
|
||||
|
||||
---
|
||||
|
||||
@@ -152,8 +164,10 @@
|
||||
| **Z5** | **P2** | **仅线上 / 下行补齐** | A→B / pull / bootstrap。 | **已落实** |
|
||||
| **Z6** | **P2** | **控制台文案** | Binding 即权限;管理员不负责维护表白名单。 | **已落实** |
|
||||
| **Z7** | **P1** | **SyncPage / Binding 展示「可读库名 + 映射」** | 通道「线上」列优先可读名;副文案 online_db_id / 落库路径;统计标注为 push 次数;Binding 列表「本地库名 ↔ 线上库名」。 | **已落实(2026-08-04)**:Binding 增 `database_name`/`display_name`;SyncPage 主标题优先本地 `database_name`,↑ 标注「推送次数 / 非表数」。宇恒 ensure 须带可读名,否则仍会回退到通道名或 driver |
|
||||
| **Z8** | **P0** | **模块数据:本机库可管理 + 按智能体上云** | 见 §5.5:本机 B 管理模块表;push 到智能体绑定的 A;废弃默认双轨 | **大部分落实**:Z8a/b/c/d/e/f;**Z8g 展示增强待智建**(P1) |
|
||||
| **Z8** | **P0** | **模块数据:本机库可管理 + 按智能体上云** | 见 §5.5:本机 B 管理模块表;push 到智能体绑定的 A;废弃默认双轨 | **已落实(含 Z8g 展示)** |
|
||||
| **Z9** | **P0** | **模块默认 import + 存量扫库** | 见 §5.6 | **已落实 Z9a–f** |
|
||||
| **Z10** | **P0** | **空表两侧建齐** | 见 §5.7:仅靠 outbox 不会建空表 | **智建 API 已落实**;**Z10c 待宇恒**接 ensure/schema |
|
||||
| **Z11** | **P1** | **蓝图增字段迁库** | 见 §5.8 | **智建已落实** ALTER + 导入提示 |
|
||||
|
||||
### 建议验收(智建改后)
|
||||
|
||||
@@ -274,7 +288,7 @@
|
||||
| **Z8c** | **P1** | **线上与本机对齐** | 智能体读模块数据时优先本机 B(离线)或已同步的 A;发布蓝图在本机建表(UUID PK)再 sync,避免只在平台 schema 建一份 | **部分**:智能体新建发布若设 `database_name` → `database_per_app` 落该库;本机建表靠宇恒 Z8f |
|
||||
| **Z8d** | **P1** | **本地上传 / 编辑 → 上云** | 本机模块表变更经 Binding + push 进该智能体 A;「查看线上表」可核对 | **路径已通**:本机改 `模块·…` 表 → drain → 「查看线上表」应见同表;若仍缺行 = 未 push / 未 drain |
|
||||
| **Z8e** | **P2** | **查看线上表默认藏 `_ajz_*`** | 减少「表名不对」误解 | **智建已做默认隐藏**(2026-08-04) |
|
||||
| **Z8g** | **P1** | **本机可见 = 线上可见(展示闭环)** | SyncPage「智能体/模块」勿长期「未绑模块」;「查看线上表」列出本机已有业务表(含 `模块·…`);模块列优先展示名 | **待智建**,见 §5.5.2 |
|
||||
| **Z8g** | **P1** | **本机可见 = 线上可见(展示闭环)** | SyncPage「智能体/模块」勿长期「未绑模块」;「查看线上表」列出本机已有业务表(含 `模块·…`);模块列优先展示名 | **智建已落实(2026-08-05)**:模块展示名 + slug 副文案;策略表标「参考/整库同步」 |
|
||||
|
||||
**分工建议**
|
||||
|
||||
@@ -289,7 +303,7 @@
|
||||
2. ✅ 本机改模块行 → sync 后智建「查看线上表」出现同表同行(有数据路径;空表见 Z10)。
|
||||
3. ✅ 智能体 X 只落到绑定库;管理员可按智能体筛通道验数(Z8b)。
|
||||
4. ✅ 文档写明:本机有、线上无 = 尚未 push/ensure,不是串库。
|
||||
5. ⬜ SyncPage「智能体/模块」显示智能体名 + 模块**展示名**(Z8g;目前多显示 slug /「未绑模块」)。
|
||||
5. ✅ SyncPage「智能体/模块」显示智能体名 + 模块**展示名**(Z8g;slug 作副文案)。
|
||||
|
||||
### 5.5.1 【联调补丁·2026-08-04】编辑发布撞 page id
|
||||
|
||||
@@ -300,20 +314,19 @@
|
||||
|
||||
**与 Z9**:Z9 默认带 import 后,此类「仅为开导入而编辑」会减少;本补丁仍保留给「改已有页能力」用。
|
||||
|
||||
### 5.5.2 【待智建 Z8g】本机可见 ↔ 线上可见(展示增强 · 非硬阻塞)
|
||||
### 5.5.2 【已落实 Z8g】本机可见 ↔ 线上可见(展示增强 · 2026-08-05)
|
||||
|
||||
> **联调现象(对照两图)**
|
||||
> - 宇恒「数据表」已有:`orders`、`填土高度(6标一工区)`、**`模块·测·Sheet1`**(及业务表)。
|
||||
> - 智建 SyncPage 通道行若未写 `agent_id`/`app_slug` 会显示 **「未绑模块」**;有 slug 时目前多直接显示 slug,未解析模块**展示名**。
|
||||
> - 期望:本机库卡片能看见的业务表,同步后「查看线上表」也应能看见(行数允许短暂滞后;**空表走 Z10**)。
|
||||
> - **有数据表对齐**靠 push;**空表对齐**靠 Z10,不单靠 Z8g。
|
||||
> - 智建 SyncPage:有 `app_slug` 时解析已发布模块**展示名**,slug 作副文案;仅缺绑定才「未绑模块」。
|
||||
> - 通道表白名单 UI 标为「策略表(参考)」/「整库同步中」,避免误读为只能 sync 名单内表。
|
||||
|
||||
| 编号 | 优先级 | 诉求 | 说明 | 负责 |
|
||||
|------|--------|------|------|------|
|
||||
| **Z8g-1** | **P1** | **SyncPage 模块列可读** | 「智能体/模块」:有 `app_slug` 时解析已发布模块**展示名**(如「测」),slug 作副文案;仅缺绑定才显示「未绑模块」。`agent_id` 有值但 agents 列表未加载时仍显示 `#id`,勿整列空白 | **智建** `web/src/SyncPage.tsx` |
|
||||
| **Z8g-2** | **P1** | **通道绑定可被宇恒写入** | 保持 `PUT /api/v1/admin/sync/channels/{id}` 可写 `agent_id`、`app_slug`;列表 API 原样返回。宇恒已在 sync/mode、full-push 调 `ensure_channel_module_link`(环境 `YXD_SYNC_AGENT_ID` / `YXD_SYNC_APP_SLUG` / `YXD_SYNC_MODULE_NAME`) | **智建保持契约**;宇恒已接 |
|
||||
| **Z8g-3** | **P1** | **查看线上表 = 本机业务表子集** | inspect 列出 remote 全部业务表(含中文/含 `模块·`);继续默认藏 `_ajz_*`。缺表文案明确:「本机有、这里没有 = 尚未 push」 | **智建**(展示已基本具备;验收与文案强化) |
|
||||
| **Z8g-4** | **P2** | **白名单列勿误导** | Z4 已允许任意表 push;若通道 `tables` 仍只配 `["orders"]`,UI 勿暗示「只能同步 orders」。可标「策略表(参考)」或「整库同步中」 | **智建** SyncPage/配置抽屉 |
|
||||
| **Z8g-1** | **P1** | **SyncPage 模块列可读** | 展示名 + slug 副文案 | **智建已落实** |
|
||||
| **Z8g-2** | **P1** | **通道绑定可被宇恒写入** | `PUT` 可写 `agent_id`/`app_slug` | **智建保持契约**;宇恒已接 |
|
||||
| **Z8g-3** | **P1** | **查看线上表 = 本机业务表子集** | inspect + 默认藏 `_ajz_*`;缺表文案 | **智建已具备** |
|
||||
| **Z8g-4** | **P2** | **白名单列勿误导** | 「策略表(参考)」/「整库同步中」 | **智建已落实** |
|
||||
|
||||
**验收**
|
||||
|
||||
@@ -346,8 +359,8 @@
|
||||
| **Z9b** | **P0** | **列表 actions 对齐** | list 页 `actions` 默认含 **`import`**(及可选 `export`) | **已落实**:发布兜底补 list actions |
|
||||
| **Z9c** | **P0** | **改 prompt / 文档** | `prompt-contract.md`:由「提到导入再加」改为「默认加;明确不要再去掉」 | **已落实** |
|
||||
| **Z9d** | **P0** | **publish/merge 兜底** | 发布或编辑合并时:业务 resource 缺 `import` 则自动补上(可配置,默认开) | **已落实**:`EnsureDefaultImportExport`;但**只在 publish 路径触发** |
|
||||
| **Z9e** | **P0(升格)** | **存量模块一次性扫库补齐** | **禁止**依赖用户「碰巧再发布一次」。平台启动或管理接口:遍历租户已发布蓝图,对可写业务 resource 缺 `import/export` 的执行与 Z9d 相同补齐并落库(可干跑+确认)。目标:**任意旧模块** `POST .../import` 不再因缺 ops 400 | **待智建**;2026-08-05 `coerce_fields/items` 仍只有 list/create/… 无 import,联调第三次踩同一坑 |
|
||||
| **Z9f** | **P1** | **读路径也兜底(双保险)** | `GetBlueprint` / `ResolveResource` / `ImportRows` 入口:若可写 resource 缺 import,**内存补齐后再校验**(或返回明确引导「请点修复导入能力」)。避免「UI 能点导入、API 仍 400」 | **待智建**;宇恒侧已在导入前自动 replace 补 ops,不能替代平台扫存量 |
|
||||
| **Z9e** | **P0(升格)** | **存量模块一次性扫库补齐** | 平台启动扫库 + 管理接口;不依赖用户再发布 | **已落实(2026-08-05)**:启动 `RunBackfill…`;`POST /api/v1/admin/apps/ensure-import`;模块管理「一键开启导入」;超管 `…/platform/apps/ensure-import` |
|
||||
| **Z9f** | **P1** | **读路径也兜底(双保险)** | Import/Export 入口内存补齐后再校验;可读错误文案 | **已落实**:`ensureImportOpInMemory` + 区分蓝图缺 import vs 权限 |
|
||||
|
||||
**存量复现(必须消灭)**
|
||||
|
||||
@@ -369,8 +382,8 @@ POST /api/v1/apps/coerce_fields/items/import
|
||||
|
||||
| 方 | 负责 |
|
||||
|----|------|
|
||||
| **智建** | **Z9e 扫存量(P0)**、Z9f 读路径兜底;保持 Z9a–d;错误文案区分「蓝图未开 import」vs「账号无 row.import」 |
|
||||
| 宇恒 / 智能体 | 导入前尽力自动补齐(已做);表单选对 slug/resource;**不能**代替平台扫全租户 |
|
||||
| **智建** | **Z9e/Z9f 已落实**;保持 Z9a–d;错误文案区分「蓝图未开 import」vs「账号无 row.import」 |
|
||||
| 宇恒 / 智能体 | 导入前尽力自动补齐(已做);表单选对 slug/resource;**重启 platform 或点「一键开启导入」后**旧模块即可 import |
|
||||
|
||||
**验收(含存量)**
|
||||
|
||||
@@ -409,7 +422,7 @@ POST .../schema
|
||||
2. 换机 / 仅线上:schema → 本机建空表 → bootstrap 灌行。
|
||||
3. 有数据的表仍走原 push;ensure **不替代** outbox 行同步。
|
||||
|
||||
### 5.8 【待智建 Z11】蓝图增字段须迁 Postgres(2026-08-04)
|
||||
### 5.8 【已落实 Z11】蓝图增字段须迁 Postgres(2026-08-05)
|
||||
|
||||
> **联调现象**
|
||||
> 模块 `record` 蓝图后来带了 `title/content/status`,但 Postgres 表仍只有 `col_0/col_1/col_2`。
|
||||
@@ -418,11 +431,103 @@ POST .../schema
|
||||
|
||||
| 编号 | 优先级 | 诉求 | 负责 |
|
||||
|------|--------|------|------|
|
||||
| **Z11a** | **P1** | 编辑/发布增字段后 **自动 ALTER** 业务表补列(或发布失败并提示未迁库) | **智建** |
|
||||
| **Z11b** | **P2** | 导入时:Excel 列映射到蓝图有、库无的字段 → 明确报「请先迁库」,勿只堆 28 条 pq 错误 | **智建** |
|
||||
| **Z11a** | **P1** | 编辑/发布增字段后 **自动 ALTER** 业务表补列 | **智建已落实**:`BuildPostgresAlterDDL` + publish 合并执行;字段-only merge 可发布 |
|
||||
| **Z11b** | **P2** | 导入时:Excel 列映射到蓝图有、库无的字段 → 明确提示迁库 | **智建已落实**:42703 行错误附加「请重新发布以自动补列」 |
|
||||
|
||||
**宇恒临时绕过**:导入 Excel 只保留库里已有列对应表头(填土:`序号/断面里程/填土高度` → col_0/1/2)。
|
||||
**说明**:存量表补列一律可空,避免 NOT NULL 迁库失败。已有库需**再发布一次**(或编辑发布增字段)才会 ALTER;之后新字段随发布自动补。
|
||||
|
||||
### 5.9 【智建已落实 Z12】生产:账号绑定即落点,禁止手填通道 / 手建通道(2026-08-05)
|
||||
|
||||
> **产品约定(生产 · 冻结意向)**
|
||||
> 1. **一个登录账号 / 一个智能体 ↔ 本公司同步落点**:绑定后,该账号的本机库只进自己的(或公司共享的)线上库,**不会**接到别人账号的库。
|
||||
> 2. **用户不应**:手抄 `channel_id`、也不应先去「数据同步」里点「新建通道」才能用。
|
||||
> 3. **通道对用户隐藏或自动生成**:公司开通 / 智能体启用时,平台**自动**准备本公司默认同步通道(Postgres 线上 A)并写到智能体/账号绑定上;控制台「数据同步」留给运维改 DSN,不作为开通必经 UI。
|
||||
> 4. **共享库**:仅「公司共享数据库」可被多名成员同步到同一 `online_db_id`;个人库默认隔离。
|
||||
> 5. 方向默认 **`local_to_remote`**(松离线 agent push);「双向」不是用户必选项。
|
||||
> 6. SyncPage 列表须展示可复制 **通道 ID**(运维用;普通开通流程不依赖)。
|
||||
|
||||
| 编号 | 优先级 | 诉求 | 说明 | 负责 |
|
||||
|------|--------|------|------|------|
|
||||
| **Z12a** | **P0** | **换票带回绑定** | `POST /api/v1/auth/token`(及登录)响应含 `channel_id` / `online_db_id` / `database_name` / `sync_bound` | **智建已落实** |
|
||||
| **Z12b** | **P0** | **智能体自查绑定** | `GET /api/v1/agents/me`:智能体 Bearer 可读自己的通道/线上库/状态 | **智建已落实** |
|
||||
| **Z12c** | **P0** | **启用即自动绑通道** | 创建/启用智能体 → `EnsureSystemDefaultChannel`(`IsSystemDefault`,表白名单可空);写回 `channel_id`+`online_db_id`;DSN 见 `DBSync.DefaultRemoteDSN`(空则 sqlite 联调文件) | **智建已落实** |
|
||||
| **Z12c-1** | **P0** | **账号级隔离** | Binding / push 校验:用户 JWT 只能写本人 `online_db_id` | **智建已有**(自助 Binding) |
|
||||
| **Z12c-2** | **P1** | **公司共享库** | 支持标记 `shared=true` 的 `online_db_id` | **待智建** |
|
||||
| **Z12d** | **P1** | **SyncPage 展示通道 ID** | 运维可见 + copyable | **智建已落实** |
|
||||
| **Z12e** | **P1** | **唯一默认通道** | 每公司至多 1 条 `is_system_default`;复用已有默认 | **智建已落实** + 宇恒「仅 1 条则写入 env」 |
|
||||
| **Z12f** | **P1** | **开通 UX** | 启用智能体即可;DSN 用公司级默认 | **智建已落实**(控制台引导文案可再收) |
|
||||
|
||||
**宇恒已做(2026-08-05)**
|
||||
|
||||
1. 当前生产通道 `691575c0-…` 已写入 env(过渡缓存;Z12c 落地后应由换票/唯一通道自动获得)。
|
||||
2. `resolve_sync_channel_id()`:env → Binding → 租户仅 1 通道自动选用。
|
||||
3. 不把「手建通道 + 手抄 ID」当作产品终态。
|
||||
|
||||
**验收**
|
||||
|
||||
1. 新公司:只「启用智能体」,**不**点新建通道,换票已带 `channel_id`,宇恒可 drain。
|
||||
2. 账号 A 的本机库 push 不会出现在账号 B 的线上库;共享库仅在显式共享时可见。
|
||||
3. 用户全程无需 F12、无需手填 `YXD_SYNC_CHANNEL_ID`。
|
||||
|
||||
### 5.10 【智建 API 已落实 / 宇恒待接 Z13】绑定流程简化:绑定码 / 手机号(2026-08-05)
|
||||
|
||||
> **端到端体验(生产目标)**
|
||||
> 1. 后台已绑定(或用户用绑定码/手机号完成绑定)→ 宇恒本机库选 **「同步」** → **直接可用**(自动通道、自动 Binding、agent drain),无第二套配置。
|
||||
> 2. 绑定流程必须比「登记智能体 + 抄通道 ID + 填 env」简单。
|
||||
> 3. **生产·宇信达联调账号**:`13531041944`(公司侧专用;**禁止**用超管号 `13531041945`);宇恒侧同号对齐此号做「已有账号是否绑定」联调。
|
||||
|
||||
**推荐交互**
|
||||
|
||||
```text
|
||||
公司管理员(智建后台)
|
||||
→ 生成「绑定码」(一次性/短时有效,绑定到本公司 + 默认同步落点)
|
||||
→ 发给终端用户 / 贴在开通单
|
||||
|
||||
宇恒 · AI建站智能体
|
||||
→ 启动 / 换票前检测绑定状态
|
||||
│
|
||||
├─ 已绑定本公司 → 静默换票;本机库选「同步」即可用
|
||||
│
|
||||
└─ 未绑定
|
||||
├─ 读取当前宇恒账号手机号(若有)
|
||||
│ └─ 智建侧已存在「相同手机号」的公司成员/管理员账号
|
||||
│ → 【必弹】「检测到手机号 xxx 在「宇信达」已有账号,是否绑定到该账号?」
|
||||
│ ├─ 确认 → 绑定到该已有账号(继承公司 + 默认同步落点)
|
||||
│ └─ 取消 → 改走绑定码 / 换号
|
||||
├─ 无同号 或 用户选择手动
|
||||
│ → 表单:【绑定码】或【手机号】
|
||||
│ · 填绑定码 → redeem
|
||||
│ · 填手机号 → 若命中已有账号,同样走「是否绑定」确认,禁止静默绑错人
|
||||
└─ 都没有 → 明确提示联系管理员要绑定码
|
||||
→ 绑定成功后:本机选「同步」→ 直接 drain,零通道配置
|
||||
```
|
||||
|
||||
**同号规则(产品硬约束)**
|
||||
|
||||
| 场景 | 行为 |
|
||||
|------|------|
|
||||
| 宇恒手机号 = 公司内已有成员手机号 | **必须先询问**「已有账号,是否绑定」;不得静默绑定 |
|
||||
| 用户点确认 | 绑定到该已有账号;智能体 host_key 挂到该公司 |
|
||||
| 用户点取消 | 不绑定;可改输绑定码或其他手机号 |
|
||||
| 手机号在公司不存在 | 提示无此成员;引导用绑定码 |
|
||||
| 生产联调样例 | 宇恒号与智建均为 **`13531041944`** → 应弹出「宇信达已有账号是否绑定」;**勿用** `13531041945` |
|
||||
|
||||
| 编号 | 优先级 | 诉求 | 说明 | 负责 |
|
||||
|------|--------|------|------|------|
|
||||
| **Z13a** | **P0** | **后台生成绑定码** | `POST/GET/DELETE /api/v1/admin/bind-codes`(需「数据同步」);关联默认通道;过期/次数/撤销 | **智建已落实**(API;控制台 UI 可后补) |
|
||||
| **Z13b** | **P0** | **绑定码兑换 API** | `POST /api/v1/auth/bind-code/redeem`(`host_key` + `code`)→ 激活并绑定落点 | **智建已落实** |
|
||||
| **Z13c** | **P0** | **手机号探测 API** | `POST /api/v1/auth/bind/phone-lookup` → `{ exists, tenant_name, masked_name, need_confirm }`,**不**直接绑定 | **智建已落实** |
|
||||
| **Z13c-1** | **P0** | **同号确认绑定** | `POST /api/v1/auth/bind/phone-confirm`(`confirm=true` 才绑);写审计 | **智建已落实** + **宇恒弹窗待接** |
|
||||
| **Z13d** | **P0** | **未绑定检测与提示** | `sync_bound=false`:有手机号先 lookup;命中则弹确认;未命中再出绑定码/手机号表单 | **宇恒技能**(智建字段已提供) |
|
||||
| **Z13e** | **P0** | **选同步即用** | 库选「同步」→ 自动 Binding + drain;零手填通道 | **宇恒**(依赖 Z12/Z13) |
|
||||
| **Z13f** | **P1** | **安全** | 路由级限速已有;确认绑定写审计;lookup 不回明文全名 | **智建部分落实**(防枚举可再加强) |
|
||||
|
||||
**验收**
|
||||
|
||||
1. 管理员生成绑定码 → 用户填码 → 绑定成功 → 库选「同步」→ 数据进该公司线上库。
|
||||
2. **宇恒与智建同号 `13531041944`** → 必须弹出「已有账号是否绑定」;确认后绑定,取消则不绑(禁止用超管号 `13531041945` 测)。
|
||||
3. 未绑定用户:先同号探测,再绑定码/手机表单;**不**出现 DSN/通道 ID。
|
||||
4. 他人绑定码 / 未确认的同号,不能把数据绑进别的公司或别人账号。
|
||||
---
|
||||
|
||||
## 6. 联系与附件
|
||||
@@ -430,4 +535,4 @@ POST .../schema
|
||||
- 方案:`松离线-dbsync方案-最终版.md`(含 2026-08-01 联调建议落地记录)
|
||||
- 宇恒使用说明:`宇恒-松离线数据同步使用文档.md`(含 Z10 schema/ensure)
|
||||
- 开通说明:`docs/数据同步-开通说明.md`
|
||||
- 本意见如与冻结方案冲突,**以冻结方案为准**;§5.1–5.7 为产品增量与复测记录,不推翻 H1–H6 默认无感约束。
|
||||
- 本意见如与冻结方案冲突,**以冻结方案为准**;§5.1–5.10 为产品增量与复测记录,不推翻 H1–H6 默认无感约束。
|
||||
|
||||
Reference in New Issue
Block a user