# 加氢站对账单功能

## Context

加氢记录审核通过后，需要定期和加氢站对账结算。当前只有一个 `settlement_status` 字段（0未对账/1已出账/2已付款），但没有对账单实体。需要新建对账单模块，支持：生成对账单 → 查看/下载 → 确认付款 → 状态同步到氢费记录。

## 核心概念

```
一张对账单 = 一个加氢站 + 一个时间段内的所有已审核订单
```

- **生成条件**：时间范围内该站所有订单必须已审核（reviewStatus=1）
- **付款含义**：我们向加氢站付款（成本结算）
- **状态流转**：生成(已出账) → 付款(已付款) / 删除(回退未对账)
- **关联订单**：对账单关联的订单 snapshot 快照，生成后订单 settlementStatus 同步为已出账
- **下载格式**：Excel + PDF

---

## 数据模型

### 新建表：`hydrogen_settlement_bill`（加氢站对账单）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT PK | 主键 |
| bill_code | VARCHAR(32) UNIQUE | 对账单编号（SB+日期+序号） |
| station_id | BIGINT | 加氢站ID |
| station_name | VARCHAR(128) | 加氢站名称（冗余） |
| period_start | DATE | 对账起始日期 |
| period_end | DATE | 对账截止日期 |
| order_count | INT | 订单笔数 |
| total_gas_weight | DECIMAL(12,4) | 总加注量(kg) |
| total_amount | DECIMAL(12,2) | 总金额(元) — 成本金额 |
| status | TINYINT | 0-已出账 1-已付款 |
| paid_time | DATETIME | 付款时间 |
| paid_by | BIGINT | 付款确认人 |
| remark | VARCHAR(500) | 备注 |
| create_by/create_time/update_by/update_time/del_flag | | 审计字段 |

### 新建表：`hydrogen_settlement_bill_item`（对账单明细快照）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT PK | 主键 |
| bill_id | BIGINT | 关联对账单ID |
| order_id | BIGINT | 关联氢费记录ID |
| order_number | VARCHAR(64) | 订单编号 |
| plate_number | VARCHAR(16) | 车牌号 |
| fill_end_time | DATETIME | 加注时间 |
| gas_weight | DECIMAL(10,4) | 加注重量(kg) |
| gas_price | DECIMAL(10,4) | 气价(元/kg) |
| total_amount | DECIMAL(10,2) | 金额(元) |
| create_time | DATETIME | 创建时间 |

> 注：明细快照不含客户/项目信息——加氢站对账只关心站方数据（车牌、时间、重量、气价、金额）。

---

## API 设计

### 后端接口

| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/station/settlement-bill/generate` | 生成对账单（传 stationId, periodStart, periodEnd） |
| GET | `/station/settlement-bill/page` | 对账单分页列表 |
| GET | `/station/settlement-bill/{id}` | 对账单详情（含明细） |
| PUT | `/station/settlement-bill/pay/{id}` | 确认付款 |
| DELETE | `/station/settlement-bill/{id}` | 删除对账单（仅已出账可删） |
| GET | `/station/settlement-bill/export-excel/{id}` | 导出 Excel |
| GET | `/station/settlement-bill/export-pdf/{id}` | 导出 PDF |

### 生成对账单逻辑

```
1. 校验：时间范围内该站所有订单 reviewStatus 必须全部为 1（已审核）
2. 校验：时间范围内该站不能有 settlementStatus != 0（未对账）的订单（避免重复出账）
3. 查询：该站 + 时间范围 + reviewStatus=1 + settlementStatus=0 的所有订单
4. 汇总：计算 orderCount, totalGasWeight, totalAmount
5. 创建：hydrogen_settlement_bill + 逐条 snapshot 到 bill_item
6. 更新：所有关联订单的 settlementStatus → 1（已出账）
7. 返回：对账单ID
```

### 确认付款逻辑

```
1. 校验：对账单 status 必须为 0（已出账）
2. 更新：对账单 status → 1（已付款），记录 paidTime, paidBy
3. 批量更新：关联订单的 settlementStatus → 2（已付款）
```

### 删除对账单逻辑

```
1. 校验：对账单 status 必须为 0（已出账，未付款才可删）
2. 批量回退：关联订单的 settlementStatus → 0（未对账）
3. 删除：对账单 + 明细（逻辑删除）
```

---

## 前端设计

### 加氢记录页面 — 增加「生成对账单」按钮

工具栏新增按钮，点击弹出对话框：
- 选择加氢站（下拉）
- 选择对账时间范围（日期区间选择器）
- 点击「生成」→ 调用后端 → 成功后自动跳转对账单详情页

### 对账单页面（/energy/order/settlement-bill/:id）

不单独设菜单，通过加氢记录页面跳转。

**页面结构：**
```
┌─ 对账单详情 ─────────────────────────────┐
│                                          │
│  对账单号：SB20260325001                  │
│  加氢站：嘉兴站   状态：[已出账]           │
│  对账周期：2026-03-01 ~ 2026-03-31        │
│                                          │
│  ┌────────┬────────┬────────┐            │
│  │ 笔数   │ 总加注量│ 总金额  │            │
│  │  25    │ 150 kg │ ¥4,500 │            │
│  └────────┴────────┴────────┘            │
│                                          │
│  [确认付款]  [删除]  [导出Excel] [导出PDF] │
│                                          │
│  ── 明细列表 ──                           │
│  订单编号 | 车牌 | 加注时间 | 重量(kg) | 气价(元/kg) | 金额(元) │
│  ...                                     │
└──────────────────────────────────────────┘
```

### 对账单列表页（可选，也可嵌在加氢记录页面作为 Tab）

暂不独立列表页，通过加氢记录页面「已出账/已付款」筛选 + 点击跳转查看。

---

## 文件清单

### 后端 — ln-energy

| 操作 | 文件 |
|------|------|
| Create | `db/station/V6__create_settlement_bill.sql` |
| Create | `entity/settlement/po/HydrogenSettlementBill.java` |
| Create | `entity/settlement/po/HydrogenSettlementBillItem.java` |
| Create | `entity/settlement/vo/SettlementBillVO.java` |
| Create | `entity/settlement/vo/SettlementBillDetailVO.java` |
| Create | `entity/settlement/req/GenerateSettlementBillReq.java` |
| Create | `mapper/HydrogenSettlementBillMapper.java` |
| Create | `mapper/HydrogenSettlementBillItemMapper.java` |
| Create | `service/ISettlementBillService.java` |
| Create | `service/impl/SettlementBillServiceImpl.java` |
| Create | `controller/SettlementBillController.java` |
| Modify | `db/init/V1__init_ln_energy.sql` — 补建表语句 |

### 前端 — ln-one-os-web

| 操作 | 文件 |
|------|------|
| Create | `views/station/settlement/bill-detail.vue` — 对账单详情页 |
| Create | `views/station/settlement/generate-modal.vue` — 生成对账单对话框 |
| Create | `api/station/settlement/index.ts` — 对账单 API |
| Modify | `views/station/order/index.vue` — 工具栏加「生成对账单」按钮 |
| Modify | 后端动态菜单 — 隐藏菜单注册（hideInMenu） |

### 数据库

| 操作 | 说明 |
|------|------|
| Execute DDL | hydrogen_settlement_bill + hydrogen_settlement_bill_item |
| Menu | 注册隐藏菜单（对账单详情页路由） |

---

## 验证

1. `mvn clean compile` 编译通过
2. DDL 执行到数据库
3. 测试：选择加氢站 + 时间范围 → 生成对账单 → 跳转详情
4. 测试：时间范围内有未审核订单 → 生成失败提示
5. 测试：确认付款 → 对账单状态+订单状态同步
6. 测试：删除对账单 → 订单状态回退
7. 测试：已付款的对账单不可删除
8. 测试：导出 Excel / PDF
