# ETC & 电费审核 → 能源账单对齐氢费模式

## Context

氢费的完整流程已跑通：API 导入 → 设置 review_status=PENDING → 用户审核通过 → 调用 `RawRecordReviewServiceImpl.processReviewedRecord()` → 创建 `energy_bill_detail` → 触发扣款。

ETC 和电费目前的 review 方法只更新了审核状态，**没有创建 energy_bill_detail，没有走统一审核服务**。需要对齐。

## 改动范围

### 1. ETC: EtcTollRecordServiceImpl.review()

**文件:** `modules/etc/service/impl/EtcTollRecordServiceImpl.java`

当前 review() 只设 reviewStatus + remark。改为：
- 设 reviewStatus
- 如果 approved → 构建 `ReviewedRecordContext`，调用 `reviewService.processReviewedRecord(context)`
- 把返回的 `EnergyBillDetail.id` 写回 `EtcTollRecord.billDetailId`
- batchReview() 同理（逐条调用 review）

ReviewedRecordContext 构建：
```java
ReviewedRecordContext.builder()
    .feeType(FeeType.ETC)
    .rawRecordId(record.getId())
    .rawTableType("etc_toll_record")
    .sourceType(record.getSourceType())
    .plateNumber(record.getPlateNumber())
    .eventTime(record.getTransTime())
    .rawUnitPrice(null)          // ETC 无单价
    .rawAmount(record.getTollFee())
    .quantity(null)              // ETC 无数量
    .stationId(null)
    .stationName(null)
    .tenantId(...)
    .build()
```

需要注入 `IRawRecordReviewService`。

### 2. 电费: ElectricityRecordServiceImpl.review()

**文件:** `modules/electricity/service/impl/ElectricityRecordServiceImpl.java`

当前 review() 设 reviewStatus + 直接调 executeDeduction（错误位置）。改为：
- 设 reviewStatus
- 如果 approved → 构建 `ReviewedRecordContext`，调用 `reviewService.processReviewedRecord(context)`
- 把返回的 `EnergyBillDetail.id` 写回 `ElectricityChargeRecord.billDetailId`
- **删除** `executeDeduction()`（扣款由 reviewService 统一处理）
- **删除** `triggerDeduction()` 方法
- **删除** `IDeductionService` 依赖

ReviewedRecordContext 构建：
```java
ReviewedRecordContext.builder()
    .feeType(FeeType.ELECTRICITY)
    .rawRecordId(record.getId())
    .rawTableType("electricity_charge_record")
    .sourceType(record.getSourceType())
    .plateNumber(record.getPlateNumber())
    .eventTime(record.getChargingEndTime())
    .rawUnitPrice(null)
    .rawAmount(record.getTotalAmount())
    .quantity(record.getKwh())
    .stationId(null)
    .stationName(null)
    .tenantId(...)
    .build()
```

### 3. 电费 PO 精简 (同 ETC 模式)

**文件:** `modules/electricity/entity/record/po/ElectricityChargeRecord.java`

electricity_charge_record 也是原始账单表，应像 ETC 一样删除关联字段：
- 删除: contract_id, contract_code, customer_id, customer_name, cost_type, payment_mode, contract_matched, deduction_status, bill_id, is_oneos_vehicle
- 保留: bill_detail_id（关联统一账单）
- 对应删除 DB 列

### 4. 电费 Listener 简化

**文件:** `modules/electricity/listener/ElectricityDetailImportListener.java`

当前 listener 做了合同匹配并存到原始记录。因为原始记录不再存这些字段，简化为：
- 仅设 review_status = PENDING
- 移除合同匹配逻辑（交给 reviewService 统一处理）

### 5. ETC Listener 已OK

当前 EtcDetailImportListener 已经只设 review_status = PENDING，无需改动。

### 6. 电费 Service 接口清理

**文件:** `modules/electricity/service/IElectricityRecordService.java`
- 删除 `manualMatch()`, `triggerDeduction()` 方法签名

**文件:** `modules/electricity/controller/ElectricityRecordController.java`
- 删除 `/manual-match` 端点

### 7. 电费前端 VO/页面同步

同 ETC 的精简模式：VO 删除关联字段，前端 data.ts 列定义同步更新。

## 关键文件

| 文件 | 操作 |
|------|------|
| `etc/service/impl/EtcTollRecordServiceImpl.java` | 改 — review() 接入 reviewService |
| `electricity/service/impl/ElectricityRecordServiceImpl.java` | 改 — review() 接入 reviewService, 删除 deduction 逻辑 |
| `electricity/entity/record/po/ElectricityChargeRecord.java` | 改 — 删除关联字段 |
| `electricity/listener/ElectricityDetailImportListener.java` | 改 — 简化，去掉合同匹配 |
| `electricity/service/IElectricityRecordService.java` | 改 — 删除 manualMatch/triggerDeduction |
| `electricity/controller/ElectricityRecordController.java` | 改 — 删除 /manual-match |
| `electricity/entity/record/vo/ElectricityChargeRecordVO.java` | 改 — 删除关联字段 |
| `electricity/entity/record/query/ElectricityRecordQuery.java` | 改 — 删除关联查询条件 |
| 前端 `views/electricity/record/data.ts` | 改 — 对齐 VO |
| 前端 `api/electricity/index.ts` | 改 — 对齐类型 |
| 数据库 `electricity_charge_record` | ALTER — 删除列 |

## 验证

1. ETC: 导入 → 列表展示 → 审核通过 → energy_bill_detail 有新记录 → bill_detail_id 回填
2. 电费: 导入 → 列表展示 → 审核通过 → energy_bill_detail 有新记录 → 扣款由 reviewService 处理
3. 三种费用的 energy_bill_detail 表中都有数据，feeType 分别为 1/2/3
