--- 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]]