5.7 KiB
title, aliases, tags, audience, status, sub_feature, last_review, code_version
| title | aliases | tags | audience | status | sub_feature | last_review | code_version | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| prop-acc · prepaid · 场景 - 业户搬走主动关账 |
|
|
|
已发布 | prepaid | 2026-05-25 | 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):
- 校验
canOperate() && balance == 0 - 更新
status=Closed - 在
meta.close_memo记关账事由 - 在
meta.closed_at记关账时间
不产生 PrepaidTransaction / CollectionOrder / Receipt(状态变更)。
第 5 步:无需通知业户
业户已搬走,通知意义不大。后台档案有完整记录(开户 → 历次充值 / 消费 → 退款 → 关账)。
系统流程
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
完整流程(退余 + 关账)
业户搬走的完整两步:
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