编辑页:新增「重复到访」卡片 —— 以基线(手机包)为参照清掉站点侧的历史副本

站点库里有一批「到达时间 + 地点与手机包里某条完全相同、但 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:
tamakyi
2026-09-29 19:17:29 +08:00
parent 40441ba900
commit 152af81f6a
7 changed files with 1097 additions and 1 deletions
+4 -1
View File
@@ -1322,7 +1322,10 @@ type pgWeather struct {
}
func queryWeather(ctx context.Context, db *sql.DB, datasetID int64) ([]pgWeather, error) {
rows, err := db.QueryContext(ctx, `SELECT src_pk, visit_src, at, is_daylight, temperature_c, apparent_c, humidity,
// is_daylight 必须兜底成 false:真机 557/557 都有值,但站点「补录天气」建的行
// 没填昼夜标记(editWeatherCreate 不写这一列),而扫进 bool 遇到 NULL 会让**整包导出失败**。
// 取 0 与导入侧同口径(parse.go 读真机包用的就是 COALESCE(ZISDAYLIGHT,0))。
rows, err := db.QueryContext(ctx, `SELECT src_pk, visit_src, at, COALESCE(is_daylight,false), temperature_c, apparent_c, humidity,
precipitation_amount, precipitation_chance, wind_speed, visibility, uv_index,
COALESCE(condition,''), COALESCE(symbol,''), COALESCE(uv_category,''), COALESCE(wind_direction,'')
FROM weather WHERE dataset_id=$1 ORDER BY id`, datasetID)