vault backup: 2026-05-26 00:23:07
This commit is contained in:
246
prop-acc/scenarios/meter/read-via-iot-remote-source.md
Normal file
246
prop-acc/scenarios/meter/read-via-iot-remote-source.md
Normal file
@@ -0,0 +1,246 @@
|
||||
---
|
||||
title: prop-acc · meter · 场景 - 集抄系统自动推送(source=remote)
|
||||
aliases:
|
||||
- 集抄系统
|
||||
- IoT 抄表
|
||||
- read-via-iot-remote-source
|
||||
- 场景-集抄自动抄表
|
||||
tags:
|
||||
- 场景
|
||||
- prop-acc
|
||||
- 计量表
|
||||
- 抄表
|
||||
- IoT
|
||||
audience:
|
||||
- 业务人员
|
||||
- 架构师
|
||||
- 抄表员
|
||||
status: 已发布
|
||||
sub_feature: meter
|
||||
last_review: 2026-05-26
|
||||
code_version: 2026-05-22
|
||||
---
|
||||
|
||||
# 场景:集抄系统自动推送(source=remote)
|
||||
|
||||
集抄系统(IoT)通过 RS485 / NB-IoT / LoRa 等技术**远程读取**物理表读数,定时(每天 / 每小时 / 每月)推送给本系统。本系统收到后建 `MeterReading(source=remote)`,**完全自动,无人工介入**。是现代化物业的标配。
|
||||
|
||||
## 典型情境
|
||||
|
||||
> [!example] 真实情境
|
||||
> 嘉禾花园 2 年前升级了集抄系统,1,200 张水电气表全部接入 IoT 网关。集抄运营商每月 1 日凌晨**统一上传上月用量数据**到本系统。
|
||||
>
|
||||
> 物业财务王主管早上来上班,集抄数据已经全部到位 + 账单已经自动生成。她只需要:
|
||||
> - 看 dashboard 异常告警(高用量 / 集抄掉线表)
|
||||
> - 手工处理少数异常情况
|
||||
|
||||
## 系统流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Meter[物理表]
|
||||
participant Gateway[IoT 网关]
|
||||
participant Vendor[集抄运营商平台]
|
||||
participant API[本系统集抄 API]
|
||||
participant 数据库
|
||||
participant GenerateBills
|
||||
|
||||
Note over Meter: 物理表每月 1 日凌晨自报
|
||||
|
||||
Meter->>Gateway: 读数推送(RS485 / NB-IoT)
|
||||
Gateway->>Vendor: 上传(GSM / 4G / 有线)
|
||||
Vendor->>Vendor: 整合 + 校验 + 归档
|
||||
|
||||
Note over Vendor: 月度批量推送(可能是每天 / 每月)
|
||||
|
||||
Vendor->>API: HTTP POST(批量推 readings)
|
||||
API->>API: 校验签名 + 防重放
|
||||
API->>API: 校验 meter 是否存在 + 是否 active
|
||||
|
||||
loop 每条 reading
|
||||
API->>数据库: 建 MeterReading(source=remote, operated_by=null, photo_url=null)
|
||||
end
|
||||
|
||||
API->>GenerateBills: handle(刚建的 readings)
|
||||
GenerateBills->>数据库: 批量建 Bill + 回写 reading.bill_id
|
||||
|
||||
API-->>Vendor: 响应(成功 N,失败 M)
|
||||
```
|
||||
|
||||
## 业务人员视角
|
||||
|
||||
### 日常(集抄正常运行)
|
||||
|
||||
业务人员**几乎不操作**:
|
||||
|
||||
- 看 `MeterDashboard`(自动跳出异常告警)
|
||||
- 月度对账(`audit-meters-needing-reading.md` 类似审计)
|
||||
- 不需要手动抄表 / 录入
|
||||
|
||||
### 月初(集抄推数完成后)
|
||||
|
||||
通常上午到岗时:
|
||||
|
||||
- 所有 reading 已经在 `MeterReading` 表里
|
||||
- 所有 Bill 已经生成
|
||||
- Dashboard 显示:本月已抄 N 张 / 应抄 M 张
|
||||
- 看 `HighConsumptionReadingsListWidget` 异常告警 → 处理([[exception-high-consumption]])
|
||||
- 看 `MetersNeedingReadingListWidget` 显示掉线 / 漏抄表(本场景的兜底:走 [[read-single-meter-manual]] 个别补抄)
|
||||
|
||||
### 异常(集抄掉线)
|
||||
|
||||
| 掉线规模 | 处置 |
|
||||
|---|---|
|
||||
| 个别表(< 5%)| 抄表员补抄([[read-single-meter-manual]])|
|
||||
| 大面积(网关故障)| 联系集抄运营商修复 + 物业短期手抄兜底 |
|
||||
| 长期掉线(> 2 周)| 重新评估集抄设备的可靠性 |
|
||||
|
||||
## 集抄 API 设计(待文档化 / 实现细节)
|
||||
|
||||
> [!info] 当前实施状态
|
||||
> 集抄 API 的**具体实现细节**(endpoint、签名、数据格式、防重放)需要看代码或与集抄运营商对接文档,本场景描述**业务流程层**。
|
||||
|
||||
### 接口要求
|
||||
|
||||
| 要求 | 说明 |
|
||||
|---|---|
|
||||
| 接收端 | 本系统提供 HTTP POST endpoint |
|
||||
| 数据格式 | JSON 数组,每条 reading 字段:meter_code / read_at / current_reading / community_id / vendor_signature |
|
||||
| 签名校验 | 防伪造,通常 HMAC-SHA256 或非对称签名 |
|
||||
| 防重放 | 同 meter + 同 read_at 不重复建(unique index)|
|
||||
| 错误响应 | 详细告知哪条失败、原因 |
|
||||
| 失败重试 | 集抄运营商按响应决定重试逻辑 |
|
||||
|
||||
### MeterReading 字段对照
|
||||
|
||||
集抄推送的 reading,数据库存的 MeterReading:
|
||||
|
||||
| 字段 | 集抄数据 | 系统存 |
|
||||
|---|---|---|
|
||||
| `meter_id` | 集抄推 meter_code → 系统查 | meter ID |
|
||||
| `read_at` | 集抄推时间(通常表自身上报) | datetime |
|
||||
| `current_reading` | 物理表读数 | decimal(12,2) |
|
||||
| `previous_reading` | (系统自动取上次)| decimal |
|
||||
| `consumption` | (系统自动算)| decimal |
|
||||
| **`source`** | (系统设)| **`remote`** |
|
||||
| `operated_by` | null(集抄无人)| null |
|
||||
| `photo_url` | null(集抄无照片)| null |
|
||||
| `bill_id` | null(初始)→ 后续 GenerateBills 回写 | 可空 |
|
||||
| `memo` | 选填(集抄可能写型号 / 网关 ID)| text |
|
||||
|
||||
## 集抄 vs 手抄 数据差异
|
||||
|
||||
| 维度 | manual(手抄) | **remote(集抄)** |
|
||||
|---|---|---|
|
||||
| 录入速度 | 慢(几天到几周)| **几小时全社区** |
|
||||
| 准确性 | 中(手抖 / 看错)| **高**(机器直读)|
|
||||
| 拍照存证 | 强烈推荐 | 无(IoT 设备自身就是凭证)|
|
||||
| operated_by | 抄表员 ID | null |
|
||||
| 业户感知 | 抄表员上门 | **无感**(无人上门)|
|
||||
| 异常处理 | 抄表员现场判断 | 系统后台告警 → 人工介入 |
|
||||
| 成本 | 抄表员工资 | IoT 设备 + 网关 + 月度服务费 |
|
||||
| 业户家在不在影响 | 影响(开门才能抄) | 无影响 |
|
||||
|
||||
## 业户视角
|
||||
|
||||
业户**完全无感** —— 集抄系统的存在业户可能都不知道(除非物业告知)。
|
||||
|
||||
唯一感知:
|
||||
|
||||
- 账单出来更准时(每月固定日期到账)
|
||||
- 没人上门抄表(隐私感更好)
|
||||
- 用量明细可能更详细(集抄能支持小时 / 天级别 granularity,虽然账单仍是月度)
|
||||
|
||||
## 集抄设备与本系统的关系
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph "物理层"
|
||||
M1[家用水表]
|
||||
M2[家用电表]
|
||||
M3[工业表]
|
||||
end
|
||||
|
||||
subgraph "网关层"
|
||||
G1[楼栋网关<br/>RS485 → 4G]
|
||||
end
|
||||
|
||||
subgraph "运营商层(第三方)"
|
||||
V[集抄运营商平台<br/>设备管理 / 数据归档 / API 输出]
|
||||
end
|
||||
|
||||
subgraph "本系统(prop-acc)"
|
||||
API[集抄 API endpoint]
|
||||
DB[(MeterReading)]
|
||||
GenerateBills[GenerateBillsFromMeterReadingsAction]
|
||||
Bill[(Bill)]
|
||||
end
|
||||
|
||||
M1 --> G1
|
||||
M2 --> G1
|
||||
M3 --> G1
|
||||
G1 --> V
|
||||
V -->|每月推送| API
|
||||
API --> DB
|
||||
DB --> GenerateBills
|
||||
GenerateBills --> Bill
|
||||
```
|
||||
|
||||
**本系统只**管接收 + 存 + 生成账单。**不管**物理设备、网关、信号质量。这些都是集抄运营商的事。
|
||||
|
||||
## 常见问题
|
||||
|
||||
> [!question] 集抄数据准确吗?会不会比手抄更容易出错?
|
||||
> 集抄数据**理论上更准**(机器直读,没手抖)。但:
|
||||
>
|
||||
> - IoT 设备本身可能故障(读数漂移、传输错)
|
||||
> - 信号不好可能漏传(掉线)
|
||||
> - 集抄运营商平台可能 bug(数据传错)
|
||||
>
|
||||
> 准确性强烈依赖**集抄运营商的可靠性**。选大牌运营商 + 完善 SLA。
|
||||
|
||||
> [!question] 集抄推过来的数据能改吗?
|
||||
> 不能(MeterReading 不可变,见 [[decommission-and-locking]])。如果集抄推错:
|
||||
>
|
||||
> - 在系统侧建错误 reading
|
||||
> - 走作废 Bill → 删 reading(若 Policy 允许)→ 集抄重推
|
||||
> - 或运维 tinker 介入
|
||||
|
||||
> [!question] 集抄运营商收费贵不贵?
|
||||
> 看市场,通常:
|
||||
> - 设备 + 安装一次性几十到几百每点
|
||||
> - 月度服务费 几元 / 表 / 月
|
||||
>
|
||||
> 中型社区(1,000 表)月度成本可能几千到几万。物业自行评估"省抄表员工资 vs 集抄费用" ROI。
|
||||
|
||||
> [!question] 集抄系统对接需要多久?
|
||||
> 看运营商:
|
||||
> - 大牌(华为 / 海康)平台标准 API → 1-2 周(主要是数据格式映射 + 测试)
|
||||
> - 小厂自研协议 → 1-3 个月(需自定义对接代码)
|
||||
|
||||
> [!question] 集抄推数据时本系统有问题(数据库挂 / 网络断)?
|
||||
> 集抄运营商应有重试机制(看 SLA)。本系统应:
|
||||
> - API 幂等(同 meter + 同 read_at 不重复建)
|
||||
> - 失败响应详细(让运营商知道哪条没收到)
|
||||
> - 重要数据有补传机制(运营商手动重推)
|
||||
|
||||
> [!question] 集抄数据与业户预存款自动扣的关系?
|
||||
> 集抄推数 → 生成 Bill → 触发 [[../prepaid/auto-deduction-design|预存款自动抵扣 job]](待实现)→ 业户预存款余额自动扣 + Bill 翻 Paid。
|
||||
>
|
||||
> 整条链**完全无人介入**,业户次日推送:"5 月电费 ¥168 已自动扣,余额 ¥X"。
|
||||
|
||||
## 异常分支
|
||||
|
||||
- 集抄掉线个别表 → [[read-single-meter-manual]] 兜底
|
||||
- 集抄数据异常用量 → [[exception-high-consumption]]
|
||||
- 集抄推错数据需修正 → [[exception-readings-locked-after-bill]]
|
||||
- 集抄 API 故障 → 运维 / 集抄运营商支持
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [[meter-vs-meter-reading]]
|
||||
- [[reading-source-and-photo-proof]]
|
||||
- [[bill-generation-pipeline]]
|
||||
- [[read-single-meter-manual]]
|
||||
- [[read-batch-via-excel-import]]
|
||||
- [[exception-high-consumption]]
|
||||
Reference in New Issue
Block a user