# 完整端到端示例

> 数据准备通过 `weaver-work-cli --json invoice run <operation> --input-json '<json>'` 执行；报销单创建/修改通过 `weaver-work-cli --json workflow run workflow.createForm|createRequest|editLoad|editPrepare|editApply` 执行（`weaver-e10-workflow` 技能）。
> 认证由 `weaver-work-cli auth` 管理，无需手动传 token/eteamsId。
> 复杂 JSON 建议先写入 UTF-8 文件再用 `--input <path>` 传入。

---

## 示例0：用户提供 fileId → 发票识别 → 自动报销

用户说："帮我报销这个文件 1290156133724692482,1290156133724692483"

### Step 0: 文件ID转发票识别

切割 fileId，调用 `invoice.reim.file-ocr.preview`：

**命令：**

Windows PowerShell：

```powershell
weaver-work-cli --json invoice run invoice.reim.file-ocr.preview --input-json '{"fileIds":["1290156133724692482","1290156133724692483"]}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json invoice run invoice.reim.file-ocr.preview --input-json '{"fileIds":["1290156133724692482","1290156133724692483"]}'
```

**返回：**

```json
{
  "code": 200,
  "msg": "接口返回成功",
  "status": true,
  "data": [
    {
      "fileId": "1290156133724692482",
      "fileName": "滴滴出行电子发票.pdf",
      "status": "success",
      "errorMsg": "识别成功",
      "invoiceId": "1290156159548506113",
      "invoiceType": "增值税电子普通发票",
      "invoiceTypeCode": 3,
      "amount": "85.60",
      "consumeContent": "*运输服务*客运服务费",
      "invoiceDate": "2026-07-28",
      "invoiceNumber": "36901200",
      "buyerName": "上海亘岩网络科技有限公司",
      "sellerName": "北京滴滴出行科技有限公司",
      "expenseType": "市内交通"
    },
    {
      "fileId": "1290156133724692483",
      "fileName": "如家酒店发票.pdf",
      "status": "success",
      "errorMsg": "识别成功",
      "invoiceId": "1290156159548506114",
      "invoiceType": "增值税电子普通发票",
      "invoiceTypeCode": 3,
      "amount": "380.00",
      "consumeContent": "*住宿服务*住宿费",
      "invoiceDate": "2026-07-29",
      "invoiceNumber": "36901201",
      "buyerName": "上海亘岩网络科技有限公司",
      "sellerName": "如家酒店管理有限公司",
      "expenseType": "住宿"
    }
  ],
  "fail": false
}
```

过滤 `status="success"` 的数据，得到 2 张发票。

### 后续流程

已获取发票数据 → **跳过 Step 1A**（不调用 `invoice.list`）

利用发票的 `invoiceDate`（2026-07-28 ~ 2026-07-29）筛选事前申请：
- `cusCreateDateStart` = "2026-04-29"（往前推90天）
- `cusCreateDateEnd` = "2026-07-29"

→ 继续 Step 1B → Step 2 匹配 → Step 2.5 → Step 3 → Step 4 → Step 5（流程同示例1/2）

---

## 示例1：单张发票 + 有事前申请（完整流程）

### Step 1A: 获取发票

**第一步：按内联公式计算最近一周时间戳参数**

AI 直接计算（UTC+8）：begin = 今天00:00:00秒时间戳 - 7*86400, end = 今天23:59:59秒时间戳

生成 `invoice.list` 入参（只传必要字段；`sreim`/`bill_type` 由 CLI 默认）：

```json
{
  "page_size": 10,
  "start_pos": 0,
  "date_begin": 1786291200,
  "date_end": 1786982399
}
```

**第二步：调用 CLI 查询发票**

Windows PowerShell：

```powershell
weaver-work-cli --json invoice run invoice.list --input-json '{"page_size":10,"start_pos":0,"date_begin":1786291200,"date_end":1786982399}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json invoice run invoice.list --input-json '{"page_size":10,"start_pos":0,"date_begin":1786291200,"date_end":1786982399}'
```

**返回（CLI 信封中列表在 `data.items`，下面是单条票面结构）：**

