235 lines
7.6 KiB
Markdown
235 lines
7.6 KiB
Markdown
|
|
---
|
|||
|
|
title: prop-acc · meter · 场景 - 工业表 10x 倍率生成账单
|
|||
|
|
aliases:
|
|||
|
|
- 工业表账单
|
|||
|
|
- multiplier 计算
|
|||
|
|
- generate-bill-with-multiplier
|
|||
|
|
- 场景-倍率表生成账单
|
|||
|
|
tags:
|
|||
|
|
- 场景
|
|||
|
|
- prop-acc
|
|||
|
|
- 计量表
|
|||
|
|
- 账单生成
|
|||
|
|
- 倍率
|
|||
|
|
audience:
|
|||
|
|
- 业务人员
|
|||
|
|
- 财务
|
|||
|
|
- 抄表员
|
|||
|
|
status: 已发布
|
|||
|
|
sub_feature: meter
|
|||
|
|
last_review: 2026-05-26
|
|||
|
|
code_version: 2026-05-22
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 场景:工业表 10x 倍率生成账单
|
|||
|
|
|
|||
|
|
商铺 / 集团表 / 三相工业表的物理表头**只显示用量的 1/10 或 1/100**,需要乘以倍率(multiplier)才是实际用量。系统在 `consumption = (current - previous) × multiplier` 公式中自动处理。
|
|||
|
|
|
|||
|
|
## 典型情境
|
|||
|
|
|
|||
|
|
> [!example] 真实情境
|
|||
|
|
> 嘉禾花园 1 楼商铺(中式餐厅)装的是**三相工业电表**(multiplier=10)。本月抄表:
|
|||
|
|
>
|
|||
|
|
> - 上月 reading.current_reading = 280
|
|||
|
|
> - 本月 reading.current_reading = 308
|
|||
|
|
> - 物理表头读数差 = 28
|
|||
|
|
>
|
|||
|
|
> **实际用电量** = 28 × **10** = **280 度**(不是 28 度!)
|
|||
|
|
>
|
|||
|
|
> 按电费阶梯(0-200 度 0.8 元,200+ 度 1.0 元)算:
|
|||
|
|
>
|
|||
|
|
> ```
|
|||
|
|
> 段 1:200 × 0.8 = 160 元
|
|||
|
|
> 段 2:80 × 1.0 = 80 元
|
|||
|
|
> 合计: 240 元
|
|||
|
|
> ```
|
|||
|
|
>
|
|||
|
|
> 商铺老板看到账单 ¥240 / 280 度。
|
|||
|
|
|
|||
|
|
如果**没有 multiplier**:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
consumption = (308 - 280) × 1 = 28 度
|
|||
|
|
amount = 28 × 0.8 = 22.4 元 ❌
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
少收 ¥217.6,商铺白用 252 度电。**物业必须用倍率算账,这是工业表的天然属性**。
|
|||
|
|
|
|||
|
|
## 系统流程
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
sequenceDiagram
|
|||
|
|
participant 抄表员
|
|||
|
|
participant Filament
|
|||
|
|
participant Calc[MeterBillCalculator]
|
|||
|
|
participant 数据库
|
|||
|
|
|
|||
|
|
抄表员->>Filament: 录入 reading current=308(物理表头)
|
|||
|
|
Filament->>Filament: 查 meter.multiplier=10
|
|||
|
|
Filament->>Filament: 查 previous_reading=280(上月)
|
|||
|
|
Filament->>Filament: consumption = (308 - 280) × 10 = 280 度
|
|||
|
|
Filament->>数据库: 建 MeterReading(consumption=280)
|
|||
|
|
|
|||
|
|
Note over 数据库: 后续 GenerateBills
|
|||
|
|
|
|||
|
|
Filament->>Calc: calculate(consumption=280, ratePlan)
|
|||
|
|
Calc->>Calc: 阶梯算法 200*0.8 + 80*1 = 240
|
|||
|
|
Calc-->>Filament: 240
|
|||
|
|
Filament->>数据库: 建 Bill(amount=240)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 抄表员视角(李师傅)
|
|||
|
|
|
|||
|
|
### 抄表录入
|
|||
|
|
|
|||
|
|
抄表员看到物理表头是 **308**(不是 3080),录入时填 **308**。
|
|||
|
|
|
|||
|
|
> [!warning] 抄表员不应自己乘倍率
|
|||
|
|
>
|
|||
|
|
> **错误做法**:抄表员看到 308 + 知道倍率 10 → 录入 3080
|
|||
|
|
>
|
|||
|
|
> **后果**:系统再乘一次 10 → consumption = (3080 - 2800) × 10 = 2800 度 → 收业户 2800 度电费 → 业户疯狂投诉
|
|||
|
|
>
|
|||
|
|
> **正确做法**:**严格录入物理表头数字**(308),倍率由系统自动处理。
|
|||
|
|
|
|||
|
|
Form 上应显示 meter 的 multiplier 提醒抄表员:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
表编号:E-COMMERCIAL-1
|
|||
|
|
倍率:10x(工业表)
|
|||
|
|
上次读数:280
|
|||
|
|
|
|||
|
|
本次读数:[___] (请录入物理表头数字)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 与家用表的对比
|
|||
|
|
|
|||
|
|
| 维度 | 家用表(multiplier=1)| 工业表(multiplier=10/100/...)|
|
|||
|
|
|---|---|---|
|
|||
|
|
| 抄表员录入 | 表头数字 = 实际用量 | 表头数字 ≠ 实际用量 |
|
|||
|
|
| 是否需要换算 | 不需要 | 需要(系统自动)|
|
|||
|
|
| 抄表员错误风险 | 低 | **中**(可能录乘 / 不乘 10) |
|
|||
|
|
| 业务培训 | 简单 | **需培训**(说清楚"录原始数字")|
|
|||
|
|
|
|||
|
|
## 业务人员视角
|
|||
|
|
|
|||
|
|
### 配置倍率
|
|||
|
|
|
|||
|
|
建表时 `MeterForm.multiplier` 字段填:
|
|||
|
|
|
|||
|
|
| 表类型 | 推荐 multiplier |
|
|||
|
|
|---|---|
|
|||
|
|
| 家用单相电表 | 1 |
|
|||
|
|
| 家用水表 | 1 |
|
|||
|
|
| 三相工业电表 | 10(常见)|
|
|||
|
|
| 大型工业电表(高压侧) | 100 / 1000 |
|
|||
|
|
| 工业大流量水表 | 10 / 100 |
|
|||
|
|
|
|||
|
|
具体看表的物理铭牌 + 设计图纸。
|
|||
|
|
|
|||
|
|
### 倍率改了如何处理
|
|||
|
|
|
|||
|
|
> [!warning] 倍率改动影响极大
|
|||
|
|
> `multiplier` 改了不会重算历史 reading 的 consumption(那些数据已经存了)。但**会影响后续抄表**。
|
|||
|
|
>
|
|||
|
|
> **何时可改 multiplier**:
|
|||
|
|
> - 表是 `is_active=true`(退役表不可改,见 [[decommission-and-locking]])
|
|||
|
|
> - 表**没有任何已生成 Bill 的 reading**(若有,改 multiplier 让历史 vs 现在的算法不一致,审计困难)
|
|||
|
|
>
|
|||
|
|
> **推荐做法**:倍率配错 → 退役旧表 → 建新表用正确 multiplier(不走更换链,因为不是物理换表)。详见 [[decommission-without-replacement]]。
|
|||
|
|
|
|||
|
|
## 业户视角(商铺老板)
|
|||
|
|
|
|||
|
|
### 您看到的账单
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
2026 年 5 月电费账单
|
|||
|
|
|
|||
|
|
用电量:280 度
|
|||
|
|
(本月表头读数 308,上月 280,差 28 × 倍率 10)
|
|||
|
|
|
|||
|
|
明细:
|
|||
|
|
0-200 度段:200 × 0.8 = 160 元
|
|||
|
|
201+ 度段: 80 × 1.0 = 80 元
|
|||
|
|
合计:240 元
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
> [!info] 账单展示倍率信息
|
|||
|
|
> 强烈推荐账单 / Receipt 展示"原始读数 + 倍率 + 计算公式",让业户看明白:
|
|||
|
|
>
|
|||
|
|
> - 业户看到差 28 度,但收 240 元,会疑惑(单价怎么算?)
|
|||
|
|
> - 展示"28 × 倍率 10 = 280 度,按 280 算"业户秒懂
|
|||
|
|
|
|||
|
|
### 商铺老板的特殊关注
|
|||
|
|
|
|||
|
|
| 业户疑问 | 应答 |
|
|||
|
|
|---|---|
|
|||
|
|
| "为什么我家是工业表不是家用表?" | 商铺用电量大,法规要求工业表 |
|
|||
|
|
| "倍率是物业定的吗?" | 不是,是物理表的属性,出厂时定 |
|
|||
|
|
| "可以换成家用表吗?" | 不能,商铺合规上必须用工业表 |
|
|||
|
|
|
|||
|
|
## 倍率与阶梯的叠加
|
|||
|
|
|
|||
|
|
倍率**先算**,得到 consumption;然后 consumption 走阶梯。两者完全独立、按顺序应用。
|
|||
|
|
|
|||
|
|
完整公式:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
consumption = (current - previous) × multiplier # 第 1 层
|
|||
|
|
amount = sum(段 i 用量 × 段 i 单价) # 第 2 层(阶梯)
|
|||
|
|
amount = clamp(amount, min, max) # 第 3 层(min/max 封顶)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
详见 [[multiplier-and-tiered-pricing]] 完整说明。
|
|||
|
|
|
|||
|
|
## 不同 multiplier 表的算例
|
|||
|
|
|
|||
|
|
| 表类型 | multiplier | 表头读数差 | consumption | 单价 0.8 | 账单 |
|
|||
|
|
|---|---|---|---|---|---|
|
|||
|
|
| 家用 | 1 | 280 | 280 | 224 | 224 |
|
|||
|
|
| 三相工业 | 10 | 28 | 280 | 224 | 224 |
|
|||
|
|
| 大工业(高压侧) | 100 | 2.8 | 280 | 224 | 224 |
|
|||
|
|
|
|||
|
|
**同样 280 度,账单相同**,只是物理表头数字大小不同。系统的 multiplier 字段把这层差异隐藏在算法里。
|
|||
|
|
|
|||
|
|
## 常见问题
|
|||
|
|
|
|||
|
|
> [!question] multiplier 必须是整数吗?
|
|||
|
|
> 不必须。decimal(10,4) 精度,支持 0.5 / 1.25 等小数。但 1.0 / 10.0 / 100.0 是市场常见的"整数倍率"。
|
|||
|
|
|
|||
|
|
> [!question] 同一表的 multiplier 会随时间变吗?
|
|||
|
|
> 物理上**不会**。表的物理参数(变压比)是出厂时确定的,使用过程中不变。
|
|||
|
|
>
|
|||
|
|
> 系统层面**可改字段**(若 `is_active=true` 且无 Bill,Policy 允许),但**不推荐**改 —— 历史与现在的算法不一致,审计困难。
|
|||
|
|
|
|||
|
|
> [!question] 抄表员录入时如何区分"录物理读数"vs"录乘倍率后读数"?
|
|||
|
|
> Form 上**明确显示倍率**+ 标注"请录入物理表头数字"。培训抄表员**严格遵守**。系统统一存物理表头数字。
|
|||
|
|
|
|||
|
|
> [!question] 集抄系统推过来的数据是物理读数还是乘了倍率?
|
|||
|
|
> 看集抄运营商。**通常是物理读数**(IoT 设备读表头,不知道倍率)。本系统接收时按 `meter.multiplier` 算 consumption。
|
|||
|
|
>
|
|||
|
|
> 如果集抄推已乘倍率的数据 → 集抄端**降级处理**(本系统 multiplier 应该设为 1,避免重复乘)。需对接时讲清楚。
|
|||
|
|
|
|||
|
|
> [!question] 配置错倍率(应该 10 配成 1)会怎样?
|
|||
|
|
> 系统按 multiplier=1 算 → consumption 缩小 10 倍 → 业户账单缩小 10 倍 → 物业损失收入(直到发现)。
|
|||
|
|
>
|
|||
|
|
> 发现后修复:
|
|||
|
|
> - 改 multiplier=10(若 Policy 允许)
|
|||
|
|
> - 修复历史已欠收(走"补开账单"业务流程,系统不直接支持)
|
|||
|
|
> - 通知业户 + 退还 / 补收差额
|
|||
|
|
|
|||
|
|
## 异常分支
|
|||
|
|
|
|||
|
|
- 阶梯计价(本场景叠加)→ [[generate-bill-tiered-pricing]]
|
|||
|
|
- min/max 封顶 → [[generate-bill-min-max-cap]]
|
|||
|
|
- 倍率配错想改 → 复杂,通常退役旧表新建([[decommission-and-locking]])
|
|||
|
|
- 抄表员录错乘倍率 → [[exception-readings-locked-after-bill]] 修正
|
|||
|
|
|
|||
|
|
## 相关文档
|
|||
|
|
|
|||
|
|
- [[multiplier-and-tiered-pricing]]
|
|||
|
|
- [[bill-generation-pipeline]]
|
|||
|
|
- [[meter-vs-meter-reading]]
|
|||
|
|
- [[generate-bill-tiered-pricing]]
|
|||
|
|
- [[generate-bill-min-max-cap]]
|