# 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