7.4 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 · 场景 - 手动建单(临时收费/调整账单) |
|
|
|
已发布 | billing | 2026-05-26 | 2026-05-22 |
场景:手动建单(临时收费/调整账单)
业务上不属于周期任务、不属于抄表的临时收费,通过 CreateBill 后台手工建一张账单。例如:维修费分摊、特别活动费、单次罚款、跨期补开账单。
典型情境
[!example] 真实情境(一):公共维修费分摊 嘉禾花园 3 单元电梯坏了维修,总成本 ¥15,000。物业公司决定全单元 30 户业户分摊(每户 ¥500)。这种"临时性的、不属周期 / 抄表"的费用,业务人员逐户手工建账单(或选定业户清单后批量手工)。
[!example] 真实情境(二):个别业户的特别罚款 张阿姨违反小区车位管理规定(占用应急车位 1 小时),物业罚款 ¥100。业务人员单独给张阿姨建一张账单。
[!example] 真实情境(三):跨期补开账单 业务人员发现陈先生 4 月物业费没生成(系统月初批量时陈先生数据有问题),5 月才发现。需补开 4 月账单。
业务人员视角
第 1 步:打开 CreateBill
后台 → 账单 → 列表 → 顶部 "新建" 按钮 → 进 CreateBill 页面。
第 2 步:填表单(BillForm)
| 字段 | 填什么 |
|---|---|
| 社区(community_id) | 嘉禾花园(若多社区可选) |
| 业户(resident_id) | 张阿姨(下拉选) |
| 房屋(asset_id) | 12-3-501(自动带入或手选) |
| 费用类型(fee_type_id) | 选合适的 FeeType(物业费 / 杂费 / 罚款 / ...) |
| 账单类型(bill_type) | 通常选 OneTime 或 Adjustment(看 BillType 枚举) |
| 金额(amount) | ¥500(电梯维修分摊) |
| 期次 | 选填(临时账单可不填,或填发生月) |
| 到期日(due_at) | 6 月 15 日 |
| 备注(memo) | 强烈推荐填,说明缘由,如 "3 单元电梯维修分摊(2026-05),总成本 ¥15,000 ÷ 30 户" |
[!warning] Policy 守护
CreateBill需要bill.create权限。
第 3 步:提交
系统:
- 校验字段(business / asset / fee_type 存在)
- 建 Bill(
status=Unpaid,sourceable_type=null/ 或自定义) - 写 activitylog(单条 Bill 创建,subject=Bill)
- 跳到
ViewBill页面
第 4 步:通知业户
通常需要业务人员单独通知(临时账单不在月度自动推送范围内):
- 微信 / 短信:"张阿姨,您本月有一笔电梯维修分摊费 ¥500,请于 6 月 15 日前付清"
- 附备注说明
第 5 步:批量手工建(电梯维修分摊场景)
如果是分摊给 30 户业户,逐户建效率低。当前没有"批量手动建" UI,只能:
- 逐户走
CreateBill(30 次) - 或运维 tinker 脚本(SQL 批量 INSERT)
- 或要求业务方加"批量手工建"功能
未来可加:BulkCreateBillsAction(给定业户清单 + 模板 → 批量建)。
系统流程
sequenceDiagram
participant 业务[业务人员]
participant Filament
participant CreateBill
participant Activity[activitylog]
participant DB
业务->>Filament: ListBills → 新建 → CreateBill
Filament->>CreateBill: 渲染 form
业务->>CreateBill: 填业户 / 金额 / 备注 / 提交
CreateBill->>DB: 校验 fields
CreateBill->>DB: 建 Bill(status=Unpaid, bill_type=OneTime, sourceable=null)
CreateBill->>Activity: log(event=created, subject=Bill)
CreateBill-->>Filament: 跳转 ViewBill
Filament-->>业务: 显示新账单
业户视角
业户收到通知:
张阿姨您好,您本月有一笔账单:
- 电梯维修分摊费:¥500
- 备注:3 单元电梯维修分摊
- 到期日:6 月 15 日
请通过微信小程序 / 前台 / 预存款 任选方式付款。
业户:
- 看明白 → 付(collect-payment-single)
- 不接受 → 投诉 / 走纠纷流程(可能 suspend-bill 挂起)
三种典型情境的不同处理
情境 1:电梯维修分摊
| 字段 | 值 |
|---|---|
bill_type |
OneTime |
fee_type_id |
"维修分摊费"(若有此 FeeType,否则用通用"杂费") |
amount |
¥500 |
| 备注 | 详细说明(分摊依据 + 总成本) |
业务上还要备齐资料:维修发票、户主同意决议(若有业主大会决议)、分摊依据。这些不在系统(物业备查)。
情境 2:违规罚款
| 字段 | 值 |
|---|---|
bill_type |
OneTime |
fee_type_id |
"罚款"(若有此 FeeType) |
amount |
¥100 |
| 备注 | 违规事由 + 处罚依据(管理规定第 X 条) |
业务上要 业户书面确认(违规事实),否则业户可能投诉 / 拒付。
情境 3:跨期补开
| 字段 | 值 |
|---|---|
bill_type |
Periodic(若是月物业费的补开) |
period |
填实际期次(4 月) |
amount |
同正常月物业费 |
| 备注 | "4 月物业费补开,原因 XXX" |
业务人员需要:
- 确认陈先生 4 月确实欠物业费(没有遗漏)
- 与陈先生沟通(突然补开他可能困惑)
与周期账单 / 计量账单的对比
| 维度 | 周期账单(create-periodic-property-fee) | 计量账单(create-meter-bill-auto) | 手动账单(本场景) |
|---|---|---|---|
| 触发 | 业务人员批量生成 | 抄表完成自动 | 业务人员单笔手工 |
| 数量 | 一次 100-1000 张 | 一次 N 张(对应 reading 数) | 一次 1 张 |
| 金额来源 | RatePlan + 房屋参数 | RatePlan + 用量计算 | 业务人员手填 |
| 业务场景 | 月度固定收费 | 抄表后变动收费 | 临时收费 / 调整 |
| sourceable | null / 周期任务 | MeterReading | null |
| 频率 | 每月 1 次 | 每月 1 次 | 不定时 |
常见问题
[!question] 手动建单和周期账单的 fee_type 重复怎么办? 例如本月已经有"5 月物业费"账单,业务人员又手工建一张同 fee_type 同期次的 → 数据库 unique 约束可能拦截(若有),否则会有两张并存。
预防:手动建单前确认是否已有同类账单。
[!question] 手动建单金额没限制吗? 系统层面无限制。业务上应有审核流程(高金额 > X 元 应主管审批,但当前系统不强制此审批流)。
[!question] 跨期补开的账单影响月度报表吗? 看报表的查询:
- 按
created_at(账单创建时间)→ 影响 5 月报表(实际是 5 月创建)- 按
billing_period_start(账单期次)→ 影响 4 月报表不同报表用不同维度。月度对账通常按期次。
[!question] 手动建单后业户拒付? 走标准流程:
- 沟通 → 协商
- 不接受 → suspend-bill 等争议解决
- 调解失败 → 物业法务介入(走线下,系统不参与司法)
[!question] 业务人员误建一张账单怎么撤? 若立即发现:delete-bill-unpaid(Unpaid 无付款)。 若已发出:[void-paid-bill|作废]。
异常分支
- 误建 → 立即删除 delete-bill-unpaid
- 业户拒付 → suspend-bill
- 已发现要修正金额 → 作废 + 新建 void-paid-bill
- 批量手工建 → 待业务方提需求 + 加 BulkCreateBillsAction