# 加氢站管理 · 站点信息 — 产品需求说明（PRD）

| 项目 | 内容 |
|------|------|
| 文档版本 | v2.0 |
| 产品模块 | 加氢站管理 → 站点信息 |
| 文档类型 | 产品需求说明 |
| 适用读者 | 研发、测试、产品、项目 |
| 关联模块 | 台账数据 → 车辆氢费明细 |
| 原型文件 | `web端/加氢站管理/站点信息.jsx` |

---

## 一、为什么做这件事

### 1.1 业务背景

加氢站是氢费成本结算的关键节点。运营侧需要维护站点主数据（签约、地址坐标、营业、成本价、预付余额），并在财务周期内按站点与加氢站完成对账、收票与付款闭环。

### 1.2 本期目标

建设 Web 端「站点信息」页面，支撑：

- 站点台账的查询、新建、编辑、查看、删除与批量导入
- 地图定位、营业状态、多规则成本价格、余额提醒等运营配置
- 加氢量 / 预付余额下钻分析与充值单发起
- **按站点生成氢费对账单 → 填写收票信息 → 提交结算**，并与「车辆氢费明细」联动回写

### 1.3 用户角色

| 角色 | 典型诉求 |
|------|----------|
| **加氢站运营** | 维护站点资料、营业与价格；查看加氢量与余额；设置余额提醒 |
| **财务/结算** | 按周期生成对账单、登记收票、发起充值、完成站点付款闭环 |
| **管理员** | 批量导入站点、全站余额提醒、删除无效站点、绑定系统账号 |

---

## 二、页面整体结构

用户进入「加氢站管理 → 站点信息」后，页面自上而下为：

1. **筛选区** — 名称、是否签约、地区、营业状态
2. **KPI 分类** — 全部 / 预付余额预警 / 已欠费 / 无加氢；签约站点快捷筛选
3. **工具栏** — 全站余额提醒设置、批量导入、发起充值单、新建站点
4. **站点列表** — 主数据 + 运营指标 + 操作列
5. **子页面 / 弹窗** — 新建/编辑整页、查看、营业状态、价格配置、余额提醒、对账单、对账记录、下钻分析等

```mermaid
flowchart TB
    subgraph 列表页
        A[筛选 / KPI] --> B[站点列表]
        B --> C[查看站点]
        B --> D[编辑 / 删除]
        B --> E[更多菜单]
        B --> F[加氢量下钻]
        B --> G[预付余额下钻]
    end
    E --> H[营业状态]
    E --> I[价格配置]
    E --> J[余额提醒设置]
    E --> K[生成对账单]
    E --> L[查看对账记录]
    B --> M[工具栏-发起充值单]
    B --> N[工具栏-全站余额提醒]
```

页面右上角提供 **「查看需求说明」**、**「查看使用说明书」** 入口。

---

## 三、列表与 KPI 规则

### 3.1 列表字段

| 字段 | 说明 |
|------|------|
| 加氢站名称 | 含签约标签（签约站点 / 签约站点-未上传合同）；下一行展示完整地址 |
| 合作时间 | 未签约显示为空 |
| 营业状态 / 营业时间 | 列表只读；在「更多 → 营业状态」维护 |
| 当前成本价格 | 元/kg；由价格配置规则与生效时间驱动；多客户规则时展示主规则价格 |
| 加氢次数 / 加氢量 | 加氢量可点击下钻；列表头支持排序 |
| 预付余额 | 可点击下钻流水；负值标红并显示「已欠费」 |
| 联系方式 | 联系人 + 电话 |
| 操作 | 查看 + 更多（⋮） |

### 3.2 KPI 分类逻辑

| 分类 | 规则 |
|------|------|
| 全部加氢站 | 台账内全部站点 |
| 预付余额预警站点 | 已设置提醒阈值，且预付余额 ≥ 0 且低于阈值（不含已欠费） |
| 已欠费站点 | 预付余额 < 0 |
| 无加氢站点 | 加氢次数 = 0 |

**签约快捷筛选**（与 KPI 并列展示）：

| 分类 | 规则 |
|------|------|
| 签约站点 | `isSigned = true` |
| 普通站点 | `isSigned = false` |

点击「预付余额预警站点」「已欠费站点」KPI 卡，打开对应站点列表弹窗，支持 **一键发起充值单**（预填站点与当前余额）。

筛选或 KPI 切换后列表回到第 1 页；默认分页 10 条，可选 5 / 10 / 20 / 50。

---

## 四、站点主数据（新建 / 编辑 / 查看）

### 4.1 新建站点

**入口**：列表工具栏 → **新建站点**

整页表单分三块卡片：

#### （1）加氢站基本信息

