fix(frontend): align daily_login storage cache with backend task_completed

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 <noreply@anthropic.com>
This commit is contained in:
zerosaturation 2026-07-27 16:45:49 +08:00
parent b17a3b4b4a
commit d6573efcdd

View File

@ -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);