|
|
@ -56,6 +56,15 @@ public class RowMergeResolver { |
|
|
// 场景 7/8:一侧删除
|
|
|
// 场景 7/8:一侧删除
|
|
|
if (v1Row == null || v1Deleted) { |
|
|
if (v1Row == null || v1Deleted) { |
|
|
if (v2Exists) { |
|
|
if (v2Exists) { |
|
|
|
|
|
// 影子表无历史记录 → V2 新增行(首次进入同步系统),不是 V1 侧删除
|
|
|
|
|
|
if (lastHashV1 == null && lastHashV2 == null && v1Row == null) { |
|
|
|
|
|
return SyncDecision.builder() |
|
|
|
|
|
.action(SyncActionEnum.WRITE_V1) |
|
|
|
|
|
.ownerSide(ownerSide) |
|
|
|
|
|
.reason("V2新增数据(影子表无记录),首次同步到V1") |
|
|
|
|
|
.targetV1Snapshot(v2Row) |
|
|
|
|
|
.build(); |
|
|
|
|
|
} |
|
|
if (ownerSide == OwnerSide.V1) { |
|
|
if (ownerSide == OwnerSide.V1) { |
|
|
// 场景 7:归属方(V1)删除 → 删除对侧(V2)
|
|
|
// 场景 7:归属方(V1)删除 → 删除对侧(V2)
|
|
|
if (!deleteAllowed(config)) { |
|
|
if (!deleteAllowed(config)) { |
|
|
@ -89,6 +98,15 @@ public class RowMergeResolver { |
|
|
|
|
|
|
|
|
if (v2Row == null || v2Deleted) { |
|
|
if (v2Row == null || v2Deleted) { |
|
|
if (v1Exists) { |
|
|
if (v1Exists) { |
|
|
|
|
|
// 影子表无历史记录 → V1 新增行(首次进入同步系统),不是 V2 侧删除
|
|
|
|
|
|
if (lastHashV1 == null && lastHashV2 == null && v2Row == null) { |
|
|
|
|
|
return SyncDecision.builder() |
|
|
|
|
|
.action(SyncActionEnum.WRITE_V2) |
|
|
|
|
|
.ownerSide(ownerSide) |
|
|
|
|
|
.reason("V1新增数据(影子表无记录),首次同步到V2") |
|
|
|
|
|
.targetV2Snapshot(v1Row) |
|
|
|
|
|
.build(); |
|
|
|
|
|
} |
|
|
if (ownerSide == OwnerSide.V2) { |
|
|
if (ownerSide == OwnerSide.V2) { |
|
|
// 场景 8:归属方(V2)删除 → 删除对侧(V1)
|
|
|
// 场景 8:归属方(V2)删除 → 删除对侧(V1)
|
|
|
if (!deleteAllowed(config)) { |
|
|
if (!deleteAllowed(config)) { |
|
|
@ -151,41 +169,21 @@ public class RowMergeResolver { |
|
|
.build(); |
|
|
.build(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 两侧同时变更 → 冲突,按归属方决定
|
|
|
// 两侧同时变更 → 冲突,归属方数据胜出,单向覆盖对侧
|
|
|
if (ownerSide == OwnerSide.V1) { |
|
|
if (ownerSide == OwnerSide.V1) { |
|
|
if (strictOwner) { |
|
|
return SyncDecision.builder() |
|
|
// 严格模式:V1 覆盖 V2,并记录冲突
|
|
|
.action(SyncActionEnum.CONFLICT_V1_WIN) |
|
|
return SyncDecision.builder() |
|
|
.ownerSide(ownerSide) |
|
|
.action(SyncActionEnum.CONFLICT_V1_WIN) |
|
|
.reason("两侧同时变更,归属方V1胜出,覆盖V2") |
|
|
.ownerSide(ownerSide) |
|
|
.targetV2Snapshot(v1Row) |
|
|
.reason("两侧同时变更,严格模式V1归属方胜出,覆盖V2") |
|
|
.build(); |
|
|
.targetV2Snapshot(v1Row) |
|
|
|
|
|
.build(); |
|
|
|
|
|
} else { |
|
|
|
|
|
// 非严格模式:V2 改动保留,把 V2 新内容写回 V1(视为补充)
|
|
|
|
|
|
return SyncDecision.builder() |
|
|
|
|
|
.action(SyncActionEnum.WRITE_V1) |
|
|
|
|
|
.ownerSide(ownerSide) |
|
|
|
|
|
.reason("两侧同时变更,非严格模式,V2变更视为补充写回V1") |
|
|
|
|
|
.targetV1Snapshot(v2Row) |
|
|
|
|
|
.build(); |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
} else { |
|
|
if (strictOwner) { |
|
|
return SyncDecision.builder() |
|
|
return SyncDecision.builder() |
|
|
.action(SyncActionEnum.CONFLICT_V2_WIN) |
|
|
.action(SyncActionEnum.CONFLICT_V2_WIN) |
|
|
.ownerSide(ownerSide) |
|
|
.ownerSide(ownerSide) |
|
|
.reason("两侧同时变更,归属方V2胜出,覆盖V1") |
|
|
.reason("两侧同时变更,严格模式V2归属方胜出,覆盖V1") |
|
|
.targetV1Snapshot(v2Row) |
|
|
.targetV1Snapshot(v2Row) |
|
|
.build(); |
|
|
.build(); |
|
|
|
|
|
} else { |
|
|
|
|
|
return SyncDecision.builder() |
|
|
|
|
|
.action(SyncActionEnum.WRITE_V2) |
|
|
|
|
|
.ownerSide(ownerSide) |
|
|
|
|
|
.reason("两侧同时变更,非严格模式,V1变更视为补充写回V2") |
|
|
|
|
|
.targetV2Snapshot(v1Row) |
|
|
|
|
|
.build(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|