# 订单编辑 API 概览

用于更新业务订单（销售单、销售退货单、采购单、采购退货单）的共同约束：

- 仅允许 **审批中**（`PENDING`）状态编辑；若订单已审批/作废，服务层会抛出错误 `"{实体}当前状态不可修改"`。
- 更新接口统一使用 `PUT/PATCH /api/v1/<order-type>/<id>/`，请求体必须包含 `items`，且为非空数组。
- 数量校验与创建逻辑一致：严进仓需 `numbers`，宽进仓需 `quantity + num_of_rolls`，严进严出（出库）需 `consume_detail_ids`。
- 订单字段（客户/供应商、仓库、备注、日期等）可被更新，未提供的字段沿用原值。

## SalesOrder 更新

- 路径：`PUT/PATCH /api/v1/sales-orders/<id>/`
- 请求体字段（全部可选，但 `items` 必须存在且非空）：
  - `customer`：客户 ID
  - `warehouse` / `warehouse_id`：仓库 ID
  - `order_date`：`YYYY-MM-DD`
  - `remarks`
  - `items`：与创建时一致（支持可选 `printing_job`）
- 响应：`200 OK`，返回最新销售单详情（同 `GET` 列表项，额外包含 `quantity_of_rolls` 数组）
- 错误：
  - `400`：参数缺失或状态不可编辑（`{"error": "销售单当前状态不可修改"}`）
  - `404`：订单不存在

> 其余订单（SalesReturn/Purchase/PurchaseReturn）的编辑接口，请在实现后按同一规范补充到本文件。

## SalesReturnOrder 更新

- 路径：`PUT/PATCH /api/v1/sales-return-orders/<id>/`
- 请求体字段：
  - `customer`、`warehouse`、`return_date`、`remarks`（可选）
  - `sales_order`：可重新绑定关联销售单，同样必须属于当前客户
  - `items`：与创建规则一致（严进模式需 `numbers`，宽进模式 `quantity/num_of_rolls` 等）
- 响应：`200 OK`，结构同 `GET /sales-return-orders/` + `quantity_of_rolls`
- 错误示例：
  - `{"error": "销售退货单当前状态不可修改"}`（状态非 PENDING）
  - `{"error": "销售退货单的客户必须与原销售单一致"}`（客户不匹配）

## PurchaseOrder 更新

- 路径：`PUT/PATCH /api/v1/purchase-orders/<id>/`
- 请求体字段：
  - `supplier`、`warehouse`、`order_date`、`remarks`
  - `items`：与创建规则相同（严进模式 `numbers`，宽进 `quantity/num_of_rolls`）
- 响应：`200 OK`，返回最新采购单，新增 `quantity_of_rolls` 字段
- 错误示例：
  - `{"error": "采购单当前状态不可修改"}`（状态非 PENDING）

## PurchaseReturnOrder 更新

- 路径：`PUT/PATCH /api/v1/purchase-return-orders/<id>/`
- 请求体字段：
  - `supplier`、`warehouse`、`return_date`、`remarks`
  - `purchase_order`：可重新绑定关联采购单，必须属于当前供应商
  - `items`：结构同创建（严出仓仍需 `consume_detail_ids`）
- 响应：`200 OK`，返回采购退货单详情（含 `quantity_of_rolls`）
- 错误示例：
  - `{"error": "采购退货单当前状态不可修改"}`
  - `{"error": "采购退货单的供应商必须与原采购单一致"}`
