feat(huya): 协作台账勾选导出 CK 到剪贴板(单点权限 + 逐行审计)+ 工具区固定两行
This commit is contained in:
+40
-1
@@ -510,6 +510,11 @@ CK 失效了业务上可能仍然有效。列表上只做**显式提示**(红
|
||||
| POST | `/api/huya/external-orders/{id}/verify` | `huya:collab:edit` | 验证这一行的 CK(只读探针,§5.2) |
|
||||
| POST | `/api/huya/external-orders/ck/preview` | `huya:collab:edit` | 粘贴 CK 后的即时预览(探针 + 拉活动礼包,**只读不写库**) |
|
||||
| POST | `/api/huya/external-orders/ck/verify` | `huya:collab:edit` | 批量验证 CK(探针,body `{ids: [...]}`,最多 50 条) |
|
||||
| POST | `/api/huya/external-orders/status/batch` | `huya:collab:edit` | 勾选多行切成同一个状态(逐行 SAVEPOINT 隔离,最多 50 条;§4.1) |
|
||||
| POST | `/api/huya/external-orders/activity/query` | `huya:collab:edit` | 勾选多行查积分 + 兑换记录(串行带间隔,每行写一条生命周期快照;§5.7) |
|
||||
| POST | `/api/huya/external-orders/{id}/activity/query` | `huya:collab:edit` | 查这一行的积分 + 兑换记录(单行「查询」按钮) |
|
||||
| GET | `/api/huya/external-orders/{id}/metrics` | `huya:collab:view` | 账号全生命周期时间线(每次查询的快照,新→旧;§3.5) |
|
||||
| POST | `/api/huya/external-orders/ck/export` | **`huya:collab:ck_export`** | **导出勾选行的 CK 明文**(前端写剪贴板;逐行写审计;最多 50 条;§11.8) |
|
||||
| POST | `/api/huya/external-orders/import` | `huya:collab:edit` | 粘贴批量导入 |
|
||||
| GET | `/api/huya/collab-shops` | `huya:collab:view` | 店铺字典(含停用的,管理弹窗用) |
|
||||
| POST | `/api/huya/collab-shops` | `huya:collab:edit` | 新增店铺(重名 409) |
|
||||
@@ -542,7 +547,12 @@ CK 失效了业务上可能仍然有效。列表上只做**显式提示**(红
|
||||
- **图片列**:缩略图 + 张数,点击开大图(`Image.PreviewGroup`);
|
||||
- **状态**:Tag 展示,行内"下一步"按钮推进(带二次确认);
|
||||
- **CK 状态**:Tag + 一键"验证";
|
||||
- 筛选:店铺 / 负责人 / 业务状态 / CK 状态 / 关键词(订单号、绑定账号、角色、uid);
|
||||
- **工具栏批量动作**(都要先勾选):批量验证 CK / 批量改状态 / 批量查积分·兑换 / **导出 CK**(勾选几行导几行,写剪贴板;§11.8);
|
||||
- **顶部工具区固定两行**(2026-10-16 用户反馈「不要选中后两行」):
|
||||
第一行永远筛选 = 店铺 / 负责人 / 业务状态 / CK 状态 / 关键词(订单号、店铺、绑定账号、角色、虎牙号、礼包、备注)/ 显示已作废;
|
||||
第二行永远动作 = 刷新 + 上面那四个批量动作 + 粘贴导入 / 店铺管理 / 新建。
|
||||
**不要**用「筛选 + 动作放在同一个 `wrap` 里靠 `space-between` 排」那种写法 ——
|
||||
不勾选时两组挤成一行、勾选后按钮多了「(N)」就被顶到第二行,列表跟着往下跳;
|
||||
- 页头统计条:`待处理 N / 已确认绑定 N / 已充值·已上脚本 N / 抢购成功 N / 抢购失败 N / 已作废 N`(`done` / `failed` 的展示名 2026-10-16 由「已完成」/「兑换失败」改成「抢购成功」/「抢购失败」,枚举值与库里数据不变)。
|
||||
|
||||
> 交互细节(2026-10-16 用户拍板):**店铺是点选按钮组**(列表里点单元格弹出同一组按钮,
|
||||
@@ -830,6 +840,34 @@ CK 失效了业务上可能仍然有效。列表上只做**显式提示**(红
|
||||
注意「判定结论」(verdict)那三个标签仍是「兑换成功 / 兑换失败 / 无法判定」:
|
||||
它说的是"兑换记录里查到没有",与业务状态名是两个概念,徽标放在列表「积分」列与生命周期时间线上。
|
||||
|
||||
### 11.8 2026-10-16 第五轮:勾选导出 CK 到剪贴板
|
||||
|
||||
需求原文:"选择、多选后增加一个导出 CK 功能,可以导出选中的 CK 到剪贴板。"
|
||||
|
||||
这是本模块**第一个把凭据往外送的读接口**(列表/详情都刻意不返回 `cookie`,见 §2.3),
|
||||
所以按"凭据出口"来设计,而不是当成一个普通导出:
|
||||
|
||||
| 面 | 落地 |
|
||||
| --- | --- |
|
||||
| 权限 | 新增权限点 **`huya:collab:ck_export`**("导出外部 CK 协作台账的 CK");**默认只给运营**,客服默认没有(贴 CK 是"录入",导出是"把凭据带走",两件事不共用一个权限;口径同 `huya:cookie:export`) |
|
||||
| 服务层 | `export_cks(db, current, orders)`:只读 + 逐行写审计;返回 `{total, exported, skipped[], items[]}`,`items[].ck_text` 是明文(**只有这个接口会返回**);上限 `PROBE_BATCH_MAX=50` |
|
||||
| 接口 | `POST /api/huya/external-orders/ck/export`(字面量路径,排在 `/{order_id}` 之前),body `{ids: [...]}` |
|
||||
| 审计 | 逐行写 `huya:collab:ck_export`,`target=huya_external_order:<id>`,detail 只记 `order_no / uid / ck_status / batch_size` —— **绝不写 CK 本体**(测试里用 `assert "C"*152 not in detail` 钉死) |
|
||||
| 前端 | 工具栏「导出 CK(N)」→ 拉明文 → 弹窗预览 + 「复制到剪贴板」(走 `utils/clipboard.ts`,兼容 http 远程访问的 `execCommand` 回退) |
|
||||
|
||||
**六条约定(改这个功能前先读)**:
|
||||
|
||||
1. **明文只活在弹窗的 state 里**:不写 `localStorage`、不进 URL、不缓存(关弹窗即清);
|
||||
2. **复制失败不吞**:回退提示"在下面的框里手动选中复制",明文本来就在框里;
|
||||
3. **格式两种**:默认「每行一份纯 CK」(直接粘),可切「订单号 + Tab + CK」(多选时对号);
|
||||
4. **没 CK 的行显式跳过并回原因**(`skipped`),界面逐条列出来,不静默丢;
|
||||
5. **作废 / 停用的单只要还有 CK 就照导**,但把 `status_label / ck_status_label` 一起给,
|
||||
界面上点名"其中 N 条已失效/已停用" —— 不替用户做隐含决策(服务层只管"有没有凭据");
|
||||
6. **上限 50 行**(和批量验证/查询一致),一次别点太多,人看不过来也难追溯。
|
||||
|
||||
**待跟进**:导出动作目前只写审计;如果以后要做"谁在什么时候导出了什么"的专门报表,
|
||||
`audit_logs.action = 'huya:collab:ck_export'` 已经可以直接筛(不用加表)。
|
||||
|
||||
---
|
||||
|
||||
## 12. 风险
|
||||
@@ -838,6 +876,7 @@ CK 失效了业务上可能仍然有效。列表上只做**显式提示**(红
|
||||
| --- | --- |
|
||||
| 与 `huya_accounts` 出现"两份 CK 谁是准的" | §2.3 已写死:本表 CK 只在协作语境有效,不自动同步;需要跑任务时人工导入 |
|
||||
| 探针接口被风控 | 只做人工触发、串行、带间隔;不做定时轮询 |
|
||||
| CK 被导出后外传(导出到剪贴板 = 凭据出门) | 独立权限点 `huya:collab:ck_export`(默认只给运营)+ 逐行审计(不含 CK 本体)+ 界面常驻警告;明文只在弹窗 state 里,关掉即清(§11.8) |
|
||||
| 积分 / 兑换记录查询被风控 | 同上:只手动触发(单行 + 勾选批量,串行带间隔),不做定时轮询(§5.7) |
|
||||
| 自动改状态误判(接口抖动 → 判成"抢购失败") | 三态判定:取不到数据一律 `unknown` 且不动状态;只有 `scripted` 的单才自动改;每次查询留快照,人工可回退(`rollback`) |
|
||||
| 活动换 ID(SID 过期)→ 礼包列表空白 | 礼包 SID 一律读 `huya_config.sid`(工作台「虎牙配置」可改,见 §11.4);空列表时结论直接提示去改 SID |
|
||||
|
||||
Reference in New Issue
Block a user