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>
17 KiB
云客「沟通」板块操作全面核对表
采集时间:2026-08-06|采集源:crm2.yunkecn.com(登录态真机核对)|范围:沟通板块 6 个列表(微信/WA × 员工/客户/语音通话) 用途:作为重写
2026-08-06-yunke-missing-operations.mdplan 的事实依据。
核对方法(关键纠错)
- 可点判定:
getComputedStyle(el).cursor === 'pointer',覆盖<a>/<button>/div.link/ 图标(.anticon-*) / 统计数字,不再只看 a/button。 - 🔴 纠正内存:云客表格无 shadow DOM(
shadowRootCount: 0),evaluate 的 CSS 选择器可直接命中。内存里"云客表格在 shadow DOM、evaluate CSS 命中 0、必须用 getByRole"的说法已过时/错误——后续采集脚本可直接用.ant-tableCSS。 - 行为探测:实际点击 + 看 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 客户:查看聊天记录
🔴 漏做 / 需补(本次核对新发现)
- 微信员工 沟通数/及时回复 的 5 个数字 modal 漏做(Plan1 误判"不可点"):沟通人数/有效沟通数/跟进客户数/员工最后回复数/未回复客户数 都是
div.link可点→modal。modal 内客户微信还可点→聊天记录。 - 微信员工 员工姓名(button+history)→员工详情:missing-operations plan 写的是"手机号",应改为员工姓名触发(手机号不可点)。
- 微信员工 「主」badge→聊天窗口:漏做(开该员工微信号聊天窗口)。
- 微信客户 导出HTML:缺时间范围选择(云客先弹「请选择时间」modal)。
- 微信语音通话列表 CallList:整个页面未实现。应按
voice-call-list对齐(每条通话记录,微信好友/群 tab,列:通话信息/客户信息/员工微信/员工信息/通话录音/通话时长),含录音播放 + 长语音列表 modal。不是 callstatistics KPI 看板。 - WA 语音通话列表 CallList:未实现。对齐
wavoicecalllist(状态/客户信息/员工信息/通话时间和录音/操作),操作列「手动匹配」(→长语音modal) +「录音异常检查」(→/call/check)。 - 长语音列表 modal(通用组件):未实现。微信/WA 语音都用到。
- 工具栏操作:批量语音下载 / 全部导出 / 导出聊天记录 / 高级筛选(语音列表)—— 之前按 spec「不复刻装饰按钮」跳过,按用户新需求需评估实现。
✅ 采信项已全部实测(第二轮真机,见文末)
原列出的采信项均已实际点击验证,结果见文末「第二轮:采信项实测补全」。
内存待纠正点(写入 memory)
- 云客表格无 shadow DOM,evaluate CSS 直接可用(旧说法过时)。
- 微信语音通话列表 =
/cms/wechat/voice-call-list(每条记录表),非callstatistics(那是另一个 KPI 看板,直链白屏)。 - 微信员工跳详情页的是员工姓名(
button.ant-btn-link+history icon),非手机号(手机号不可点)。 - 微信员工「主」badge→聊天窗口;沟通数/及时回复 5 个数字均可点→modal(Plan1 误判)。
- 微信/WA 语音共享「微信长语音列表」modal(手动匹配/录音编辑)。
- WA 语音操作:手动匹配(→长语音modal) + 录音异常检查(→GET /call/check/{id})。
- WA 客户列表 URL 带 userId:
friendlist/0/{userId};WA 员工userlist。 - 微信客户导出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) |