```json
{
  "infos": [
    {
      "info": {
        "id": "1295366637717012482",
        "fid": "1295366637717012482",
        "code": "",
        "number": "36901189",
        "ext": "{\"content\":\"*运输服务*客运服务费\",\"products\":[{\"name\":\"*运输服务*客运服务费\",\"amount\":\"108.2\"}],\"category\":\"增值税电子普通发票\"}",
        "fylx": "897092516517920775",
        "currency": "CNY",
        "province": "上海市",
        "modify_info": { "ctm": 1786168444, "utm": 1786168444, "cstm": 1722268800, "source": 4 },
        "comm_info": {
          "pro": { "cname": "增值税电子普通发票", "type": 3, "date": "2026-07-30", "status": 0 },
          "price": { "amount": "102.08", "total": "108.2" },
          "buyer": { "tcode": "xxx", "company": "上海亘岩网络科技有限公司" },
          "payer": { "tcode": "xxx", "company": "北京滴滴出行科技有限公司" }
        },
        "relative_fids": [],
        "bill_type": 0
      },
      "ret": { "trace": "", "ret": 0, "message": "执行成功" },
      "is_valid": 0
    }
  ],
  "res_base": { "trace": "", "ret": 0, "message": "执行成功" }
}
```

**字段映射提取：**
- `invoiceId` = `info.fid` = `"1295366637717012482"`
- `invoiceNumber` = `info.number` = `"36901189"`
- `invoiceType` = `info.comm_info.pro.cname` = `"增值税电子普通发票"`
- `invoiceTypeCode` = `info.comm_info.pro.type` = `3`
- `invoiceDate` = `info.comm_info.pro.date` = `"2026-07-30"`
- `amount` = `info.comm_info.price.total` = `"108.2"`
- `buyerName` = `info.comm_info.buyer.company` = `"上海亘岩网络科技有限公司"`
- `sellerName` = `info.comm_info.payer.company` = `"北京滴滴出行科技有限公司"`
- `consumeContent` = `JSON.parse(ext).content` = `"*运输服务*客运服务费"`
- `expenseType` = 根据 `info.fylx` 查名称 → `"市内交通"`

### Step 1C: 展示发票汇总，等待用户确认

> 用户说"帮我报销"，未指定日期 → 使用默认最近一周范围，**必须告知用户查询范围**

**AI 展示给用户：**

```markdown
已为您查询最近一周（2026-07-24 ~ 2026-07-30）的发票数据，共找到 1 张未报销发票，汇总金额 ¥108.20：

| # | 发票类型 | 开票日期 | 发票号码 | 金额 | 销方名称 | 费用类型 |
|---|----------|----------|----------|------|----------|----------|
| 1 | 增值税电子普通发票 | 2026-07-30 | 36901189 | ¥108.20 | 北京滴滴出行科技有限公司 | 市内交通 |

请确认是否使用以上发票进行报销？如需查询其他日期范围的发票，请告诉我。
```

用户回复"确认" → 继续后续流程

### Step 1B: 获取事前申请（基于发票日期预筛选）

> 已知发票 invoiceDate = "2026-07-30"
> 事前申请日期一定在开票日期之前 → cusCreateDateEnd = "2026-07-30"
> 往前推90天 → cusCreateDateStart = "2026-05-01"

**命令：**

Windows PowerShell：

```powershell
weaver-work-cli --json invoice run invoice.reim.requests.list --input-json '{"pageNo":1,"pageSize":20,"cusCreateDateStart":"2026-05-01","cusCreateDateEnd":"2026-07-30"}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json invoice run invoice.reim.requests.list --input-json '{"pageNo":1,"pageSize":20,"cusCreateDateStart":"2026-05-01","cusCreateDateEnd":"2026-07-30"}'
```

**返回：**

```json
{
  "code": 200,
  "data": [
    {
      "requestid": "1298294241967177729",
      "workflowid": "1181057526276915214",
      "requestname": "交通费报销-后端开发111-2026-07-25",
      "requestnametitle": "交通费报销-后端开发111-2026-07-25 (相关客户:, 相关项目:, 承担主体: , 流程编号:Weaver-FYBX202607000069, 报销总金额:14.47 , 费用承担公司:)",
      "flowStatus": 6,
      "creatorId": "1201729946891231232",
      "creatorName": "后端开发111",
      "creatorDepartmentId": "1201729461554241537",
      "nodeid": "1181057741029220917",
      "createTime": "2026-07-25 10:30:00"
    }
  ]
}
```

