Files
2026-05-26 01:08:16 +08:00

7.2 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 · billing · 场景 - 拆账单(SplitBillAction)
拆账单
账单分摊
SplitBillAction
split-bill
场景-拆账单
场景
prop-acc
账单
调整
业务人员
财务
已发布 billing 2026-05-26 2026-05-22

场景:拆账单(SplitBillAction)

业户多人共住一户(房东 + 租户 / 合租),物业费 / 水电气按比例分摊到各自账户,业务人员走 SplitBillAction 把一张账单拆成多张

典型情境

[!example] 真实情境 12-3-501 房屋:

  • 房东陈先生(产权人)
  • 租户李先生(2026 年 1 月起租)

合同约定:物业费房东付,水电气租户付。但系统月初按"业户=陈先生"批量生成的:

  • 5 月物业费 ¥800(应给陈先生)
  • 5 月水费 ¥54(实际应租户付)
  • 5 月电费 ¥168(实际应租户付)
  • 5 月燃气 ¥30(实际应租户付)

业务人员王主管要把后 3 张账单重新分给租户李先生(从陈先生的账户拆出去)。

业务人员视角

第 1 步:确认拆单需求

业户来电话 / 合同约定:

  • 房东本人来报备"水电气以后租户付"
  • 看合同 / 租赁备案
  • 确认租户身份(可能已在 community_user_profiles 注册)

第 2 步:逐张拆单

(本场景默认逐张拆,不是一次 SplitAll)

后台 → 账单 → 找到 5 月水费 Bill → 进 ViewBill → 点 SplitBillAction(标签"拆账单")。

[!warning] 按钮可见性 看 SplitBillAction 守护(应该是 Unpaid + 业务权限)。Paid / Void 状态可能不允许拆(已付的钱难撤)。

第 3 步:Modal 填参数

字段 填什么
原账单 5 月水费 ¥54(陈先生)
拆分方式 按比例 / 按金额 / 按目标业户
新业户 李先生(下拉选)
拆给新业户的金额 ¥54(全部 → 全转给李先生 = 业户更换;或部分 → 拆成两张)
拆分原因 必填,如 "房东与租户合同约定:水费由租户付"

第 4 步:提交

SplitBillAction 业务逻辑(看实现):

模式 1:全转给新业户(本场景常见)

- 原 Bill #X(陈先生):状态翻 Void(原账单作废)+ 标 split_to=新 Bill ID
- 新建 Bill #Y(李先生):amount=54, status=Unpaid
- 关联(meta 记拆分来源)

模式 2:部分拆分(罕见)

- 原 Bill #X(陈先生):amount 改为 30(原 54 - 拆出 24)
- 新建 Bill #Y(李先生):amount=24
- 两张同存

[!info] 实施细节看代码 SplitBillAction 的具体行为(全转 vs 部分拆 vs 按比例)看 packages/prop-acc/src/Actions/Bills/SplitBillAction.php。本文按业务场景描述。

第 5 步:通知双方

  • 陈先生:"5 月水费已转给租户李先生付,您不必付了"
  • 李先生:"您 5 月水费 ¥54 新账单已生成,请于 6 月 15 日前付清"

第 6 步:重复对电费 / 燃气

逐张拆。3 张全拆完后:

  • 陈先生只欠 5 月物业费 ¥800
  • 李先生欠 5 月水费 + 电费 + 燃气 ¥252

系统流程(全转模式)

sequenceDiagram
    participant 业务
    participant Filament
    participant Action[SplitBillAction]
    participant DB
    participant Activity[activitylog]

    业务->>Filament: ViewBill(陈先生水费)→ SplitBillAction
    Filament->>Action: handle(bill=陈先生水费, mode=Full, target=李先生, reason)
    Action->>Action: 校验 bill.status (Unpaid)
    Action->>Action: 校验 target_resident 在同 community

    Action->>DB: 开启事务
    Action->>DB: 1. 原 Bill 翻 Void + meta.split_to=新 ID
    Action->>DB: 2. 新建 Bill(target=李先生, amount=54, status=Unpaid, meta.split_from=原 ID)
    Action->>Activity: log(event=split, properties)
    Action->>DB: 提交

    Filament-->>业务: 跳转新 Bill

