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

17 KiB
Raw Blame History

云客「沟通」板块操作全面核对表

采集时间: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)