# 下推流程（Query → Push → View → Save/Submit/Audit）

## 流程概览

```
1. ExecuteBillQuery  — 查询源单据 ID
2. Push              — 下推生成目标单据
3. View              — 查看目标单据详情（获取下推结果）
4. Save/Submit/Audit — 对目标单据走标准流程
```

## Step 1: 查询源单据

```python
# 查询可下推的源单据
source_bills = client.execute_bill_query(
    form_id="{source_form_id}",
    field_keys="FID,FBillNo",
    filter_string="FDocumentStatus='C'"
)
source_ids = [row[0] for row in source_bills]  # 提取 FID
```

## Step 2: 下推

```
POST .../DynamicFormService.Push.common.kdsvc
[
  {
    "Ids": "100001,100002",       // 源单据ID（逗号分隔）
    "RuleId": "{configured_rule_id}",  // 转换规则ID
    "TargetFormId": "{target_form_id}",  // 目标表单ID
    "IsEnableDefaultRule": "true",
    "CustomParams": {}
  }
]
```

**响应**：
```json
{
  "Result": {
    "ResponseStatus": {
      "IsSuccess": true,
      "SuccessEntitys": [
        { "Id": 200001, "Number": "PO-001", "EntityId": "100001" }
      ]
    }
  }
}
```

## Step 3: 查看目标单据

```python
target_id = result["Result"]["ResponseStatus"]["SuccessEntitys"][0]["Id"]
target_detail = client.view("{target_form_id}", target_id)
```

## Step 4: 对目标单据走标准流程

```python
# 补充/修改目标单据字段
model = json.loads(target_detail)["Result"]["Result"]
model["FNote"] = "下推生成"

# 保存 → 提交 → 审核
client.save("{target_form_id}", model)
client.submit("{target_form_id}", [target_id])
client.audit("{target_form_id}", [target_id])
```

## 注意事项

- `RuleId` 推荐从平台配置核对真实的转换规则，避免猜测
- 一次下推可以多个源单据（`Ids` 逗号分隔）
- 下推后目标单据默认是"暂存"状态，需手动 Save → Submit → Audit
- 源单据建议处于可下推状态（通常是"已审核"）
