完善加氢站站点信息:价格配置、余额提醒、地图定位与 PRD。
新增多规则价格配置、全站余额提醒、地图选点及 v2.0 产品需求说明文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
487
web端/加氢站管理/站点信息-产品需求说明.md
Normal file
487
web端/加氢站管理/站点信息-产品需求说明.md
Normal file
@@ -0,0 +1,487 @@
|
||||
# 加氢站管理 · 站点信息 — 产品需求说明(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)
|
||||
- 按组织架构的复杂数据权限
|
||||
|
||||
---
|
||||
|
||||
**文档结束**
|
||||
1664
web端/加氢站管理/站点信息.jsx
1664
web端/加氢站管理/站点信息.jsx
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user