fix(calls+scraper): 语音群scope服务端过滤+对话发现缺口补全+抓取韧性三连修

- /api/calls 加 scope=friend|group(@chatroom后缀判群,与isRoom实测等价120=120),CallList去掉「全部」tab改服务端查
- 对话发现:全部customer pair ∪ 语音pair(weChatId,talker),未扫过的排最前——修复纯语音关系客户聊天记录永远空(35%语音客户pair从未扫过)
- voice-calls改浏览器直发(isRoom=0/1双趟+WA callSource=4,拦截方式已两次失效)
- 断连恢复重试30×2min(云客约3h一次断连,已实战扛过多次)
- WA messages upsert改整列表直调(_upsert_all逐条传dict被迭代成key字符串→TypeError)
- 405测试绿含scope新增3个

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
浅念
2026-08-19 16:48:22 +08:00
parent f9ed7dd821
commit ab5a918a3b
5 changed files with 293 additions and 80 deletions
+9 -16
View File
@@ -28,7 +28,7 @@ const callType = ref<CallChannel>(
// 微信语音 tab scope filter: 对齐云客 微信好友/微信群 二分(isRoom 0=好友, 1=群)。
// 仅在 voice_call tab 生效;client-side 过滤当前页。
const voiceScope = ref<'all' | 'friend' | 'group'>('all')
const voiceScope = ref<'friend' | 'group'>('friend')
const calls = ref<PhoneCall[]>([])
const total = ref(0)
@@ -64,6 +64,8 @@ async function load(): Promise<void> {
try {
const res = await getCalls({
channel: callType.value,
// 微信语音 好友/群 scope 为服务端过滤(@chatroom 后缀判群,与云客 isRoom 等价)
scope: callType.value === 'voice_call' ? voiceScope.value : undefined,
page: page.value,
page_size: pageSize.value,
})
@@ -97,7 +99,7 @@ watch(
callType.value = next
page.value = 1
// 复位 scope,避免把 微信群/好友 筛选带到 WA语音。
voiceScope.value = 'all'
voiceScope.value = 'friend'
load()
}
},
@@ -136,19 +138,11 @@ async function exportCalls(): Promise<void> {
}
/**
* 当前表格要渲染的行。非 voice_call tab 原样返回;voice_call tab 按 voiceScope
* 依 isRoom(0=好友, 1=群)做页内过滤。云客 isRoom 可能是 number/string/boolean,
* 三种都判一下。
* 好友/群 scope 切换 → 服务端重查(与云客一致按 isRoom 分舱,分页/总数都对)。
*/
const displayCalls = computed<PhoneCall[]>(() => {
if (callType.value !== 'voice_call' || voiceScope.value === 'all') {
return calls.value
}
return calls.value.filter((row) => {
const v = cell(row, 'isRoom')
const isGroup = v === 1 || v === '1' || v === true
return voiceScope.value === 'group' ? isGroup : !isGroup
})
watch(voiceScope, () => {
page.value = 1
load()
})
/**
@@ -283,14 +277,13 @@ onMounted(load)
size="small"
style="margin-bottom: 8px"
>
<el-radio-button value="all">全部</el-radio-button>
<el-radio-button value="friend">微信好友</el-radio-button>
<el-radio-button value="group">微信群</el-radio-button>
</el-radio-group>
<el-table
v-loading="loading"
:data="displayCalls"
:data="calls"
stripe
border
row-key="call_id"