Files
uniprop-manual/prop-acc/scenarios/prepaid/close-resident-moveout.md

164 lines
5.7 KiB
Markdown
Raw Normal View History

2026-05-25 23:32:57 +08:00
---
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 自动关账对比)