From d6573efcdd825db484de31433f36c1223e51b481 Mon Sep 17 00:00:00 2001 From: zerosaturation Date: Mon, 27 Jul 2026 16:45:49 +0800 Subject: [PATCH] fix(frontend): align daily_login storage cache with backend task_completed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Header.vue 的 '日内去重' 逻辑原本在 reportEvent 走 .then() 时无条 件 setStorageSync(true),但 reportEvent 在后端 task_completed=false 时仍 HTTP 200 + code=0(例如 trigger_event=NULL / 任务不存在等), .then() 照样跑,storage 缓存被错误标记为'已报',后续进 home 永远跳 过 reportEvent,daily_login 任务永远无法补完成(死锁)。 修后 .then((res) => ...) 按后端真实 task_completed 判定: - task_completed=true → setStorageSync + 清昨日(保持原优化) - task_completed=false → removeStorageSync(自愈,允许下次重试) 影响范围:仅 daily_login。其他 daily 任务(daily_browse_asset / daily_place_asset)本来就没前端 storage cache,不受影响。 当前 daily_login 卡住的用户:手动清 storage 后重进 home 可触发自愈; 或等明天 5 点跨天后 storage key 自动失效(同日 5 点重置周期)。 Co-Authored-By: Claude Fable 5 --- frontend/pages/components/Header.vue | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/frontend/pages/components/Header.vue b/frontend/pages/components/Header.vue index 2f75e6f..ee43a50 100644 --- a/frontend/pages/components/Header.vue +++ b/frontend/pages/components/Header.vue @@ -309,15 +309,24 @@ function checkAndReportDailyLogin() { const dailyLoginKey = `daily_login_completed_${today}_${userId}_${starId}`; if (!uni.getStorageSync(dailyLoginKey)) { reportEvent("daily_login", starId) - .then(() => { - // 报告成功后标记今日已完成,并清除昨日的记录 - uni.setStorageSync(dailyLoginKey, true); - const yesterday = new Date(now.getTime() - 86400000) - .toISOString() - .split("T")[0]; - uni.removeStorageSync( - `daily_login_completed_${yesterday}_${userId}_${starId}`, - ); + .then((res) => { + // ★ 按后端真实 task_completed 判定 storage:只有真完成才缓存; + // 否则 removeStorageSync(自愈)防止 HTTP 200 但 task_completed=false + // (如 trigger_event=NULL 等)时 storage 永远挡死 daily_login 上报。 + if (res?.data?.task_completed) { + uni.setStorageSync(dailyLoginKey, true); + const yesterday = new Date(now.getTime() - 86400000) + .toISOString() + .split("T")[0]; + uni.removeStorageSync( + `daily_login_completed_${yesterday}_${userId}_${starId}`, + ); + } else { + uni.removeStorageSync(dailyLoginKey); + console.warn( + "[daily_login] 后端未完成任务(可能 trigger_event 缺失或任务不存在),保持 storage 未缓存以便下次重试", + ); + } }) .catch((err) => { console.error("上报登录事件失败:", err);