合并:地点配对只留一份实现(rond.MatchPlaces),合并侧不再自己配一遍
- 抽出 rond.MatchPlaces(stored, backup) PlaceMatch:坐标优先、退到「同名且相距 ≤1km」、 多值索引 + 认领即标记已用;DiffPlaces 与 web.mergePlaces 共用它。 - mergePlaces 原来是单槽位 byCoord/byName 自己再配一遍:同坐标/同名的多条备份地点全并到同一行 站内地点,到访被挂到错的分店(实测「茶颜悦色」两家分店相隔 8.3km,到访却指着同一条)。 现在直接用配对结果,再叠加 plan.AddPlaces 的新插入。 - loadStoredPlaces 与 mergePlaces 的地点查询都加 ORDER BY id:候选多于一个时靠顺序定谁配谁, 两侧必须一致,否则配对会飘。 - 删掉只写不读的 PlacePatch.CoordKey、ActivityPatch.Key(容易被误当成查找键)。 - 用例:TestMatchPlacesKeepsDuplicateNameGroupsDistinct(同一坐标/邻近同名都要一条配一条)、 TestMergePlacesMapsSameNameLocationsOneToOne(真库 + 真事务,两条同名备份地点必须映射到两条不同 地点);两处都做了变异验证(认领不标记已用 / 恢复单槽位映射 → 对应用例变红)。 - 探针库复测(从 dump 恢复、不动本地真库,49 组冲突全「用实机」):到访挂错地点(>1km)0/953 条、 地点被搬动 >1km 0 个;合并后再比对三类全 0(到访 0/47/0、地点 0/4/0、活动 0/0/0), 再点合并「按当前的选择没有要写入的改动」。全量验收 293 PASS / 0 FAIL / 0 SKIP。 已知取舍:勾「用实机」但没勾「并进来」时,若该到访在实机上的地点站内没有、且按 1km 规则也配不上, place_id 会被置空(旧行为是挂到一条远方的同名地点上——那正是这次要去掉的错配)。
This commit is contained in:
@@ -46,16 +46,15 @@ type VisitPatch struct {
|
||||
V Visit
|
||||
}
|
||||
|
||||
// PlacePatch 同理,键是坐标键。
|
||||
// PlacePatch 表示用备份侧的值覆盖库里的那一条。要改哪一条由配对结果决定
|
||||
// (DiffPlaces/MatchPlaces 已经配好),所以这里只带备份侧的整条地点。
|
||||
type PlacePatch struct {
|
||||
CoordKey string
|
||||
L Location
|
||||
L Location
|
||||
}
|
||||
|
||||
// ActivityPatch 键是活动 UUID(没有 UUID 时退回名称)。
|
||||
// ActivityPatch 同理。
|
||||
type ActivityPatch struct {
|
||||
Key string
|
||||
A Activity
|
||||
A Activity
|
||||
}
|
||||
|
||||
// MergePlan 是一次合并要做的全部改动。
|
||||
@@ -87,7 +86,7 @@ func BuildMergePlan(vd VisitDiff, pd PlaceDiff, ad ActivityDiff, c Choices) Merg
|
||||
}
|
||||
for _, cf := range pd.Changed {
|
||||
if c.placePick(cf.DB.Key) == PickBackup {
|
||||
p.UpdPlaces = append(p.UpdPlaces, PlacePatch{CoordKey: cf.DB.Key, L: cf.Backup})
|
||||
p.UpdPlaces = append(p.UpdPlaces, PlacePatch{L: cf.Backup})
|
||||
}
|
||||
}
|
||||
for _, sp := range pd.Removed {
|
||||
@@ -101,7 +100,7 @@ func BuildMergePlan(vd VisitDiff, pd PlaceDiff, ad ActivityDiff, c Choices) Merg
|
||||
}
|
||||
for _, cf := range ad.Changed {
|
||||
if c.activityPick(activityKey(cf.DB)) == PickBackup {
|
||||
p.UpdActs = append(p.UpdActs, ActivityPatch{Key: activityKey(cf.DB), A: cf.Backup})
|
||||
p.UpdActs = append(p.UpdActs, ActivityPatch{A: cf.Backup})
|
||||
}
|
||||
}
|
||||
for _, sa := range ad.Removed {
|
||||
|
||||
Reference in New Issue
Block a user