--- title: prop-acc · prepaid · 场景 - 首次开户充值 5000 aliases: - 首次充值预存款 - 开预存款账户 - deposit-first-time - 场景-首次充值预存款 tags: - 场景 - prop-acc - 预存款 - 充值 audience: - 业户 - 业务人员 status: 已发布 sub_feature: prepaid last_review: 2026-05-25 code_version: 2026-05-22 --- # 场景:首次开户充值 5000 业户**第一次**开预存款账户并充值。一户一账约束:同业户在同社区只能开一个,系统在提交时校验。 ## 典型情境 > [!example] 真实情境 > 张阿姨(12-3-501)每月物业费 ¥800,觉得月月去前台缴麻烦,跟物业管家说:"我一次充半年,以后从这里自动扣行不行?" > > 物业管家:"行,我帮您开个预存款账户,您充 ¥5,000 进去,以后账单出来自动从这里扣。" ## 业户视角 ### 第 1 步:跟物业说要充值 - 到前台 / 物业管家微信 / 小程序(若开通) - 表达"我想预存,以后自动扣账单" ### 第 2 步:确认充值金额 通常建议:**3-6 个月账单的金额**。少了频繁充值,多了占用资金。 - 月物业费 ¥800 → 充 ¥3,000-¥5,000(够 3-6 个月) - 加水电费一起 → 充 ¥5,000-¥10,000 ### 第 3 步:付款 支付方式: - **现金** - **微信扫码** - **POS 刷卡** - **银行转账** ### 第 4 步:拿收据 "预付款充值 ¥5,000"。 > [!info] 这张收据是普通正数收据 > 跟付物业费的收据长一样,只是文案不同。详见 [[transaction-types]]。 ### 第 5 步:后续 - 物业费账单出来 → 业务人员手动 / (未来)自动抵扣 → 您收到"物业费 ¥800" 收据 - 余额 ¥4,200 留账户里,下月继续扣 ## 业务人员视角 ### 第 1 步:核实业户身份 - 业户档案存在(否则要先建) - 业户当前社区(决定 community_id) ### 第 2 步:打开后台 后台 → 预存款 → **新建账户**(`ListPrepaidAccounts` 的 Create 按钮)。 ### 第 3 步:填表单 | 字段 | 填什么 | |---|---| | **业户档案(`community_user_profile_id`)** | 通过房号 / 手机号 / 姓名找到张阿姨 | | **社区(`community_id`)** | 自动带入业户所在社区(或手动选) | | **首次充值金额** | ¥5,000 | | **支付方式** | 现金 / 微信 / POS / 银行转账 | | **收款银行账户** | 微信/POS/转账选对应银行;现金可空 | | **备注** | 选填,如 "业户要求月度自动扣账" | > [!warning] 一户一账校验 > 系统提交时检查 `(community_id, community_user_profile_id)` 是否已存在: > - 已有 Active → 提示"该业户在本社区已有预存款账户,请直接充值" → 引导到 [[deposit-additional-topup]] > - 已有 Frozen → 提示"账户冻结中,请先解冻" > - 已有 Closed → 当前阻塞(见 [[one-account-per-resident]] "已知设计 gap" 段) > - 无 → 正常建账 ### 第 4 步:提交 系统在事务内: 1. 建 `PrepaidAccount`(`status=Active`,`balance=5000`) 2. 建 `CollectionOrder`(`collection_type=Prepaid`,`actual_amount=+5000`,`status=Completed`) 3. 建 `PrepaidTransaction`(`type=deposit`,`amount=5000`,`balance_before=0`,`balance_after=5000`,关联 CO) 4. 触发 `CollectionOrderCompleted` 事件 5. Listener `generatePrepaidReceiptItems` 建 Receipt + ReceiptItem"预付款充值 ¥5,000" ### 第 5 步:打印 / 发收据 后台收据列表找到新生成 Receipt → 打印 / 微信发业户。 ## 系统流程 ```mermaid sequenceDiagram participant 业户 participant 前台 participant Filament participant 数据库 participant 监听器 业户->>前台: 充 5000 预存款 前台->>Filament: ListPrepaidAccounts → Create Filament->>数据库: 校验 unique(community_id, profile_id) → 通过 Filament->>数据库: 开启事务 Filament->>数据库: 1. 建 PrepaidAccount (Active, balance=5000) Filament->>数据库: 2. 建 CollectionOrder (type=Prepaid, +5000, Completed) Filament->>数据库: 3. 建 PrepaidTransaction (deposit, 0→5000, 关联 CO) Filament->>监听器: 4. 触发 CollectionOrderCompleted 监听器->>数据库: 5. 建 Receipt ("预付款充值 ¥5,000") Filament->>数据库: 提交事务 Filament-->>前台: 成功 + 显示新账户 前台->>业户: 给收据 ``` ## 与 deposit 首次缴款的对比 | 维度 | 押金首次缴款 | **预存款首次充值** | |---|---|---| | 表单字段 | payer_type / fee_type / asset 等多个 | **只需 community_user_profile** | | 业户/缴款人差异 | 缴款人可与业户不同(装修公司代缴)| **缴款人必须是业户本人** | | CollectionType | Deposit | **Prepaid** | | 同业户多账户 | ✅ 多种费类多账户 | ❌ **一户一账** | | 关账机制 | 退完自动 Closed | 退完仍 Active(可继续充) | ## 常见问题 > [!question] 业户已有 Closed 账户,如何开新? > 当前系统阻塞(unique 约束)。可选: > - 联系运维 tinker 改账户名(罕见) > - 业务上说服业户用现金 / 微信付,不开新预存账户 > - 系统层加 `WHERE status != 'closed'` 软约束(待业务方拍板) > > 详见 [[one-account-per-resident]] "已知设计 gap" 段。 > [!question] 跨社区业户(同时住两个小区)怎么开? > 各社区独立账户(各自 unique)。在 A 社区开一个、B 社区开一个,各自独立余额。 > [!question] 充值金额有上限吗? > 系统层面无硬性上限。业务上建议: > - 不超过 12 个月账单合计(避免资金被冻在物业账上太久) > - 单笔大额(>10000)走银行转账,留银行流水 > - 单笔超 50000 需财务上报(防风险) > [!question] 充错金额(把 5000 录成 50000)怎么办? > 不要改流水。建一笔 `Refund` ¥45,000(走 [[refund-partial-after-consume]] 流程),业户拿到红字"预付款退款 ¥-45,000",事后审计完整可追。 > [!question] 业户不知道这账户怎么用,需要培训吗? > 关键点: > - 余额能抵物业费 / 水电费 / 其他账单 > - 余额随时可查(小程序 / 微信对账单) > - 余额随时可退(业务人员后台操作) > - 余额不够时账单不会自动扣 → 业户仍需补缴 ## 异常分支 - 业户已有账户 → [[deposit-additional-topup]] - 业户充错金额想撤 → [[refund-partial-after-consume]](走部分退款) - 业户后悔不想用预存了 → [[refund-full-resident-moveout]] + [[close-resident-moveout]] ## 相关文档 - [[prepaid-account-vs-transaction]] - [[account-state-machine]] - [[one-account-per-resident]] - [[transaction-types]] - [[deposit-additional-topup]] - [[consume-monthly-property-bill]]