# 加氢站管理 · 站点信息 — 预付余额预警 / 已欠费 KPI 交互说明

| 项 | 说明 |
|---|---|
| 所属模块 | 加氢站管理 → 站点信息 |
| 关联页面 | `/prototypes/oneos-web-h2-station-site` |
| 目标用户 | 加氢站运营、财务结算 |
| 关联能力 | 余额提醒设置、发起充值单、预付余额下钻 |

---

## 1. 业务背景

运维与财务需要**快速发现预付余额不足或已欠费的加氢站**，并批量发起充值，避免氢费结算中断。列表页通过两张 KPI 卡片汇总风险站点，点击后进入专项处理流程，而不是像「全部 / 无加氢」那样仅筛选主列表。

**与列表「加氢量」列高频/低频标签的区别**：

| 维度 | KPI：预付余额预警 / 已欠费 | 列表列：加氢量旁高频/低频 |
|---|---|---|
| 依据 | 预付余额与提醒阈值 | 加氢次数（来自氢费明细） |
| 点击行为 | 打开站点列表弹窗 → 可批量充值 | 无 KPI 级交互；加氢量可下钻明细 |
| 业务目的 | 资金风险预警与充值 | 运营活跃度展示 |

---

## 2. KPI 统计口径

两张卡片与主列表**并行展示**，统计基于当前台账内全部站点（不受列表筛选影响，但随站点数据实时重算）。

| KPI 卡片 | 计入规则 | 不计入 |
|---|---|---|
| **预付余额预警站点** | 已设置 `balanceAlertThreshold`（> 0），且 `prepaidBalance ≥ 0`，且 `prepaidBalance < balanceAlertThreshold` | 未设阈值；已欠费（余额 < 0） |
| **已欠费站点** | `prepaidBalance < 0` | 余额 ≥ 0 |

**互斥关系**：同一站点若已欠费，只计入「已欠费」，不再计入「预付余额预警」。

**阈值来源**（影响预警站点数量）：

| 入口 | 行为 |
|---|---|
| 工具栏 → **全站余额提醒设置** | 将同一阈值批量写入全部站点 |
| 行内更多 → **余额提醒设置** | 仅更新当前站点阈值 |

---

## 3. 与其他 KPI 的交互差异

| KPI 类型 | 点击后行为 | 选中态（绿色描边） |
|---|---|---|
| 全部加氢站 / 无加氢站点 | 筛选主列表，回到第 1 页；与签约筛选互斥 | `categoryTab` 匹配且未选签约筛选 |
| 签约站点 / 普通站点 | 快捷签约筛选，重置 KPI 为「全部」 | `appliedFilters.signed` 匹配 |
| **预付余额预警 / 已欠费** | **打开站点列表弹窗**，不筛选主列表 | 弹窗打开且 `type` 与卡片一致 |

点击预警/欠费 KPI 时：

- **不**修改主列表筛选条件
- **不**切换 `categoryTab` 为列表筛选项
- 弹窗打开期间，对应 KPI 卡片保持选中高亮

---

## 4. 点击 KPI → 站点列表弹窗

### 4.1 触发

用户点击「预付余额预警站点」或「已欠费站点」任一张 KPI 卡片。

系统按口径从当前台账筛选站点，打开居中弹窗：

| 属性 | 说明 |
|---|---|
| 标题 | 「预付余额预警站点」或「已欠费站点」 |
| 宽度 | 约 1200px |
| 数据范围 | 符合该 KPI 口径的全部站点（非仅当前页） |

### 4.2 弹窗内容

**顶部摘要区**

- 标题与卡片名称一致
- 副文案：`共 N 个站点 · 字段与列表页一致`
- 主操作按钮：**一键发起充值单**（站点数为 0 时禁用）

**站点表格**

- 列与主列表一致（**不含操作列**）：加氢站名称、合作时间、营业状态、营业时间、当前成本价格、加氢次数、加氢量、预付余额、联系方式等
- 预付余额列：负值标红并显示「已欠费」（与主列表一致）
- 超过 8 条时分页，每页 8 条
- 无数据时展示「暂无站点」

**底部按钮**

| 按钮 | 行为 |
|---|---|
| 关闭 | 关闭弹窗，清除 KPI 选中态 |
| 一键发起充值单 | 见下文第 5 节 |

---

## 5. 一键发起充值单

### 5.1 流程

