编辑页:新增「重复到访」卡片 —— 以基线(手机包)为参照清掉站点侧的历史副本
站点库里有一批「到达时间 + 地点与手机包里某条完全相同、但 UUID 不同」的到访副本, 合并/差异按 UUID 认人会把它们当成备份新增,导出到 rond 就成了成对的两条重复记录。 判定与 tools/dedup_site_visits.py 同一套语义:UUID 是前提(只按时间+地点判会误删手机包 自身合法的成对条目);基线跟本站一条都对不上时只给说明、不给按钮。清理在单事务里删 副本 + 其位移/天气/留档,并把指向副本的 ZMERGEDTO/ZPARENT 改指到保留项——只动本来 就有的那个键,工具那版会凭空补出一个 ZMERGEDTO(真机里是「已并入别处」,会白丢记录)。 顺带修一个「一补录天气就整包导出失败」的洞:rond 导出把 weather.is_daylight 扫进裸 bool, 而站点「新增天气」不写这一列 ⇒ NULL ⇒ sql.Scan 报错。改成 COALESCE(is_daylight,false), 与导入侧读真机包同口径。 验收:301 PASS / 0 FAIL / 0 SKIP(新增 4 个用例,含变异验证:去掉 UUID 前提/改回 create_if_missing=true/不删副本位移,三种改法都被用例抓到)。
This commit is contained in:
@@ -68,6 +68,13 @@ func (s *Server) editPage(w http.ResponseWriter, r *http.Request) {
|
||||
} else {
|
||||
d.CanExport = true
|
||||
}
|
||||
// 重复到访(站点侧的历史副本)以基线为参照,见 edit_duplicates.go。
|
||||
// 这里只读基线库与站点数据,不改任何东西;判定不了时 d.DupUnavailable 非空。
|
||||
if pairs, unavailable, err := s.detectDuplicateVisits(ctx, ds.ID); err != nil {
|
||||
log.Printf("检测重复到访失败(数据集 %d): %v", ds.ID, err)
|
||||
} else {
|
||||
d.DupVisits, d.DupUnavailable = pairs, unavailable
|
||||
}
|
||||
|
||||
// 活动类型与标签
|
||||
if d.Activities, err = s.editOptions(ctx, `SELECT a.id, COALESCE(a.name,'')
|
||||
|
||||
Reference in New Issue
Block a user