# 创建单据流程（Save → Submit → Audit）

## 流程概览

```
1. Save    — 保存草稿
2. Submit  — 提交（状态: 暂存→已提交）
3. Audit   — 审核（状态: 已提交→已审核）
```

## Step 1: Save

```
POST {server_url}Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc

[
  "PUR_POOrder",           // 表单ID
  {
    "Model": {
      "FBillNo": "PO-001",
      "FDate": "2026-06-22",
      "FSupplierId": { "FNumber": "{supplier_number}" },
      "FPOOrderEntry": [
        {
          "FMaterialId": { "FNumber": "{material_number}" },
          "FQty": 10,
          "FPrice": 100
        }
      ]
    },
    "IsDeleteEntry": "true",
    "ValidateFlag": "true",
    "NumberSearch": "true"
  }
]
```

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

## Step 2: Submit

```
POST .../DynamicFormService.Submit.common.kdsvc
[
  "PUR_POOrder",
  { "CreateOrgId": 0, "Numbers": "", "Ids": "100001" }
]
```

## Step 3: Audit

```
POST .../DynamicFormService.Audit.common.kdsvc
[
  "PUR_POOrder",
  { "CreateOrgId": 0, "Numbers": "", "Ids": "100001" }
]
```

## 修改单据流程（反审核 → 保存 → 提交 → 审核）

```
1. UnAudit  — 反审核（状态: 已审核→已提交）
2. Save     — 修改保存
3. Submit   — 重新提交
4. Audit    — 重新审核
```

## 响应解析

每次操作后检查 `Result.ResponseStatus.IsSuccess`：
- `true` → 操作成功，从 `SuccessEntitys` 取单据 ID
- `false` → 操作失败，从 `Errors` 取错误信息

```python
result = client.save("PUR_POOrder", model)
resp = result.get("Result", {}).get("ResponseStatus", {})
if not resp.get("IsSuccess"):
    errors = resp.get("Errors", [])
    for err in errors:
        print(f"错误: {err.get('Message')}")
    raise Exception("保存失败")
else:
    bill_id = resp["SuccessEntitys"][0]["Id"]
```

## 客户端示例

| 语言 | 客户端方法 |
|------|-----------|
| Python | `client.save()` → `client.submit()` → `client.audit()` |
| C# | `client.Save()` → `client.Submit()` → `client.Audit()` |
| Java | `client.save()` → `client.submit()` → `client.audit()` |