```mermaid
flowchart TD
    A[点击 KPI 卡片] --> B[打开站点列表弹窗]
    B --> C{用户操作}
    C -->|关闭| D[结束]
    C -->|一键发起充值单| E[关闭弹窗]
    E --> F[打开发起充值单弹窗]
    F --> G[预填弹窗内全部站点行]
    G --> H[用户填写付款金额]
    H --> I[发起付款流程]
```

### 5.2 预填规则

关闭站点列表弹窗后，打开「发起充值单」弹窗，并为弹窗内**每一个站点**自动生成一行：

| 预填字段 | 来源 |
|---|---|
| 站点 | 站点名称（不可为空） |
| 当前余额 | 站点 `prepaidBalance` 格式化展示 |
| 收款公司 / 银行账号 / 开户行 | 站点关联供应商付款信息 |
| 转账用途 | 默认「羚牛预付氢费款 YYYY-MM-DD」 |
| 付款金额 | **留空**，由用户填写 |

**提示文案**：

- 预警站点：`已载入 N 个预警站点，请填写付款金额后发起`
- 欠费站点：`已载入 N 个欠费站点，请填写付款金额后发起`

### 5.3 提交校验

与工具栏「发起充值单」一致：

- 每行须选择站点并填写付款金额
- 站点须已关联供应商且收款信息完整；否则提示补全后再发起
- 原型环境：校验通过后提示「已发起审批流程」

### 5.4 与其他充值入口的关系

| 入口 | 预填站点 |
|---|---|
| 工具栏 → 发起充值单 | 空白一行，用户自选 |
| KPI 弹窗 → 一键发起充值单 | 预填当前弹窗内全部站点 |
| 行内更多（无批量） | — |

---

## 6. 端到端场景示例

### 场景 A：日常巡检余额

1. 财务打开站点信息页，看到 KPI「预付余额预警站点 = 1」
2. 点击该卡片，弹窗列出余额低于阈值但仍 ≥ 0 的站点
3. 确认后点击「一键发起充值单」，填写各站付款金额并提交

### 场景 B：处理欠费

1. KPI「已欠费站点」显示 1，列表中对应行预付余额为红色「已欠费 -3,250.00」
2. 点击 KPI，弹窗仅展示欠费站点
3. 一键发起充值单，补足欠费金额

### 场景 C：配置阈值后统计变化

1. 工具栏「全站余额提醒设置」统一设为 50,000 元
2. KPI 预警数量随 `prepaidBalance` 与阈值比较实时更新
3. 某站余额扣减至阈值以下后自动出现在预警 KPI 中

---

## 7. 异常与边界

| 场景 | 预期行为 |
|---|---|
| KPI 数值为 0 | 可点击；弹窗内表格为空，「一键发起充值单」禁用 |
| 弹窗内点击关闭 | 弹窗关闭，KPI 选中态取消 |
| 站点未设阈值 | 不计入预警 KPI（即使余额较低） |
| 已欠费站点 | 只出现在「已欠费」，不出现在「预警」 |
| 主列表正在筛选 | 不影响 KPI 统计与弹窗站点范围（口径为全量台账） |

---

## 8. 验收清单

- [ ] 预警 KPI 仅统计：有阈值、余额 ≥ 0 且 < 阈值
- [ ] 欠费 KPI 仅统计：余额 < 0；与预警互斥
- [ ] 点击预警/欠费 KPI 打开弹窗，**主列表不筛选**
- [ ] 弹窗打开时对应 KPI 卡片呈选中态
- [ ] 弹窗表格字段与主列表一致（无操作列）
- [ ] 「一键发起充值单」预填全部站点及当前余额、供应商信息
- [ ] 预填后付款金额须用户填写；提交校验与工具栏充值一致
- [ ] 全站/单站余额提醒设置保存后，预警 KPI 数量联动更新

---

## 9. 实现参考（原型）

| 能力 | 位置 |
|---|---|
| KPI 卡片配置 | `H2_STATION_KPI_CARDS` |
| 口径函数 | `h2IsBalanceAlertStation` / `h2IsArrearsStation` |
| 打开弹窗 | `openAlertStationModal` |
| 批量充值 | `handleBatchRechargeFromAlert` → `openRechargeModal` |
| 页面文件 | `src/prototypes/oneos-web-h2-station/pages/03-站点信息.jsx` |
