feat(weibo): 支持管理员强制转入工作台且不影响原使用人

This commit is contained in:
yml
2026-11-12 12:05:26 +08:00
parent 11b5a4d938
commit 31045e0f2e
11 changed files with 604 additions and 56 deletions
@@ -18,7 +18,8 @@ status: implemented
- **分配管理**:管理员和运营把全局账号分配给客服,支持批量分配、取消分配和按客服查看。
- **微博工作台**:每个用户自己的账号子集,只展示自己导入的账号,用于绑定、充值、兑换和日常操作。
工作台采用斗鱼模式:**账号实体仍然全局唯一,工作台只保存用户与账号的映射**。同一个全局账号同一时间只能被一个用户加入工作台;当前使用人移出后,其他人才可以加入。
工作台采用斗鱼模式:**账号实体仍然全局唯一,工作台只保存用户与账号的映射**。
普通用户之间保持独占;超级管理员可以额外增加并行映射,不改变、也不阻塞原使用人。
## 2. 数据模型
@@ -33,8 +34,8 @@ weibo_accounts.assigned_to -> users.id
- `assigned_to` 为空表示未分配。
- 管理员和运营可查看全部账号并修改归属。
- 客服的账号管理、标签、工作台候选、绑定、充值、兑换、复制 CK 等操作全部只允许访问 `assigned_to = 当前用户` 的账号。
- 同一账号改分配给新客服时,旧客服工作台中的映射会自动清除,避免账号被旧工作台继续占用。
- 取消分配时清除该账号的全部工作台映射。
- 同一账号改分配给新客服时,旧客服的普通工作台映射会自动清除,避免账号被旧工作台继续占用。
- 取消分配时清除普通工作台映射;超级管理员的并行映射保留。
新增:
@@ -43,10 +44,12 @@ weibo_workbench_accounts
id
user_id -> users.id
account_id -> weibo_accounts.id
exclusive_slot -- 普通用户固定为 1,超级管理员为 NULL
created_at
UNIQUE(user_id, account_id)
UNIQUE(account_id) -- 同一账号同时只能属于一个工作台
UNIQUE(account_id, exclusive_slot)
-- MySQL 允许多个 NULL,因此一个账号可保留普通使用人,同时被多个超级管理员并行使用
```
删除账号或用户时,对应工作台映射级联删除,不保留孤儿记录。
@@ -148,6 +151,9 @@ UNIQUE(account_id) -- 同一账号同时只能属于一个工作台
中文逗号、分号分隔;后端先按 UID 精确匹配,再按用户名、角色名兜底解析,
重名时必须改用 UID。导入结果逐项区分:已导入、已存在、未找到、重名、
被其他工作台占用、账号停用和名单内重复。原来的「从账号池选择」页签完整保留。
超级管理员的批量粘贴默认允许强制转入被其他用户占用的账号:服务端新增一条
`exclusive_slot = NULL` 的并行映射,不修改原使用人的工作台、账号归属或 CK。
普通客服仍不能强制转入。结果会把强制转入单独计数,并记录原使用人和时间。
### 5.3 工作台转入外部单协作
@@ -159,7 +165,8 @@ UNIQUE(account_id) -- 同一账号同时只能属于一个工作台
## 6. 数据隔离边界
- 工作台列表和增删接口都按当前登录用户过滤。
- 客服的账号池候选只包含分配给自己的账号,并排除所有已被其他用户工作台占用的账号。
- 客服的账号池候选只包含分配给自己的账号,并排除所有已被其他普通用户独占的账号。
- 超级管理员的账号池候选只排除自己已经加入的账号,其他人的占用不阻塞。
- 加入/移出只操作 `weibo_workbench_accounts`,不修改账号归属或 CK。
- 账号池全量查看由 `weibo:assign` 控制;客服可以看到账号管理入口,但列表和所有详情/操作接口只返回分配给自己的账号。
- 外部单协作继续引用全局账号 ID,不受个人工作台选择影响。