tamakyi
f26537b1e9
导出:新建活动没选颜色时补占位色,别再写 ZCOLOR_=NULL(真机拒收整包)
症状:生产导出的包导不回 rond,提示「错误,备份恢复失败,你的当前数据未被更改」。
根因链:站内「地点补全」新建活动时写的是 color=''、icon=''(fillup.go 的 INSERT),而导出侧
ns() 把空串也当空(返回 nil)——图标那侧早就有 📍 兜底(注释还写着「站点自己渲染时缺省用 📍」),
颜色这侧漏了,于是写出 ZACTIVITY.ZCOLOR_ = NULL。真机这一列在任何包里都是 0 NULL/0 空串
(扫了 data/ 与 storage/ 下全部 15 个包,只有出事的那份有 1 个空),Core Data 拿到非可选属性上的
NULL 会判成损坏数据 → 整包拒收。
修复:加 activityPlaceholderColor = "gray"(与 transportPlaceholderColor 同一套写法),
活动颜色为空时兜底。
用例:TestExportNeverNullsColumnsTheDeviceAlwaysFills 补上「没选颜色的活动」场景——它守的通用
不变量是「基线里 0 个 NULL 的列,导出新行也不许 NULL」,但此前只造过交通方式,没覆盖活动。
变异验证:去掉兜底 → 两条断言都红(提示语正好复刻生产现象)。
另新增 tools/audit_export_nulls.py:拿参照包做逐列空值画像 + 全部关系列悬空 + Z_MAX 检查,
是排查「导出被拒收」最快的一步(这次就是它一击命中的)。注意判据必须是「参照里 0 个 NULL」——
ZLOCATION.ZISOCOUNTRYCODE 真机自己就漏过 1 个 NULL,说明它容忍 NULL,不要当违规去修。
全量验收 293 PASS / 0 FAIL / 0 SKIP。
2026-09-29 11:50:06 +08:00
..
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 13:05:49 +08:00
2026-09-28 19:31:21 +08:00
2026-09-29 10:46:54 +08:00
2026-09-29 10:46:54 +08:00
2026-09-29 10:46:54 +08:00
2026-09-18 17:06:22 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-29 11:50:06 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:31:01 +08:00
2026-09-19 16:31:01 +08:00
2026-09-20 10:07:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 21:52:29 +08:00
2026-09-19 16:04:00 +08:00
2026-09-18 13:05:49 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:57 +08:00
2026-09-19 16:31:01 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-20 12:22:11 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 21:23:13 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 17:06:22 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-20 12:22:11 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:57 +08:00