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>
This commit is contained in:
@@ -0,0 +1,258 @@
|
||||
# 云客「沟通」板块操作全面核对表
|
||||
|
||||
> 采集时间: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) |
|
||||
Reference in New Issue
Block a user