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

136 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` | 业务主体类型,`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 返回结构与客户完全一致,只是正负金额对应采购维度,方便在采购结算或付款审批前快速核对余款。
---
如需拓展分页、过滤、导出等能力,请在提交需求时同步更新本文件,保持文档的单一来源。