# API 文档：按流程节点查询开版订单（v2）

日期：2026-02-06

## 接口信息
- Method：GET
- Path：/api/v2/plate-orders/by-process-node/
- 权限：已登录 + 印染工厂用户（IsPrintingFactory）

## 查询参数
必填：
- process_node_id：int，流程节点 ID（ProcessNode.id）

可选：
- search：string
  - 纯数字：同时匹配 id 精确 + design_code 模糊
  - 非纯数字：design_code 模糊
- date_from：string，YYYY-MM-DD（与 date_to 成对提供）
- date_to：string，YYYY-MM-DD（与 date_from 成对提供）
- ordering：string，默认 -created_at
  - 可选字段：id / created_at / updated_at / design_code
- limit：int，分页大小（默认 20）
- offset：int，分页起始偏移
- param_key：string，与 param_value 搭配使用
- param_value：string，与 param_key 搭配使用

### param_key / param_value 过滤说明
- 必须成对提供，否则返回 400。
- 过滤语义：存在任意一次“未撤销”的目标节点状态日志（StateFlowRecord.is_cancelled=false），其参数记录包含 param_key，且对应值 **模糊匹配** param_value 即命中（icontains）。

## 返回结构
```
{
  "process_node": {
    "id": 1,
    "process_id": 10,
    "state_id": 5,
    "state_name": "调色",
    "order": 1
  },
  "parameters": [
    {"key": "temperature", "value": null}
  ],
  "count": 2,
  "next": null,
  "previous": null,
  "results": [
    {
      "id": 100,
      "original_id": null,
      "design_code": "PO-001",
      "plate_image": [{"file_id": 1, "name": "封面", "path": "/media/xxx", "url": "..."}],
      "customer": 200,
      "customer_name": "客户A",
      "style_name": "款式A",
      "urgency_level": "正常",
      "is_invalid": false,
      "business_object_id": 300,
      "created_by": 400,
      "process_parameters": [
        {"key": "temperature", "value": "30"}
      ],
      "created_at": "2026-02-06T10:00:00+08:00",
      "updated_at": "2026-02-06T10:00:00+08:00"
    }
  ]
}
```

## 字段说明（results[*]）
- plate_image：仅返回第一个图片条目（最多 1 个），来源为 PlateOrder.plate_image。
- process_parameters：订单维度参数，按当前节点的参数模板输出 key/value。
  - 若该订单未提交过该节点参数，则 value 为 null。

## 校验与错误
- 缺少 process_node_id：400
- process_node_id 非数字：400
- process_node_id 不存在：404
- ordering 不在允许范围：400
- param_key/param_value 只提供一个：400

## 备注（查询流程）
- 起点为 PlateOrder 查询，再通过 business_object 的状态日志进行筛选。
- “当前已完成”模式判定：
  - 目标节点已完成（未撤销）
