1
0
forked from erp-dev/erp

feat: sales_order api

This commit is contained in:
2025-11-30 17:06:48 +08:00
parent f6f0ec2ae9
commit ce1954ad58
15 changed files with 1426 additions and 44 deletions

122
api_v1/business/README.md Normal file
View File

@@ -0,0 +1,122 @@
# 业务域 API 文档Purchase & Sales
所有接口均位于 `/api/v1/` 前缀下,要求用户已登录且具备员工身份。除特殊说明外,返回值为 JSON错误时返回 `{"error": "...", ...}`
## 通用约定
- **分页**:列表接口使用 `limit` / `offset`(默认 `limit=20`,最大 `100`)。
- **items 结构**:与仓库模式相关
- 严进/严进严出仓库:`numbers: [int, ...]`
- 宽进宽出仓库:`quantity: number` + `num_of_rolls: int`
- **状态枚举**`PENDING=1``APPROVED=2``CANCELLED=3`
---
## 1. 采购单PurchaseOrder
### 1.1 列表
- **GET** `/api/v1/purchase-orders/`
- **查询参数**`limit``offset`
- **返回**`{"count": int, "next": url|null, "previous": url|null, "results": [PurchaseOrder]}`
每个 `PurchaseOrder` 记录包含 `supplier_name / operator_name / warehouse_name / total_amount / total_quantity / items[...]` 等字段。
### 1.2 创建
- **POST** `/api/v1/purchase-orders/`
- **请求体**
| 字段 | 类型 | 说明 |
|------|------|------|
| `supplier` | int | 供应商 ID必填 |
| `warehouse` | int | 仓库 ID或使用 `warehouse_id`(必填) |
| `order_date` | str (`YYYY-MM-DD`) | 采购日期 |
| `items` | list | 产品明细(至少 1 条) |
| `remarks` | str | 备注,可选 |
明细字段:
| 仓库模式 | 必填字段 |
|----------|----------|
| 严进/严进严出 | `product_id`, `numbers` (list[int]), `price`, `unit` |
| 宽进宽出 | `product_id`, `quantity`, `num_of_rolls`, `price`, `unit` |
- **成功返回**`201` + `{"id": int, "status": 1, "message": "采购单创建成功,等待审批"}`
### 1.3 审批 / 作废
- **POST** `/api/v1/purchase-orders/<id>/review/`
- **请求体**`{"action": "approve" | "cancel"}`
- **返回**:最新的 `PurchaseOrder` 序列化结果。
- `approve`:当商户开启自动入库时,会异步创建入库任务。
- `cancel`:若已生成入库记录,返回 `400`
---
## 2. 销售单SalesOrder
接口与采购单保持一致,仅字段差异:
- 关联主体:`customer`(客户 ID
- 日期字段:`order_date` 映射到 `sales_date`
- 审批通过后触发**出库**任务,库存方向为 “出库/负数”。
### 2.1 列表
- **GET** `/api/v1/sales-orders/`
- **返回**:同采购列表,但字段为 `customer_name` 等。
### 2.2 创建
- **POST** `/api/v1/sales-orders/`
- **请求体**
| 字段 | 类型 | 说明 |
|------|------|------|
| `customer` | int | 客户 ID |
| `warehouse` | int | 仓库 ID`warehouse_id` |
| `order_date` | str | 销售日期 |
| `items` | list | 产品明细,与采购单格式一致 |
| `remarks` | str | 可选 |
`items` 结构(按仓库模式):
| 仓库模式 | 出库模式 | 必填字段 |
|----------|----------|----------|
| `UNRESTRICTED` | 宽出 | `product_id`, `quantity`, `num_of_rolls`, `price`, `unit` |
| `RESTRICT_IN` | 宽出 | `product_id`, `numbers` (list[int]), `price`, `unit` |
| `RESTRICT_IN_OUT` | 严出 | `product_id`, `consume_detail_ids` (list[int]), `quantity`, `price`, `unit` |
- **成功返回**`201` + `{"id": int, "status": 1, "message": "销售单创建成功,等待审批"}`
### 2.3 审批 / 作废
- **POST** `/api/v1/sales-orders/<id>/review/`
- **请求体**`{"action": "approve" | "cancel"}`
- **返回**`SalesOrder` 序列化数据。
- `approve`:若开启自动出库,则投递 `create_sales_order_stock_entries`
- `cancel`:若已生成出库记录(`StockChangeRecord`),返回 `400`
---
## 3. 响应字段说明(节选)
| 字段 | 说明 |
|------|------|
| `total_amount` | 明细金额合计(未带方向) |
| `diff_quantity` | 空差数量合计 |
| `total_quantity` | 原始数量合计 |
| `items[].quantity_of_rolls` | 严进模式下的各条数明细(字符串,以逗号分隔) |
| `items[].num_of_rolls` | 条数 |
| `status` | 1=审批中、2=通过、3=作废 |
---
## 4. 错误示例
| 场景 | HTTP | 返回体 |
|------|------|--------|
| 未登录 | 401 | `{"detail": "Authentication credentials were not provided."}` |
| 缺少必填字段 | 400 | `{"error": "缺少供应商 ID"}` 等 |
| 无权限访问他商户单据 | 403 | `{"error": "无权限访问"}` |
| 单据不存在 | 404 | `{"error": "采购单不存在"}` / `{"error": "销售单不存在"}` |
| 已有库存记录仍尝试作废 | 400 | `{"error": "采购单已生成出入库记录,无法作废"}`(销售单同理) |
---
如需对 `items` 结构、仓库模式或审批流程做深入了解,请参阅:
- `docs/purchase_order_approval_and_red_flush.md`
- `docs/sales_order_approval_and_red_flush.md`