171 lines
6.8 KiB
Markdown
171 lines
6.8 KiB
Markdown
---
|
||
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]]
|