feat(platform): consolidate production vehicle data workflows

This commit is contained in:
lingniu
2026-07-15 23:26:29 +08:00
parent 6cddc0a43d
commit 3fabcf181a
59 changed files with 6849 additions and 3532 deletions

View File

@@ -0,0 +1,135 @@
# OneOS 生产数据库只读审计报告
审计时间2026-07-14
## 1. 执行边界
- 连接路径:本机 → SSH 加密隧道 → 当前车辆中台 ECS → 阿里云 RDS 内网地址。
- 所有查询会话均执行 `SET SESSION TRANSACTION READ ONLY`
- 单条查询设置 `MAX_EXECUTION_TIME=10000`10 秒)。
- 仅执行元数据和聚合查询,未读取密码、客户姓名、手机号、银行账号等明细。
- 未执行任何 INSERT、UPDATE、DELETE、DDL 或权限变更。
## 2. 账号权限核验
当前从 `ln-bi` 部署配置取得的 RDS 账号并不是账号级只读:
-`ln_asset_management``ry-cloud` 等多个业务库拥有 `ALL PRIVILEGES`
- 还拥有 `PROCESS``REPLICATION SLAVE``REPLICATION CLIENT``XA_RECOVER_ADMIN` 等全局权限。
本次审计依靠会话只读保护,没有使用这些写权限。但该账号不适合作为车辆数据中台的生产同步账号,也不应继续以“只读账号”管理。
建议另建独立账号,只授予必要表的 `SELECT`;如需最小到列级,优先建立脱敏只读视图并仅授权视图。权限调整属于数据库写操作,需另行审批。
## 3. 数据质量基线
### 车辆档案
| 指标 | 结果 |
| --- | ---: |
| 有效车辆 | 1,209 |
| VIN 缺失 | 0 |
| VIN 重复组 | 0 |
| 车牌缺失 | 0 |
车辆身份基础质量良好,当前 1,209 台有效车辆均有 VIN 和车牌,标准化 VIN 后无重复。
生产库尚未给 `vehicle_info.vin` 建立索引或唯一约束。当前数据满足增加唯一索引的前置条件,但正式 DDL 前仍要确认历史/逻辑删除记录及业务兼容性。
### 客户账号
| 指标 | 结果 |
| --- | ---: |
| 有效客户 | 335 |
| `customer_info.id = sys_user.user_id` 的账号 | 0 |
| `user_type=customer` 的账号 | 0 |
| 客户编码与系统用户名匹配 | 0 |
| 联系手机号与系统账号手机号匹配 | 4 |
| 客户编码缺失 | 7 |
结论客户账号体系尚未形成不能通过“补角色”直接开放。4 个手机号匹配仅能作为待人工核验线索,不能自动认定为客户账号或覆盖现有用户。
两个库的字符排序规则不同:
- `customer_info.customer_code/contact_mobile``utf8mb4_unicode_ci`
- `sys_user.user_name/phonenumber``utf8mb4_0900_ai_ci`
跨库字符串直接等值 JOIN 会报 collation 冲突。正式关联应优先使用稳定 ID补偿审计若按编码/手机号匹配,需要显式统一 collation。
### 当前客户车辆候选范围(事务事实口径)
候选条件:每车最新有效交车单已完成(`delivery_status IN (2,3)`),且该交车单不存在正式完成的还车任务(`status IN (2,3,5)`)。聚合表仅用于客户归属交叉校验,不使用可能被还车草稿提前写入的 `last_return_time` 判断生命周期。
| 指标 | 结果 |
| --- | ---: |
| 候选记录 | 639 |
| 候选车辆 | 639 |
| 可安全发布记录 | 613 |
| 应隔离记录 | 26 |
隔离原因(可能重叠):
| 原因 | 数量 |
| --- | ---: |
| 聚合记录或客户 ID 缺失 | 17 |
| 聚合客户与合同有效客户不一致 | 9 |
| 车辆档案不可用 | 0 |
| VIN 缺失 | 0 |
因此第一版客户车辆 Scope 最多只能发布 613 条已校验关系,其余 26 条必须隔离,不能为了数量完整而放宽权限。
与旧聚合时间口径相比,事务事实口径排除 16 台12 台已有正式还车事实、3 台最新交车尚未完成、1 台没有交车事实;另有 8 台进入事务候选但不在旧聚合候选,其中 4 台缺聚合记录并会继续 fail-closed 隔离。该差异证明 `last_delivery_time/last_return_time` 不适合作为外部授权生命周期真值。
### 租赁聚合与历史一致性
| 指标 | 结果 |
| --- | ---: |
| 有效当前聚合记录 | 831 |
| 无任何交还车时间 | 13 |
| 已交车、无还车时间 | 617 |
| 还车后再次交车 | 30 |
| 已还车 | 171 |
| 聚合表与最新历史关键字段不一致 | 325 |
| 违反“一车一条聚合记录”的车辆组 | 1 |
| 当前候选范围内重复车辆 | 0 |
325 条差异说明 `vehicle_lease_order_record_log` 不能简单取最大 ID 当作当前真值1 组重复聚合记录也意味着现有 `selectOne(vehicle_id)` 存在运行时异常风险。正式修复前需要对异常组做明细复核,但明细不写入本报告。
## 4. 索引结论
生产库已有车牌、vehicleId 和部分状态索引,但缺少:
- `vehicle_info.vin` 索引/唯一约束;
- `vehicle_lease_order_record.customer_id` 的客户范围查询索引;
- `vehicle_lease_order_record.vehicle_id` 唯一约束;
- `vehicle_status.vehicle_id` 唯一约束;
- 合同有效客户查询所需索引。
当前数据量不大。2026-07-14 事务事实影子查询耗时约 93 ms主交车表预估扫描 2,320 行,其余关联均使用 `eq_ref/ref`;两分钟一次的单次批量查询压力可控。后续数据增长后仍需监控执行时间,索引 DDL 必须单独审批并用 `EXPLAIN`、影子查询和回滚方案验证。
## 5. 当前可采用的权限口径
在业务确认和异常修复前,外部客户范围必须同时满足:
```text
车辆有效且 VIN 非空
聚合记录有效
最新有效交车单已完成
该交车单不存在正式完成的还车任务
客户档案有效
合同有效
聚合客户 ID 非空
合同有效客户非空
聚合客户 = COALESCE(合同丙方客户, 合同主客户)
同一车辆不存在多客户冲突
```
不满足任一条件的记录进入隔离清单,外部查询失败关闭。
## 6. 下一步
1. 创建真正的最小权限 RDS 只读账号,替换当前高权限账号。
2. 由业务人员复核 26 条隔离关系和 1 组重复聚合记录。
3. 不修改 `ln-asset-management`;将还车草稿提前写聚合字段记录为上游风险,数据中台只读取正式交还车任务状态。
4. 以 613 条可发布关系运行影子 Scope与合同和交还车样本对账。
5. 完成客户身份入口与所有客户 API 的 Scope 强制校验后,再审批上线外部客户入口。