Files
yunke/docs/superpowers/specs/2026-08-06-yunke-comm-operations-audit.md
T
浅念 a66c3be00a chore: final Minor polish — export filename/test断言, downloadBlob 类型/清理, plan docs
address review Minors: drop redundant filename replace, assert 暂无消息,
tighten downloadBlob return type + try/finally, fix plan group time-picker wording.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-06 18:06:17 +08:00

259 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 云客「沟通」板块操作全面核对表
> 采集时间:2026-08-06|采集源:crm2.yunkecn.com(登录态真机核对)|范围:沟通板块 6 个列表(微信/WA × 员工/客户/语音通话)
> 用途:作为重写 `2026-08-06-yunke-missing-operations.md` plan 的事实依据。
## 核对方法(关键纠错)
- **可点判定**:`getComputedStyle(el).cursor === 'pointer'`,覆盖 `<a>` / `<button>` / `div.link` / 图标(`.anticon-*`) / 统计数字,**不再只看 a/button**。
- **🔴 纠正内存**:云客表格**无 shadow DOM**(`shadowRootCount: 0`),evaluate 的 CSS 选择器可直接命中。内存里"云客表格在 shadow DOM、evaluate CSS 命中 0、必须用 getByRole"的说法**已过时/错误**——后续采集脚本可直接用 `.ant-table` CSS。
- **行为探测**:实际点击 + 看 modal/新 tab/URL 跳转/网络请求。标注 `✅实测` 的为真机点过;标注 `⚠️采信` 的为沿用 Plan1/2 既对齐结论或同类模式推断,**实现时建议复核**。
## 重要 URL 纠正(vs 内存)
| 实体 | 内存说法 | 实际(2026-08-06 真机) |
|---|---|---|
| 微信语音通话列表 | `callstatistics`(按员工KPI统计) | **`/cms/wechat/voice-call-list`**(每条通话记录表)。`callstatistics` 是「微信看板→微信语音统计」另一个 KPI 页,直链白屏,**非**"语音通话列表" |
| WA 员工列表 | (未明确) | `/cms/wechat/waBusiness/userlist` |
| WA 客户列表 | `waBusiness/friendlist` | `/cms/wechat/waBusiness/friendlist/0/{userId}`(按员工 userId 过滤) |
| WA 语音通话 | `waBusiness/wavoicecalllist` | ✅ 正确 `/cms/wechat/waBusiness/wavoicecalllist` |
| 微信侧边栏 | "微信侧边栏有员工/客户列表" | 员工/客户/语音都在**「微信号管理」**一级菜单下;「微信看板」下是数据看板/微信语音统计/数据统计 |
## 侧边栏结构(真机)
- **微信**一级菜单:微信看板 / 微信号管理 / 微信风控 / 微信设置 / **WhatsApp商业版**
- 微信号管理子菜单:**员工微信列表** / **客户列表** / **语音通话列表** / 微信群统计 / 重复好友统计 / 微信验证消息
- 微信看板子菜单:数据看板 / 微信语音统计(callstatistics) / 数据统计
- **WhatsApp商业版**一级菜单:数据统计 / **员工列表** / **客户列表** / 账号解绑 / 敏感词设置 / 敏感词统计 / **语音通话列表**
---
## 1. 微信员工列表 `/cms/wechat/wechatlist`
**列**(7):`checkbox` / `员工信息` / `数据更新时间/最新消息时间` / `好友数` / `消息数` / `沟通数` / `及时回复`
复合列内容:
- 员工信息:主(badge) / 微信昵称 / 员工姓名 / 微信手机号 / 微信号
- 好友数:好友数 / 微信群数
- 消息数:发送消息数 / 接收消息数 / 撤回消息数
- 沟通数:沟通人数 / 有效沟通数 / 跟进客户数
- 及时回复:员工最后回复数 / 员工最后回复率 / 未回复客户数
**可点元素 × 行为**:
| 元素 (selector) | 文本样本 | 行为 |
|---|---|---|
| 主 badge `员工信息 a:first` | 主 | ✅ 新 tab 聊天窗口 `wechat/salewechat/message/wechat-window/1/{wxId}/...` |
| 微信昵称 `员工信息 a` | Pasha Zhang | ✅ 新 tab 聊天窗口 `wechat-window/1/{wxId}/1` |
| **员工姓名** `button.ant-btn-link`(含 anticon-history) | 张士蓓 | ✅ **新 tab 员工详情** `customer/userDetailNew?userId={userId}` |
| 好友数 `好友数 a:eq(0)` | 1229 | ✅ 当前 tab 跳客户列表 `wechatlist/wechatdetail/1/{wxId}?ymdStart=0000-00-00&ymdEnd=YYYY-MM-DD` |
| 微信群数 `好友数 a:eq(1)` | 185 | ⚠️采信 跳群列表 `wechatdetail/2/{wxId}`(type=2 群) |
| 消息数(发送/接收/撤回) | — | ❌ **不可点** |
| 沟通人数 `沟通数 div.link:eq(0)` | 160 | ✅ modal「沟通人数(已去重)」列:序号/客户微信/员工信息/员工微信/操作 |
| 有效沟通数 `沟通数 div.link:eq(1)` | 32 | ✅ modal「有效沟通数(已去重)」列:序号/客户微信/**发送消息数/接收消息数**/员工信息/员工微信/操作 |
| 跟进客户数 `沟通数 div.link:eq(2)` | 37 | ✅ modal「跟进客户数」列:序号/客户微信/员工信息/员工微信/操作 |
| 员工最后回复数 `及时回复 div.link:eq(0)` | 15 | ✅ modal(标题空)列:序号/客户微信/员工信息/员工微信/操作 |
| 未回复客户数 `及时回复 div.link:eq(1)` | 17 | ✅ modal(标题空)列:序号/客户微信/员工信息/员工微信/操作 |
| 员工最后回复率 | 9% | ❌ **不可点** |
| modal 内 客户微信 / 员工微信 | 脱敏昵称 | ✅ 新 tab 聊天记录详情 `wechat/detail/message/{owner}/{friend}/1?start&end`(带 modal 时间范围) |
**工具栏**:导出 / 导出聊天记录(未逐一探测)
**🔴 vs missing-operations plan 的纠正**:plan Task1 写"微信员工**手机号**→openDrawer"。实际云客 `button.ant-btn-link` 包的是**员工姓名**(带 history 图标),手机号本身**不可点**。跳详情页的触发元素是员工姓名。
---
## 2. 微信客户列表 `/cms/wechat/wechatlist/wechatdetail/1/{wxId}?ymdStart&ymdEnd`
**列**(8):`checkbox` / `客户微信` / `数据来源` / `客户备注名` / `最近沟通时间` / `发送条数` / `接收条数` / `操作`
**可点元素 × 行为**:仅操作列(其余列全不可点)
| 元素 | 行为 |
|---|---|
| 查看聊天记录 | ✅ 新 tab 聊天详情 `wechat/detail/message/{owner}/{friend}/1?lastChatTime=...` |
| 导出HTML聊天记录 | ✅ **先弹 modal「请选择时间」**(选时间范围,按钮 确认/取消)→ 确定后下载 HTML |
**🔴 vs missing-operations plan 的补充**:plan Task2 的 `GET /api/export/chat-html` **未含时间范围参数**。云客原生是两步(先选时间再导出),yunkes 实现建议:加可选 `start/end` 参数;或简化为导出全部(但 UI 上可保留时间选择器对齐云客)。
---
## 3. 微信语音通话列表 `/cms/wechat/voice-call-list` 🔴纠正:非 callstatistics
**范围 tab**:`微信好友` / `微信群`
**列**(微信好友 tab,7):`checkbox` / `通话信息` / `客户信息` / `员工微信` / `员工信息` / `通话录音` / `通话时长`
**列**(微信群 tab,7):`checkbox` / `通话信息` / **`群信息`** / `员工微信` / `员工信息` / `通话录音` / `通话时长`(仅 客户信息↔群信息 之差)
复合列内容:
- 通话信息:通话状态(已接通/未接通) / 通话类型(微信语音) / 通话来源(手机/未知)
- 客户信息:微信昵称(脱敏) / 微信号(脱敏)
- 员工微信:微信昵称 / 微信号
- 员工信息:姓名 / 手机号
- 通话录音:录音时长 或 -(未接通无)
- 通话时长:结束时间 / 通话时长
**统计卡片**(顶部):今日好友语音呼入量/外呼量、今日微信群语音量、今日好友呼入呼出时长/群通话录音时长
**可点元素 × 行为**:
| 元素 (selector) | 行为 |
|---|---|
| 客户头像/昵称 `客户信息 a` | ⚠️采信 开聊天 |
| 员工头像/昵称 `员工微信 a` | ⚠️采信 聊天窗口 |
| 员工姓名/手机 `员工信息 div.link` | ⚠️采信 员工详情 |
| 通话录音播放 `通话录音 div.yk-voice`(含 anticon-wifi) | ✅ 播放录音 |
| 通话录音编辑 `通话录音 button.ant-btn`(含 anticon-edit) | ✅ **modal「微信长语音列表」**(见通用组件) |
**工具栏**:批量语音下载 / 全部导出 / 高级筛选(通话结束时间范围)
---
## 4. WA 员工列表 `/cms/wechat/waBusiness/userlist`
**列**(11):`checkbox` / `序号` / `员工信息` / `员工WhatsApp` / `是否在职` / `添加人数` / `沟通人数` / `好友数` / `群数` / `最新消息时间` / `操作`
**可点元素 × 行为**:
| 元素 | 文本样本 | 行为 |
|---|---|---|
| 员工WhatsApp 昵称 `员工WhatsApp a` | Hesucar | ⚠️采信 WA 聊天窗口 |
| 添加人数 | -(无数据时) | ⚠️采信(Plan1已做) modal |
| 沟通人数 `沟通人数 button` | 2 | ✅ modal「沟通人数」列:序号/员工信息/员工WhatsApp/客户WhatsApp/**添加时间/最后沟通时间** |
| 好友数 / 群数 | 551 / 2 | ❌ **不可点**(纯数字展示) |
| 操作-好友列表 `操作 button` | 好友列表 | ✅ 当前 tab 跳 WA 客户列表 `waBusiness/friendlist/0/{userId}` |
| 操作-群聊 `操作 button` | 群聊 | ⚠️采信 跳 WA 群列表 |
| 员工信息(姓名/手机) | — | ❌ **不可点**(与微信员工不同) |
**工具栏**:查询 / 导出 / 聊天记录类型 / 导出聊天记录
**与微信员工差异**:WA 用操作列按钮(好友列表/群聊)跳转,微信直接点数字(好友数/群数);WA 员工信息列不可点,微信员工姓名可点跳详情。
---
## 5. WA 客户列表 `/cms/wechat/waBusiness/friendlist/0/{userId}`
**列**(7,无 checkbox):`序号` / `员工信息` / `员工WhatsApp` / `客户WhatsApp` / `添加时间` / `最后沟通时间` / `操作`
**tab**:好友列表 / 群列表
**可点元素**:仅操作列「查看聊天记录」(⚠️采信 → WA 聊天记录)。**无导出HTML**(与微信客户不同,印证 Plan2)。
---
## 6. WA 语音通话列表 `/cms/wechat/waBusiness/wavoicecalllist`
**列**(6):`checkbox` / `状态` / `客户信息` / `员工信息` / `通话时间和录音` / `操作`
复合列内容:
- 状态:通话状态 / 通话时长
- 客户信息:WhatsApp昵称(脱敏) / WhatsApp号(脱敏)
- 员工信息:姓名 / 手机号 / 工号 / WhatsApp昵称 / WhatsApp号
- 通话时间和录音:通话时间
**可点元素 × 行为**:
| 元素 | 行为 |
|---|---|
| 客户WA 昵称 `客户信息 a` | ⚠️采信 开聊天 |
| 员工姓名 `员工信息 div.link` | ⚠️采信 员工详情 |
| 操作-点击语音列表手动匹配 | ✅ **modal「微信长语音列表」**(与微信同,见通用组件) |
| 操作-录音异常检查 | ✅ GET `/wechatweb/call/check/{callId}`(异步检查,toast 反馈) |
| "语音未匹配?" | 状态提示文本,非按钮 |
**工具栏**:筛选(WhatsApp好友/呼入呼出/员工姓名手机号WA昵称/客户WA昵称账号/接通状态)/ 批量语音下载 / 全部导出
---
## 通用组件:微信长语音列表 modal
微信 `voice-call-list` 的通话录音编辑按钮 + WA `wavoicecalllist` 的「手动匹配」**打开同一个 modal**。
- **标题**:微信长语音列表
- **筛选**:录音结束时间 / 员工姓名 / 企业串码
- **列**:`员工姓名` / `企业串码` / `文件地址`(yunke-pcfile...) / `录音开始时间` / `录音结束时间` / `录音时长` / `操作(匹配)`
- **底部**:取消 / 确定
- 含多条长语音片段,每条可「匹配」到当前通话
---
## yunkes 实现差距总览
### 已对齐(Plan1/2/3,✅无需改)
- 微信员工:好友数→客户列表、操作跳转、昵称→ChatTimeline、(部分)数字 modal
- 微信客户:查看聊天记录→ChatTimeline
- WA 员工:添加人数/沟通人数 modal、操作跳转
- WA 客户:查看聊天记录
### 🔴 漏做 / 需补(本次核对新发现)
1. **微信员工 沟通数/及时回复 的 5 个数字 modal 漏做**(Plan1 误判"不可点"):沟通人数/有效沟通数/跟进客户数/员工最后回复数/未回复客户数 都是 `div.link` 可点→modal。modal 内客户微信还可点→聊天记录。
2. **微信员工 员工姓名(button+history)→员工详情**:missing-operations plan 写的是"手机号",应改为**员工姓名**触发(手机号不可点)。
3. **微信员工 「主」badge→聊天窗口**:漏做(开该员工微信号聊天窗口)。
4. **微信客户 导出HTML**:缺**时间范围选择**(云客先弹「请选择时间」modal)。
5. **微信语音通话列表 CallList**:整个页面未实现。应按 `voice-call-list` 对齐(每条通话记录,微信好友/群 tab,列:通话信息/客户信息/员工微信/员工信息/通话录音/通话时长),含录音播放 + 长语音列表 modal。**不是** callstatistics KPI 看板。
6. **WA 语音通话列表 CallList**:未实现。对齐 `wavoicecalllist`(状态/客户信息/员工信息/通话时间和录音/操作),操作列「手动匹配」(→长语音modal) +「录音异常检查」(→/call/check)。
7. **长语音列表 modal**(通用组件):未实现。微信/WA 语音都用到。
8. **工具栏操作**:批量语音下载 / 全部导出 / 导出聊天记录 / 高级筛选(语音列表)—— 之前按 spec「不复刻装饰按钮」跳过,按用户新需求需评估实现。
### ✅ 采信项已全部实测(第二轮真机,见文末)
原列出的采信项均已实际点击验证,结果见文末「第二轮:采信项实测补全」。
---
## 内存待纠正点(写入 memory)
1. 云客表格**无 shadow DOM**,evaluate CSS 直接可用(旧说法过时)。
2. 微信语音通话列表 = **`/cms/wechat/voice-call-list`**(每条记录表),**非** `callstatistics`(那是另一个 KPI 看板,直链白屏)。
3. 微信员工跳详情页的是**员工姓名**(`button.ant-btn-link`+history icon),**非手机号**(手机号不可点)。
4. 微信员工「主」badge→聊天窗口;沟通数/及时回复 5 个数字均可点→modal(Plan1 误判)。
5. 微信/WA 语音共享「微信长语音列表」modal(手动匹配/录音编辑)。
6. WA 语音操作:手动匹配(→长语音modal) + 录音异常检查(→GET /call/check/{id})。
7. WA 客户列表 URL 带 userId:`friendlist/0/{userId}`;WA 员工 `userlist`。
8. 微信客户导出HTML 是两步(先选时间范围)。
---
## 第二轮:采信项实测补全(2026-08-06,零采信)
所有原 ⚠️ 采信项均已真机点击验证:
### 微信员工
- 微信群数「185」→ ✅ 当前 tab 跳群列表 `wechatlist/wechatdetail/2/{wxId}?ymdStart&ymdEnd`(type=2 群,标题「微信群」)
### 微信群列表(wechatdetail/2,Plan3 复核)
- 列:`checkbox` / `群信息` / `数据来源` / `群主信息` / `群成员数量` / `群成员好友数量` / `消息数量` / `操作`
- 操作列:查看聊天记录 + **导出HTML聊天记录**(🔴 Plan3 GroupList 可能漏做导出HTML,需补)
- 其余列(群信息/群主信息/数字)不可点
### 微信语音 voice-call-list
- 客户昵称 → ✅ 新 tab 聊天记录 `wechat/detail/message/{ownerWx}/{friendWx}/1?start={通话ts}&scrollToBottom=0`
- 员工微信昵称 → ✅ 新 tab 聊天窗口 `wechat-window/1/{ownerWx}/filehelper?...`
- 员工姓名/手机 → ✅ 新 tab 员工详情 `customer/userDetailNew?userId={userId}`
### WA 员工 userlist
- 员工WhatsApp 昵称 → ✅ 新 tab WA 聊天窗口 `waBusiness/wschatroom/1/{ownerWA}/null/{sessionId}?menuId=0`(friend=null=账号会话列表)
- 添加人数「32」→ ✅ modal「添加人数」列:`序号/员工信息/员工WhatsApp/客户WhatsApp/添加时间/最后沟通时间`(与沟通人数 modal 同列结构)
- 操作列「群聊」→ ✅ 当前 tab 跳 `waBusiness/friendlist/1/{userId}`(type=1 群;好友是 type=0)
- 好友数/群数 → ❌ 不可点(纯数字)
### WA 群列表(friendlist/1,补 Plan3)
- 列:`序号` / `员工信息` / `员工WhatsApp` / `群信息` / `添加时间` / `最后沟通时间` / `操作`
- 操作列:查看聊天记录(与 WA 客户列表仅 客户WhatsApp↔群信息 之差)
### WA 客户 friendlist
- 查看聊天记录 → ✅ 新 tab WA 聊天记录 `waBusiness/wschatroom/0/{ownerWA}/{friendWA}/{sessionId}`
### WA 语音 wavoicecalllist
- 客户WA 昵称 → ✅ 新 tab `waBusiness/wschatroom/0/{ownerWA}/{friendWA}/{sessionId}?start={通话ts}`
- 员工姓名 → ✅ 新 tab 员工详情 `customer/userDetailNew?userId={userId}`
### 通用 URL 模式总结(全部实测)
| 跳转类型 | URL 模式 | 触发来源 |
|---|---|---|
| 员工详情 | `customer/userDetailNew?userId={userId}` | 微信员工姓名 / 微信语音员工姓名 / WA语音员工姓名 |
| 微信聊天窗口 | `wechat/salewechat/message/wechat-window/1/{wxId}/...` | 微信员工 昵称/主badge / 微信语音 员工昵称 |
| 微信聊天记录 | `wechat/detail/message/{ownerWx}/{friendWx}/1?{lastChatTime \| start&end \| start&scrollToBottom}` | 微信客户查看 / 微信员工modal内 / 微信语音客户昵称 |
| WA 聊天(窗口/记录) | `waBusiness/wschatroom/{type}/{ownerWA}/{friendWA\|null}/{sessionId}?{menuId \| start}` | WA员工昵称(type=1,friend=null) / WA客户查看(type=0) / WA语音客户(type=0,+start) |
| 微信 客户/群列表 | `wechatlist/wechatdetail/{1\|2}/{wxId}` | 微信员工 好友数(1) / 群数(2) |
| WA 客户/群列表 | `waBusiness/friendlist/{0\|1}/{userId}` | WA员工 操作-好友列表(0) / 群聊(1) |