| 字段 | 必填 | 说明 |
|------|------|------|
| 加氢站名称 | 是 | 不可与已有站点重名 |
| 省市、通讯地址 | 是 | 只读，由地址解析回填 |
| 地址解析 | 否 | 粘贴完整地址，失焦后自动解析省/市与详细地址 |
| 地图定位 | 否 | 见 [4.4 地图定位模块](#44-地图定位模块) |
| 联系人 | 是 | — |
| 手机号 / 固定电话 | 至少一项 | 格式校验 |
| 站点类型 | 否 | 签约站点 / 普通站点；签约须填合作时间与合同附件 |

#### （2）系统账号绑定

- 选择 **绑定系统账号** 或 **暂不绑定**
- 绑定支持 **多选**；已被其他站点占用的账号不可选
- 绑定后所选账号可登录并管理该站点

#### （3）供应商相关信息

Tab：**关联已有** / **新建供应商** / **不关联供应商**

- 关联已有：搜索供应商档案绑定，可 OCR 营业执照
- 新建供应商：主体、开票、银行、证照上传
- 不关联：跳过供应商区块

**底部**：返回（未保存二次确认）、提交创建（进度达 100% 后可点）

### 4.2 编辑 / 查看

| 模式 | 交互 |
|------|------|
| **编辑** | 整页（与新建同结构）；**不含**供应商；营业状态不在此页；系统账号仅 admin 可改 |
| **查看** | 弹窗分块：加氢站信息、系统账号、供应商信息、付款信息 |

编辑页同样包含 **地图定位模块**，回显已保存经纬度。

### 4.3 批量导入

**入口**：列表工具栏 → **批量导入**（位于「全站余额提醒设置」右侧）

- 下载 CSV 模板 → 上传 `.csv` / `.xlsx` / `.xls`
- 预览可导入 / 不可导入条数及错误原因
- 站点名称不可与现有台账重复

模板字段与新建表单一致（名称、省、市、详细地址、是否签约、签约起止、营业状态、营业时间、联系人、联系电话等）。

### 4.4 地图定位模块

**位置**：新建 / 编辑页 → 加氢站基本信息卡片 → 地址解析下方

**数据字段**：

| 字段 | 说明 |
|------|------|
| `mapAddress` | 地图模块地址（可与通讯地址一致） |
| `latitude` | 纬度，保留 6 位小数 |
| `longitude` | 经度，保留 6 位小数 |

**交互规则**：

1. **地址解析联动**：上方「地址解析」识别成功后，自动将完整地址填入地图地址框并触发定位
2. **输入定位**：地图地址框支持手动输入；失焦、回车或点击「定位」后，地图自动移动到对应位置
3. **拖动微调**：地图上标记可拖动，拖动结束后更新经纬度并展示在地图下方
4. **定位失败**：提示用户拖动标记手动选点

**实现说明（原型）**：使用 OpenStreetMap + Leaflet；优先按省市区 Mock 坐标定位，必要时调用 Nominatim 地理编码。

### 4.5 删除站点

**入口**：更多 → 删除 → 二次确认，不可撤销。

---

## 五、运营配置

### 5.1 营业状态

**入口**：更多 → **营业状态**

- 顶部站点信息卡（名称、地址、当前状态）
- **营业状态**：营业中 / 暂停营业 / 停止营业（按钮组）
- **营业时间**：全天营业 / 自定义时段；非全天须填开始、结束时间（HH:mm）
- 下方展示 **营业状态变更记录**
- 保存后列表同步更新

### 5.2 价格配置

**入口**：更多 → **价格配置**

#### 5.2.1 弹窗结构

```
┌─────────────────────────────────────────────┐
│ 顶部：加氢站名称 + 签约站点标签（无则省略）    │
├─────────────────────────────────────────────┤
│ 当前已生效价格配置（表格）    [+ 新增规则]    │
├─────────────────────────────────────────────┤
│ （点击修改/新增后展开）编辑表单               │
│ 定价方式 | 适用客户                          │
│ 固定价：成本价格 + 生效时间                   │
│ 阶梯价：阶梯条件 + 重置日/生效时间            │
├─────────────────────────────────────────────┤
│ （编辑态）当前规则调整记录                    │
└─────────────────────────────────────────────┘
```

- 打开弹窗默认为 **查看态**，仅展示已生效配置表格
- 点击行内 **「修改」** 或 **「+ 新增规则」** 才展开编辑卡片
- **保存** 后回到查看态，**不关闭**弹窗

#### 5.2.2 已生效配置表格

| 列 | 说明 |
|----|------|
| 适用客户 | 全部客户 / 指定客户名称 |
| 定价方式 | 固定价格 / 阶梯价格（Tag） |
| 当前价格 | 元/kg；阶梯价展示当前匹配单价，可附「距下个阶梯还差 X kg」 |
| 生效时间 | 最近一条已生效日志的生效时间 |
| 阶梯重置 | 阶梯规则展示「每月 N 日」；固定价显示 — |
| 操作 | 修改 |

#### 5.2.3 定价方式

**固定价格**

- 成本价格（元/kg）+ 生效时间
- 适用客户：与阶梯价相同的多选下拉
  - 未选客户 → 保存为「全部客户」规则
  - 已选客户 → 为每个客户各生成一条固定价规则
  - 已有单独规则的客户在下拉中禁用
  - 固定价提示：默认对全部客户生效；已为某客户单独配置的，将自动从本规则中排除

**阶梯价格**

- 阶梯价格条件：加氢总量阈值（kg）+ 成本单价，可多条
- 阶梯量重置日期（每月 1～28 日）+ 生效时间
- 适用客户：多选，至少选一个；可为多个客户批量配置相同阶梯规则

#### 5.2.4 生效与列表联动

- 保存时写入规则及调整日志
- 到达生效时间后，列表「当前成本价格」按适用客户范围更新（原型模拟）
- 同一客户仅允许一套生效规则；保存时校验冲突

### 5.3 余额提醒设置

#### 5.3.1 单站设置

**入口**：更多 → **余额提醒设置**

- 展示站点名称、当前预付余额
- 必填 **提醒金额（元）**，须 > 0
- 保存后写入 `balanceAlertThreshold`
- 当预付余额低于阈值时，站点计入 KPI「预付余额预警站点」（已欠费站点不计入预警）

#### 5.3.2 全站批量设置

**入口**：列表工具栏 → **全站余额提醒设置**（位于批量导入左侧）

- 交互与单站余额提醒相同
- 保存后将同一阈值批量写入 **全部加氢站**

### 5.4 发起充值单

**入口**：

- 列表工具栏 → **发起充值单**（空白行，自选站点）
- KPI 预警 / 欠费弹窗 → **一键发起充值单**（预填站点）

**规则**：

- 支持多行，每行选择站点、填写付款金额
- 自动带出收款公司、银行账号、转账用途等（来自供应商付款信息）
- 提交后走付款流程（原型提示成功）

### 5.5 加氢量 / 预付余额下钻

**加氢量下钻**（点击列表加氢量）：

- 统计卡：加氢次数、加氢总量、成本总价、加氢总价
- 明细表字段对齐「车辆氢费明细」
- 支持导出 CSV

**预付余额下钻**（点击列表预付余额）：

- 当前余额（负值标「已欠费」）
- 充值 / 车辆加氢流水
- 余额趋势图 + 导出 CSV

---

## 六、核心流程：生成对账单

本模块与「车辆氢费明细」配合完成 **站点侧氢费结算闭环**。

### 6.1 数据来源

对账单明细取自 **车辆氢费明细** 中同时满足以下条件的记录：

1. 对账状态 = **已对账**
2. **尚未**被本站点历史对账单结算过（未绑定 `statementRecordId`）
3. 加氢时间落在 `[账单开始日期, 账单结束日期]` 内
4. 加氢站名称与当前操作站点一致

> 对账单明细 **仅展示成本字段**，不展示加氢单价、加氢总价。

### 6.2 两阶段交互

```mermaid
flowchart TD
    A[打开「生成对账单」] --> B[选择账单开始/结束日期]
    B --> C[展示上次对账单结束时间]
    C --> D{点击「生成对账单」}
    D -->|无符合条件记录| E[提示调整日期]
    D -->|有记录| F[生成对账记录草稿]
    F --> G[统计：加氢次数/总量/成本总金额]
    G --> H[成本明细表]
    H --> I[填写结算信息]
    I --> J{点击「提交对账单」}
    J -->|校验失败| K[提示必填项]
    J -->|校验通过| L[完成闭环]
```

**阶段一 · 选期生成**

- 展示 **上次对账单结束时间**（无则「暂无」）
- 默认开始日期 = 上次结束日 + 1 天
- 生成后进入阶段二，日期锁定

**阶段二 · 结算提交**

| 统计项 | 说明 |
|--------|------|
| 加氢次数 | 本账单笔数 |
| 加氢总量 | kg 合计 |
| 成本总金额 | 成本总价合计 |

**必填结算项**：

| 字段 | 规则 |
|------|------|
| 结算后加氢站预付款余额 | 只读，= 当前预付余额 − 成本总金额 |
| 收票日期 | 必填 |
| 收票金额 | 必填，默认成本总金额 |
| 发票附件 | 必填 |

### 6.3 提交后的系统行为

提交成功后需原子性完成：

1. 写入对账历史
2. 扣减站点预付余额
3. 标记台账记录已结算（`statementRecordId`）
4. 回写车辆氢费明细：对账日期、收票日期、加氢站付款状态 = 已付款

```mermaid
sequenceDiagram
    participant 台账 as 车辆氢费明细
    participant 站点 as 站点信息
    participant 财务 as 结算操作人

    台账->>台账: 完成对账 → 已对账
    财务->>站点: 更多 → 生成对账单
    站点->>台账: 拉取已对账且未结算记录
    财务->>站点: 生成对账记录 + 填收票信息
    财务->>站点: 提交对账单
    站点->>站点: 更新预付余额 / 写对账历史
    站点->>台账: 回写对账日期、收票日期、已付款
```

---

## 七、查看对账记录

**入口**：更多 → **查看对账记录**

### 7.1 历史列表

| 列 | 说明 |
|----|------|
| 对账日期 | 提交操作时间 |
| 对账人 | 操作人 |
| 账单开始/结束日期 | 覆盖区间 |
| 加氢次数 / 加氢金额 | 本单汇总 |
| 对账后预付款余额 | 负值标「已欠费」 |
| 操作 | 查看明细 |

### 7.2 查看明细

- 账单区间、统计三卡
- 收票时间、收票金额、发票附件下载
- 成本明细表

---

## 八、操作列「更多」菜单

| 菜单项 | 作用 |
|--------|------|
| 编辑 | 整页编辑站点主数据（含地图） |
| 营业状态 | 维护营业状态与营业时间 |
| 价格配置 | 固定价 / 阶梯价多规则配置 |
| 余额提醒设置 | 单站提醒阈值 |
| 生成对账单 | 两阶段对账结算 |
| 查看对账记录 | 历史对账单与明细 |
| 删除 | 删除站点（不可恢复） |

---

## 九、校验与异常

| 场景 | 处理 |
|------|------|
| 新建/编辑：名称重复 | 阻止提交 |
| 新建/编辑：省市区或详细地址为空 | 阻止提交 |
| 新建/编辑：联系人或电话缺失 | 阻止提交 |
| 签约站点：合作时间或合同缺失 | 阻止提交 |
| 价格配置：未填价格/生效时间/阶梯条件 | 阻止保存 |
| 阶梯价：未选适用客户 | 阻止保存 |
| 价格配置：客户已有规则 | 提示编辑原规则 |
| 余额提醒：金额无效 | 阻止保存 |
| 对账单：日期无效 / 无已对账记录 | 阻止生成 |
| 对账单：收票信息不完整 | 阻止提交 |
| 预付余额结算后为负 | 允许提交，标「已欠费」 |
| 地图：地址无法定位 | 提示手动拖动选点 |

---

## 十、研发实现要点

1. **价格配置模型**：`priceConfigs[]` 支持 `customerScope: all | customer`、固定价 / 阶梯价、生效日志 `logs[]`；列表价取当前时间已生效日志。
2. **客户规则互斥**：`h2GetAssignedCustomerIds` 维护已占用客户；保存时 `h2ApplyCustomerExclusion` 处理规则覆盖。
3. **余额预警**：`balanceAlertThreshold` + `prepaidBalance` 计算 KPI；欠费优先于预警。
4. **地图字段**：`mapAddress`、`latitude`、`longitude` 随站点主数据持久化。
5. **对账单幂等**：同一笔已对账记录只能绑定一次 `statementRecordId`。
6. **跨模块同步**：生产对接统一台账服务；原型通过 `H2_STATION_STATEMENT_LEDGER_UPDATES` / `H2_VEHICLE_LEDGER_API` 模拟回写。
7. **权限**（后续）：对账提交、全站余额设置建议限制财务 / 管理员角色。

### 10.1 主要数据字段（站点）

| 字段 | 类型 | 说明 |
|------|------|------|
| `name` | string | 加氢站名称 |
| `region` | string[] | 省、市 |
| `addressDetail` | string | 详细地址 |
| `fullAddress` | string | 完整地址展示 |
| `mapAddress` | string | 地图定位地址 |
| `latitude` / `longitude` | number | 经纬度 |
| `isSigned` | boolean | 是否签约 |
| `contractStart` / `contractEnd` | string | 合作时间 |
| `businessStatus` / `businessHours` | string | 营业信息 |
| `costUnitPrice` | number | 列表展示用当前成本价 |
| `priceConfigs` | array | 价格规则集合 |
| `balanceAlertThreshold` | number | 余额提醒阈值 |
| `prepaidBalance` | number | 预付余额 |
| `bindAccountIds` | string[] | 绑定系统账号 |

---

## 十一、本期不做

- 对账单审批流、ERP 自动过账
- 发票 OCR 识别与验真
- 多币种 / 多税率
- 高德 / 百度地图商用 Key 接入（原型使用 OSM）
- 按组织架构的复杂数据权限

---

**文档结束**
