Files
uniprop-manual/prop-acc/scenarios/prepaid/close-resident-moveout.md
2026-05-25 23:32:57 +08:00

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 · 场景 - 业户搬走主动关账
关预存款账户
业户搬走关账
close-resident-moveout
场景-预存款搬走关账
场景
prop-acc
预存款
结清
业务人员
已发布 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):

  1. 校验 canOperate() && balance == 0
  2. 更新 status=Closed
  3. meta.close_memo 记关账事由
  4. 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 再关账。

异常分支

相关文档