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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user