forked from erp-dev/erp
2.4 KiB
2.4 KiB
Business 模块采购单 API
创建采购单并触发入库
- URL:
POST /api/v1/purchase-orders/ - 权限: 需要登录且具备员工身份
- 描述: 创建业务模块的
PurchaseOrder,并异步触发库存入库任务(通过stock.services.StockFlowService.stock_in实现)。
请求体
{
"supplier": 1,
"warehouse": 2,
"order_date": "2025-11-26",
"total_amount": "1200.50",
"remarks": "测试采购单",
"items": [
{
"product_id": 10,
"quantities": ["10.5", "6.0"]
},
{
"product_id": 18,
"quantities": ["3.25"]
}
]
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| supplier | integer | ✅ | 供应商 ID,必须隶属于当前商户 |
| warehouse | integer | ✅ | 入库仓库 ID |
| order_date | string (date) | ✅ | 订单日期(YYYY-MM-DD) |
| total_amount | string/number | ✅ | 采购总金额 |
| remarks | string | 否 | 备注 |
| items | array | ✅ | 入库明细,结构需满足 StockFlowService 的要求(目前仅支持严谨模式:product_id + quantities) |
items内部字段会被直接传给StockFlowService,因此:
- 严谨/严进模式:
{'product_id': 1, 'quantities': ['10', '5']}- 宽松模式/严进严出出库暂未开放,后续按需扩展。
响应
{
"id": 35,
"message": "采购单创建成功,入库任务已排队"
}
创建成功即刻返回,实际入库明细由后台 Celery 任务生成,可在日志或 stock_change 记录中查看。
错误示例
| 状态码 | 示例 | 说明 |
|---|---|---|
| 400 | {"error": "缺少供应商 ID"} |
请求缺失关键字段 |
| 400 | {"error": "供应商 99 不存在"} |
提供的供应商不属于当前商户 |
| 403 | {"error": "无权限访问"} |
当前用户无员工信息 |
关联任务(business/tasks.py)
create_purchase_order_stock_entries 任务会接收 purchase_order_id、warehouse_id、items 等信息,并通过 StockFlowService.stock_in 创建入库记录。
- 任务日志示例:
采购单 35 入库任务完成 - 返回 payload 包含
stock_change_record_id、created_details_count
测试
api_v1/tests.py 中新增 PurchaseOrderAPITestCase,通过 eager Celery 设置验证:
- API 请求返回 201
- Celery 任务被成功调用(patch
create_purchase_order_stock_entries.delay断言参数)