Files
uniprop-manual/prop-acc/scenarios/meter/read-single-meter-manual.md
2026-05-26 00:18:06 +08:00

171 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: prop-acc · meter · 场景 - 单张表后台手动录入
aliases:
- 手动抄表单录
- 单张表录入
- read-single-meter-manual
- 场景-单张表手动抄表
tags:
- 场景
- prop-acc
- 计量表
- 抄表
audience:
- 业务人员
- 抄表员
status: 已发布
sub_feature: meter
last_review: 2026-05-26
code_version: 2026-05-22
---
# 场景:单张表后台手动录入
抄表员**单张表**录入读数。最基础的抄表方式 —— 适合小规模物业 / 个别补抄 / 集抄掉线的兜底。
## 典型情境
> [!example] 真实情境
> 嘉禾花园抄表员李师傅本月集抄系统**有 5 户掉线**(IoT 表故障 / 信号不好)。这 5 户他亲自上门读表,然后回办公室后台单条录入。
>
> 本场景:其中一户(张阿姨 12-3-501 的电表 E-501,本月读数 5,280)。
## 抄表员视角
### 第 1 步:现场读表
到张阿姨家:
1. 找到电表(通常装在玄关 / 门外配电箱)
2. **看清表头数字**:5280
3. **拍照存证**(`photo_url`,见 [[reading-source-and-photo-proof]] + [[read-with-photo-proof]])
4. 记录(写在抄表本子上或手机备忘)
### 第 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 步:提交
系统:
1. 校验 `meter.is_active=true`(退役表不能抄,详见 [[decommission-and-locking]])
2. 校验 `current_reading >= previous_reading`(若有此守护;否则即"读数倒走"异常,见 [[exception-high-consumption]] 相关)
3. 算 consumption
4. 建 MeterReading(`bill_id=null`,即未生成账单)
5. (可选)若配置了"抄表即生成账单",自动调 `GenerateBillsFromMeterReadingsAction`(详见 [[bill-generation-pipeline]])
提交后跳回 `ViewMeter`,新 reading 显示在列表第一条。
## 业务人员视角
业务人员**通常不直接抄表**,但会做:
- **审核**抄表员录入的数据(看高用量异常,见 [[exception-high-consumption]])
- **生成账单**(批量,月底统一,走 `GenerateBillsFromMeterReadingsAction`)
- **核对**抄表完成率(`MetersNeedingReadingListWidget`)
## 系统流程
```mermaid
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]]
## 相关文档
- [[meter-vs-meter-reading]]
- [[reading-source-and-photo-proof]]
- [[bill-generation-pipeline]]
- [[read-batch-via-excel-import]]
- [[read-via-iot-remote-source]]
- [[exception-high-consumption]]