6.8 KiB
title, aliases, tags, audience, status, sub_feature, last_review, code_version
| title | aliases | tags | audience | status | sub_feature | last_review | code_version | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| prop-acc · meter · 场景 - 单张表后台手动录入 |
|
|
|
已发布 | meter | 2026-05-26 | 2026-05-22 |
场景:单张表后台手动录入
抄表员单张表录入读数。最基础的抄表方式 —— 适合小规模物业 / 个别补抄 / 集抄掉线的兜底。
典型情境
[!example] 真实情境 嘉禾花园抄表员李师傅本月集抄系统有 5 户掉线(IoT 表故障 / 信号不好)。这 5 户他亲自上门读表,然后回办公室后台单条录入。
本场景:其中一户(张阿姨 12-3-501 的电表 E-501,本月读数 5,280)。
抄表员视角
第 1 步:现场读表
到张阿姨家:
- 找到电表(通常装在玄关 / 门外配电箱)
- 看清表头数字:5280
- 拍照存证(
photo_url,见 reading-source-and-photo-proof + read-with-photo-proof) - 记录(写在抄表本子上或手机备忘)
第 2 步:回办公室录入
打开手机 App / 浏览器后台 → 计量表 → 找 E-501 → 进 ViewMeter → 滚动到下方"抄表读数"(MeterReadingsRelationManager)→ 点 "新增" 按钮。
替代路径:抄表员手机 App 直接现场录入,无需回办公室。当前若有此 App 走集成接口,无此 App 走后台。
第 3 步:填表单
| 字段 | 填什么 |
|---|---|
抄表日期(read_at) |
2026-05-26(默认今天) |
当前读数(current_reading) |
5280(物理表头数字) |
来源(source) |
manual(默认) |
拍照(photo_url) |
上传现场照片(若有要求) |
操作员(operated_by) |
自动填李师傅(当前登录用户) |
备注(memo) |
选填,如 "集抄掉线手动补抄" |
[!info] previous_reading 不用填 系统自动从该 meter 最近一条 reading 取(或从
Meter.initial_reading取)作为 previous,自动算consumption = (current - previous) × multiplier。例:上次抄表 5050 → previous=5050 → consumption = (5280 - 5050) × 1 = 230 度
第 4 步:提交
系统:
- 校验
meter.is_active=true(退役表不能抄,详见 decommission-and-locking) - 校验
current_reading >= previous_reading(若有此守护;否则即"读数倒走"异常,见 exception-high-consumption 相关) - 算 consumption
- 建 MeterReading(
bill_id=null,即未生成账单) - (可选)若配置了"抄表即生成账单",自动调
GenerateBillsFromMeterReadingsAction(详见 bill-generation-pipeline)
提交后跳回 ViewMeter,新 reading 显示在列表第一条。
业务人员视角
业务人员通常不直接抄表,但会做:
- 审核抄表员录入的数据(看高用量异常,见 exception-high-consumption)
- 生成账单(批量,月底统一,走
GenerateBillsFromMeterReadingsAction) - 核对抄表完成率(
MetersNeedingReadingListWidget)
系统流程
sequenceDiagram
participant 李师傅[抄表员]
participant Filament
participant MeterReadingsRelationManager
participant 数据库
Note over 李师傅: 现场读表 5280
李师傅->>Filament: ViewMeter(E-501) → 新增 reading
Filament->>MeterReadingsRelationManager: 渲染 form
李师傅->>MeterReadingsRelationManager: 填 current=5280 + 上传照片 + 提交
MeterReadingsRelationManager->>数据库: 校验 meter.is_active=true
MeterReadingsRelationManager->>数据库: 查 previous_reading(上次 5050)
MeterReadingsRelationManager->>数据库: 算 consumption=(5280-5050)*1=230
MeterReadingsRelationManager->>数据库: 建 MeterReading(source=manual, operated_by=李师傅, photo_url, bill_id=null)
Filament-->>李师傅: 显示新 reading 230 度
业户视角
业户无感知 —— 张阿姨可能根本不知道李师傅上门读了表。
下个月物业账单出来,显示"5 月电费:用电 230 度,¥XXX",业户看明白即可。如果有异议 → 物业拿出 photo_url 照片证明。
何时用本场景
| 场景 | 用本场景? |
|---|---|
| 集抄系统正常运行 | ❌ 走 read-via-iot-remote-source |
| 集抄系统某户掉线 | ✅ 个别补抄 |
| 小规模物业未上集抄(全靠人工) | ✅ 但建议升级到 [read-batch-via-excel-import] |
| 抄表数据需要事后修正 | ❌ Reading 不可改,见 exception-readings-locked-after-bill |
| 业户家暂时无人,无法抄 | 抄表员标"未抄",月底再补 |
常见问题
[!question] 读数倒走(current < previous)怎么办? 看 Form 是否有守护。若允许提交:系统建 reading,consumption 是负数 → 后续生成 Bill 时 Calculator 可能抛错 / 给 0 / 给 min_amount。
业务上读数倒走通常意味着:
- 表故障(乱跳)→ 走 replace-broken-meter
- 抄表录错(可能是本月录上月数 / 笔误)→ 立即改(若没生成 Bill 可改;若有 Bill 见 exception-readings-locked-after-bill)
- 业户偷电 / 物理改表 → 严重事件,法务介入
[!question] 读完一户表才发现没拍照怎么办? 看物业政策严格度:
- 必须拍照:回去补拍 → 上传(理论上事后照片也是凭据,但不如当场)
- 建议拍照:本次录入时备注"未拍照" → 业户事后无异议则 OK
长期不拍照 = 业户争议时无凭证 = 物业被动。
[!question] 抄表日期填错了能改吗? Reading 不可改(decommission-and-locking 第 2 锁)。若
read_at填错且没生成 Bill → 见 Policy 是否允许删 + 重建。若已生成 Bill → 复杂,走作废 Bill 流程(exception-readings-locked-after-bill)。预防:Form 默认带入今天日期,改之前确认。
[!question] 一次录多张表(几十户)用单录效率太低? 是的。走 read-batch-via-excel-import 批量导入或 read-via-iot-remote-source IoT 自动。本场景适合 1-10 张表的个别情况。
[!question] 录入后立即生成 Bill 吗? 看配置:
- 抄表即生成 Bill:Form 提交后自动调
GenerateBillsFromMeterReadingsAction(每条 reading 立即变 Bill)- 月底批量生成 Bill:Form 提交后只建 reading,月底业务人员统一触发批量生成
当前实现看具体 Filament 配置,两种都支持。
异常分支
- 批量录入 → read-batch-via-excel-import
- 集抄自动 → read-via-iot-remote-source
- 拍照存证 → read-with-photo-proof
- 读完发现是错的 → 立即改(无 Bill)/ exception-readings-locked-after-bill(有 Bill)
- 异常用量 → exception-high-consumption