53 lines
4.4 KiB
Markdown
53 lines
4.4 KiB
Markdown
# GB32960 旧来源基线重复累计修复与数据重算 — 2026-09-18
|
||
|
||
已部署 `mileage-baseline-reset-20260918`,修复实时统计和历史回补的基线选取,并在备份后重算受影响数据。
|
||
|
||
## 线上结果
|
||
|
||
| 车辆 | 日期 | 协议 | 修复后日里程 km | 说明 |
|
||
|---|---|---|---:|---|
|
||
| 粤AGH6240 | 2026-09-08 | GB32960 | 0.2 | 原记录保留 |
|
||
| 粤AGH6240 | 2026-09-15 | GB32960 | 0 | 原 35042.9;改用 09-09 的 75429.6 基线,日末仍为 75429.6 |
|
||
| 粤AGH6240 | 2026-09-15 | JT808 | 0.1 | 未修改;中台默认去重选择该非零来源,因此默认页面结果为 0.1 |
|
||
| 粤AGG5043 | 2026-09-17 | GB32960 | 70.7 | 原 308.2 包含重复累计;42077 − 42006.3 = 70.7 |
|
||
|
||
这些结果已通过中台 HTTP 查询和公网开放接口验证;公网单日及区间分页都返回 NORMAL。此前将粤AGG5043 的 308.2 判为正确的结论已被本次完整基线核查纠正。
|
||
|
||
## 代码与规则
|
||
|
||
- GB32960 的总里程以 VIN 对应的车辆里程表为基准。旧转发来源恢复时,查找该车此前最新日期的有效来源记录(同来源或中台已选中的来源),同日优先采用已选中记录,避免因 IP 不同退回几个月前的基线。
|
||
- 实时 Writer 和 stats-backfill 共用修正后的数据库基线查询。回补同时检查窗口前的跨转发来源历史,与持久化日统计比较后采用较新的自然日基线。
|
||
- JT808、MQTT 保留原来的来源隔离。GPS 估算、协议未确认的历史导入和质量不通过的记录,不作为 GB32960 跨来源基线。
|
||
- 保留累计回退、负值抖动和按实际统计窗口计算的异常上限检查。
|
||
- 新增受控修复工具 mileage-baseline-repair:默认只读计划;应用时要求备份清单,逐条核验旧值和生产基线,在同一事务中更新来源记录及正式日统计,发现并发变化即回滚。
|
||
|
||
## 重算范围与备份
|
||
|
||
扫描 33,681 条有终端证据的 GB32960 来源记录,修正 304 辆车、1,268 条来源记录,重建 1,263 个车辆日结果。第一批 1,265 条,重投影后发现另外 3 条选源关联基线,一并修正;再次检查剩余候选为 0。没有改动原始报文或累计读数。
|
||
|
||
操作期间暂停统计 Writer 和相关定时任务,备份、重算及发布完成后已恢复。
|
||
|
||
备份目录:`/opt/lingniu-go-native/backups/mileage-baseline-reset-20260918`。
|
||
|
||
- `mileage-tables.sql.gz`:两张里程统计表的一致性快照,32,438,655 bytes,gzip 完整性校验通过。
|
||
- vehicle_daily_mileage:1,462,363 行;vehicle_daily_mileage_source:1,646,422 行。
|
||
- SHA-256:`f918217fa1d613fe6d70ef8fee3f8413ca8320f9d3cee8c1e6942a0d850898b2`。
|
||
- `apply-plan-0.json`、`apply-plan-1.json` 保留逐行修改前内容与新基线。
|
||
- 需要恢复时应在独立库还原备份并按受影响行清单恢复,不直接覆盖已恢复实时写入的整张生产表。
|
||
|
||
## 验证与已知限制
|
||
|
||
- `go test ./internal/stats ./cmd/stats-backfill ./cmd/stat-writer ./cmd/mileage-reproject` 通过。
|
||
- 新增返回旧来源的 35042.9 重复累计、来源切换增量 70.7、累计回退仍异常、JT808 来源隔离等回归。
|
||
- 全量 `go test ./...` 中,未修改的 internal/identity 包测试 `TestJT808RegistrationProjectorThrottlesLocationOnlyAfterPersist` 失败(throttled facts=1,预期 0),单独重试同样失败。该包未在本次更改或部署,不将全量测试报告为通过。
|
||
- 生产 Repository 验证覆盖 1,024 辆车、09-08~09-17 共 6,867 条结果,平台日统计差异 0、单日/区间差异 0;3 条 outside_daily_range 异常仍保留。
|
||
- 公网与中台 HTTP 实际响应保存在 http-verification.json;临时测试应用 75 已停用并清除车辆授权。
|
||
- 新 Writer readyz 正常,运行二进制 SHA 与发布产物一致;三协议各分区 Kafka lag=0,三个 worker 重试队列均为 0,发布后无 error 级日志。
|
||
- 中台默认“非零优先”的跨协议选择规则未改变,因此应在相同协议下比较中台与开放接口。BI 历史缓存未在本次清理。
|
||
|
||
## 发布
|
||
|
||
新目录:`/opt/lingniu-go-native/releases/mileage-baseline-reset-20260918`。
|
||
旧目录:`/opt/lingniu-go-native/releases/mileage-reconciliation-20260916`。
|
||
更新 stat-writer、stats-backfill,并附带修复工具;其他运行组件沿用原二进制。开放 API 继续使用已发布的中台日统计对齐逻辑,无须再次修改车辆日里程响应代码。
|