### Step 2: 匹配绑定

根据匹配规则分析（硬约束：invoiceDate >= createTime）：
- 时间硬约束：invoiceDate "2026-07-30" >= createTime "2026-07-25" → ✅ 满足
- 费用类型匹配：发票 expenseType="市内交通" ↔ 事前申请 requestname 含"交通费" → +40
- 时间匹配：invoiceDate 在 createTime 后 5 天（7天内） → +30
- 同一申请人 → +10
- 总分 80 → confidence = "high"

匹配结果：

```json
{
  "matchResults": [
    {
      "invoiceId": "1295366637717012482",
      "preApprovalId": "1298294241967177729",
      "preApprovalWorkflowId": "1181057526276915214",
      "matchConfidence": "high",
      "matchScore": 80,
      "matchReasons": ["费用类型匹配：交通费", "时间匹配：开票日期在事前申请后5天内", "同一申请人"]
    }
  ],
  "unmatchedInvoices": [],
  "unmatchedApprovals": []
}
```

### Step 2.5: 获取报销单工作流

**命令：**

Windows PowerShell：

```powershell
weaver-work-cli --json invoice run invoice.reim.workflow.resolve --input-json '{"requestIds":["1298294241967177729"]}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json invoice run invoice.reim.workflow.resolve --input-json '{"requestIds":["1298294241967177729"]}'
```

**返回：**

```json
{
  "code": 200,
  "data": {
    "requestWorkflowMap": {
      "1298294241967177729": {
        "workFlowId": "100003460000000060",
        "workFlowName": "总部费用报销"
      }
    }
  }
}
```

**决策：** 有事前申请 → 用 `总部费用报销(100003460000000060)` 载入表单。

### Step 3: 并行载入表单 + 预填信息 + 发票对象

以下四条命令互相独立，**同时发起**。

**① 载入报销表单（`weaver-e10-workflow`）：**

Windows PowerShell：

```powershell
weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow":["总部费用报销(100003460000000060)"]}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow":["总部费用报销(100003460000000060)"]}'
```

**返回（`fields` 节选，2026-10-21 真实表单）：**

```json
{
  "status": "FORM_READY",
  "continuation": "wc-9834fa828b86aed3",
  "requestName": "总部费用报销-后端开发111-2026-08-04",
  "fields": [
    {"id": "1256786432515129369", "name": "事前申请流程", "componentKey": "Workflow", "isBrowser": true},
    {"id": "100003720000008409", "name": "承担主体", "componentKey": "Employee", "initialValue": "后端开发111", "isBrowser": true},
    {"id": "100003720000000088", "name": "报销事由", "componentKey": "TextArea"},
    {"id": "100003720000000073", "name": "申请人", "componentKey": "Employee", "initialValue": "后端开发111", "isBrowser": true},
    {"id": "100003720000001376", "name": "合同号", "componentKey": "Text", "initialValue": "20260999"},
    {"id": "100003720000076596", "name": "报销人直接上级", "componentKey": "Employee", "initialValue": "直属主管王五", "isBrowser": true},
    {"id": "100003720000000084", "name": "报销方式", "componentKey": "Select", "initialValue": "银行（个人报销）", "isSelect": true},
    {"id": "100003720000000687", "name": "相关客户", "componentKey": "Ebuilder", "isBrowser": true},
    {"id": "100003720000016373", "name": "申请金额", "subFormId": "100003690000000011", "componentKey": "NumberComponent"},
    {"id": "100003720000000684", "name": "相关流程", "subFormId": "100003690000000011", "componentKey": "Workflow", "isBrowser": true},
    {"id": "100003720000000360", "name": "费用类型（科目）", "subFormId": "100003690000000011", "componentKey": "RelateBrowser", "isBrowser": true},
    {"id": "100003720000077896", "name": "相关发票", "subFormId": "100003690000000011", "componentKey": "EinvoiceComponent", "isEinvoice": true},
    {"id": "100003720000052200", "name": "币种", "subFormId": "100003690000000011", "componentKey": "RelateBrowser", "initialValue": "人民币", "isBrowser": true},
    {"id": "100003720000000361", "name": "费用说明", "subFormId": "100003690000000011", "componentKey": "Text"},
    {"id": "100003720000000419", "name": "费用日期", "subFormId": "100003690000000011", "componentKey": "DateComponent"},
    {"id": "100003720000079682", "name": "相关凭证", "subFormId": "100003690000000011", "componentKey": "EinvoiceComponent", "isEinvoice": true}
  ]
}
```

