forked from erp-dev/erp
2.5 KiB
2.5 KiB
API v1 创建销售单(/api/v1/sales-orders/)
视图位置:
api_v1.views.business.sales.views.SalesOrderView.post
服务逻辑:business.services.create_sales_order(含事务,主单与明细同事务创建)
请求
- 方法:
POST - 路径:
/api/v1/sales-orders/ - Body(JSON)
customer(int, 必填):客户 IDwarehouse(int, 必填):仓库 IDorder_date(string, 必填):日期,YYYY-MM-DDremarks(string, 可选)items(array, 必填,至少 1 条):销售明细- 通用字段:
product_id(int, 必填)price(string/number, 必填)unit(string, 可选;默认产品单位或“米”)empty_diff_percent(string/number, 可选,默认 0)color/batch_number/remarks/spec(可选)printing_job(int, 可选):绑定印染任务 ID- 校验:存在且产品一致;若传入销售客户,需与任务的
printing_order.customer一致。
- 校验:存在且产品一致;若传入销售客户,需与任务的
- 数量字段取决于仓库模式:
- 宽进/宽出 (
UNRESTRICTED):quantity、num_of_rolls - 严进宽出 (
RESTRICT_IN):numbers数组(每条数值为正),自动汇总数量 - 严进严出 (
RESTRICT_IN_OUT):出库需consume_detail_ids数组 +quantity;入库需numbers
- 宽进/宽出 (
- 通用字段:
响应
- 成功
201 Created:{"id": <销售单ID>, "status": <状态枚举>, "message": "销售单创建成功,等待审批"} - 失败
400 Bad Request:缺参、格式或校验不通过(含 printing_job 校验)。
示例
严进严出(出库)示例
{
"customer": 12,
"warehouse": 3,
"order_date": "2025-12-20",
"items": [
{
"product_id": 501,
"price": "18.50",
"quantity": 30,
"unit": "米",
"consume_detail_ids": [101, 102],
"printing_job": 88
}
],
"remarks": "严进严出示例"
}
宽进宽出示例
{
"customer": 12,
"warehouse": 5,
"order_date": "2025-12-20",
"items": [
{
"product_id": 501,
"price": "15.00",
"quantity": 90,
"num_of_rolls": 3,
"printing_job": 88
}
]
}
关键行为说明
- 事务:主单与明细在同一
transaction.atomic()中,任一失败整体回滚。 - 校验:
- 仓库模式决定数量字段(
numbers/consume_detail_ids/quantity)。 printing_job可选;如提供需满足产品与客户一致性校验,否则返回 400。
- 仓库模式决定数量字段(
- 明细创建:服务层使用
bulk_create写入SalesOrderItem。***