weaver-work-cli 0.1.25 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -30
- package/dist/cmd/root.js +1 -0
- package/dist/cmd/setup/index.js +1 -1
- package/dist/core/runtime-agent.js +19 -0
- package/dist/internal/e10/auth/commands.js +48 -33
- package/dist/internal/e10/auth/messages.js +3 -0
- package/dist/internal/e10/auth/session.js +8 -0
- package/dist/internal/e10/auth/xiaoe.js +62 -43
- package/dist/internal/e10/auth-recovery.js +148 -0
- package/dist/internal/e10/client.js +47 -15
- package/dist/internal/e10/context.js +9 -31
- package/dist/internal/e10/index.js +1 -0
- package/dist/internal/e10/request-runtime.js +51 -9
- package/dist/shortcuts/archive/host.js +3 -2
- package/dist/shortcuts/archive/manifest.js +1 -1
- package/dist/shortcuts/archive-oa/constants.js +66 -0
- package/dist/shortcuts/archive-oa/continuation.js +70 -0
- package/dist/shortcuts/archive-oa/errors.js +53 -0
- package/dist/shortcuts/archive-oa/host.js +158 -0
- package/dist/shortcuts/archive-oa/index.js +225 -0
- package/dist/shortcuts/archive-oa/manifest.js +62 -0
- package/dist/shortcuts/archive-oa/operations/borrow-car.js +159 -0
- package/dist/shortcuts/archive-oa/operations/borrow-url.js +108 -0
- package/dist/shortcuts/archive-oa/operations/confirm.js +48 -0
- package/dist/shortcuts/archive-oa/operations/contract.js +120 -0
- package/dist/shortcuts/archive-oa/operations/locate.js +50 -0
- package/dist/shortcuts/archive-oa/operations/registry.js +40 -0
- package/dist/shortcuts/archive-oa/operations/shared.js +181 -0
- package/dist/shortcuts/archive-oa/operations/types.js +45 -0
- package/dist/shortcuts/archive-oa/operations.js +13 -0
- package/dist/shortcuts/asset/host.js +7 -6
- package/dist/shortcuts/blog/host.js +4 -3
- package/dist/shortcuts/caizhilian/host.js +3 -2
- package/dist/shortcuts/caizhilian/manifest.js +1 -1
- package/dist/shortcuts/calendar/host.js +2 -1
- package/dist/shortcuts/contract/host.js +34 -59
- package/dist/shortcuts/ehr/host.js +2 -1
- package/dist/shortcuts/esb/host.js +2 -1
- package/dist/shortcuts/fna/host.js +6 -3
- package/dist/shortcuts/fna/manifest.js +10 -5
- package/dist/shortcuts/fna/operations/expense-chart.js +162 -0
- package/dist/shortcuts/fna/operations/registry.js +2 -0
- package/dist/shortcuts/hrm/host.js +2 -1
- package/dist/shortcuts/im/host.js +3 -2
- package/dist/shortcuts/index.js +2 -0
- package/dist/shortcuts/invoice/host.js +9 -7
- package/dist/shortcuts/invoice/manifest.js +38 -47
- package/dist/shortcuts/invoice/operations/issuing-qys.js +328 -0
- package/dist/shortcuts/invoice/operations/registry.js +2 -3
- package/dist/shortcuts/jiuchuanhui/host.js +2 -1
- package/dist/shortcuts/mail/host.js +2 -1
- package/dist/shortcuts/meeting/host.js +2 -1
- package/dist/shortcuts/meeting/operations/eb/conflict.js +78 -12
- package/dist/shortcuts/okr/host.js +2 -1
- package/dist/shortcuts/plan/host.js +2 -1
- package/dist/shortcuts/project/host.js +2 -1
- package/dist/shortcuts/workflow/endpoints.js +11 -0
- package/dist/shortcuts/workflow/host.js +5 -7
- package/dist/shortcuts/workflow/index.js +6 -36
- package/dist/shortcuts/workflow/operations/chatscene.js +252 -0
- package/dist/shortcuts/workflow/operations/form.js +1047 -191
- package/dist/shortcuts/workflow/operations/read.js +137 -8
- package/dist/shortcuts/workflow/operations/sign-input.js +106 -0
- package/dist/shortcuts/workflow/operations/write.js +9 -1
- package/dist/shortcuts/workflow/stdout-compact.js +16 -1
- package/docs/SKILL.md +1 -1
- package/docs/_catalog.md +1 -1
- package/docs/agent-invoice.md +1 -1
- package/docs/archive-oa.md +79 -0
- package/docs/caizhilian.md +1 -1
- package/docs/e10-auth.md +7 -6
- package/docs/fna.md +7 -3
- package/docs/invoice.md +4 -6
- package/package.json +1 -1
- package/skill-template/business-info.json +20 -1
- package/skill-template/domains/archive-oa.md +19 -0
- package/skill-template/domains/caizhilian.md +2 -1
- package/skill-template/domains/qiyecheng.md +1 -0
- package/skill-template/domains/yepiaotong.md +8 -4
- package/skill-template/skill-template.md +1 -0
- package/skills/weaver-e10-archive-oa/SKILL.md +159 -0
- package/skills/weaver-e10-archive-oa/references/archive-locate.md +49 -0
- package/skills/weaver-e10-archive-oa/references/borrow-car.md +76 -0
- package/skills/weaver-e10-archive-oa/references/borrow-flow.md +53 -0
- package/skills/weaver-e10-archive-oa/references/contract-search.md +63 -0
- package/skills/weaver-e10-archive-oa/references/disabled-capabilities.md +29 -0
- package/skills/weaver-e10-archive-oa/references/qys-contract-search.md +47 -0
- package/skills/weaver-e10-archive-oa/references/source-manifest.json +400 -0
- package/skills/weaver-e10-blog/SKILL.md +6 -1
- package/skills/weaver-e10-blog/references/blog-query.md +3 -1
- package/skills/weaver-e10-builder/SKILL.md +22 -0
- package/skills/weaver-e10-caizhilian/SKILL.md +47 -16
- package/skills/weaver-e10-caizhilian/references/action-flow.md +70 -0
- package/skills/weaver-e10-caizhilian/references/agent-entry.md +12 -4
- package/skills/weaver-e10-caizhilian/references/auth-and-install.md +207 -0
- package/skills/weaver-e10-caizhilian/references/collaboration.md +5 -3
- package/skills/weaver-e10-caizhilian/references/document.md +33 -11
- package/skills/weaver-e10-caizhilian/references/file-collection.md +57 -54
- package/skills/weaver-e10-caizhilian/references/file-upload.md +5 -6
- package/skills/weaver-e10-caizhilian/references/files.md +9 -3
- package/skills/weaver-e10-caizhilian/references/folder.md +48 -16
- package/skills/weaver-e10-caizhilian/references/host-executor-prompt.md +32 -0
- package/skills/weaver-e10-caizhilian/references/host-platform-integration.md +46 -0
- package/skills/weaver-e10-caizhilian/references/rule-index.md +56 -0
- package/skills/weaver-e10-caizhilian/references/setting-attach.md +17 -54
- package/skills/weaver-e10-caizhilian/references/setting-backup.md +16 -63
- package/skills/weaver-e10-caizhilian/references/setting-encrypt.md +24 -64
- package/skills/weaver-e10-caizhilian/references/setting-storage-docs-summary.md +126 -0
- package/skills/weaver-e10-caizhilian/references/setting-storage-field-map.md +57 -0
- package/skills/weaver-e10-caizhilian/references/setting-storage.md +143 -548
- package/skills/weaver-e10-caizhilian/references/source-manifest.json +7 -7
- package/skills/weaver-e10-caizhilian/references/task-workflow.md +87 -0
- package/skills/weaver-e10-caizhilian/references/withheld.md +21 -45
- package/skills/weaver-e10-caizhilian/references/write-protocol.md +7 -0
- package/skills/weaver-e10-calendar/SKILL.md +6 -1
- package/skills/weaver-e10-esb/SKILL.md +8 -0
- package/skills/weaver-e10-esb/references/input-format.md +3 -1
- package/skills/weaver-e10-esb/references/source-manifest.json +5 -5
- package/skills/weaver-e10-hrm/SKILL.md +6 -1
- package/skills/weaver-e10-hrm/references/employee.md +1 -1
- package/skills/weaver-e10-hrm/references/org.md +1 -1
- package/skills/weaver-e10-hrm/references/position.md +1 -1
- package/skills/weaver-e10-jinchengda/SKILL.md +2 -1
- package/skills/weaver-e10-jinchengda/references/contract-agent-entry.md +1 -1
- package/skills/weaver-e10-jiuchuanhui/SKILL.md +6 -1
- package/skills/weaver-e10-jucailin/SKILL.md +6 -1
- package/skills/weaver-e10-jucailin/references/hr-contact.md +1 -1
- package/skills/weaver-e10-jucailin/references/salary.md +1 -1
- package/skills/weaver-e10-mail/SKILL.md +6 -1
- package/skills/weaver-e10-meeting/SKILL.md +11 -6
- package/skills/weaver-e10-meeting/references/meeting-eb.md +7 -3
- package/skills/weaver-e10-meeting/references/meeting-queries.md +3 -1
- package/skills/weaver-e10-meeting/references/meeting-verification.md +4 -2
- package/skills/weaver-e10-okr/SKILL.md +6 -1
- package/skills/weaver-e10-okr/references/source-manifest.json +5 -5
- package/skills/weaver-e10-plan/SKILL.md +6 -1
- package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +3 -1
- package/skills/weaver-e10-plan/references/plan-report-query.md +3 -1
- package/skills/weaver-e10-plan/references/source-manifest.json +7 -7
- package/skills/weaver-e10-qiyecheng/SKILL.md +16 -6
- package/skills/weaver-e10-qiyecheng/references/catalog.md +6 -3
- package/skills/weaver-e10-qiyecheng/references/expense-center.md +2 -0
- package/skills/weaver-e10-qiyecheng/references/expense-chart.md +78 -0
- package/skills/weaver-e10-qiyecheng/references/source-manifest.json +87 -33
- package/skills/weaver-e10-shared/SKILL.md +53 -28
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +22 -20
- package/skills/weaver-e10-shared/references/non-interactive-environment.md +13 -13
- package/skills/weaver-e10-shared/references/weaver-e10-installation.md +3 -1
- package/skills/weaver-e10-wenshuding/SKILL.md +6 -1
- package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
- package/skills/weaver-e10-workflow/references/source-manifest.json +33 -24
- package/skills/weaver-e10-workflow/references/workflow-create.md +41 -26
- package/skills/weaver-e10-yepiaotong/SKILL.md +23 -18
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +87 -45
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +152 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +210 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +59 -36
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +63 -512
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +205 -346
- package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +4 -5
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +231 -344
- package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +5 -5
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +201 -162
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +121 -145
- package/skills/weaver-e10-yimiaoban/SKILL.md +9 -2
- package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +9 -9
- package/skills/weaver-e10-ziguanjia/SKILL.md +6 -1
- package/dist/shortcuts/invoice/operations/issuing.js +0 -198
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +0 -161
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +0 -107
- package/skills/weaver-e10-yepiaotong/references/reim-fast-path.md +0 -119
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# AI 报销单自动填单 — 工作流编排
|
|
2
2
|
|
|
3
3
|
> 本文件是报销自动填单的完整工作流参考。
|
|
4
|
-
>
|
|
5
|
-
>
|
|
4
|
+
> 发票、事前申请、预填信息等数据准备走本技能的 `weaver-work-cli --json invoice run <operation>`;**报销单的创建与修改统一走 `weaver-e10-workflow` 技能**(`workflow.createForm` / `workflow.createRequest` / `workflow.edit*`),命令契约与返回处置见 [`../../weaver-e10-workflow/references/workflow-create.md`](../../weaver-e10-workflow/references/workflow-create.md) 与 [`workflow-edit.md`](../../weaver-e10-workflow/references/workflow-edit.md)。
|
|
5
|
+
> 所有调用都必须通过 CLI 执行,不能直接 curl E10 接口。
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -31,21 +31,20 @@
|
|
|
31
31
|
|
|
32
32
|
## 报销共享常量(所有 reference 统一引用本节)
|
|
33
33
|
|
|
34
|
-
以下常量在报销 reference
|
|
34
|
+
以下常量在报销 reference 中多处出现,**统一以本节为准**,其余文件引用本节不再重复定义。浏览按钮类字段一律写成 `名称(ID)`。
|
|
35
35
|
|
|
36
36
|
| 常量 | 值 | 说明 |
|
|
37
37
|
|------|-----|------|
|
|
38
|
-
| 默认合同编号 | `"20260999"` |
|
|
39
|
-
| 非出差相关客户 | `"100504500000311504"` |
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
38
|
+
| 默认合同编号 | `"20260999"` | 用户当次未给出别的合同号时使用;表单默认值已是它时不必再传。用户给了别的合同号 → 承担主体 / 相关客户 / 相关项目以合同联动为准,见 [reim-form-fill-rules.md](reim-form-fill-rules.md#用户给了合同号以合同联动为准) |
|
|
39
|
+
| 非出差相关客户 | `"泛微上海(100504500000311504)"` | 出差流程必须由用户提供具体客户 |
|
|
40
|
+
| 发票金额 | 价税合计 `info.comm_info.price.total` | 报销金额字段一律填它;**不是** `price.amount` / `invoice.get` 的 `amount`(都是不含税) |
|
|
41
|
+
| 兜底费用科目 | `"其他-管理费用(100502270000000104)"` | 所有科目匹配策略均未命中时使用 |
|
|
42
|
+
| 人民币币种 | `"人民币(100001050000000001)"` | 明细每行必传(即使表单默认带出),否则字段联动失效,见 [reim-form-fill-rules.md](reim-form-fill-rules.md) |
|
|
43
|
+
| 报销方式默认值 | `"银行(个人报销)"` | Select 传选项名;表单默认带出时不传 |
|
|
43
44
|
| 全额红冲状态值 | `status = 8` | `comm_info.pro.status`;此类发票必须过滤,不允许报销 |
|
|
44
45
|
| 相关凭证 typeCode | 17, 18, 57, 58 | 不能独立成行,必须与发票配对 |
|
|
45
|
-
|
|
|
46
|
-
|
|
|
47
|
-
|
|
48
|
-
> **continuation 过期处理**:`prepare`/`auto-prepare` 签发的 continuation 有 600 秒有效期。中间若用户核对耗时过长导致过期(返回 `validation/continuation_expired`),**重新 `prepare` 后立即 `apply` 即可**(用户已确认过的内容无需重新征询)。不要重放旧 continuation。
|
|
46
|
+
| 直接上级取值 | `directSuperior` | ⚠️ **不是 `allSuperiors[0]`**(后者是上级链最高层) |
|
|
47
|
+
| 总部费用报销 | `总部费用报销(100003460000000060)` | 费用明细 `subFormId` = `100003690000000011`(字段清单以 `createForm` 实际返回为准) |
|
|
49
48
|
|
|
50
49
|
---
|
|
51
50
|
|
|
@@ -100,7 +99,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
|
|
|
100
99
|
|
|
101
100
|
### 1. 立即获取数据,展示后确认
|
|
102
101
|
|
|
103
|
-
当用户表达报销意图时(如"帮我报销"、"我要报销"、"报销一下"等),**必须立即调用 `invoice.list`
|
|
102
|
+
当用户表达报销意图时(如"帮我报销"、"我要报销"、"报销一下"等),**必须立即调用 `invoice.list`(或 `invoice.reim.candidates.list`)获取发票数据,展示发票汇总信息后询问用户确认,确认后再自动执行后续填单流程**。禁止反问用户要求提供发票信息、事前申请信息、报销用途等。
|
|
104
103
|
|
|
105
104
|
**禁止的行为:**
|
|
106
105
|
|
|
@@ -117,7 +116,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
|
|
|
117
116
|
- 最近一周无结果 → 自动用一个月参数再查
|
|
118
117
|
- 直接调用 `invoice.reim.requests.list` 获取用户的事前申请
|
|
119
118
|
- **获取到发票后,先展示发票汇总信息(张数、基础信息),明确告知用户查询范围,询问用户确认是否报销**
|
|
120
|
-
- 用户确认后,自动执行匹配 →
|
|
119
|
+
- 用户确认后,自动执行匹配 → 载入报销表单 → 组装 `data` → `workflow.createRequest` 直接存草稿
|
|
121
120
|
|
|
122
121
|
### 2. 根据用户意图智能构建查询条件
|
|
123
122
|
|
|
@@ -128,6 +127,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
|
|
|
128
127
|
| "帮我报销" / "我要报销" | 查**最近一周**发票 → 无结果则查**最近一个月** → **展示发票汇总,询问确认** → 确认后走后续流程 |
|
|
129
128
|
| "报销打车费" | 设置 `content="滴滴"` 筛选交通类 → **展示发票汇总,询问确认** → 确认后走后续流程 |
|
|
130
129
|
| "报销上周的发票" | 设置时间范围为上周 → **展示发票汇总,询问确认** → 确认后走后续流程 |
|
|
130
|
+
| "报销上周去北京的费用" / "报销去重庆的发票" | 按**出差时间 + 城市**查票(见 Step 1A「出差 / 城市意图查票」)→ **展示发票汇总,询问确认** → 确认后走后续流程 |
|
|
131
131
|
| "报销发票号码 xxx" | 设置 `number="xxx"` 精确匹配 → **展示发票汇总,询问确认** → 确认后走后续流程 |
|
|
132
132
|
| 用户直接提供了发票数据 | **跳过 Step 1A** → **展示发票汇总,询问确认** → 确认后继续后续流程 |
|
|
133
133
|
| 用户提供了 fileId | 先调用 `invoice.reim.file-ocr.preview`(Step 0)→ **展示发票汇总,询问确认** → 确认后继续 |
|
|
@@ -150,7 +150,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
|
|
|
150
150
|
|
|
151
151
|
| 用户输入 | 起始步骤 |
|
|
152
152
|
|----------|---------|
|
|
153
|
-
| "帮我报销" | 1A → **1C(发票确认)→ 用户确认** → 1B → 2 → 2.5 → 3 →
|
|
153
|
+
| "帮我报销" | 1A → **1C(发票确认)→ 用户确认** → 1B → 2 → 2.5 → 3 → 4 → 5 |
|
|
154
154
|
| "报销打车费" / "报销上周的" | 1A(加筛选条件)→ **1C → 用户确认** → 后续同上 |
|
|
155
155
|
| 提供 fileId | Step 0 → **1C → 用户确认** → 1B → 后续同上 |
|
|
156
156
|
| 直接给发票数据 | **1C → 用户确认** → 1B → 后续同上 |
|
|
@@ -166,9 +166,9 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
|
|
|
166
166
|
|
|
167
167
|
> **⚠️ 禁止输出内部推理过程**。直接对用户说话,不要解释自己在做什么。
|
|
168
168
|
|
|
169
|
-
####
|
|
169
|
+
#### 报销后修正
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
用户补充缺失字段、修改字段值 → 通过 `workflow.editLoad` → `workflow.editPrepare` → 用户确认 → `workflow.editApply` 完成(Step 6)。
|
|
172
172
|
|
|
173
173
|
### 4. 自动化决策原则
|
|
174
174
|
|
|
@@ -178,7 +178,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
|
|
|
178
178
|
- 事前申请有数据 → 自动匹配,不需要用户确认"是否关联"
|
|
179
179
|
- 事前申请为空 → 跳过匹配,直接用发票数据填单,不需要问用户
|
|
180
180
|
- 匹配到唯一结果 → 直接使用,不需要用户确认
|
|
181
|
-
-
|
|
181
|
+
- **只有在必须用户做选择时才暂停**(如:多候选需要选一个、发票列表为空无法继续、**出差流程必须填写相关客户**、话费材料不齐);**创建报销单不再暂停确认,直接存草稿**
|
|
182
182
|
- **⚠️ 严禁篡改任何原始数据值**
|
|
183
183
|
|
|
184
184
|
---
|
|
@@ -190,31 +190,32 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
|
|
|
190
190
|
↓
|
|
191
191
|
Step 0 (可选): invoice.reim.file-ocr.preview → 识别发票
|
|
192
192
|
↓
|
|
193
|
-
Step 1A: invoice.list (可跳过) ←→ Step 1B: invoice.reim.requests.list
|
|
193
|
+
Step 1A: invoice.list / invoice.reim.candidates.list (可跳过) ←→ Step 1B: invoice.reim.requests.list
|
|
194
194
|
↓
|
|
195
195
|
Step 1C: 展示发票汇总 → 用户确认是否报销
|
|
196
196
|
↓ (用户确认)
|
|
197
197
|
Step 2: 发票 ↔ 事前申请匹配绑定 (reim-matching-rules.md)
|
|
198
198
|
↓
|
|
199
|
-
Step 2.5: invoice.reim.workflow.resolve →
|
|
199
|
+
Step 2.5: invoice.reim.workflow.resolve → 获取报销工作流 ID 与名称
|
|
200
200
|
↓
|
|
201
|
-
Step 2.6:
|
|
201
|
+
Step 2.6: 按工作流分组(多个工作流 → 多组,各组独立执行后续步骤)
|
|
202
202
|
↓ ↓ ↓ (每组)
|
|
203
|
-
|
|
204
|
-
│ ▼ 并行组 A(同时发起)
|
|
205
|
-
│ Step 3:
|
|
206
|
-
│ Step 3.5: invoice.reim.row-info
|
|
207
|
-
│ Step 3.6: invoice.
|
|
208
|
-
│ 交通类额外: invoice.get × M
|
|
209
|
-
|
|
203
|
+
┌──────────────────────────────────────────────┐
|
|
204
|
+
│ ▼ 并行组 A(同时发起) │
|
|
205
|
+
│ Step 3: workflow.createForm(载入报销表单) │
|
|
206
|
+
│ Step 3.5: invoice.reim.row-info-batch │
|
|
207
|
+
│ Step 3.6: invoice.browse-field.data(发票对象) │
|
|
208
|
+
│ 交通类额外: invoice.get × M │
|
|
209
|
+
└──────────────────────────────────────────────┘
|
|
210
210
|
↓ (全部返回后)
|
|
211
|
-
Step 4:
|
|
211
|
+
Step 4: 组装 createRequest 的 data (reim-form-fill-rules.md)
|
|
212
212
|
↓
|
|
213
213
|
Step 4.5: 出差流程 → 提醒用户填写相关客户(未提供则不允许报销)
|
|
214
|
+
Step 4.6: 话费报销 → 核对材料并按标准核算实报金额
|
|
214
215
|
↓
|
|
215
|
-
Step 5:
|
|
216
|
+
Step 5: workflow.createRequest(action 固定 draft,直接存草稿,不问用户)→ 原样展示 finalMarkdown
|
|
216
217
|
↓
|
|
217
|
-
Step 6 (可选):
|
|
218
|
+
Step 6 (可选): workflow.editLoad / editPrepare / editApply → 用户修正
|
|
218
219
|
```
|
|
219
220
|
|
|
220
221
|
### ⚡ 并行调用策略(必须遵守)
|
|
@@ -222,11 +223,10 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
222
223
|
| 并行组 | 可并行的操作 | 说明 |
|
|
223
224
|
|--------|------------|------|
|
|
224
225
|
| **Step 1 并行** | `invoice.reim.requests.list` 与 Step 1C 发票展示 | 用户确认期间预取事前申请 |
|
|
225
|
-
| **Step 3 并行** | `
|
|
226
|
-
| **多张发票** | 多张发票的 `row-info` | 各发票独立,强制并行 |
|
|
226
|
+
| **Step 3 并行** | `workflow.createForm` + `invoice.reim.row-info-batch` + `invoice.browse-field.data` + `invoice.get` × M | 全部互相独立,**必须同时发起** |
|
|
227
227
|
| **交通类行程** | 多张交通发票的 `invoice.get` | 各发票独立,强制并行 |
|
|
228
228
|
|
|
229
|
-
>
|
|
229
|
+
> **`createForm` 不跨组复用**:它返回的 `continuation` 与本次单据绑定,**每个报销单各调一次 `createForm`**,不能拿上一单的 `continuation` 再发起。
|
|
230
230
|
|
|
231
231
|
---
|
|
232
232
|
|
|
@@ -248,7 +248,12 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
248
248
|
|
|
249
249
|
> **如果用户已提供发票数据或已通过 Step 0 获取,则跳过此步骤。**
|
|
250
250
|
|
|
251
|
-
|
|
251
|
+
两种方式任选其一:
|
|
252
|
+
|
|
253
|
+
| 方式 | 适用 | 说明 |
|
|
254
|
+
| --- | --- | --- |
|
|
255
|
+
| `invoice.reim.candidates.list` | 按日期范围批量报销(推荐) | 自动翻页、自动过滤红冲票,并把发票分成 `available`(可报)/ `assigned`(已挂单)两组;**只从 `available` 里选**。见 [reim-api-reference.md](reim-api-reference.md#1b-报销候选发票分类) |
|
|
256
|
+
| `invoice.list` | 按关键词 / 号码 / 类型筛选 | 需自己过滤红冲票 |
|
|
252
257
|
|
|
253
258
|
### 默认查询策略(用户未指定日期时)
|
|
254
259
|
|
|
@@ -258,6 +263,26 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
258
263
|
4. 有结果 → Step 1C 展示汇总,告知"最近一周没找到,已扩大到一个月"
|
|
259
264
|
5. 仍无结果 → 告知用户未找到发票,建议指定日期范围
|
|
260
265
|
|
|
266
|
+
### 出差 / 城市意图查票
|
|
267
|
+
|
|
268
|
+
用户提到了去某个城市(「去北京」「重庆的发票」)时,**不能只按开票日期筛**:出差的票常在回来后才开,用户说的"上周"是出差时间,不是开票时间。
|
|
269
|
+
|
|
270
|
+
1. **时间范围(开票日期 `date_begin` / `date_end`)**
|
|
271
|
+
- 用户说了出差时间(「上周」「10月12日到15日」)→ 从**出差开始日**查到**今天**
|
|
272
|
+
- 没说时间 → 最近一个月;没有与该城市相关的票 → 扩到最近 90 天
|
|
273
|
+
2. **按城市逐张筛**(不按 `content` 关键词筛,城市不在消费内容里):
|
|
274
|
+
|
|
275
|
+
| 发票 | 怎么判断与目的城市相关 |
|
|
276
|
+
| --- | --- |
|
|
277
|
+
| 火车票 / 机票 | 出发站或到达站所在城市是目的城市(列表项带 `from` / `to` 时直接用,没有再调 `invoice.get`);站名换成城市(「北京南」→ 北京) |
|
|
278
|
+
| 酒店 / 餐饮 | 销方名称或地址里的城市 |
|
|
279
|
+
| 打车 / 网约车 | 销方名称里的城市(「重庆滴滴出行科技有限公司」→ 重庆);或行程单起止点所在城市 |
|
|
280
|
+
| 其他 | 销方名称或地址里的城市;判断不了的不算相关 |
|
|
281
|
+
|
|
282
|
+
3. **按出差时间再筛一次**:用户说了出差时间时,火车票 / 机票的乘车日期、酒店入住日期要落在出差时间内(前后各放宽 1 天);打车票和其他票只要开票日期不早于出差开始日即可。
|
|
283
|
+
4. **展示**:Step 1C 只列与该城市相关的票,并说明「按 {城市}、{时间范围} 查的」。同期查到的其他票不混进来,只在表格下一句话提示「同期还有 N 张其他发票,需要一起报请告诉我」。
|
|
284
|
+
5. **没有相关的票** → 明确告诉用户查了哪个时间范围、按什么条件筛的、为什么同期的票不算(如「火车票是杭州东 → 全椒」),然后停下,不要自己扩到不相关的票或无限放宽时间。
|
|
285
|
+
|
|
261
286
|
### 日期筛选参数
|
|
262
287
|
|
|
263
288
|
| 参数 | 用途 | 使用时机 |
|
|
@@ -266,9 +291,9 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
266
291
|
| `create_tm_begin` / `create_tm_end` | 录入/创建日期范围 | 用户明确说"录入日期"/"创建日期"时 |
|
|
267
292
|
|
|
268
293
|
**⚠️ 数据过滤(红冲票排除):**
|
|
269
|
-
-
|
|
270
|
-
-
|
|
271
|
-
-
|
|
294
|
+
- `candidates.list` **自动过滤** `status=8` 的全额红冲发票(过滤张数在 `summary.filteredRedReversedCount` 中报告)。
|
|
295
|
+
- 使用 `invoice.list` 时,**必须在进入任何后续流程前先过滤掉 `info.comm_info.pro.status == 8` 的发票**,并向用户报告:"已自动排除 N 张全额红冲发票"。
|
|
296
|
+
- 全额红冲发票不允许报销,**不能让红冲票进入匹配/组装环节**。
|
|
272
297
|
|
|
273
298
|
关键返回字段映射见 [reim-api-reference.md](reim-api-reference.md#1-获取发票数据)。
|
|
274
299
|
|
|
@@ -334,6 +359,7 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
334
359
|
{
|
|
335
360
|
"invoiceId": "INV001",
|
|
336
361
|
"preApprovalId": "1298294241967177729",
|
|
362
|
+
"preApprovalName": "交通费报销-后端开发111-2026-07-25",
|
|
337
363
|
"preApprovalWorkflowId": "1181057526276915214",
|
|
338
364
|
"matchConfidence": "high",
|
|
339
365
|
"matchReasons": ["时间范围匹配", "费用类型一致"]
|
|
@@ -341,6 +367,8 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
341
367
|
]
|
|
342
368
|
```
|
|
343
369
|
|
|
370
|
+
> `preApprovalName` 要保留:填「事前申请流程 / 相关流程」字段时写成 `{preApprovalName}({preApprovalId})`。
|
|
371
|
+
|
|
344
372
|
### Step 2 匹配结果展示(推荐)
|
|
345
373
|
|
|
346
374
|
匹配完成后,**建议向用户展示匹配结果**,而不是静默进入下一步。展示格式:
|
|
@@ -364,9 +392,9 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
364
392
|
|
|
365
393
|
---
|
|
366
394
|
|
|
367
|
-
## Step 2.5: 获取报销单工作流
|
|
395
|
+
## Step 2.5: 获取报销单工作流
|
|
368
396
|
|
|
369
|
-
通过 `invoice.reim.workflow.resolve`
|
|
397
|
+
通过 `invoice.reim.workflow.resolve` 获取报销工作流的 `workFlowId` 与 `workFlowName`(Step 3 用 `{workFlowName}({workFlowId})` 载入表单)。
|
|
370
398
|
|
|
371
399
|
**⚠️ 核心逻辑:当存在多个工作流时,需要将发票/事前申请按工作流分组,每组各创建一个报销单。**
|
|
372
400
|
|
|
@@ -388,75 +416,114 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
388
416
|
|
|
389
417
|
---
|
|
390
418
|
|
|
391
|
-
## Step 3:
|
|
419
|
+
## Step 3: 载入报销表单(`workflow.createForm`)
|
|
392
420
|
|
|
393
|
-
|
|
421
|
+
调用 `weaver-e10-workflow` 的 `workflow.createForm`,`workflow` 传 Step 2.5 得到的 `{workFlowName}({workFlowId})`(带 ID 时 CLI 不查可发起列表,直接载入):
|
|
394
422
|
|
|
395
|
-
|
|
423
|
+
macOS/Linux(bash/zsh):
|
|
396
424
|
|
|
397
|
-
|
|
425
|
+
```bash
|
|
426
|
+
weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow":["总部费用报销(100003460000000060)"]}'
|
|
427
|
+
```
|
|
398
428
|
|
|
399
|
-
|
|
429
|
+
Windows PowerShell:
|
|
400
430
|
|
|
401
|
-
|
|
431
|
+
```powershell
|
|
432
|
+
weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow":["总部费用报销(100003460000000060)"]}'
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
> ⚠️ **AI 报销调用 `createForm` 时不传 `userQuestion`**(`workflow-create.md` 里「强烈建议每次都传」**不适用于报销**),也**不用 `workflow.createRequestDirect`**(一步发起)。
|
|
436
|
+
> 传了 `userQuestion` 会让流程侧的智能填参按用户原话算 `data`:发票字段只给 `"invoice"` 占位符、承担主体会按用户口述填(与「合同联动为准」冲突)、不会逐行传币种、标题和费用说明也不按本技能格式;同时 `historyRequestData` 不再返回。报销的 `data` 一律按本技能 Step 4 的规则自己组装。
|
|
437
|
+
> 万一返回里还是带了 `data`(例如别的环节传了 `userQuestion`),**忽略它**,照常按 Step 4 组装;此时没有 `historyRequestData`,费用承担公司交给 `missingFields` 提醒。
|
|
438
|
+
|
|
439
|
+
从返回里取:
|
|
402
440
|
|
|
403
|
-
|
|
441
|
+
| 返回键 | 用途 |
|
|
442
|
+
| --- | --- |
|
|
443
|
+
| `continuation`(= `contextId`) | Step 5 `createRequest` 的 `context` |
|
|
444
|
+
| `fields` | **可写字段全集**:按 `name` 找业务字段取 `id`;带 `subFormId` 的是明细字段;带 `initialValue` 的有默认值 |
|
|
445
|
+
| `requestName` | 表单默认标题(报销单标题按 [reim-form-fill-rules.md](reim-form-fill-rules.md#流程标题requestname) 生成后用 `requestName` 参数覆盖) |
|
|
446
|
+
| `historyRequestData` | 只用于本技能规则没覆盖的字段(如费用承担公司),口径见 `workflow-create.md`「历史流程数据参考规则」;**只有不传 `userQuestion` 时才返回** |
|
|
447
|
+
| `workflowMemory` | 该工作流的记忆(可能没有这个键);只能补本技能规则没覆盖的非必填字段,与本技能规则冲突时以本技能为准 |
|
|
448
|
+
|
|
449
|
+
- `NEEDS_CLARIFICATION`(`workflow_not_exist` / `no_create_right`)→ 按 `workflow-create.md` 如实告知用户,停止本组。
|
|
450
|
+
- 大表单超线(stdout 只有一句话 + `resultFile`)→ 按 `workflow-create.md` 读一次 `resultFile`,不要重跑。
|
|
451
|
+
- **不再需要** `invoice.reim.form.structure`、`invoice.reim.field.search`:字段清单由 `createForm` 给出,浏览按钮的名称 → ID 由 `createRequest` 解析。
|
|
404
452
|
|
|
405
|
-
|
|
453
|
+
---
|
|
406
454
|
|
|
407
|
-
|
|
455
|
+
## Step 3.5: 获取发票预填信息(`invoice.reim.row-info-batch`)
|
|
408
456
|
|
|
409
|
-
- 入参:`
|
|
410
|
-
- 返回的 `date`、`fysm`、`itinerary`、`subjectId` **在 Step 4 中优先使用**
|
|
411
|
-
-
|
|
457
|
+
- 入参:`invoiceIds`=本组全部**发票**(不含凭证)ID,`requestid`=匹配到的事前申请 ID(无则留空)
|
|
458
|
+
- 返回的 `date`、`fysm`、`itinerary`、`subjectId`、`subjectName` **在 Step 4 中优先使用**
|
|
459
|
+
- 某张失败或字段为空 → 该行回退到 AI 推断逻辑
|
|
460
|
+
- `itineraryData`(行程单逐段明细)**暂不拆行**,仍一张发票一行,见 [reim-form-fill-rules.md](reim-form-fill-rules.md#4-行程单多段行程暂不拆行)
|
|
412
461
|
|
|
413
462
|
### 交通类发票额外处理
|
|
414
463
|
|
|
415
|
-
交通类发票(`expenseType` 含交通/出行/打车,或 `consumeContent` 含客运服务费/运输服务,或 `sellerName`
|
|
464
|
+
交通类发票(`expenseType` 含交通/出行/打车,或 `consumeContent` 含客运服务费/运输服务,或 `sellerName` 含滴滴/享道等),以及出差报销里的火车票 / 机票 → **额外并行调用 `invoice.get`** 获取出发地和目的地。`invoice.get` 取不到起止点时,用行程单 `itineraryData` 兜底。
|
|
416
465
|
|
|
417
|
-
>
|
|
466
|
+
> 费用说明统一写 `起点-终点`,规则见 [reim-form-fill-rules.md](reim-form-fill-rules.md#行程--出差费用说明)
|
|
418
467
|
|
|
419
468
|
---
|
|
420
469
|
|
|
421
|
-
## Step 3.6:
|
|
470
|
+
## Step 3.6: 取发票对象(`invoice.browse-field.data`)
|
|
471
|
+
|
|
472
|
+
发票字段(`EinvoiceComponent`)只接受发票对象,不接受文本或裸 ID。把本组所有**发票** + 已确定的**配对凭证**的 `fid` 一次传入:
|
|
473
|
+
|
|
474
|
+
macOS/Linux(bash/zsh):
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fids":["1295366637717012482","1298798990831518001"]}'
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
Windows PowerShell:
|
|
422
481
|
|
|
423
|
-
|
|
482
|
+
```powershell
|
|
483
|
+
weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fids":["1295366637717012482","1298798990831518001"]}'
|
|
484
|
+
```
|
|
424
485
|
|
|
425
|
-
>
|
|
486
|
+
> `row-info` 的 `itinerary` 要等 Step 3.5 返回后才知道。为了不串行,Step 3 并行组里先只传发票 + AI 已配对的凭证;`itinerary` 返回了新的凭证 ID 时再补调一次,只传新增的 `fids`。
|
|
426
487
|
|
|
427
|
-
|
|
428
|
-
- `allSuperiors` 全部 `id` 逗号拼接 → "承担人所有上级"(⚠️ 必填)
|
|
488
|
+
> 发票都来自用户已确认的票夹,属于 `workflow-create.md` 里"指名从票夹取"的情形,**不需要**上传提醒。
|
|
429
489
|
|
|
430
490
|
---
|
|
431
491
|
|
|
432
|
-
## Step
|
|
492
|
+
## Step 3.7(兜底): 当前人员及上级(`invoice.reim.employee-superiors`)
|
|
433
493
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
494
|
+
承担主体、报销人上级等人员字段通常由表单默认值带出,**默认不调用**。只有以下情况才调用一次(同一会话可复用):
|
|
495
|
+
|
|
496
|
+
- `fields` 里承担主体 / 申请人 / 报销人上级等字段**没有 `initialValue`**;或
|
|
497
|
+
- `createRequest` 的 `missingFields` 列出了这些字段。
|
|
498
|
+
|
|
499
|
+
取值:当前人员 → `{currentEmployee.name}({currentEmployee.id})`;直接上级 → `{directSuperior.name}({directSuperior.id})`(**不是 `allSuperiors[0]`**);所有上级 → `allSuperiors` 每项的 `名称(ID)`。
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## Step 4: 组装 `createRequest` 的 `data`
|
|
441
504
|
|
|
442
|
-
|
|
505
|
+
> **详细填值规则见 [reim-form-fill-rules.md](reim-form-fill-rules.md)**
|
|
506
|
+
> **费用科目匹配规则见 [reim-expense-subject-rules.md](reim-expense-subject-rules.md)**
|
|
443
507
|
|
|
444
508
|
```json
|
|
445
509
|
{
|
|
446
|
-
"
|
|
447
|
-
"
|
|
448
|
-
"request_name": "流程标题",
|
|
449
|
-
"main_fields": [{"fieldId": "...", "value": "...", "fieldName": "..."}],
|
|
450
|
-
"detail_rows": [{"dataIndex": 1, "subFormId": "...", "invoiceId": "...", "fields": [...]}],
|
|
451
|
-
"need_user_confirm": [],
|
|
452
|
-
"unable_to_fill": []
|
|
510
|
+
"main": {"<主表字段id>": "<值>"},
|
|
511
|
+
"details": {"<费用明细subFormId>": [{"<明细字段id>": "<值>"}]}
|
|
453
512
|
}
|
|
454
513
|
```
|
|
455
514
|
|
|
456
515
|
**关键约束:**
|
|
457
|
-
-
|
|
458
|
-
-
|
|
459
|
-
-
|
|
516
|
+
- **⚠️ `createRequest` 必传 `requestName`**:按 [reim-form-fill-rules.md](reim-form-fill-rules.md)「流程标题」公式生成,**禁止留用表单默认标题**(不传会静默留用「{流程名}-{申请人}-{日期}」默认值,无任何提示)
|
|
517
|
+
- **⚠️ 主表必填「报销事由」**:按 [reim-form-fill-rules.md](reim-form-fill-rules.md)「报销事由」公式生成写入 `data.main`,**禁止留空**
|
|
518
|
+
- 键只取 `createForm` 的 `fields[].id`;`fields` 里没有的字段不传,带默认值且不需改写的字段不传(例外:明细「币种」每行必传)
|
|
519
|
+
- 浏览按钮写 `名称(ID)`;Select 写选项名;发票字段写 `[发票对象]`
|
|
520
|
+
- 一张发票一行;相关凭证(17/18/57/58)放进配对发票那一行,每行最多 1 张
|
|
521
|
+
- 行程单有多段行程也**不拆行**
|
|
522
|
+
- 有行程单 / 交通类 / 出差报销的明细,费用说明写精简后的 `起点-终点`:**整串最多 1 个 `-`、不含 `|` 和空格**,禁止原样填 `大道|重庆财经学院-西门 - 鱼胡路-地铁站` 这类原始地址
|
|
523
|
+
- **费用类型(科目)每行必须有值**,匹配不到填 `"其他-管理费用(100502270000000104)"`
|
|
524
|
+
- **合同号固定 `"20260999"`**(除用户当次明确给出别的合同号);表单默认值已是它时不必传
|
|
525
|
+
- **用户给了合同号 → 承担主体、相关客户、相关项目都不传,以合同联动为准**(用户口头指定的承担主体也不传);创建后从 `linkageResult` 读出实际带出的值告诉用户
|
|
526
|
+
- **⚠️ 出差流程相关客户规则见 Step 4.5;话费报销规则见 Step 4.6。**
|
|
460
527
|
|
|
461
528
|
---
|
|
462
529
|
|
|
@@ -466,10 +533,11 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
466
533
|
> 完整规则见 [reim-form-fill-rules.md - 出差流程相关客户](reim-form-fill-rules.md#出差流程相关客户硬拦截)。
|
|
467
534
|
|
|
468
535
|
简要规则:
|
|
536
|
+
- 用户给了合同号 → 相关客户由合同联动带出,不拦截
|
|
469
537
|
- `workFlowName` 或 `requestname` 含「差旅」「出差」→ 暂停,提醒用户提供具体客户名称
|
|
470
|
-
- 用户给出客户名称 → `
|
|
471
|
-
- 用户拒绝 / 不提供 → **结束报销,禁止调用 `
|
|
472
|
-
- 非出差流程:相关客户固定填 `"100504500000311504"`
|
|
538
|
+
- 用户给出客户名称 → 原样填进「相关客户」,由 `createRequest` 解析;多候选/查不到按 `workflow-create.md` 的浏览按钮口径处理
|
|
539
|
+
- 用户拒绝 / 不提供 → **结束报销,禁止调用 `workflow.createRequest`**
|
|
540
|
+
- 非出差流程:相关客户固定填 `"泛微上海(100504500000311504)"`
|
|
473
541
|
|
|
474
542
|
---
|
|
475
543
|
|
|
@@ -483,103 +551,73 @@ Step 6 (可选): invoice.reim.flow.update.prepare/apply → 用户修正
|
|
|
483
551
|
- 必须提供本人实名制当月手机账单截图及账单构成
|
|
484
552
|
- 必须确认岗位对应月度上限(350 / 200 / 100),禁止猜测岗位
|
|
485
553
|
- 剔除手机设备赠送套餐、家庭宽带套餐后,实报金额 = `min(可报销账单金额, 上限)`
|
|
486
|
-
-
|
|
487
|
-
- 材料不齐 / 岗位未确认 / 用户拒绝 → **结束报销,禁止调用 `invoice.reim.flow.create.prepare`**
|
|
554
|
+
- 材料不齐 / 岗位未确认 / 用户拒绝 → **结束报销,禁止调用 `workflow.createRequest`**
|
|
488
555
|
|
|
489
556
|
---
|
|
490
557
|
|
|
491
|
-
## Step
|
|
492
|
-
|
|
493
|
-
> **向用户展示单据预览、汇总、确认清单时,凡是字典/选择类 ID 值,一律渲染成 `中文名(ID)`,禁止只给裸 ID。**
|
|
494
|
-
> 用户要靠中文名核对金额、科目、上级和客户;裸 ID 无法复核,属于无效展示。
|
|
558
|
+
## Step 5: 直接存草稿(`workflow.createRequest`,`action:"draft"`)
|
|
495
559
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
| `labels` | `employees` / `subjects` / `currencies` / `customers` / `selectOptions` / `customer` / `detailSubForm` / `workflow` | 需要自己拼其它展示时取字典 |
|
|
505
|
-
| `labels.unresolved`、`preview.unresolvedLabels` | 未取到中文名的 ID 清单 | 非空时按下方兜底口径如实展示,并放进 `need_user_confirm` 提醒用户核对 |
|
|
560
|
+
> **⚠️ AI 报销一律存草稿,组装完 `data` 直接调用,不展示「存草稿 / 提交审批」让用户选,也不再等创建前确认。** 草稿不进审批,用户在 E10 里核对后自己提交。
|
|
561
|
+
> - `action` 固定 `"draft"`,**不要传 `"submit"`**——即使用户说了「提交」,本流程也只建草稿,并在回复里告诉用户去 E10 页面核对后提交。
|
|
562
|
+
> - **`requestName` 必传**(按「流程标题」公式生成)、**`data.main` 必含「报销事由」**(按「报销事由」公式生成)——两者不传会静默留用表单默认标题 / 留空,且无 warning。
|
|
563
|
+
> - 用户在 Step 1C 已确认过用哪些发票;之后匹配、组装、创建一路自动执行。
|
|
564
|
+
>
|
|
565
|
+
> **以下拦截仍然有效(未满足前禁止调用):**
|
|
566
|
+
> - **出差流程**:相关客户未由用户提供具体信息(或合同联动带出)前,禁止调用。
|
|
567
|
+
> - **话费报销**:账单截图、账单构成或岗位标准未确认前,禁止调用。
|
|
506
568
|
|
|
507
|
-
|
|
569
|
+
### 5.1 创建
|
|
508
570
|
|
|
509
|
-
|
|
571
|
+
macOS/Linux(bash/zsh):
|
|
510
572
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
| 费用类型(科目) | `invoice.reim.row-info` 的 `subjectName`(与 `subjectId` 同源,**同一行数据直接取**) | 用 `reim-expense-subject-rules.md` 查找表反查;仍无则保留 `未知科目(ID)` |
|
|
514
|
-
| 币种 | `invoice.reim.row-info` 的 `bz[].name` | `人民币(100001050000000001)` |
|
|
515
|
-
| 申请人 / 提单人员 / 承担主体 | `invoice.reim.employee-superiors` 的 `currentEmployee.name` | — |
|
|
516
|
-
| 报销人上级 / 承担人直接上级 | 同命令 `directSuperior.name` | — |
|
|
517
|
-
| 承担人所有上级 | 同命令 `allSuperiors[].name`,按原顺序逗号拼接,**每个都带 ID** | — |
|
|
518
|
-
| 报销方式等 Select 字段 | `invoice.reim.form.structure` 主表该字段 `options` 里 `optionValue` → `optionName` | 保留 `optionValue=7` |
|
|
519
|
-
| 相关客户 | `invoice.reim.field.search` 返回项的 `name` | 见下方警告 |
|
|
520
|
-
|
|
521
|
-
⚠️ **相关客户无法用 ID 反查**(实测):`invoice.reim.field.search` 把待查的那个 ID 当 `keywords` 传,一律返回 `[]`(例如 `keywords="100504500000311504"` → 空)。必须改用**关键词模糊搜索**再按 `id` 匹配:
|
|
522
|
-
|
|
523
|
-
```text
|
|
524
|
-
keywords="泛微" → 命中 {"name":"泛微上海","id":"100504500000311504"}
|
|
573
|
+
```bash
|
|
574
|
+
weaver-work-cli --json workflow run workflow.createRequest --input ./reim-create-request.json
|
|
525
575
|
```
|
|
526
576
|
|
|
527
|
-
|
|
577
|
+
Windows PowerShell:
|
|
528
578
|
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
```markdown
|
|
532
|
-
| 项目 | 值 |
|
|
533
|
-
| --- | --- |
|
|
534
|
-
| 相关客户 | 泛微上海(100504500000311504) |
|
|
535
|
-
| 报销人上级 / 承担人直接上级 | 温明刚(6490972696771260615) |
|
|
536
|
-
| 承担人所有上级 | 熊学武(8005823778783571762), 章宏武(4270809363797382452), 周军锋(9080972482706531342), 温明刚(6490972696771260615), 韦利东(8005823776035471761) |
|
|
537
|
-
| 报销方式 | 银行(个人报销)(optionValue=7) |
|
|
538
|
-
| 费用科目(每行) | 日常消费(1256664958132969489) |
|
|
579
|
+
```powershell
|
|
580
|
+
weaver-work-cli --json workflow run workflow.createRequest --input .\reim-create-request.json
|
|
539
581
|
```
|
|
540
582
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
---
|
|
544
|
-
|
|
545
|
-
## Step 5: 生成报销单流程
|
|
546
|
-
|
|
547
|
-
通过 `invoice.reim.flow.create.prepare` → 用户确认 → `invoice.reim.flow.create.apply` 完成。
|
|
548
|
-
|
|
549
|
-
> **⚠️ 禁止重复调用:同一组发票数据只能调用一次。调用成功后,修改已创建的报销单使用 Step 6 的 update。**
|
|
550
|
-
> **⚠️ 出差流程拦截:相关客户未由用户提供具体信息前,禁止调用。**
|
|
551
|
-
> **⚠️ 话费报销拦截:账单截图、账单构成或岗位标准未确认前,禁止调用。**
|
|
552
|
-
|
|
553
|
-
### 创建成功后
|
|
583
|
+
`reim-create-request.json` 的内容:
|
|
554
584
|
|
|
555
|
-
|
|
585
|
+
```json
|
|
586
|
+
{
|
|
587
|
+
"context": "<Step 3 createForm 返回的 continuation>",
|
|
588
|
+
"requestName": "龚为明7月上海交通费报销",
|
|
589
|
+
"action": "draft",
|
|
590
|
+
"data": {
|
|
591
|
+
"main": {"100003720000000088": "上海市内交通费(滴滴出行)", "100003720000000687": "泛微上海(100504500000311504)"},
|
|
592
|
+
"details": {"100003690000000011": [{"100003720000016373": "108.2", "100003720000052200": "人民币(100001050000000001)"}]}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
```
|
|
556
596
|
|
|
557
|
-
|
|
558
|
-
✅ 报销单创建成功!
|
|
597
|
+
> `data` 含发票对象,体积较大,建议写成 UTF-8 文件用 `--input <path>` 传入。
|
|
559
598
|
|
|
560
|
-
|
|
599
|
+
### 5.2 返回处置
|
|
561
600
|
|
|
562
|
-
|
|
563
|
-
**报销事由**:2026-07-30 市内交通 - 滴滴出行
|
|
564
|
-
**汇总金额**:¥185.80
|
|
565
|
-
**查看链接**:[点击查看报销单](viewUrl)
|
|
601
|
+
**完全按 `workflow-create.md`「createRequest 返回后的处置」执行**:
|
|
566
602
|
|
|
567
|
-
|
|
|
568
|
-
|
|
569
|
-
|
|
|
570
|
-
|
|
|
603
|
+
| 返回 | 处置 |
|
|
604
|
+
| --- | --- |
|
|
605
|
+
| `CREATED` | **原样粘贴 `finalMarkdown`**,一字不改;链接只出现在回复文本里。之后按需补几句:合同联动带出的值与用户口述不同、未挂上 / 未配对的凭证、话费核算明细、`missingFields` 提交前要补的字段 |
|
|
606
|
+
| `BROWSER_FILL`(小e 环境) | **没有写服务端、没有 `requestId`**:把 `finalMarkdown`(一段 `<browsertool>` 标签块)**整段原样输出**作为回复正文,不包代码块、不加任何前后说明,也不补上面那几句提醒;由页面打开新建页带入字段值,用户在页面上保存。之后**不要走 Step 6**(没有可改的单据) |
|
|
607
|
+
| `NEEDS_INPUT` | 缺的是承担主体、上级、合同号、相关客户、科目等本技能有规则的字段 → 按 [reim-form-fill-rules.md](reim-form-fill-rules.md) 补值后用同一 `context` 重发;其余原样粘贴 `finalMarkdown` 一次问齐用户 |
|
|
608
|
+
| `NEEDS_CONFIRMATION` | 按 `ambiguities` 处理(浏览按钮多候选让用户选;`MULTIPLICITY` 只保留 1 个值) |
|
|
609
|
+
| `partial` / `write_uncertain` | 停止,不重放;只读回查一次后告知用户 |
|
|
571
610
|
|
|
572
|
-
|
|
573
|
-
```
|
|
611
|
+
> **⚠️ 禁止重复创建**:同一组发票 `createRequest` 成功后,**不要再次 `createForm` + `createRequest`**;修改一律走 Step 6。
|
|
574
612
|
|
|
575
613
|
---
|
|
576
614
|
|
|
577
|
-
## Step 6(可选):
|
|
615
|
+
## Step 6(可选): 修改已创建的报销单
|
|
578
616
|
|
|
579
|
-
通过 `
|
|
617
|
+
通过 `weaver-e10-workflow` 的 `workflow.editLoad`(传 Step 5 返回的 `requestId`)→ `workflow.editPrepare`(`data` 写法同 Step 4,只传要改的字段)→ 用户确认 → `workflow.editApply`。详见 [`workflow-edit.md`](../../weaver-e10-workflow/references/workflow-edit.md)。
|
|
580
618
|
|
|
581
|
-
-
|
|
582
|
-
-
|
|
619
|
+
- 流程已流转到不可编辑节点时 `editApply` 返回"失去操作权限",如实转述
|
|
620
|
+
- 只读字段会被拒绝(`notEditable`),如实转述,不要换字段 id 绕过
|
|
583
621
|
|
|
584
622
|
---
|
|
585
623
|
|
|
@@ -589,26 +627,27 @@ CLI 返回 `requestId` 和 `viewUrl`,**用结构化汇总信息展示给用户
|
|
|
589
627
|
- 发票列表为空 → 提示"未找到未报销的发票",结束
|
|
590
628
|
- 出差/差旅流程缺少相关客户 → 见 Step 4.5
|
|
591
629
|
- 话费报销缺少账单截图、账单构成或岗位标准 → 见 Step 4.6
|
|
592
|
-
-
|
|
630
|
+
- `createRequest` 返回 `NEEDS_INPUT` / `NEEDS_CONFIRMATION` 且本技能规则补不上 → 按 `workflow-create.md` 问用户
|
|
593
631
|
|
|
594
632
|
**严禁重复调用:**
|
|
595
|
-
- **`
|
|
633
|
+
- **`createRequest` 已成功 → 严禁再次创建,后续修改一律使用 Step 6**
|
|
596
634
|
|
|
597
635
|
**自动继续(不问用户):**
|
|
598
636
|
- 事前申请为空 / 匹配失败 → 跳过事前关联,直接用发票填单
|
|
599
|
-
- 匹配结果唯一
|
|
637
|
+
- 匹配结果唯一 → 直接使用
|
|
600
638
|
|
|
601
639
|
**用户中途取消:**
|
|
602
640
|
- 用户说"取消"/"不报了"/"算了" → 立即停止
|
|
603
|
-
-
|
|
641
|
+
- 已创建成功 → 告知用户可通过链接手动删除
|
|
604
642
|
|
|
605
643
|
---
|
|
606
644
|
|
|
607
645
|
## 参考文档
|
|
608
646
|
|
|
609
|
-
- [reim-api-reference.md](reim-api-reference.md) -
|
|
647
|
+
- [reim-api-reference.md](reim-api-reference.md) - 报销数据准备 CLI operation 入参与返回值
|
|
610
648
|
- [reim-matching-rules.md](reim-matching-rules.md) - 发票与事前申请匹配逻辑
|
|
611
|
-
- [reim-form-fill-rules.md](reim-form-fill-rules.md) -
|
|
612
|
-
- [reim-expense-subject-rules.md](reim-expense-subject-rules.md) -
|
|
649
|
+
- [reim-form-fill-rules.md](reim-form-fill-rules.md) - `createRequest` 的 `data` 填值规则
|
|
650
|
+
- [reim-expense-subject-rules.md](reim-expense-subject-rules.md) - 费用科目自动匹配规则
|
|
613
651
|
- [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) - 话费补贴 / 话费报销月度标准与实报金额
|
|
614
652
|
- [reim-examples.md](reim-examples.md) - 完整端到端示例
|
|
653
|
+
- [`workflow-create.md`](../../weaver-e10-workflow/references/workflow-create.md) / [`workflow-edit.md`](../../weaver-e10-workflow/references/workflow-edit.md) - 发起与修改流程的命令契约
|