Files
lingniu-vehicle-ingest/reports/mileage-reconciliation-20260916/REPORT.md
T

69 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 里程对账修复与发布记录 — 2026-09-16
已完成代码修复、MySQL 全库一致性备份、生产数据修复、发布和验证。未改动工作区原有的用氢导出及地理统计开发内容。
## 已采用的口径
- 开放平台单日和区间接口共用 `ReconciledMileageRange`,直接使用可追溯终端累计读数。
- 同一来源的日里程 = 当日累计值 − 前一天累计值,保留三位小数。缺报日累计值结转、日里程为 0,并标记 `CARRIED_FORWARD`;恢复日承接跨缺报期增量。这是对账日里程,不保证增量实际发生在恢复当天。
- 按请求协议优先级选择截至该日已存在有效读数的协议;该协议缺报时沿用其历史读数,不自动切换到低优先级协议的另一累计基准。
- 首次基线、来源变化、累计回退及异常累计记录返回 `DATA_ANOMALY``dailyMileageKm=null`,保留累计值与来源时间,避免伪造可连续相减的里程。
- GPS 估算继续保存在内部独立来源记录中,不参与开放平台累计差日里程。日里程和累计值的时间证据来自同一来源。
- 实时统计和历史回补接受更早的同来源基线,不再丢弃跨完整缺报日的增量。
- 无协议依据的旧库迁移入口拒绝执行写入,禁止将旧库记录统一标为 GB32960。
## 备份
主机:115.29.187.205。数据库:`lingniu_vehicle_data`
完整备份:`/opt/lingniu-go-native/backups/mileage-reconciliation-20260916/database.sql.gz`
- 一致性快照逻辑备份:全部表结构和数据;当前库无存储过程、无数据库事件。
- 文件大小:499,964,151 bytes;目录权限 0700、备份文件权限 0600。
- SHA-256`5d1f86e062d3410316a6ea66775aebcd8061e2d4a959ca304b7bf6a93e9438c4`
- 完成时间:2026-09-16 11:51:31 +08:00;已通过 `gzip -t` 完整性检查。
- 本目录 `backup-manifest.json` 保存逐表行数和备份校验信息。未把数据库凭证写入报告或日志。
- 服务版本、配置备份和修复前基线另保存在同一服务器备份目录。
## 数据修复
1. 两类历史导入来源 `legacy-mysql.lingniu-prod``manual-lingniu-prod-day-mileage` 共 169,604 条、涉及 892 个 VIN,标为 `INVALID_DELTA / UNVERIFIED_LEGACY_PROTOCOL`,清除选中标记。原始来源记录和旧库数据保留。
2. 移除由这些来源生成的 169,014 条错误 GB32960 日统计;未将其猜改成 MQTT 或 JT808。
3. 修复截至 09-16 的 5,635 条当前日首帧基线记录,使用此前同来源最近有效累计值。保留累计读数本身,维持回退及按跨日长度计算的异常上限检查。
4. 通过正式统计投影函数重建 10,079 个车辆/日期/协议统计,恢复被旧迁移记录遮盖的真实来源统计。
5. 生产复核:误标来源对应的最终统计剩余 0 条;169,604 条来源记录均保留、未选中、已标记协议未确认。
影响边界:只有协议不明的历史导入、没有真实终端证据的日期,不再作为正常协议里程返回,可能表现为 NO_DATA。不能把这类变化当作车辆里程真实减少。来源变化等异常记录也不能直接把日里程 null 当作正常 0 后参与完整对账。
## 样本结果
| 车辆 | 日期 | 修复后日里程 km | 累计 km | 说明 |
|---|---|---:|---:|---|
| 沪A60591F | 09-1309-15 | 0 | 51,416 | MQTT 历史结转,不再返回错误 GB32960 |
| 粤AGQ8377 | 09-15 | 101.4 | 14,467.4 | 原 31.2,补回跨缺报期 70.2 |
| 粤AGR6839 | 09-15 | 40.6 | 45,162.8 | 原 2.6,补回跨缺报期 38.0 |
| 粤AGP3609 | 09-14 | 878.8 | 48,981.7 | 原 70.1,补回跨缺报期 808.7 |
| 粤AGP3609 | 09-15 | 1,367.4 | 50,349.1 | 原正常日期保持一致 |
## 验证
- API Go 模块 `go test ./...` 通过;统计模块、回补命令、迁移命令相关测试通过。
- 新增恢复日增量、协议缺报结转、来源替换、首次基线以及单日/区间切分一致性测试。
- 使用与 HTTP 接口相同的生产 Repository,只读核对 1,024 个当前车辆绑定、09-1109-15。
- 返回 3,435 条有累计证据记录:3,399 条正常/结转、36 条来源变化标记;其余车辆日期无可用协议证据。
- 正常/结转记录的相邻日累计差核对失败数:0;逐日查询与整段查询的字段差异数:0。
- `verification-all.json``verification-samples.json``database-verification.json` 保存实际验证结果。验证覆盖真实 SQL 与计算路径;未使用客户密钥重放外部认证 HTTP 请求。
- 发布后统计服务 `/readyz`、开放平台 `/healthz` 正常;三协议全部 Kafka 分区 lag=0,三个 worker 重试队列=0,相关服务近期无 error 级日志。
## 发布与恢复资料
发布标识:`mileage-reconciliation-20260916`
- Go 发布目录:`/opt/lingniu-go-native/releases/mileage-reconciliation-20260916`,更新 stat-writer、stats-backfill、legacy-mileage-migrate,并包含显式列表重投影工具 mileage-reproject。
- 开放平台发布目录:`/opt/lingniu-vehicle-open-platform/releases/mileage-reconciliation-20260916`
- 旧版本路径存于服务器备份目录 `previous-go-release.txt``previous-open-release.txt`;旧开放平台环境配置存于 `open-platform.env.before`
- 数据恢复应先将完整备份恢复到独立临时库,再按本次来源及重建清单恢复受影响记录;不要直接覆盖整个线上库,以免覆盖备份后新增业务数据。
- `baseline-before.json``reproject.json``repair-result.json` 为本次修复清单和结果。`repair.py` 为本次一次性修复工具,默认仅预检。
下游 BI 历史缓存可能仍保留旧响应,需刷新或等待原有最长 6 小时缓存过期。本次没有修改下游 BI 或清空其缓存。