vault backup: 2026-05-25 22:22:37

This commit is contained in:
Willie
2026-05-25 22:22:37 +08:00
parent d169be22a5
commit 5482164460
5 changed files with 673 additions and 16 deletions

View File

@@ -0,0 +1,182 @@
---
title: prop-acc · deposit · 场景 - 装修完无损全额退还
aliases:
- 全额退还押金
- 无损装修退押
- refund-full-no-damage
- 场景-押金全额退还
tags:
- 场景
- prop-acc
- 保证金
- 退款
audience:
- 业户
- 业务人员
status: 已发布
sub_feature: deposit
last_review: 2026-05-25
code_version: 2026-05-22
---
# 场景:装修完无损全额退还
最常见、最理想的退押场景。业户装修完物业验收**无损坏无违约**,押金原额退还,账户自动关闭。
## 典型情境
> [!example] 真实情境
> 张阿姨家装修完了(花了 6 周),物业例行验收公共走道、电梯、楼栋出入口,**没有任何损坏**。张阿姨当初交了 ¥5,000 装修保证金,现在物业要全额退给她。
## 业户视角
### 第 1 步:装修完通知物业验收
- 微信通知物业管家 / 直接到前台说"我家装修完了,来验收一下退押金"
- 通常物业 2-3 个工作日内派人到现场
### 第 2 步:验收无损,等退款
- 验收员检查公共区域、电梯、楼道、出入口
- 无损 → 出验收报告"无损,准予退押"
- 物业财务凭报告办理退款
### 第 3 步:收到退款
退款方式取决于您当初**怎么交的押金**:
| 当初缴款方式 | 退款方式 |
|---|---|
| 微信扫码 | 退微信 / 银行卡 |
| 现金 | 通常退到您银行卡(物业转账)|
| 银行转账 | 原账户回款 |
| POS 刷卡 | 原卡原路退 |
> [!info] 一两个工作日内到账
> 退款不是即时,物业财务批量处理(通常隔日)。
### 第 4 步:收到红字收据
您会收到一张**红字收据**:
> "装修保证金退还 ¥-5,000"
- 金额前的负号表示"退款"
- 这是中国会计的"红字凭证"标准写法
- 妥善保管,可作税务凭证
> [!success] 完成
> 账户自动关闭,不会再有变动。短信/微信通知:"您的押金账户已结清,余额 0"。
## 业务人员视角(物业财务)
### 第 1 步:核对验收报告
确认装修完验收通过、无损坏、无未结违约。
### 第 2 步:打开账户
后台 → 保证金 → 账户列表 → 找到张阿姨的账户(Active,balance=5000)→ 点击进入 `ViewDepositAccount`
### 第 3 步:点击 `RefundAction`(标签"退款")
右上角状态管理组里。Modal 表单:
| 字段 | 填什么 |
|---|---|
| **退款金额** | ¥5,000(默认带入当前余额,可改) |
| **退款渠道(PaymentChannel)** | 选张阿姨指定的回款方式(微信 / 银行转账 / POS) |
| **退款备注** | 选填,如 "装修验收无损,全额退还" |
> [!warning] 按钮可见性
> `RefundAction` 加了 `->authorize('refund')` Policy 守护:`update` 权限 + `canWithdraw()` 状态(Active only)。Frozen / Closed 账户该按钮灰化。
### 第 4 步:提交
系统调 `RefundFromDepositAccountAction`,事务内:
1. 校验账户 `canWithdraw()`(Active only)
2. 校验金额 ≤ 当前余额
3.`CollectionOrder`(`actual_amount=-5000` 红字,`status=Completed`)
4.`DepositTransaction`(`type=refund`,`amount=5000`,`balance_before=5000`,`balance_after=0`,关联红字 CO)
5. 更新 `DepositAccount.balance=0`
6. **余额清零自动关账** → 账户 `status=Closed`
7. 触发 `CollectionOrderCompleted` → Listener 建红字 Receipt"装修保证金退还 ¥-5,000"
### 第 5 步:走线下退款流程
- 微信 / POS 退款:在对应支付网关后台操作
- 银行转账:导出回款指令交银行
- 现金退款(罕见):张阿姨到前台领现金
### 第 6 步:把红字收据交给张阿姨
后台找到红字 Receipt → 打印 / 发微信。
## 系统流程
```mermaid
sequenceDiagram
participant 业户
participant 财务
participant Filament
participant RefundFromDepositAccountAction
participant 数据库
participant 监听器
业户->>财务: 装修完了,验收无损,退押金
财务->>Filament: ViewDepositAccount → RefundAction(modal)
Filament->>RefundFromDepositAccountAction: handle(account, 5000, channel)
RefundFromDepositAccountAction->>RefundFromDepositAccountAction: canWithdraw()? (Active=true)
RefundFromDepositAccountAction->>RefundFromDepositAccountAction: amount ≤ balance? (5000≤5000)
RefundFromDepositAccountAction->>数据库: 开启事务
RefundFromDepositAccountAction->>数据库: 1. 建 CollectionOrder (-5000 红字, Completed)
RefundFromDepositAccountAction->>数据库: 2. 建 DepositTransaction (refund, 5000→0)
RefundFromDepositAccountAction->>数据库: 3. balance=0,自动 status=Closed
RefundFromDepositAccountAction->>监听器: 4. 触发 CollectionOrderCompleted
监听器->>数据库: 5. 建 Receipt (装修保证金退还 ¥-5,000 红字)
RefundFromDepositAccountAction->>数据库: 提交事务
Filament-->>财务: 成功通知
财务-->>业户: 银行/微信退款 + 红字收据
```
> [!info] 自动关账
> 余额清零时,系统自动把账户翻成 `Closed`,不需要再单独走一次 [[close-after-zero-balance|关账]] 操作。
## 常见问题
> [!question] 业户当初付现金,退款必须退现金吗?
> 不强制。退款时选 `PaymentChannel` 可以与缴款时不同。常见做法是退到业户银行卡,详见 [[refund-with-payment-channel-switch]]。
> [!question] 退一半就行可以吗?
> 可以,Modal 表单的"退款金额"字段可以改成任意 ≤ 余额的数字。剩余款还在账户里,账户保持 Active。后续可继续退或扣或关。
> [!question] 退款后红字收据上的"-"是什么意思?
> 中国会计的"红字凭证"。负数表示资金方向是"从物业流出 / 回到业户",与缴款时的"+"对称。详见 [[red-receipt-design]]。
> [!question] 业户拿到红字收据后觉得"扣了我的钱"?
> 给业户解释:
> - "-5,000" 不是"扣 5,000",是"退还 5,000"
> - 黑字(无负号)是物业收到的钱,红字(有负号)是物业退给您的钱
> - 这是会计标准做法
> [!question] 退款失败(银行退回 / 微信渠道异常)怎么办?
> 当前系统**不处理这种回调**。物业财务需要在线下沟通业户,重新指定退款渠道,然后:
> - 如果账户已关:开新账户(不推荐)或 tinker 改流水(运维介入)
> - 推荐:**业务流程上避免** —— 退款前与业户确认渠道有效
> [!question] 已关账户能反悔吗?
> 不能。`canBeReopened()` 永远 false。详见 [[account-state-machine]] "为什么不允许 Reopen" 段。如果业户反悔继续装修要再交押金,**开新账户**。
## 异常分支
- 有损坏 → 先扣 [[forfeit-damage-public-area]],再走 [[refund-partial-after-forfeit]]
- 退款渠道与缴款不同 → [[refund-with-payment-channel-switch]]
- 退款时账户 Frozen → 走 [[force-close-refund]] 强制关并退
## 相关文档
- [[deposit-account-vs-transaction]]
- [[account-state-machine]]
- [[red-receipt-design]]
- [[refund-partial-after-forfeit]]
- [[close-after-zero-balance]]