> 承担主体、申请人、报销人直接上级、合同号、报销方式都带 `initialValue` → **不传**。明细「币种」虽然也有默认值，但**每行必须显式传** `人民币(100001050000000001)`，否则「申请金额」联动会失效。实报金额、附件数、承担人所有上级等不在 `fields` 里 → **不传**。

**② 批量预填信息：**

Windows PowerShell：

```powershell
weaver-work-cli --json invoice run invoice.reim.row-info-batch --input-json '{"invoiceIds":["1295366637717012482"],"requestid":"1298294241967177729"}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json invoice run invoice.reim.row-info-batch --input-json '{"invoiceIds":["1295366637717012482"],"requestid":"1298294241967177729"}'
```

返回 `results[0].data`：`{"date":"2026-07-30","fysm":"交通运输服务","itinerary":"1298798990831518001","subjectId":"100502270000000006","subjectName":"市内交通费"}`

**③ 交通类发票取行程：** `invoice.get`（`{"fid":"1295366637717012482"}`）→ `from`=「仁济医院南院区门诊部(南门)南侧」、`to`=「浦江瑞和城柒街区30号」。

**④ 取发票对象：** 发票 + `itinerary` 返回的凭证一起传。

Windows PowerShell：

```powershell
weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fids":["1295366637717012482","1298798990831518001"]}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fids":["1295366637717012482","1298798990831518001"]}'
```

> `itinerary` 与 `browse-field.data` 同时发起时还不知道凭证 ID：先只传发票 `fid`，`row-info-batch` 返回新的凭证 ID 后再补调一次只传凭证。

### Step 4: 组装 `data`

```json
{
  "main": {
    "1256786432515129369": "交通费报销-后端开发111-2026-07-25(1298294241967177729)",
    "100003720000000088": "2026-07-30 市内交通 - 滴滴出行",
    "100003720000000687": "泛微上海(100504500000311504)"
  },
  "details": {
    "100003690000000011": [
      {
        "100003720000000419": "2026-07-30",
        "100003720000016373": "108.2",
        "100003720000052200": "人民币(100001050000000001)",
        "100003720000000360": "市内交通费(100502270000000006)",
        "100003720000000361": "仁济医院南院-浦江瑞和城",
        "100003720000000684": "交通费报销-后端开发111-2026-07-25(1298294241967177729)",
        "100003720000077896": [{"optionId": "1295366637717012482", "id": "1295366637717012482", "fid": "1295366637717012482", "content": "增值税电子普通发票-36901189", "...": "browse-field.data 返回的其余键原样保留"}],
        "100003720000079682": [{"optionId": "1298798990831518001", "id": "1298798990831518001", "fid": "1298798990831518001", "content": "滴滴行程单-...", "...": "browse-field.data 返回的其余键原样保留"}]
      }
    ]
  }
}
```

### Step 5: 预览确认 → 创建

**AI 先展示预览：**

```markdown
即将创建报销单「交通费报销-后端开发111-2026-08-04」，请确认：

| 项目 | 值 |
| --- | --- |
| 报销工作流 | 总部费用报销 |
| 报销事由 | 2026-07-30 市内交通 - 滴滴出行 |
| 相关客户 | 泛微上海(100504500000311504) |
| 事前申请 | 交通费报销-后端开发111-2026-07-25(1298294241967177729) |
| 合计金额 | ¥108.20 |

| # | 发票号码 | 金额 | 费用日期 | 费用类型 | 费用说明 | 相关凭证 |
|---|----------|------|----------|----------|----------|----------|
| 1 | 36901189 | ¥108.20 | 2026-07-30 | 市内交通费(100502270000000006) | 仁济医院南院-浦江瑞和城 | ✅ 滴滴行程单 |

申请人、承担主体、上级、部门、合同号、报销方式由表单按当前登录人默认带出；币种为人民币。
请回复「存草稿」或「提交审批」；需要修改请直接告诉我。
```

