--- title: prop-acc · meter · 场景 - 退役不换表(房屋拆除/业户永久弃用) aliases: - 退役不换表 - 永久弃用 - decommission-without-replacement - 场景-计量表退役不换 tags: - 场景 - prop-acc - 计量表 - 表管理 audience: - 业务人员 status: 已发布 sub_feature: meter last_review: 2026-05-26 code_version: 2026-05-22 --- # 场景:退役不换表(房屋拆除/业户永久弃用) 物理表**不再需要**(房屋拆除 / 业户永久搬走 / 商铺撤店 / 法定使用年限到不续装),系统**只退役不建新表**。`decommission_reason` 选 `Removed` / `Expired` 等,不走 `ReplaceMeterAction`。 ## 典型情境 > [!example] 真实情境(一):房屋拆除 > 嘉禾花园三期某栋老楼要拆迁重建,3 单元 1-6 层 30 户业主已全部搬走,准备拆楼。该单元所有水电气表(共 90 张)需要**永久退役**(房子拆了表也没了)。 > [!example] 真实情境(二):商铺撤店 > 一楼商铺(原餐饮店)经营 5 年后结业,装修拆除,新承租人方向未定。原餐饮店专用商业电表 + 燃气表暂不需要,**退役归档**(等新承租人入驻再视情况建新表)。 > [!example] 真实情境(三):法定使用年限到 > 一批 2010 年装的电表到 2026 年达到法定 15 年使用年限。物业评估: > - 部分表性能仍好 + 业户无投诉 → 送校验,合格继续用([[replace-broken-meter|换表]] 的 `Calibration` reason) > - 部分表频繁出问题 + 业户投诉 → 退役换新表(`Replaced`) > - 个别表所在房屋已无人居住 → **退役不换表**(`Expired`) ## 业务人员视角(王主管) ### 第 1 步:确认场景与原因 选择正确的 `decommission_reason`: | 场景 | 推荐 reason | |---|---| | 房屋拆除 | `Removed` | | 业户永久搬走且无新业户 | `Removed` | | 法定年限到不续装 | `Expired` | | 校验送检中暂停(后续可能恢复) | `Calibration`(暂停态,不算永久退役)| | 损坏不修(整体弃用)| `Damaged` | | (换新表替代) | `Replaced` — **走 [[replace-broken-meter]] 不是本场景** | ### 第 2 步:打开表 后台 → 计量表 → 按 asset 查找 → 进 `ViewMeter`(`is_active=true`)。 ### 第 3 步:`EditMeter` 改字段(或专用退役 Action,看 UI 设计) > [!info] UI 实现注意 > 当前实现可能**没有专门的"退役不换表"按钮**,而是通过: > - `EditMeter` 页直接改 `is_active=false` + 填 `decommissioned_at` + `decommission_reason` + `final_reading` > - 或自定义"退役"Action(若实现了) > > 看具体 `MeterForm` 的字段开关。若没专用按钮,走 EditMeter。 填字段: | 字段 | 填什么 | |---|---| | `is_active` | **false**(取消勾选)| | `decommissioned_at` | 2026-05-26 | | `decommission_reason` | `Removed`(本场景一) / `Expired` / `Damaged` | | `final_reading` | 退役那天的物理读数(若可读)/ 0(若表已被拆除无法读)| | 备注 | 关键说明,如 "三期 3-1-101 拆迁,房屋已拆,表无法回读" | ### 第 4 步:提交 系统: 1. 校验旧表 `is_active=true`(`EditMeter` 守护 `->visible(is_active)`) 2. update Meter:`is_active=false`, `decommissioned_at`, `decommission_reason`, `final_reading` 3. **不建新表**(与 [[replace-broken-meter|换表]] 的关键区别) ### 第 5 步:后续不抄表 `MetersNeedingReadingListWidget` 自动**不再显示**此表(`is_active=false` 过滤)。 历史 reading 保留,可查。 ## 批量退役 如果是单元拆除(90 张表一起退役),逐张走太慢。可能的批量方案: | 方案 | 实现 | |---|---| | **List 页批量 Edit**(若有 BulkAction) | 选中多张 → 批量改 `is_active=false` | | **Excel 导入"退役清单"** | 类似 `MeterInitializationImporter`,但当前没此功能(可补)| | **tinker 脚本**(运维)| `Meter::whereIn('id', [...])->update([...])`,**留 audit log** | 当前推荐:**业务量小的话逐张 EditMeter**;**业务量大的话联系运维**走 tinker(批量改字段 + 留事由记录)。 ## 系统流程 ```mermaid sequenceDiagram participant 王主管 participant Filament participant EditMeter participant 数据库 王主管->>Filament: 找到要退役的表 → ViewMeter → 编辑 Filament->>EditMeter: 渲染 form 王主管->>EditMeter: is_active=false + 填 decommissioned_at + reason + final_reading + 备注 EditMeter->>EditMeter: 校验 is_active=true(原状态)+ Policy update 权限 EditMeter->>数据库: update Meter 字段 数据库-->>Filament: ok Filament-->>王主管: 跳回 ViewMeter,状态显示"已退役 - Removed - 2026-05-26" ``` ## 退役后的状态 | 字段 | 退役后值 | |---|---| | `is_active` | false | | `decommissioned_at` | 2026-05-26 | | `decommission_reason` | `Removed` | | `final_reading` | 退役当天读数(或 0)| | `replaced_meter_id` | null(没有继任者)| | 后续是否能改字段 | **几乎不能**(`EditMeter` `visible(is_active)` 守护 + Policy 拦截)| | 后续是否能删 | 仅当**无任何 reading** 时(罕见)| 详见 [[decommission-and-locking]]"退役后的行为"段。 ## 与"换表"的关键差异 | 维度 | [[replace-broken-meter|换表(Replaced)]] | **退役不换表(本场景)** | |---|---|---| | `decommission_reason` | `Replaced` | `Removed` / `Expired` / `Damaged` | | 是否建新表 | ✅ 是,带 `-R1` 后缀 | ❌ 否 | | 业户后续是否要付水电费 | 是(用新表继续计费)| 否(无表无计费)| | 房屋状态 | 仍有人住 | 通常拆 / 撤 / 弃用 | | 触发 UI | `ReplaceMeterAction`(专用)| `EditMeter`(改字段)| ## 业户视角 业户**通常感知不到**这条系统操作,因为业户本人也搬走 / 房屋已拆。 如果是商铺撤店 / 房屋暂时无人(后续可能有新业户),系统层面表已退役,**未来如有新业户入住要重新装表 → 建新表(走 [[register-single-meter]]),不是"复活"旧表**。 ## 常见问题 > [!question] 退役表能"复活"吗(`is_active=false → true`)? > Policy 设计上**不允许**(`EditMeter` 在 `is_active=false` 时隐藏所有编辑)。如果真需要复活: > > - tinker 改字段(运维,留事由) > - 推荐做法:**建新表**替代,旧表保持退役状态(历史档案) > [!question] 退役表如何处理未付的历史 Bill? > 表退役**不影响**已生成的 Bill(Bill 关联 reading 关联表,数据完整)。业户该付的还是要付。 > > 若业户也搬走联系不上:走逾期催收流程(不在本场景)。 > [!question] 退役不换表后,房屋还在但暂无业户用电怎么办? > 房屋空置但有可能后续入驻 → **保留表 active 状态**,只是没有抄表数据(零用量)。每月账单可能仍生成(看 RatePlan 是否有 `min_amount`,详见 [[multiplier-and-tiered-pricing|min/max 封顶]])。 > > 真的永久不需要 → 退役。 > [!question] `decommission_reason` 选错了能改吗? > 退役后修改字段被 Policy 拦截。若改错只能 tinker 修(运维 + 留事由)。 > > **预防**:退役前确认场景,选对 reason。 > [!question] 退役了但表上物理装着没拆走怎么办? > 系统层面无区别(系统不管物理状态,只管"系统层面已退役")。物业人员需要**实际去现场拆表**(若房屋拆迁要拆楼)或**留存**(若只是商铺暂关)。系统不管理物理库存。 > [!question] 表的物理库存追踪? > 当前系统**不涉及**。物业的"实物计量表"库存(回收、报废、复用)在 ERP / 资产管理系统里处理,不在本子模块。 ## 异常分支 - 换表(有新表替代)→ [[replace-broken-meter]] - 误退役想撤销 → 困难,见上方"复活"问题 - 退役后无历史读数想删表 → 见 [[decommission-and-locking]]"退役表的物理删除"段 ## 相关文档 - [[decommission-and-locking]] - [[replace-broken-meter]] - [[meter-vs-meter-reading]] - [[multiplier-and-tiered-pricing]]