账单统计

场景

付费套餐上线后,第一批用户开始付费。

但财务部门找到我:

Finance Chat
周一 09:30

需求:

  1. 每月自动生成账单
  2. 统计每个用户的调用量
  3. 计算超额部分
  4. 发送账单给用户

问题分析

我查了一下当前的统计系统:

问题:

  1. 统计表每月聚合一次,不是实时的
  2. 没有按 API 分别统计
  3. 没有按时间段统计(用于计算超限)
  4. 没有计费相关的字段

账单系统设计

需求分析

账单需要包含:
1. 基本信息(用户、周期、套餐)
2. 使用情况(总调用量、各 API 调用量)
3. 费用明细(基础费用、超额费用)
4. 支付状态

计费规则:
- 基础费用:套餐月费
- 超额费用:超出套餐部分按次计费
- 超额价格:¥0.001/次(1 元 1000 次)

数据库设计

账单生成逻辑

按用户生成月度账单

设计流程
按用户生成月度账单
  1. 步骤 1:生成账单并记录计费明细
  2. 步骤 2:计算用量、账单或套餐状态
  3. 步骤 3:读取用户套餐、调用量和当前计费周期
  4. 步骤 4:根据套餐、用量和支付状态选择计费处理路径
关注点:计费准确性、幂等处理、账单追溯和用户提示。

批量生成账单

月底定时任务

设计流程
月底定时任务
  1. 步骤 1:生成账单并记录计费明细
  2. 步骤 2:计算用量、账单或套餐状态
  3. 步骤 3:读取用户套餐、调用量和当前计费周期
  4. 步骤 4:根据套餐、用量和支付状态选择计费处理路径
关注点:计费准确性、幂等处理、账单追溯和用户提示。

账单查询 API

获取用户账单列表

设计流程
获取用户账单列表
  1. 步骤 1:生成账单并记录计费明细
  2. 步骤 2:计算用量、账单或套餐状态
  3. 步骤 3:校验身份、密钥或权限
关注点:计费准确性、幂等处理、账单追溯和用户提示。

获取单个账单详情

设计流程
获取单个账单详情
  1. 步骤 1:生成账单并记录计费明细
  2. 步骤 2:计算用量、账单或套餐状态
  3. 步骤 3:校验身份、密钥或权限
关注点:计费准确性、幂等处理、账单追溯和用户提示。

账单发送

自动发送账单

设计流程
自动发送账单
  1. 步骤 1:生成账单并记录计费明细
  2. 步骤 2:计算用量、账单或套餐状态
  3. 步骤 3:读取用户套餐、调用量和当前计费周期
  4. 步骤 4:根据套餐、用量和支付状态选择计费处理路径
关注点:计费准确性、幂等处理、账单追溯和用户提示。

练习

练习 1

月底定时任务因为网络问题重试了一次,同一个用户的账单可能被生成两遍。你会怎么避免重复扣费?

参考答案 (3 个标签)
计费 幂等 账单系统

账单系统最重要的是可追溯和幂等,不能只靠“任务应该只跑一次”。

可以这样设计:

  1. 账单唯一键:用 user_id + billing_period 作为唯一约束,同一周期只能有一张正式账单。
  2. 生成过程可重试:重试时先查账单是否已存在,存在就直接返回,不再重复创建。
  3. 费用明细可追溯:账单金额来自明细表,明细也要有唯一标识,避免重复写入。
  4. 支付和账单分开:生成账单不等于扣款,扣款也要有独立的支付流水号和幂等键。

验证时可以故意让任务中途失败,再重复执行,检查账单数量、明细数量和支付流水是否都没有重复。

当前架构