用户回复「提交审批」→ 写入 `reim-create-request.json` 并调用：

```json
{
  "context": "wc-9834fa828b86aed3",
  "requestName": "交通费报销-后端开发111-2026-08-04",
  "action": "submit",
  "data": {"main": {"...": "Step 4 的 main"}, "details": {"...": "Step 4 的 details"}}
}
```

Windows PowerShell：

```powershell
weaver-work-cli --json workflow run workflow.createRequest --input .\reim-create-request.json
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json workflow run workflow.createRequest --input ./reim-create-request.json
```

**返回 `CREATED_SUBMITTED`** → 把返回的 `finalMarkdown` **原样粘贴**作为回复（已含流程编号、链接、已填内容、明细表），不要自己重拼。

---

## 示例2：多张发票 + 有事前申请（要点说明）

> 与示例1 流程一致，此处仅说明多发票场景的差异点。

**场景**：2 张发票（交通+住宿）均匹配到同一条出差事前申请。

**出差拦截**：`workFlowName` 含「差旅」或事前申请名称含「出差」→ **必须先提醒用户填写相关客户**。
**话费拦截**：`workFlowName` 含「话费补贴标准审批流程」或「话费报销」→ **必须先按 [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) 核对账单截图、账单构成和岗位上限，再按标准计算实报金额**。

```markdown
当前为出差报销，必须填写相关客户。请提供本次出差对应的具体客户名称，否则无法继续报销。
```

用户给出客户名称（如「XX科技」）→ 直接把 `"XX科技"` 填进「相关客户」，由 `createRequest` 解析；唯一命中即可，多候选按 `ambiguities` 让用户选。用户不提供 → **不允许报销，不创建报销单**。

**`data` 关键点**：

```json
{
  "main": {
    "<事前申请流程id>": "北京出差申请-张三-2026-07-20(1299854672520364033)",
    "<相关客户id>": "XX科技"
  },
  "details": {
    "<费用明细subFormId>": [
      {"<申请金额id>": "76.80", "<币种id>": "人民币(100001050000000001)", "<相关发票id>": [{"fid": "INV001", "...": "..."}]},
      {"<申请金额id>": "480.00", "<币种id>": "人民币(100001050000000001)", "<相关发票id>": [{"fid": "INV002", "...": "..."}]}
    ]
  }
}
```

**要点**：
- 一张发票一行，数组顺序就是明细行顺序
- 两行都绑定同一个事前申请（明细「相关流程」同值）
- 每行「相关发票」只放该行发票的 1 个对象

---

## 示例3：无事前申请（要点说明）

**场景**：无事前申请，`invoice.reim.workflow.resolve` 传空 requestIds `[]`，返回候选工作流列表。

**差异点**：
- 候选只有1个 → 直接使用；多个 → 自动匹配最相关的
- 「事前申请流程」「相关流程」不传
- 其他流程与示例1 一致

---

## 示例4：浏览按钮返回多个候选

`createRequest` 返回 `NEEDS_CONFIRMATION`，`ambiguities` 里 `kind = "BROWSER"`、`reason = "MULTIPLE_MATCHES"`（例如「相关项目」填了 `"智慧园区"`）：

```json
{
  "status": "NEEDS_CONFIRMATION",
  "ambiguities": [
    {
      "kind": "BROWSER",
      "fieldName": "相关项目",
      "reason": "MULTIPLE_MATCHES",
      "candidates": [
        {"id": "P001", "name": "智慧园区一期"},
        {"id": "P002", "name": "智慧园区二期"}
      ]
    }
  ]
}
```

**处理方式**：把候选原样列给用户选；用户选「智慧园区一期」后，该字段改为 `{"id":"P001","name":"智慧园区一期"}`，用**同一 `context`** 重发 `createRequest`。不要向用户索取 ID。

---

## 示例5：多候选报销单工作流自动匹配

无事前申请，`invoice.reim.workflow.resolve` 返回 3 个候选工作流。

**自动匹配过程**（已有发票 expenseType="市内交通"）：
1. "报销流程666【活动版本V1】" — 无关键词命中
2. "差旅费用报销" — "差旅"与交通类费用强相关 → **命中**
3. "日常费用报销" — "日常"弱相关

