]> acesimba.cloud Git - words.git/commitdiff
fix: 同步拉取时按日期LWW覆盖本地进度时间, 让首页进度与云端一致
authorroot <root@localhost.localdomain>
Tue, 18 Aug 2026 12:05:04 +0000 (20:05 +0800)
committerroot <root@localhost.localdomain>
Tue, 18 Aug 2026 12:05:04 +0000 (20:05 +0800)
- 之前 pull 仅在本地缺失时才补入, 导致服务端已修正的 log_date(如时区误记)
  不会回写本地 IndexedDB, 首页进度页仍显示旧 UTC 日期
- 改为本地已存在(同 group,op)时, 若云端日期更新则覆盖本地 completed_at(只升不降, 按日期比较)
- 日期比较避免触碰其他历史记录; 仅云端日期确实更晚的(如本次 8/17->8/18)被更新

frontend/src/sync.js

index f5521fde33b3baa07a715b08f8517759969d76b1..a7c30ca49d43dbb346ff193243ea9c9b038e3787 100644 (file)
@@ -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);
+            }
         }
     }