--- title: prop-acc · prepaid · 场景 - 业户搬走主动关账 aliases: - 关预存款账户 - 业户搬走关账 - close-resident-moveout - 场景-预存款搬走关账 tags: - 场景 - prop-acc - 预存款 - 结清 audience: - 业务人员 status: 已发布 sub_feature: prepaid last_review: 2026-05-25 code_version: 2026-05-22 --- # 场景:业户搬走主动关账 业户搬走、走完 [[refund-full-resident-moveout|全额退余]] 后,**业务人员手动**关账户。**与 deposit 不同,prepaid 不会自动关账**(零余额仍 Active),所以这步必须手动做。 ## 典型情境 > [!example] 真实情境 > 刘先生卖了房子,昨天走 [[refund-full-resident-moveout|全额退余]] 流程退完了 ¥3,200。账户余额 0,状态仍 Active(因为 prepaid 设计如此)。物业财务今天清理时主动关掉这个账户。 ## 业务人员视角(本场景**业户无感**) > [!info] 业户视角 > 业户已经搬走,通常**不感知**关账动作。小程序登录(若仍登)会看到账户从 ✅ Active 变 🔒 Closed,但流水照常可看。 ### 第 1 步:确认前提 - 业户已搬走(房屋已过户 / 退租) - 余额已退完(balance = 0) - 无未付账单 ### 第 2 步:打开账户 后台 → 预存款 → 找到刘先生账户(Active,balance=0)→ 进 `ViewPrepaidAccount`。 ### 第 3 步:点击 `CloseAccountAction`(标签"关账") > [!warning] 按钮可见性 > 守护:`canOperate()`(Active only)+ `balance == 0` + Policy `->authorize('close')`。Frozen / 有余额账户灰化。 Modal 表单: | 字段 | 填什么 | |---|---| | **关账事由(memo)** | 必填,如 "业户搬走,12-3-501 已过户,余额已退完" | ### 第 4 步:提交 系统调 `PrepaidAccount::close($memo)`: 1. 校验 `canOperate() && balance == 0` 2. 更新 `status=Closed` 3. 在 `meta.close_memo` 记关账事由 4. 在 `meta.closed_at` 记关账时间 **不产生** PrepaidTransaction / CollectionOrder / Receipt(状态变更)。 ### 第 5 步:无需通知业户 业户已搬走,通知意义不大。后台档案有完整记录(开户 → 历次充值 / 消费 → 退款 → 关账)。 ## 系统流程 ```mermaid sequenceDiagram participant 财务 participant Filament participant PrepaidAccount participant 数据库 Note over 财务: 业户搬走,退余已完成,balance=0 财务->>Filament: ViewPrepaidAccount → CloseAccountAction(memo) Filament->>PrepaidAccount: close(memo) PrepaidAccount->>PrepaidAccount: canOperate() && balance==0? yes PrepaidAccount->>数据库: 更新 status=Closed, meta.close_memo, meta.closed_at 数据库-->>Filament: ok Filament-->>财务: 成功 Note over 数据库: 无 Transaction / CO / Receipt ``` ## 完整流程(退余 + 关账) 业户搬走的**完整两步**: ```mermaid sequenceDiagram participant 业户 participant 财务 participant Filament participant Account 业户->>财务: 我要搬走,退预存款 财务->>Filament: RefundAction (全额) Filament->>Account: refund() → balance 0, status 仍 Active Note over Filament: prepaid 不自动关账,需手动 财务->>Filament: CloseAccountAction Filament->>Account: close() → status=Closed 财务-->>业户: 退款 + 关账完成 ``` ## 与 deposit 关账的差异 | 维度 | deposit close-after-zero-balance(自动)| prepaid close(本场景,手动)| |---|---|---| | 触发 | 最后一笔 refund/forfeit 使 balance=0 时自动 | 业务人员手动点 CloseAccountAction | | 是否需 CloseAction | 不需要(自动)| **需要** | | 业务背景 | 押金业务完结 | 业户搬走、长期不用 | | 业务人员介入度 | 0 | 1 次操作 | ## 常见问题 > [!question] 业户没搬走但想关账户? > 看具体情况: > - **业户主动要求关**:不推荐(以后想用还得开新户,**一户一账约束阻塞**)。建议劝业户留 Active 账户,余额 0 不影响什么 > - **业户彻底不想用预存款**:走 [[refund-full-resident-moveout|全额退]] → 本场景关账 > > 关闭账户是**业务终态**,反悔代价大。 > [!question] 没退完余额能关账吗? > **不能**。`CloseAccountAction` 守护 `balance == 0`。要关必须先退完。这与 deposit 一致。 > [!question] 关账后能反悔重开吗? > 不能(`canBeReopened` 永远 false)。新业务**开新账户**,但**一户一账阻塞**(详见 [[one-account-per-resident]] "已知设计 gap")。 > [!question] 业务上批量关账(例如批量清理多年未用的零余额账户)有功能吗? > 当前没有。如果要清理 100+ 账户,需要 List 页加批量操作,或运维 tinker。**优先级不高** —— 零余额 Active 账户对业务影响小,不主动清理也可。 > [!question] 关账后流水台账还能看吗? > 能。Closed 账户**只读模式**保留全部历史,流水台账 / Receipt 都可查询。 > [!question] 关账时业户还有未付账单怎么办? > 不会触发系统校验(系统不主动联动 Bill 模块),但**业务上是大问题**: > - 业户搬走 + 余额已退 + 关账户 → 未付账单挂业户身上 > - 业户搬走后催收困难 > > **预防** = 关账前业务人员**手动核对** 该业户是否有未付账单,有 → 先 [[consume-monthly-property-bill|抵清]] 再关账。 ## 异常分支 - 余额非 0 想关 → 先退完([[refund-full-resident-moveout]] / [[refund-partial-after-consume]]) - Frozen 账户想关 → 先 [[unfreeze-after-verification|解冻]] 再退再关 - 余额 0 但不想关(业户可能还用)→ [[close-with-zero-balance-decision]] ## 相关文档 - [[refund-full-resident-moveout]] - [[close-with-zero-balance-decision]] - [[account-state-machine]] - [[one-account-per-resident]] - [[../deposit/close-after-zero-balance]](deposit 自动关账对比)