* 上传本地变更到云端
()
| 276 | * 上传本地变更到云端 |
| 277 | */ |
| 278 | private async uploadLocalChanges(): Promise<{ |
| 279 | count: number |
| 280 | errors: number |
| 281 | processedDocIds: Set<string> |
| 282 | }> { |
| 283 | // 获取所有需要同步的文档(_cloudSynced === false) |
| 284 | const pendingDocs = await this.getUnsyncedDocs() |
| 285 | |
| 286 | if (pendingDocs.length === 0) { |
| 287 | console.log('[Sync] 没有待上传的文档') |
| 288 | return { count: 0, errors: 0, processedDocIds: new Set() } |
| 289 | } |
| 290 | |
| 291 | console.log(`[Sync] 待上传文档数量: ${pendingDocs.length}`) |
| 292 | |
| 293 | let uploaded = 0 |
| 294 | let errors = 0 |
| 295 | const processedDocIds = new Set<string>() |
| 296 | |
| 297 | for (const doc of pendingDocs) { |
| 298 | try { |
| 299 | // 跳过已处理的文档 |
| 300 | if (processedDocIds.has(doc._id)) { |
| 301 | continue |
| 302 | } |
| 303 | |
| 304 | // 检查云端是否有更新版本 |
| 305 | const remoteDoc = await this.webdavClient.downloadDoc(doc._id) |
| 306 | |
| 307 | if (remoteDoc && this.hasConflict(doc, remoteDoc)) { |
| 308 | // 冲突:使用 Last Write Wins 策略 |
| 309 | const winner = doc._lastModified! > remoteDoc._lastModified! ? doc : remoteDoc |
| 310 | |
| 311 | if (winner === doc) { |
| 312 | // 本地版本胜出,上传到云端 |
| 313 | await this.webdavClient.uploadDoc({ |
| 314 | ...doc, |
| 315 | _lastModified: Date.now() |
| 316 | }) |
| 317 | |
| 318 | // 更新本地同步状态 |
| 319 | const updatedDoc = await this.db.promises.get(doc._id) |
| 320 | if (updatedDoc) { |
| 321 | updatedDoc._cloudSynced = true |
| 322 | await this.updateDocSyncStatus(doc._id, updatedDoc) |
| 323 | } |
| 324 | |
| 325 | uploaded++ |
| 326 | console.log(`[Sync] 冲突已解决: ${doc._id}, 胜出: 本地,已上传`) |
| 327 | } else { |
| 328 | // 云端版本胜出,更新本地 |
| 329 | remoteDoc._cloudSynced = true |
| 330 | await this.updateDocSyncStatus(doc._id, remoteDoc) |
| 331 | |
| 332 | console.log(`[Sync] 冲突已解决: ${doc._id}, 胜出: 云端,已下载`) |
| 333 | } |
| 334 | |
| 335 | // 标记为已处理,避免下载阶段重复处理 |
no test coverage detected