业户视角

陈先生(原账单业户)

收到通知:

陈先生您好,您的 5 月水费 ¥54 已根据合同拆给租户李先生付。您原账单已作废,无需付款。

李先生(新账单业户)

收到通知:

李先生您好,您 5 月水费 ¥54 账单已生成(由 12-3-501 房屋的合同拆分而来),请于 6 月 15 日前付清。

拆单的几种业务场景

场景 频率 拆法
房东 / 租户合同分摊 中(本场景) 按费用类型分,水电气给租户
多业主分摊(共有产权) 罕见 按比例
公摊费用追溯 中(本月才发现某费用应分摊) 按户数
企业内部子公司分摊(商铺) 罕见 按合同

与"作废 + 重建"的对比

维度 拆账单(SplitBillAction) 作废 + 手动重建
单一操作 (一个 Action 完成) (走 2-3 个 Action)
关联追溯 (meta 标 split_from/to) (无系统关联)
审计 activitylog event=split 多条 activitylog(void + create)
灵活性 受 SplitBillAction 限制 更灵活(可改任意字段)
推荐场景 简单拆分(全转 / 部分按金额) 复杂拆分 / 拆完还要改其他字段

拆单后已付款的复杂情况

[!warning] 已付款 Bill 拆单的复杂度

如果原账单已付一部分(Partial 状态):

  • 原账单作废 → 已付的部分怎么办?
  • 退还给原业户 → 走作废 + 退款(void-paid-bill 类似)
  • 新账单上记 paid_amount? 不行(原业户付的钱不该算到新业户)

实施上 SplitBillAction 可能不允许 Partial 状态拆(只允许 Unpaid)。看具体实现。

推荐:拆单前先处理已付款(作废 + 退款 / 退现金后)再拆。

常见问题

[!question] 拆给的业户不存在(系统里没注册)怎么办? 先建业户档案(community 模块的 community_user_profiles)→ 然后拆。

[!question] 拆错了(应该拆给李先生,选成王先生)? 看实施:

  • 若新 Bill 仍 Unpaid → 走 delete-bill-unpaid + 重拆
  • 若已 Paid → 麻烦,需走作废 + 退款 + 重拆

[!question] 按比例自动拆所有账单(房东 50% / 租户 50% 物业费)? 当前 SplitBillAction 应是逐张操作。按比例批量拆需要业务方提需求 + 加 BulkSplitBillsAction(待实现)。

[!question] 拆单的合规性? 物业要确保:

  • 业户合同明确分摊条款
  • 双方书面同意拆分
  • 物业内部审批留底

系统层面只管账单数据,合规由物业流程保障。

[!question] 一张账单能拆成 3+ 份吗(多人合租 3 人均摊)? 看 SplitBillAction 设计。简单实现是一次拆 2 份(原账单 + 新账单)。要拆 3 份需 2 次操作:

  1. 第 1 次:原账单(¥54)→ 拆出 ¥18(给租户 A),原账单剩 ¥36
  2. 第 2 次:原账单(¥36)→ 拆出 ¥18(给租户 B),原账单剩 ¥18(给房东自己)

累加得到三份 ¥18 各自归一人。

异常分支

  • 拆错了 → 删除 / 作废新 Bill,原 Bill 状态可能要恢复(看实施)
  • 已付的拆 → 走 void-paid-bill 流程,复杂
  • 简单"换业户"(不拆,只改账单的 resident_id)→ 可能用 Edit Bill 直接改(若 Policy 允许),但强烈不推荐(破坏追溯)→ 用拆单更标准

相关文档