→ 自动选择 `workFlowId = "1250064959163990031"`（差旅费用报销），继续后续流程。

---

## 示例6：创建后修改报销单（Step 6）

假设 Step 5 `workflow.createRequest` 返回 `requestId = "1300266422434136064"`，用户说"报销事由改成 7 月份上海出差交通费"。

**① 加载当前表单：**

Windows PowerShell：

```powershell
weaver-work-cli --json workflow run workflow.editLoad --input-json '{"requestId":"1300266422434136064"}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json workflow run workflow.editLoad --input-json '{"requestId":"1300266422434136064"}'
```

**② 准备修改**（只传要改的字段，字段须在 `editableFields` 里）：

Windows PowerShell：

```powershell
weaver-work-cli --json workflow run workflow.editPrepare --input-json '{"context":"<editLoad返回的context>","data":{"main":{"100003720000000088":"7月份上海出差交通费"}}}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json workflow run workflow.editPrepare --input-json '{"context":"<editLoad返回的context>","data":{"main":{"100003720000000088":"7月份上海出差交通费"}}}'
```

修改明细行（金额、科目、发票等）时，`data.details` 的结构与行定位以 [`workflow-edit.md`](../../weaver-e10-workflow/references/workflow-edit.md) 为准，并对照 `editLoad` 返回的 `currentValues` 确认要改的是哪一行。

**③ 向用户展示 `changedFields` 与 `linkageResult`，确认后保存：**

Windows PowerShell：

```powershell
weaver-work-cli --json workflow run workflow.editApply --input-json '{"context":"<同一context>","confirm":true}'
```

macOS/Linux（bash/zsh）：

```bash
weaver-work-cli --json workflow run workflow.editApply --input-json '{"context":"<同一context>","confirm":true}'
```

返回 `EDIT_SAVED` 即成功。流程已流转到不可编辑节点时返回"失去操作权限"，如实转述。

---

## 示例7-10：多轮对话与组合条件（精简）

> 以下示例说明多轮对话和上下文复用的处理逻辑。

### 示例7：先查发票再报销

| 轮次 | 用户 | AI 操作 |
|------|------|---------|
| 1 | "查下我最近的发票" | 内联计算最近一周时间戳 → 调用 `invoice.list`，无结果则扩大到一个月 → 告知用户查询范围，展示发票列表，**不进入报销流程** |
| 2 | "帮我报销" | 上下文已有发票 → 跳过 1A，展示发票汇总（Step 1C）→ 用户确认 → 用发票日期筛选事前申请 → Step 2 → 2.5 → 3 → 4 → 5 |

### 示例8：查事前申请 → 查发票 → 报销

| 轮次 | 用户 | AI 操作 |
|------|------|---------|
| 1 | "查下我的事前申请" | 调用 `invoice.reim.requests.list`，展示列表 |
| 2 | "查下对应的发票" | 复用事前申请日期，`date_begin` = 最早 createTime 的秒级时间戳，调用 `invoice.list` 展示 |
| 3 | "报销吧" | 上下文已有两组数据 → 跳过 1A/1B，直接 Step 2 → 2.5 → 3 → 4 → 5 |

### 示例9：查询后选部分报销

| 轮次 | 用户 | AI 操作 |
|------|------|---------|
| 1 | "查下我的发票" | 查到 5 张发票并展示 |
| 2 | "只报第1张和第3张" | 从上下文取第 1、3 张发票 → 用其日期筛选事前申请 → Step 1B → 2 → ... → 5 |

### 示例10：组合条件报销

用户说："报销上个月滴滴和住宿的发票"

AI 操作：
1. 内联计算 2026-07-01 ~ 2026-07-31 的秒级时间戳，并设置 `content="滴滴"` 组装请求参数
2. 调用 `invoice.list` 查询（CLI 支持服务端筛选，减少返回数据量）
3. 展示发票汇总（Step 1C），用户确认后走 Step 1B → 2 → 2.5 → 3 → 4 → 5

### 示例11：默认查询 fallback（一周无结果，自动扩到一个月）

用户说："帮我报销"

AI 操作：
1. 内联计算最近一周时间戳参数
2. 调用 `invoice.list` → 返回空（无结果）
3. 自动内联计算最近一个月时间戳参数
4. 再次调用 `invoice.list` → 返回 3 张发票
5. 展示 Step 1C：

