From cab8ab95dc6d02826b5d7342b19f454e5bb19fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Fri, 7 Aug 2026 18:50:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(staff):=20loadWechatStats=20=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=AB=9E=E6=80=81=E5=AE=88=E5=8D=AB=EF=BC=88token?= =?UTF-8?q?=EF=BC=89+=20=E9=87=8D=E6=9F=A5=E6=97=B6=E6=B8=85=E7=A9=BA?= =?UTF-8?q?=E6=97=A7=E7=AA=97=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- yunkes/src/views/StaffList.vue | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/yunkes/src/views/StaffList.vue b/yunkes/src/views/StaffList.vue index 9ae6e5f..c224268 100644 --- a/yunkes/src/views/StaffList.vue +++ b/yunkes/src/views/StaffList.vue @@ -83,18 +83,24 @@ const statsEnd = computed(() => dateRange.value[1].getTime()) /** account_id → stats 缓存(wechat 行)。undefined 表示尚未加载,cell 显示 '--'。 */ const staffStats = ref>({}) +// 单调递增 token:防止快速切换日期窗时旧 in-flight fetch(捕获旧窗)覆盖新结果。 +let statsLoadToken = 0 async function loadWechatStats(rows: Account[]): Promise { + const myToken = ++statsLoadToken const ids = rows.map((r) => r.account_id).filter(Boolean) + // 先清空当前批次缓存 → cell 显示 '--'(加载中),并防止旧窗 in-flight 写回覆盖新结果 + for (const id of ids) staffStats.value[id] = undefined await Promise.all( ids.map(async (id) => { try { - staffStats.value[id] = await getStaffChatStats({ + const stats = await getStaffChatStats({ owner_account_id: id, start: statsStart.value, end: statsEnd.value, }) + if (myToken === statsLoadToken) staffStats.value[id] = stats } catch { - staffStats.value[id] = undefined // 失败留空,cell 显示 '--' + if (myToken === statsLoadToken) staffStats.value[id] = undefined // 失败留空,cell 显示 '--' } }), ) @@ -111,7 +117,7 @@ function statNum( function onStatsDateChange(): void { // 改日期 → 重查当前可见 wechat 行(覆盖其缓存条目)。 - loadWechatStats(tabState.wechat.items) + void loadWechatStats(tabState.wechat.items) } // ---------------------------------------------------------------------------