1
0
forked from erp-dev/erp
Files
erpnew/docs/statements.md

5.7 KiB
Raw Blame History

Statements 对账单 API

本文件专门描述客户与供应商对账单接口的请求与响应结构。所有接口均位于 /api/v1/,默认需要登录并具备员工身份,且只返回当前员工所属商户的数据。


1. 功能概览

  • 客户对账单:聚合指定客户的销售单、销售退货单、收款单,统一展示正负金额、当前余额以及累欠金额。
  • 供应商对账单:聚合指定供应商的采购单、采购退货单、付款单,展示待付金额的增减与余额。
  • 排序规则:固定按 occurred_at -> recorded_at -> source_id 倒序排列,不支持外部修改。
  • 金额方向
    • 客户:销售单记入 positive_amount(增加应收),销售退货/收款记入 negative_amount(减少应收)。
    • 供应商:采购单记入 positive_amount(增加待付),采购退货/付款记入 negative_amount(减少待付)。
  • 余额来源:调用 BalanceService,每次请求仅查询一次,并冗余在每条记录中,便于前端表格或统计组件使用。

2. 接口列表

API 方法 描述
/customers/<id>/statements/ GET 指定客户的销售、销退、收款对账单
/suppliers/<id>/statements/ GET 指定供应商的采购、采退、付款对账单
/statements/record/ GET 通过主体 + 单据信息查询单条对账记录

请求无需额外参数;分页暂不开放(按时间倒序返回全部记录)。单条记录查询则必须提供如下 Query 参数:

参数 说明
counterparty_type 业务主体类型,customersupplier
counterparty_id 对应客户或供应商 ID
order_type 单据类型,取值与 source_type 一致,例如 sales_orderpurchase_order
order_id 单据 ID

⚠️ 由于底层仍需构建完整对账单后再筛选匹配记录,在大体量数据下应谨慎调用此接口。


3. 响应结构

{
  "customer": 6,
  "customer_name": "杭州零售商",
  "records": [
    {
      "source_type": "sales_order",
      "source_label": "销售单",
      "source_id": 1024,
      "occurred_at": "2025-11-30",
      "recorded_at": "2025-12-01T03:26:18.815992Z",
      "status": 2,
      "status_label": "审批通过",
      "counterparty": 6,
      "counterparty_name": "杭州零售商",
      "positive_amount": "3200.00",
      "negative_amount": "0.00",
      "cumulative_amount": "0.00",
      "current_balance": "1850.00",
      "arrears_amount": "1850.00"
    },
    {
      "source_type": "receipt_order",
      "source_label": "收款单",
      "source_id": 2001,
      "occurred_at": "2025-12-05",
      "recorded_at": "2025-12-05T02:11:07.441982Z",
      "status": 2,
      "status_label": "审批通过",
      "counterparty": 6,
      "counterparty_name": "杭州零售商",
      "positive_amount": "0.00",
      "negative_amount": "1500.00",
      "cumulative_amount": "3200.00",
      "current_balance": "1850.00",
      "arrears_amount": "-335.00"
    }
  ],
  "summary": {
    "positive_total": "3200.00",
    "negative_total": "1500.00"
  }
}

3.1 单条记录查询示例

GET /api/v1/statements/record/?counterparty_type=customer&counterparty_id=6&order_type=sales_order&order_id=1024

返回结构与对账单列表保持一致,仅 records 数组只包含匹配的那一条记录,summary 会基于该数组重新计算。

字段说明

字段 说明
source_type / source_label 业务来源及可读名称(sales_orderpayment_order 等)。
source_id 业务单据 ID。
occurred_at 业务日期(如 sales_datereturn_datereceipt_date 等)。
recorded_at 系统记录时间(created_at)。
status / status_label 业务单据当前状态(仅返回 APPROVED 的记录)。
counterparty / counterparty_name 客户或供应商信息。
positive_amount / negative_amount 金额正负值(字符串形式的 Decimal
cumulative_amount 当前记录输出前累计的对账金额(正负抵消)。
current_balance 余额表的最新应收/待付款快照;每条记录重复提供,便于表格展示。
arrears_amount 累欠金额,等于 current_balance - cumulative_amount,表示该记录时刻的实时欠款/待付款。
extra 预留字段,后续可扩展批次、仓库等信息。
summary 记录集中正负金额的求和,供前端快速展示。

4. 业务规则

  1. 审批依赖:只有审批通过的单据才会出现在对账单中;审批完成后若需冲销则需走红冲流程。
  2. 数据一致性:在审批事务内同步写入 BalanceServiceBalanceChangeRecord,对账单直接基于这些模型计算,因此账面数据与业务状态保持一致。
  3. 幂等保障BalanceService 在审批中使用行级锁和 select_for_update,避免重复写入;对账单查询为只读操作,不影响事务。
  4. 扩展字段:如需在对账单中加入汇总、备注、仓库信息,可在视图构建 extra 字段或通过 serializer context 注入新的统计字段。

5. 场景示例

5.1 客户账龄视图

前端可使用 cumulative_amountarrears_amount 直接绘制折线或柱状图;由于排序固定为最新在前,可反向遍历展示账龄。

5.2 供应商对账

供应商 API 返回结构与客户完全一致,只是正负金额对应采购维度,方便在采购结算或付款审批前快速核对余款。


如需拓展分页、过滤、导出等能力,请在提交需求时同步更新本文件,保持文档的单一来源。