多人AA记账的难点,往往不是求和,而是把不同业务事实放进了同一个字段。本文结合AA我来算微信小程序,拆解付款人、承担人、消费状态和结清标记之间的边界。
我是AA我来算的运营,本文根据项目已有业务能力整理,是产品方的实践介绍。下面的数据与TypeScript结构是用于说明业务的示例,不是生产源码,也不讨论资金清算或支付通道实现。
1. 付款人不一定承担这笔消费
四个人出游,A订酒店,B付晚餐,C替B和D付一段打车费,C本人没有坐这段车。
如果账单只有一个payer字段,再默认所有账本成员分摊,就会把C错误地算进车费。账本成员集合、实际付款人、单笔承担人是三种信息。
AA我来算的消费记录将垫付人与分摊明细分开:垫付人可以不在这笔承担人范围中;每笔仍需要有明确的承担人,且分摊合计等于该笔金额。
一个说明用的结构可以写成:
ts
type Share = { memberId: string; amountFen: number };
type Expense = {
amountFen: number;
paidBy: string;
shares: Share[];
status: 'confirmed' | 'pending' | 'excluded' | 'personal';
};
这里用整数分表达金额。结构的重点是shares独立于paidBy,而不是所有消费都复用同一份成员名单。示例省略了日期、权限、编辑历史等字段,不能直接当完整账务系统设计。
2. 先算承担,再与垫付相抵
用一组虚构数据说明,金额单位为元:
| 消费 | 垫付人 | 承担人 | 金额 |
|---|---|---|---|
| 酒店 | A | A、B、C、D | 600 |
| 晚餐 | B | A、B、C | 240 |
| 代付车费 | C | B、D | 120 |
总费用960元。逐笔分摊后,A承担230,B承担290,C承担230,D承担210。
定义一个明确的符号约定:净额=已垫付-应承担。正数表示应收,负数表示应付。
| 成员 | 已垫付 | 应承担 | 净额 |
|---|---|---|---|
| A | 600 | 230 | +370 |
| B | 240 | 290 | -50 |
| C | 120 | 230 | -110 |
| D | 0 | 210 | -210 |
所以可以由B、C、D分别给A转50、110、210元。C虽然不承担那段车费,但仍可能因酒店和晚餐形成整体应付;不能把"某笔代付要收回的钱"直接当作"整本账的最终应收"。
3. 三个值得检查的不变量
第一,每笔分摊明细合计等于该笔消费金额。
第二,同一结算范围内,全部成员的垫付合计等于承担合计,净额合计为零。
第三,转账建议执行后,每个人的剩余净额都应归零;不能只看收付款总和相等,就忽略某个成员的方向错了。
除不尽到分的均摊还需要处理尾差。例如100元由3人承担,应是3334、3333、3333分的一种确定分配,不能给每人都显示33.33元后把剩余1分丢掉。确定性规则和可解释的明细,比前端把数字显示得整齐更重要。
4. 待处理消费不应悄悄进入共同结算
AA我来算当前共同结算只纳入已确认的共同消费;个人消费、待处理消费和已排除消费不进入AA结算。
这样做的价值是把"系统还不确定这笔怎么记"与"大家已经确认这笔需要分摊"区分开。图片识别出金额,不等于付款人和承担人也已经正确;成员变化后需要处理的异常消费,也不能在用户不知情时继续影响应付款。
对应的交互不只是一个最终数字,还需要让用户看到待处理项目,并能核查每个人垫了哪些、承担了哪些。
5. 标记结清不等于资金到账
分账建议、个人结清标记和真实资金流是不同状态。
AA我来算给出转账方向和金额,实际转账由用户在外部完成。"我已结清"只是一方记录的外部结清情况,不是支付成功回调,也不是对方确认到账。
如果消费或承担范围发生变化,旧结算结果对应的标记不应直接套到新结果上。当前产品将个人标记关联到对应结算结果;账变了,就应重新核对,而不是继续展示一个失去上下文的"全部付完了"。
6. AI辅助录入,确定性规则负责算账
AA我来算提供文字、图片识别和语音转文字辅助记账,也支持手动录入。产品里需要一直区分两件事:理解用户说了什么,与根据已确认明细计算结果。
例如"我帮他们两人付了车费,我自己没坐",录入环节要保留代付语义,不能默认把说话人也加入承担人。识别不清时应让用户核对;后续结算仍使用确认后的账单与分摊明细,不靠生成一段看似合理的文字猜金额。
7. 放回产品流程里验证
可以用三个小场景检查一个分账产品是否表达清楚业务:付款人不参与承担、只有部分成员参加活动、金额无法整除到分。再补一个状态变化场景:标记结清后修改消费,是否提示重新核对。
如果你关注这种业务体验,可以在微信搜索"AA我来算"小程序,用演示账目查看多人账本、逐笔承担人和结算明细。它适合旅行、聚餐等共同开销的记录与计算,不是收付款通道,也不替参与者决定分摊约定。
这也是本文想分享的产品设计取舍:先表达清楚谁付、谁承担、哪笔已确认,再谈如何减少手工对账。