164 lines
6.5 KiB
Markdown
164 lines
6.5 KiB
Markdown
|
|
---
|
||
|
|
title: prop-acc · deposit · 场景 - 业户纠纷期间冻结账户
|
||
|
|
aliases:
|
||
|
|
- 冻结押金账户
|
||
|
|
- 纠纷冻结
|
||
|
|
- freeze-during-dispute
|
||
|
|
- 场景-押金账户冻结
|
||
|
|
tags:
|
||
|
|
- 场景
|
||
|
|
- prop-acc
|
||
|
|
- 保证金
|
||
|
|
- 冻结
|
||
|
|
audience:
|
||
|
|
- 业户
|
||
|
|
- 业务人员
|
||
|
|
status: 已发布
|
||
|
|
sub_feature: deposit
|
||
|
|
last_review: 2026-05-25
|
||
|
|
code_version: 2026-05-22
|
||
|
|
---
|
||
|
|
|
||
|
|
# 场景:业户纠纷期间冻结账户
|
||
|
|
|
||
|
|
业户和物业**就扣罚 / 退款 / 损坏归责发生纠纷**,沟通陷入僵局。物业先把账户**冻结**(任何资金动作禁止),等调解结果。
|
||
|
|
|
||
|
|
## 典型情境
|
||
|
|
|
||
|
|
> [!example] 真实情境
|
||
|
|
> 陈先生家装修完了,物业验收发现公共走道墙面损坏要扣 ¥800。陈先生坚持"墙是装修前就坏的,跟我没关系,拒绝扣罚"。物业找施工方核实暂无定论,**预计要 1-2 周走调解**。这段时间不能让账户继续动 —— 不能让陈先生提退款,也不能强行扣罚。物业先冻结账户。
|
||
|
|
|
||
|
|
## 业户视角
|
||
|
|
|
||
|
|
### 您会感受到什么
|
||
|
|
|
||
|
|
- 想申请退押金 → 物业说"账户冻结中,等纠纷处理完才能退"
|
||
|
|
- 微信小程序"我的押金账户"显示"⏸ 冻结"
|
||
|
|
- 不会被强行扣钱(冻结期间扣罚也不允许)
|
||
|
|
- 不会丢钱(余额冻结,只是不让动)
|
||
|
|
- 收到通知:"您的押金账户已冻结,事由:XXX"
|
||
|
|
|
||
|
|
> [!info] 冻结不等于扣钱
|
||
|
|
> 冻结只是**暂停所有资金动作**,余额仍是您的钱,等纠纷处理完会做正确处置(退 / 扣 / 部分扣余下退)。
|
||
|
|
|
||
|
|
### 您要做什么
|
||
|
|
|
||
|
|
- 配合物业调解(提供装修前后照片、施工合同等证据)
|
||
|
|
- 不要单方面追讨(系统层面已挡住,纠纷不在系统层面解决)
|
||
|
|
- 调解有结果后通知物业操作(走 [[unfreeze-after-mediation|解冻]] 或 [[force-close-refund|强制关账]] 等)
|
||
|
|
|
||
|
|
## 业务人员视角(物业财务 + 物业管理)
|
||
|
|
|
||
|
|
### 第 1 步:决定冻结
|
||
|
|
|
||
|
|
触发场景:
|
||
|
|
|
||
|
|
- 业户对扣罚归责有异议
|
||
|
|
- 装修方与业户之间纠纷,押金归属不明
|
||
|
|
- 涉及司法 / 仲裁,资金需保留待裁决
|
||
|
|
- 业户失联但有未决业务(暂留 Active 不合适)
|
||
|
|
|
||
|
|
### 第 2 步:打开账户
|
||
|
|
|
||
|
|
后台 → 保证金 → 账户列表 → 找到陈先生账户(Active,balance=5000)→ 进入 `ViewDepositAccount`。
|
||
|
|
|
||
|
|
### 第 3 步:点击 `FreezeAction`(标签"冻结")
|
||
|
|
|
||
|
|
右上角状态管理组。Modal 表单:
|
||
|
|
|
||
|
|
| 字段 | 填什么 |
|
||
|
|
|---|---|
|
||
|
|
| **冻结事由(reason)** | 必填,如 "业户对墙面损坏归责有异议,等待第三方核查" |
|
||
|
|
| **预计冻结时长** | 选填,如 "2 周" |
|
||
|
|
|
||
|
|
> [!warning] Policy 守护
|
||
|
|
> `FreezeAction` 调 `DepositAccount::canBeFreezed()`:仅 Active 状态可冻。Frozen / Closed 状态下按钮灰化。
|
||
|
|
|
||
|
|
### 第 4 步:提交
|
||
|
|
|
||
|
|
系统调 `DepositAccount::freeze(reason)`,事务内:
|
||
|
|
|
||
|
|
1. 校验 `canBeFreezed()`(Active only)
|
||
|
|
2. 更新 `status=Frozen`
|
||
|
|
3. 在 `meta.freeze_reason` 记冻结事由(可选)
|
||
|
|
4. 在 `meta.frozen_at` 记冻结时间
|
||
|
|
|
||
|
|
**注意:不产生 DepositTransaction**(冻结不是资金动作,只是状态变更)。
|
||
|
|
|
||
|
|
### 第 5 步:通知业户
|
||
|
|
|
||
|
|
后台 → 短信 / 微信通知陈先生"账户已冻结,事由 XXX,预计解冻时间 XXX"。
|
||
|
|
|
||
|
|
## 系统流程
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant 业户
|
||
|
|
participant 财务
|
||
|
|
participant Filament
|
||
|
|
participant 数据库
|
||
|
|
|
||
|
|
Note over 业户,财务: 业户与物业就 800 扣罚分歧,调解中
|
||
|
|
|
||
|
|
财务->>Filament: ViewDepositAccount → FreezeAction(modal, reason)
|
||
|
|
Filament->>数据库: 校验 canBeFreezed() (Active=true, ok)
|
||
|
|
Filament->>数据库: 更新 status=Frozen + meta.freeze_reason
|
||
|
|
数据库-->>Filament: ok
|
||
|
|
Filament-->>财务: 成功通知
|
||
|
|
|
||
|
|
Note over 数据库: 冻结期间所有 deposit/refund/forfeit 调用都会被守护拦截
|
||
|
|
```
|
||
|
|
|
||
|
|
## 冻结状态下的能力对照
|
||
|
|
|
||
|
|
| 操作 | Active 状态 | Frozen 状态 |
|
||
|
|
|---|---|---|
|
||
|
|
| `DepositAction`(缴款)| ✅ | ❌(`canDeposit=false`)|
|
||
|
|
| `RefundAction`(退款)| ✅ | ❌(`canWithdraw=false`)|
|
||
|
|
| `ForfeitureAction`(扣罚)| ✅ | ❌(`canWithdraw=false`)|
|
||
|
|
| `FreezeAction`(冻结)| ✅ | ❌(已是 Frozen)|
|
||
|
|
| `UnfreezeAction`(解冻)| ❌(已是 Active)| ✅ |
|
||
|
|
| `CloseAction`(关账)| ✅(余额 0) | ❌(必须先解冻再关)|
|
||
|
|
| `ForceCloseAction`(强制关账)| ❌ | ✅(`isFrozen && hasBalance`)|
|
||
|
|
| 看账户 / 看流水 | ✅ | ✅(只读)|
|
||
|
|
|
||
|
|
> [!info] Frozen + 有余额 + 想关账 = 用 ForceClose
|
||
|
|
> Frozen 状态下既不能退也不能扣,但万一就是要终结此账户(纠纷长期无果、业户失联多年、法律保留期满等),走 [[force-close-refund]] / [[force-close-forfeit]] / [[force-close-retain]]。详见 [[account-state-machine]]。
|
||
|
|
|
||
|
|
## 常见问题
|
||
|
|
|
||
|
|
> [!question] 冻结后能解冻吗?
|
||
|
|
> 当然能,走 [[unfreeze-after-mediation]]。冻结是临时状态,设计上就是"暂停"。
|
||
|
|
|
||
|
|
> [!question] 冻结期间业户能查询余额吗?
|
||
|
|
> 能。**只读**,业户看得到余额、流水台账、状态(Frozen)、冻结事由。
|
||
|
|
|
||
|
|
> [!question] 冻结期间业户能在小程序申请退款吗?
|
||
|
|
> 看小程序设计。当前 Action 假设手工触发,业户的小程序申请只是一个**业务申请单**,系统不会自动执行退款。物业人工处理时仍会被 `canWithdraw=false` 守护拦截,自然走流程。
|
||
|
|
|
||
|
|
> [!question] 冻结理由必填吗?
|
||
|
|
> 系统层面不强制(`reason` 参数可选)。**业务层面强烈推荐填**,审计追溯、调解复盘、与业户沟通都需要。
|
||
|
|
|
||
|
|
> [!question] 冻结时间长了系统会自动解冻吗?
|
||
|
|
> **不会**。冻结是手工操作,解冻也是手工。如果业务上需要"30 天自动解冻"之类的策略,需要单独写定时任务,但不推荐 —— 调解周期不固定,自动解冻容易在错误的时机解开。
|
||
|
|
|
||
|
|
> [!question] 多次冻结会有多个冻结理由吗?
|
||
|
|
> 当前只有 1 个 `meta.freeze_reason` 字段(后写覆盖前写)。如果想保留历史,可以在解冻时把当前 reason 抄进 `meta.freeze_history[]` 数组,再清空 `freeze_reason`。当前业务量未必需要,先简单实现。
|
||
|
|
|
||
|
|
> [!question] 冻结期间能改账户的其他字段吗?
|
||
|
|
> 看 Policy。当前 Policy 允许 update(改 payer 信息、备注等),但不允许 delete。如果有更严的"冻结期间什么都不能改"需求,在 `DepositAccountPolicy::update()` 加 `!isFrozen()` 检查。
|
||
|
|
|
||
|
|
## 异常分支
|
||
|
|
|
||
|
|
- 误冻结 → [[unfreeze-after-mediation]] 解开(reason 改 "误操作解除")
|
||
|
|
- 长期冻结无解 → [[force-close-refund]] / [[force-close-forfeit]] / [[force-close-retain]]
|
||
|
|
- 冻结期间业户失联 → 留 Frozen 到法律保留期满 → [[force-close-retain]]
|
||
|
|
|
||
|
|
## 相关文档
|
||
|
|
|
||
|
|
- [[account-state-machine]]
|
||
|
|
- [[unfreeze-after-mediation]]
|
||
|
|
- [[force-close-refund]]
|
||
|
|
- [[exception-deposit-on-frozen]]
|
||
|
|
- [[forfeit-damage-public-area]]
|