vault backup: 2026-05-26 00:18:06

This commit is contained in:
Willie
2026-05-26 00:18:06 +08:00
parent 7987adb131
commit 896265cad6
4 changed files with 592 additions and 3 deletions

View File

@@ -0,0 +1,191 @@
---
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]]