From: root Date: Tue, 18 Aug 2026 12:05:04 +0000 (+0800) Subject: fix: 同步拉取时按日期LWW覆盖本地进度时间, 让首页进度与云端一致 X-Git-Url: http://acesimba.cloud/gitweb/?a=commitdiff_plain;h=71c03a907dfdfdbcfe571ec3c13682a13f4ed6eb;p=words.git fix: 同步拉取时按日期LWW覆盖本地进度时间, 让首页进度与云端一致 - 之前 pull 仅在本地缺失时才补入, 导致服务端已修正的 log_date(如时区误记) 不会回写本地 IndexedDB, 首页进度页仍显示旧 UTC 日期 - 改为本地已存在(同 group,op)时, 若云端日期更新则覆盖本地 completed_at(只升不降, 按日期比较) - 日期比较避免触碰其他历史记录; 仅云端日期确实更晚的(如本次 8/17->8/18)被更新 --- diff --git a/frontend/src/sync.js b/frontend/src/sync.js index f5521fd..a7c30ca 100644 --- a/frontend/src/sync.js +++ b/frontend/src/sync.js @@ -57,13 +57,24 @@ export async function syncNow() { const pullResp = await api.syncPull(); const serverEvents = pullResp.data.events || []; const localAll = await getAllProgress(); - const localKeys = new Set(localAll.map(p => p.key)); for (const ev of serverEvents) { const key = `${ev.group_id}:${ev.op_type}`; - if (!localKeys.has(key)) { + const local = localAll.find(p => p.key === key); + if (!local) { + // 本地缺失: 直接补入(布尔并集) await putProgress(ev.group_id, ev.op_type, ev.completed_at, false); result.pulled++; result.pulledEvents.push(ev); + } else { + // 本地已存在: 若云端日期更新(如服务端修正了时区误记), + // 用云端日期覆盖本地显示时间, 让首页进度与云端一致(LWW, 只升不降, 按日期比较) + const localDate = (local.completed_at || '').slice(0, 10); + const serverDate = (ev.completed_at || '').slice(0, 10); + if (serverDate > localDate) { + await putProgress(ev.group_id, ev.op_type, ev.completed_at, false); + result.pulled++; + result.pulledEvents.push(ev); + } } }