# Statements 对账单 API 本文件专门描述客户与供应商对账单接口的请求与响应结构。所有接口均位于 `/api/v1/`,默认需要登录并具备员工身份,且只返回当前员工所属商户的数据。 --- ## 1. 功能概览 - **客户对账单**:聚合指定客户的销售单、销售退货单、收款单,统一展示正负金额、当前余额以及累欠金额。 - **供应商对账单**:聚合指定供应商的采购单、采购退货单、付款单,展示待付金额的增减与余额。 - **排序规则**:固定按 `occurred_at -> recorded_at -> source_id` 倒序排列,不支持外部修改。 - **金额方向**: - 客户:销售单记入 `positive_amount`(增加应收),销售退货/收款记入 `negative_amount`(减少应收)。 - 供应商:采购单记入 `positive_amount`(增加待付),采购退货/付款记入 `negative_amount`(减少待付)。 - **余额来源**:调用 `BalanceService`,每次请求仅查询一次,并冗余在每条记录中,便于前端表格或统计组件使用。 --- ## 2. 接口列表 | API | 方法 | 描述 | |-----|------|------| | `/customers//statements/` | GET | 指定客户的销售、销退、收款对账单 | | `/suppliers//statements/` | GET | 指定供应商的采购、采退、付款对账单 | | `/statements/record/` | GET | 通过主体 + 单据信息查询单条对账记录 | 请求无需额外参数;分页暂不开放(按时间倒序返回全部记录)。单条记录查询则必须提供如下 Query 参数: | 参数 | 说明 | |------|------| | `counterparty_type` | 业务主体类型,`customer` 或 `supplier` | | `counterparty_id` | 对应客户或供应商 ID | | `order_type` | 单据类型,取值与 `source_type` 一致,例如 `sales_order`、`purchase_order` 等 | | `order_id` | 单据 ID | > ⚠️ 由于底层仍需构建完整对账单后再筛选匹配记录,在大体量数据下应谨慎调用此接口。 --- ## 3. 响应结构 ```json { "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_order`、`payment_order` 等)。 | | `source_id` | 业务单据 ID。 | | `occurred_at` | 业务日期(如 `sales_date`、`return_date`、`receipt_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. **数据一致性**:在审批事务内同步写入 `BalanceService` 及 `BalanceChangeRecord`,对账单直接基于这些模型计算,因此账面数据与业务状态保持一致。 3. **幂等保障**:`BalanceService` 在审批中使用行级锁和 `select_for_update`,避免重复写入;对账单查询为只读操作,不影响事务。 4. **扩展字段**:如需在对账单中加入汇总、备注、仓库信息,可在视图构建 `extra` 字段或通过 serializer context 注入新的统计字段。 --- ## 5. 场景示例 ### 5.1 客户账龄视图 前端可使用 `cumulative_amount`、`arrears_amount` 直接绘制折线或柱状图;由于排序固定为最新在前,可反向遍历展示账龄。 ### 5.2 供应商对账 供应商 API 返回结构与客户完全一致,只是正负金额对应采购维度,方便在采购结算或付款审批前快速核对余款。 --- 如需拓展分页、过滤、导出等能力,请在提交需求时同步更新本文件,保持文档的单一来源。