```markdown
最近一周（2026-08-10 ~ 2026-08-17）未找到发票，已自动扩大到最近一个月（2026-07-18 ~ 2026-08-17），共找到 3 张未报销发票，汇总金额 ¥1,288.20：

| # | 发票类型 | 开票日期 | 发票号码 | 金额 | 销方名称 | 费用类型 |
|---|----------|----------|----------|------|----------|----------|
| 1 | 增值税电子普通发票 | 2026-07-25 | 36901189 | ¥108.20 | 北京滴滴出行科技有限公司 | 市内交通 |
| 2 | 电子发票（普通发票） | 2026-07-22 | 26467088 | ¥800.00 | 如家酒店管理有限公司 | 住宿 |
| 3 | 电子发票（铁路电子客票） | 2026-07-20 | 88990001 | ¥380.00 | 铁路客运 | 市内交通 |

请确认是否使用以上发票进行报销？如需查询其他日期范围，请告诉我。
```

6. 用户确认后 → Step 1B → 2 → 2.5 → 3 → 4 → 5

---

## 示例12：用户给了合同号（以合同联动为准）

用户说："帮我报销一下去重庆的发票，承担主体：边宝，合同编号：20250104933"

- 合同号传 `"20250104933"`；**承担主体、相关客户、相关项目都不传**（「边宝」也不传），预览里这三项写「由合同 20250104933 联动带出」
- 创建后 `linkageResult` 返回（2026-10-21 真机）：`字段联动带出：…实报金额=50.07、承担主体=朱洪磊、相关客户=中国航空集团有限公司、合同号=20250104933、相关项目=中航集团办公平台改造及升级项目。`
- 原样粘贴 `finalMarkdown` 后补一句：「承担主体、相关客户、相关项目已按合同 20250104933 联动带出：朱洪磊 / 中国航空集团有限公司 / 中航集团办公平台改造及升级项目；你提到的承担主体「边宝」与合同不一致，已按合同联动为准。」

---

## 关键检查清单

调用 `workflow.createRequest` 前确认：

1. [ ] `context` 是本组 `workflow.createForm` 返回的 `continuation`，没有复用别的报销单的句柄
2. [ ] `workflow.createForm` 传的是 Step 2.5 得到的 `{workFlowName}({workFlowId})`
3. [ ] `requestName` 按规则生成，不超过30字
4. [ ] `data` 的键全部来自本次 `createForm` 的 `fields[].id`，没有 `fields` 之外的字段（实报金额、附件数、承担人所有上级等不传）
5. [ ] 带 `initialValue` 且不需改写的字段没有重复传；**例外：每行明细都显式传了「币种」`人民币(100001050000000001)`**（不传会让「申请金额」联动失效）
6. [ ] 浏览按钮写 `名称(ID)`，没有裸 ID；Select 写选项名，不是 optionValue
7. [ ] 每行「相关发票」是 `invoice.browse-field.data` 返回的 1 个发票对象；有凭证时「相关凭证」也是 1 个对象，无凭证不传
8. [ ] 相关凭证（17/18/57/58）没有单独成行
9. [ ] 每行「费用类型（科目）」有值，匹配不到填 `其他-管理费用(100502270000000104)`
10. [ ] 文本字段没有 `*` 号
11. [ ] **出差/差旅流程：相关客户已由用户提供具体名称；未提供则不允许调用 `workflow.createRequest`**
12. [ ] 非出差流程：相关客户填 `泛微上海(100504500000311504)`；**用户给了合同号时承担主体 / 相关客户 / 相关项目都不传，以合同联动为准**
13. [ ] 话费报销：金额字段填的是核算后的实报金额
14. [ ] 已向用户展示预览，并拿到「存草稿 / 提交审批」的明确确认

修改报销单前确认：

15. [ ] `requestId` 来自 `workflow.createRequest` 的返回结果
16. [ ] 走 `workflow.editLoad` → `workflow.editPrepare` → 用户确认 → `workflow.editApply`，只传要改的字段
17. [ ] 只改 `editableFields` 里的字段，遇 `notEditable` 如实转述，不换字段 id 绕过
