weaver-work-cli 0.1.26 → 0.1.29
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 +7 -2
- package/dist/cmd/setup/index.js +1 -1
- package/dist/internal/e10/auth/commands.js +1 -6
- package/dist/internal/e10/auth/messages.js +3 -0
- package/dist/internal/e10/auth/session.js +8 -0
- package/dist/internal/e10/auth-recovery.js +148 -0
- package/dist/internal/e10/client.js +47 -15
- package/dist/internal/e10/context.js +8 -8
- 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/host.js +2 -1
- package/dist/shortcuts/archive-oa/manifest.js +1 -1
- 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/invoice/host.js +9 -7
- package/dist/shortcuts/invoice/manifest.js +23 -142
- package/dist/shortcuts/invoice/operations/issuing-qys.js +266 -203
- package/dist/shortcuts/invoice/operations/registry.js +1 -6
- 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/host.js +3 -5
- package/dist/shortcuts/workflow/index.js +4 -1
- package/dist/shortcuts/workflow/operations/chatscene.js +4 -22
- package/dist/shortcuts/workflow/operations/form.js +281 -166
- package/dist/shortcuts/workflow/operations/read.js +39 -8
- package/dist/shortcuts/workflow/operations/registry.js +2 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +331 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +133 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +326 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +113 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +259 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoListRows.js +64 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoOutputPlanner.js +28 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.aggregate.js +70 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +267 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +392 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +165 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +448 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +348 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +222 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +66 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +502 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +540 -0
- package/dist/shortcuts/workflow/stdout-compact.js +7 -0
- package/docs/SKILL.md +1 -1
- package/docs/_catalog.md +2 -1
- package/docs/agent-invoice.md +1 -1
- package/docs/caizhilian.md +1 -1
- package/docs/e10-auth.md +1 -1
- package/docs/fna.md +7 -3
- package/docs/invoice.md +4 -6
- package/docs/todo-smart-convert/README.md +171 -0
- package/docs/todo-smart-convert/data-contract.md +236 -0
- package/docs/todo-smart-convert/mock/ai-todo-query-target.json +209 -0
- package/docs/todo-smart-convert/subgroup-rules.md +245 -0
- package/package.json +1 -1
- package/scripts/package-skill.mjs +1 -1
- package/skill-template/business-info.json +4 -1
- package/skill-template/domains/caizhilian.md +2 -1
- package/skill-template/domains/qiyecheng.md +1 -0
- package/skill-template/domains/yepiaotong.md +6 -2
- package/skill-template/skill-template.md +1 -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-caizhilian/SKILL.md +18 -9
- package/skills/weaver-e10-caizhilian/references/action-flow.md +70 -0
- package/skills/weaver-e10-caizhilian/references/agent-entry.md +6 -2
- package/skills/weaver-e10-caizhilian/references/auth-and-install.md +207 -0
- package/skills/weaver-e10-caizhilian/references/file-collection.md +56 -54
- package/skills/weaver-e10-caizhilian/references/file-upload.md +4 -4
- 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 +5 -16
- package/skills/weaver-e10-caizhilian/references/setting-backup.md +4 -13
- package/skills/weaver-e10-caizhilian/references/setting-encrypt.md +6 -15
- 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 +142 -482
- 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 +2 -2
- 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 +37 -14
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +11 -8
- package/skills/weaver-e10-shared/references/non-interactive-environment.md +4 -4
- 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/SKILL.md +23 -1
- package/skills/weaver-e10-workflow/references/source-manifest.json +1 -2
- package/skills/weaver-e10-workflow/references/todo-smart-convert.md +282 -0
- package/skills/weaver-e10-workflow/references/workflow-create.md +30 -55
- package/skills/weaver-e10-workflow/scripts/todo-summary.cjs +695 -0
- package/skills/weaver-e10-yepiaotong/SKILL.md +19 -17
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +75 -78
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +179 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +238 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +7 -7
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +11 -5
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +55 -33
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +102 -23
- package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +1 -1
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +53 -42
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +94 -214
- 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-qys-ledger.md +0 -66
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +0 -107
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# AI 开票:获取待开票合同数据 → 开票流程草稿(主链路)
|
|
2
|
+
|
|
3
|
+
## 什么时候读取
|
|
4
|
+
|
|
5
|
+
用户说"开票""开一下合同 XX 的票""把 XX 公司那份合同开票""按台账开票""发起开票流程"等开票意图时,**默认读取本文件**。
|
|
6
|
+
|
|
7
|
+
**本文件是唯一开票链路(0.1.27 起)**:CLI 已移除 `invoice.issuing.make.prepare/apply`、`invoice.issuing.qys.prepare`、`invoice.issuing.result`,不再存在"直接开票""存待开台账"的接口。用户说"直接开票""不走流程""先存台账"时,一律按本链路发起开票流程草稿,并说明开票必须经所选开票流程审批后由流程侧完成;数据不在待开票合同数据里时,提示用户先录入合同商品信息。
|
|
8
|
+
|
|
9
|
+
## 链路概览
|
|
10
|
+
|
|
11
|
+
本链路**不直接开票**:Agent 先获取待开票合同数据(含契约锁、泛微及其他合同),在 E10 按合同号发起「开票申请」流程并**存为草稿**;用户在 E10 核对后自己提交,审批通过后由流程侧完成开票。
|
|
12
|
+
|
|
13
|
+
| 步 | 命令 | 所属技能 | 风险 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| 1 | `invoice.issuing.qys.list` | 本技能 | read |
|
|
16
|
+
| 2 | `workflow.createForm` | `weaver-e10-workflow` | read |
|
|
17
|
+
| 3 | `workflow.createRequest`(`action` 固定 `draft`) | `weaver-e10-workflow` | high-risk-write |
|
|
18
|
+
| 修改 | `workflow.editLoad` → `workflow.editPrepare` → 用户确认 → `workflow.editApply` | `weaver-e10-workflow` | high-risk-write |
|
|
19
|
+
|
|
20
|
+
流程的创建与修改依赖同级的 `weaver-e10-workflow` 技能(`../weaver-e10-workflow/`),命令契约与返回处置以 [`workflow-create.md`](../../weaver-e10-workflow/references/workflow-create.md)、[`workflow-edit.md`](../../weaver-e10-workflow/references/workflow-edit.md) 为准。该技能不存在时停止并告知用户需要安装,不要改用直接开票或其他方式代替。
|
|
21
|
+
|
|
22
|
+
## 选哪个开票流程
|
|
23
|
+
|
|
24
|
+
先按用户意图,再按销售方名称。`workflow.createForm` 传选中的 `名称(ID)`。**不要按宽词 `开票` 检索**:「合同开票申请」「发票开具」不是本链路的流程,宽词还会误中冲红流程。
|
|
25
|
+
|
|
26
|
+
| 情形 | 流程 |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| 用户要退票、冲红或红冲 | `合同开票冲红流程(887410479139758085)` |
|
|
29
|
+
| 核算公司完全等于 `上海亘岩网络科技有限公司` | `契约锁合同收款发票开具及快递申请(100003460000001852)` |
|
|
30
|
+
| 核算公司完全等于下面任一名称:`泛微网络`、`泛微软件`、`上海田亩`、`成都泛微`、`泛微国际`、`北京泛微`、`浙江泛微` | `合同收款发票开具及快递申请(100003460000000214)` |
|
|
31
|
+
| 核算公司为空,或不在上面两档名单里 | 先问用户,选定前不建草稿 |
|
|
32
|
+
|
|
33
|
+
销售方即所属公司,只取本组 `sellerNames`(台账「核算公司」)。名称必须与名单**完全相同**才算命中,不要自行补全或改写(`泛微网络` 不等于 `上海泛微网络科技有限公司`)。用户本轮说了销售方、所属公司或核算公司,以用户原话为准,仍按上表完全匹配。
|
|
34
|
+
|
|
35
|
+
- 非空名称去重后只有一个,且在名单里:用这个名称选流程。
|
|
36
|
+
- 有多个不同名称:列出这些名称,请用户指定一个。没选定之前不建草稿。
|
|
37
|
+
- 全部为空,或名称不在名单里:**不要默认选流程**。只问一句:「台账核算公司是空的(或不在已知名单里,当前是『{名称}』),销售方是哪家?『上海亘岩网络科技有限公司』走契约锁开票流程;泛微网络、泛微软件、上海田亩、成都泛微、泛微国际、北京泛微、浙江泛微走合同收款发票开具及快递申请。」用户给出名称后再按上表选择。
|
|
38
|
+
- 退票、冲红、红冲优先于销售方判断,不按销售方改去上面两个开票流程。
|
|
39
|
+
|
|
40
|
+
冲红不套用 [invoice-issuing-form-fill-rules.md](invoice-issuing-form-fill-rules.md)。`createForm` 后按返回字段的中文名填写;至少要有红冲原因和要冲的原开票流程,用户没给就先问,问齐再存草稿。`action` 仍固定 `draft`。
|
|
41
|
+
|
|
42
|
+
两个开票流程的填单规则相同。下表字段 id 在契约锁流程上实测过;走到「合同收款发票开具及快递申请」时,用当次 `createForm` 里同中文名的字段 id,中文名对不上就不要借用另一条流程的 id。
|
|
43
|
+
|
|
44
|
+
| 常量 | 值 |
|
|
45
|
+
| --- | --- |
|
|
46
|
+
| 关联字段 | 主表「合同号」;契约锁流程上的字段 id 是 `100003720000056343`,以 `createForm` 返回的 `fields` 按中文名「合同号」定位为准 |
|
|
47
|
+
| 流程标题 `requestName` | `开票申请-{购方名称}-{合同号}` |
|
|
48
|
+
| `action` | 固定 `draft` |
|
|
49
|
+
|
|
50
|
+
载入后必须核对,**两条都满足才往下填**,否则停止并请用户确认流程:
|
|
51
|
+
|
|
52
|
+
- `workflow.id` 等于上面选中的那条流程 ID;
|
|
53
|
+
- 开票流程的 `fields` 里能按中文名找到主表「合同号」。冲红流程改为能按中文名找到红冲原因或相关开票流程。
|
|
54
|
+
|
|
55
|
+
## 对话流程
|
|
56
|
+
|
|
57
|
+
### Step 1:获取待开票合同数据(`invoice.issuing.qys.list`)
|
|
58
|
+
|
|
59
|
+
- 用户给了合同号 → 传 `contractNo`;给了公司名、合同名或商品名 → 传 `keyword`。这一步叫「获取待开票合同数据」,数据里有契约锁、泛微和其他合同的待开票行。命令 id 仍是 `invoice.issuing.qys.list`,返回的 `items` / `groups` 结构不变。
|
|
60
|
+
- 用户什么线索都没给(只说"帮我开票")→ **只问一句**:"要给哪个合同开票?请提供合同号或客户名称。"不要追问购方、金额、税率——这些都由台账和流程联动带出。
|
|
61
|
+
- 不要传 `limit` 去翻全量;分组看 `groups`,逐行明细才看 `items`。
|
|
62
|
+
- 获取待开票合同数据返回 `api/business_error`「系统错误」(code 500)时,多半是当前登录租户里没有这份待开票合同数据:如实告知并请用户确认登录的 E10 租户,不要重试、不要换关键词再查。
|
|
63
|
+
|
|
64
|
+
### Step 2:按分组展示(`data.groups`)
|
|
65
|
+
|
|
66
|
+
`groups` 已按「合同号 + 购方」分好组,**一组 = 一张开票流程**;`totalAmount` 是 CLI 按分累加的开票金额合计(台账开票金额为**含税**金额),**Agent 不做任何金额计算**。
|
|
67
|
+
|
|
68
|
+
| `groups` 条数 | 处置 |
|
|
69
|
+
| --- | --- |
|
|
70
|
+
| 0 | 用 `includeIssued=true` 再查**一次**,按组展示 `blockedRows` 与对应 `items[].blockers`(已开票 / 已关联开票流程 / 开票中 / 已废弃),说明这份合同当前没有可开票的行,**结束**。 |
|
|
71
|
+
| 1 | 直接进 Step 3 确认卡片。 |
|
|
72
|
+
| 多条 | 列出分组让用户选(合同号、合同审批流程、购方、销售方、行数、商品、开票金额合计),**不要替用户选**;一次只处理一组。 |
|
|
73
|
+
|
|
74
|
+
`scanComplete=false` 时提醒用户:台账超过扫描上限,结果可能不全。
|
|
75
|
+
|
|
76
|
+
**税号与发票类型硬拦截**:选定的分组 `specialInvoiceWithoutTaxNo=true`(购方没有税号,台账发票类型却是专票)时,**不展示确认卡片、不发起流程**。只告诉用户:「{购方名称} 没有税号,不能开专票,只能开普票。请先把台账里这份合同的发票类型改成普票(如全电普票),再让我发起。」用户改完台账后从 Step 1 重新查。
|
|
77
|
+
|
|
78
|
+
- 不要在流程里把「发票类型」改成普票来绕过:发票类型由合同号联动带出,联动值优先,Agent 传的值会被覆盖。
|
|
79
|
+
- 用户坚持要开专票时,说明专票必须有购方税号,请先在台账补全税号。
|
|
80
|
+
|
|
81
|
+
### Step 3:确认卡片(创建前唯一一次确认)
|
|
82
|
+
|
|
83
|
+
按下面模板展示,等用户明确回复"确认""发起""好的"等同义确认后再往下走:
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
将为以下合同发起「开票申请」流程(只存草稿,不会直接开票):
|
|
87
|
+
|
|
88
|
+
合同号:20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)
|
|
89
|
+
购方:南昌我爱我家科技有限公司 税号:91360125083909438T
|
|
90
|
+
销售方:上海亘岩网络科技有限公司
|
|
91
|
+
开票流程:契约锁合同收款发票开具及快递申请
|
|
92
|
+
发票类型:全电专票
|
|
93
|
+
| 序号 | 商品 | 税率 | 开票金额(含税) |
|
|
94
|
+
| 1 | 技术服务费 | 6.0% | 20000 |
|
|
95
|
+
开票金额合计(含税):20000.00(共 1 行)
|
|
96
|
+
|
|
97
|
+
本次开票金额:20000(默认按总金额开)
|
|
98
|
+
开票事由:合同20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)技术服务费全额开票,金额20000元
|
|
99
|
+
开票内容:技术服务费(按货物名称「技术服务费」匹配)
|
|
100
|
+
预计收款时间:(必填)请选择:本月底 2026-10-31 / 下月底 2026-11-30 / 30 天后 2026-11-22,或直接给一个日期
|
|
101
|
+
请回复预计收款时间并确认发起。
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- `group.purchaserBankName` 或 `group.purchaserBankAccount` 非空时,在「购方」行下加一行 `开户行:{purchaserBankName} 账号:{purchaserBankAccount}`,两个值分开写,不要用台账原始的混写串。
|
|
105
|
+
- 「销售方」「开票流程」两行按「选哪个开票流程」填写。核算公司为空、不在名单里,或有多个不同名称时,先按该节问用户,选定前不展示这条确认卡片、不建草稿。
|
|
106
|
+
- 明细表的行取该组 `formDataIds` 对应的 `items[]`:商品取「开票名称」,为空取「商品名称」;金额取 `amount` 原值,不改写。
|
|
107
|
+
- 模板里的「开票内容」行只属于 `契约锁合同收款发票开具及快递申请`。其他流程没有这个字段,确认卡片不写这一行,也不推断、不问。
|
|
108
|
+
- 「开票事由」按填单规则自动生成并展示在卡片里,不问用户;「预计收款时间」由用户决定,卡片里附上按当天日期算好的本月底、下月底、30 天后三个候选日期。**用户没给出日期就不建草稿**:只回"确认 / 继续"时再问一句,拿到日期再往下走;不要自己定默认日期,也不要留空先建(详见填单规则「预计收款时间」)。用户开票时已说了收款时间,卡片里直接展示换算后的日期,末行改为"确认发起吗?"。
|
|
109
|
+
- `warnings` 非空时在卡片末尾逐条列出。命中"同合同另有 N 行已开票…"时追加一句:"流程按合同号联动,可能一并带出这些行,请在 E10 草稿里核对明细。"
|
|
110
|
+
- 用户要改购方、金额、税率或商品 → 告知需先在台账修改,再重新从 Step 1 开始;**不要在流程里手工覆盖这些值**。
|
|
111
|
+
|
|
112
|
+
### Step 4:载入开票流程表单(`workflow.createForm`)
|
|
113
|
+
|
|
114
|
+
- `workflow` 传「选哪个开票流程」里选中的 `名称(ID)`;**不传 `userQuestion`**,也不用 `workflow.createRequestDirect`。
|
|
115
|
+
- 载入后按「选哪个开票流程」里的两条核对规则检查 `workflow.id` 与「合同号」字段(冲红流程改查红冲原因或相关开票流程);不满足就停止,不往下填,也不要换别的流程凑。
|
|
116
|
+
- `createForm` 返回 OA 业务错误(如表单布局接口报错)时如实转述并停止,不重试、不换流程。
|
|
117
|
+
|
|
118
|
+
### Step 5:组装 `data` 并存草稿(`workflow.createRequest`)
|
|
119
|
+
|
|
120
|
+
`data` 按 [invoice-issuing-form-fill-rules.md](invoice-issuing-form-fill-rules.md) 组装,一句话概括:**用户说了就按用户的,没说就按默认值**。创建时的默认值包括:合同号、相关合同审批流程、产品类型「契约锁」、开票日期取当天、开票备注填合同号、所售产品版本号取明细规格类型(须与下拉选项完全一致)、开票事由按公式自动生成;预计收款时间填用户在卡片环节给的日期(必须有,没有就回到 Step 3 问)。「开票内容」只在 `契约锁合同收款发票开具及快递申请(100003460000001852)` 上按明细货物名称推断并填写,其他流程忽略。明细每行**只传**「本次开票金额」(契约锁流程上的中文名是「金额(含税)」)。用户没指定金额时,默认等于**该明细行自己的**「总开票金额」(台账该行开票金额)。有多行就按「明细行id」各传各的,不要只传一行、也不要把一行的金额写到另一行。货物名称、购买方名称、明细合同号、明细行id、单价、规格类型、单位、税率、总开票金额、已开票金额、未开票金额都由合同号联动带出,**传了反而会让总开票金额等三列带不出来**。
|
|
121
|
+
|
|
122
|
+
明细「数量」、主表「开户行名称」「开户行银行帐号」创建时**不传**:
|
|
123
|
+
- 联动会把数量写成税率选项 id。
|
|
124
|
+
- 联动会把开户行写成名称账号混写串。
|
|
125
|
+
|
|
126
|
+
「开票内容」只在 `契约锁合同收款发票开具及快递申请` 创建时传入,取值见填单规则「开票内容推断」。多个货物名称对上不同选项时,先在确认卡片里问用户,选定前不建草稿。其他流程不传这个字段。
|
|
127
|
+
|
|
128
|
+
开户行两个字段在 Step 6 第 5 条经编辑链补正。契约锁流程上的开票内容不要再经编辑链改(`editPrepare` 会报错)。只有这条流程没推断出来时,才在 Step 6 第 6 条提醒用户在 E10 里选。数量仍在第 6 条提醒。其余购方信息不传;金额(不含税)、税额不传、不计算。
|
|
129
|
+
|
|
130
|
+
- `requestName` **必传**:`开票申请-{购方名称}-{合同号}`,不留用表单默认标题。
|
|
131
|
+
- `action` 固定 `"draft"`:用户说"直接提交"也只建草稿,并告诉用户去 E10 核对后提交。
|
|
132
|
+
|
|
133
|
+
`data` 较大时写成 UTF-8 JSON 文件用 `--input <path>` 传入。
|
|
134
|
+
|
|
135
|
+
### Step 6:回显与核对
|
|
136
|
+
|
|
137
|
+
1. 按 `workflow-create.md`「createRequest 返回后的处置」处理:`CREATED` / `NEEDS_INPUT` / `BROWSER_FILL` 有 `finalMarkdown` 就**原样粘贴**;`NEEDS_CONFIRMATION` 按 `ambiguities` 处理;`partial` / `write_uncertain` 停止,只读回查一次。
|
|
138
|
+
2. `CREATED` 后用返回的 `linkageResult`(一段「字段联动带出:字段=值、…」文本)核对联动结果。明细其余列由联动写入,`previewDetails` 里只有 Agent 自己填的金额,属正常。只核对三项:
|
|
139
|
+
- 含「是否存在合同明细数据=存在」;
|
|
140
|
+
- 含「总开票金额=」和「货物名称=」(明细整行已从台账带出);
|
|
141
|
+
- 「本次开票总金额」等于本次填入各行「金额(含税)」之和;按默认值开时,它等于 `group.totalAmount`。数值比较时 `5900.00` 与 `5900` 视为相等。
|
|
142
|
+
|
|
143
|
+
另外用 `editLoad` 的 `currentValues` 核对每一明细行:「本次开票金额」为空,或不等于该行「总开票金额」时,按填单规则「创建后补正」补成该行「总开票金额」,只改这一列。补完后「本次开票总金额」应等于各行「本次开票金额」之和。
|
|
144
|
+
|
|
145
|
+
三项都满足、且每行「本次开票金额」已经等于该行「总开票金额」时**不额外说明**。补完仍不一致时,在 `finalMarkdown` 之后**只追加一行**:`⚠️ 流程汇总的本次开票总金额为 X,与本次填写的开票金额 Y 不一致(或未带出合同明细),请在 E10 核对后再提交。`
|
|
146
|
+
3. `missingFields` 非空时原样转述(提交前需补齐);`finalMarkdown` 末尾已有这段提示时不要重复。
|
|
147
|
+
4. `BROWSER_FILL`(小e 环境)只输出那段 `<browsertool>` 标签块,不做第 2 步核对。
|
|
148
|
+
5. **补正开户行名称与账号**(`CREATED` 后都要做,取值规则见填单规则「创建后补正」):
|
|
149
|
+
- `workflow.editLoad` 读草稿(`requestId` 取创建返回值),从 `currentValues` 取主表「开户行名称」「开户行银行帐号」「开户行及帐号」,以及每行「明细行id」「数量」(第 6 条要用)。
|
|
150
|
+
- 算出补正值:取 `group.purchaserBankName` / `group.purchaserBankAccount`,为空时拆「开户行及帐号」。已经相同就不提交。
|
|
151
|
+
- 有要补的:`workflow.editPrepare` **只传主表这两个字段**,不传任何明细、不传开票内容。然后向用户列出补正项,并问「要把开户行名称和账号分开补进草稿吗?」,用户确认后 `workflow.editApply`。
|
|
152
|
+
- 「开户行及帐号」格式无法拆分时不补这两项,告诉用户原值,请其在 E10 里手工拆填。
|
|
153
|
+
- `editPrepare` / `editApply` 报错时原样转述,不重试;草稿本身已建好,不受影响。
|
|
154
|
+
6. **提醒用户在 E10 里改的项**:在本轮回复末尾加一段「提交前请在 E10 里改」。只有 `契约锁合同收款发票开具及快递申请` 才处理开票内容:已经写入时不提;没推断出来才写「开票内容:明细货物名称没有对应的下拉选项,请在 E10 里选择」。其他流程不要提开票内容。数量按填单规则提醒,如:
|
|
155
|
+
|
|
156
|
+
```text
|
|
157
|
+
提交前请在 E10 里改:
|
|
158
|
+
- 明细第 1 行数量:联动带出的是 1201835186337538063,请在 E10 改成 1
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
没有要改的项就不要加这段。不要为了开票内容或数量调用 `editPrepare`。
|
|
162
|
+
|
|
163
|
+
### Step 7:之后的操作
|
|
164
|
+
|
|
165
|
+
- **禁止重复创建**:同一合同 `createRequest` 成功后,不要再次 `createForm` + `createRequest`;修改一律走 `workflow.editLoad` → `workflow.editPrepare` → 用户确认 → `workflow.editApply`。
|
|
166
|
+
- 用户问"开出来了吗 / 发票号是多少":说明开票在流程审批通过后由流程侧完成,请在 E10 查看该流程;CLI 已无 `invoice.issuing.result`,不要尝试用 `QYS-{formDataId}` 查开票结果。
|
|
167
|
+
- 用户中途说"取消 / 不开了" → 立即停止;草稿已创建时告知可在 E10 通过链接删除。
|
|
168
|
+
|
|
169
|
+
## 命令
|
|
170
|
+
|
|
171
|
+
下面这条是核算公司为「上海亘岩网络科技有限公司」时的开票草稿。核算公司是泛微网络、泛微软件、上海田亩、成都泛微、泛微国际、北京泛微、浙江泛微之一时,把 `workflow.createForm` 的流程换成 `合同收款发票开具及快递申请(100003460000000214)`,`data` 里的字段 id 改成该流程 `createForm` 返回的同中文名 id。
|
|
172
|
+
|
|
173
|
+
macOS/Linux(bash/zsh):
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
weaver-work-cli --json invoice run invoice.issuing.qys.list --input-json '{"contractNo":"20266105586"}'
|
|
177
|
+
weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow":["契约锁合同收款发票开具及快递申请(100003460000001852)"]}'
|
|
178
|
+
cat > ./issuing-request.json <<'JSON'
|
|
179
|
+
{
|
|
180
|
+
"context": "<createForm 返回的 continuation>",
|
|
181
|
+
"requestName": "开票申请-深圳市康哲药业有限公司-20266105586",
|
|
182
|
+
"action": "draft",
|
|
183
|
+
"data": {
|
|
184
|
+
"main": {
|
|
185
|
+
"100003720000056343": "20266105586",
|
|
186
|
+
"100003720000056262": "深圳市康哲药业有限公司2026年度维护(1327967410806063252)",
|
|
187
|
+
"100003720000056342": "契约锁",
|
|
188
|
+
"100003720000056243": "年度维护费",
|
|
189
|
+
"100003720000056255": "2026-10-23",
|
|
190
|
+
"100003720000056250": "2026-11-30",
|
|
191
|
+
"100003720000118915": "20266105586",
|
|
192
|
+
"100003720000056252": "合同20266105586(深圳市康哲药业有限公司2026年度维护)年度维护费全额开票,金额5900元"
|
|
193
|
+
},
|
|
194
|
+
"details": {"100003690000001811": [{
|
|
195
|
+
"100003720000118901": "5900"
|
|
196
|
+
}]}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
JSON
|
|
200
|
+
weaver-work-cli --json workflow run workflow.createRequest --input ./issuing-request.json
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Windows PowerShell:
|
|
204
|
+
|
|
205
|
+
```powershell
|
|
206
|
+
weaver-work-cli --json invoice run invoice.issuing.qys.list --input-json '{"contractNo":"20266105586"}'
|
|
207
|
+
weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow":["契约锁合同收款发票开具及快递申请(100003460000001852)"]}'
|
|
208
|
+
Set-Content -Encoding utf8 -LiteralPath .\issuing-request.json -Value @'
|
|
209
|
+
{
|
|
210
|
+
"context": "<createForm 返回的 continuation>",
|
|
211
|
+
"requestName": "开票申请-深圳市康哲药业有限公司-20266105586",
|
|
212
|
+
"action": "draft",
|
|
213
|
+
"data": {
|
|
214
|
+
"main": {
|
|
215
|
+
"100003720000056343": "20266105586",
|
|
216
|
+
"100003720000056262": "深圳市康哲药业有限公司2026年度维护(1327967410806063252)",
|
|
217
|
+
"100003720000056342": "契约锁",
|
|
218
|
+
"100003720000056243": "年度维护费",
|
|
219
|
+
"100003720000056255": "2026-10-23",
|
|
220
|
+
"100003720000056250": "2026-11-30",
|
|
221
|
+
"100003720000118915": "20266105586",
|
|
222
|
+
"100003720000056252": "合同20266105586(深圳市康哲药业有限公司2026年度维护)年度维护费全额开票,金额5900元"
|
|
223
|
+
},
|
|
224
|
+
"details": {"100003690000001811": [{
|
|
225
|
+
"100003720000118901": "5900"
|
|
226
|
+
}]}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
'@
|
|
230
|
+
weaver-work-cli --json workflow run workflow.createRequest --input .\issuing-request.json
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## 注意
|
|
234
|
+
|
|
235
|
+
- 台账里的合同号、购方、税号、金额、税率按原值使用,**不改写、不补位、不格式化**。
|
|
236
|
+
- 本链路不读取、不上传任何附件或图片;用户另外提供文件要求"按文件开票"时,说明当前只支持按待开票合同数据发起开票流程,需先把数据录入后再获取。
|
|
237
|
+
- 一次只发起一组(一张流程);用户要求多份合同一起开时,逐组走 Step 3~6,每组各调一次 `createForm`,`continuation` 不跨组复用。
|
|
238
|
+
- 写请求已发出但结果不确定时按 SKILL.md「写操作失败处理」处理,**禁止重放 `createRequest`**。
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
| 取发票字段对象 | `invoice.browse-field.data` | yepiaotong | read |
|
|
19
19
|
| 获取当前人员及上级(兜底) | `invoice.reim.employee-superiors` | yepiaotong | read |
|
|
20
20
|
| 载入报销表单 | `workflow.createForm` | workflow | read |
|
|
21
|
-
|
|
|
21
|
+
| 创建报销单(固定存草稿) | `workflow.createRequest` | workflow | high-risk-write |
|
|
22
22
|
| 修改已创建的报销单 | `workflow.editLoad` / `workflow.editPrepare` / `workflow.editApply` | workflow | read / read-before-write / high-risk-write |
|
|
23
23
|
|
|
24
24
|
> workflow 侧命令的入参、返回处置以 [`../../weaver-e10-workflow/references/workflow-create.md`](../../weaver-e10-workflow/references/workflow-create.md)、[`workflow-edit.md`](../../weaver-e10-workflow/references/workflow-edit.md) 为准。`weaver-e10-workflow` 技能不可用时停止并告知用户需要安装该技能,不要改用其他方式创建报销单。
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
3. 用 `invoice.reim.requests.list` 获取事前申请,再按时间、费用类型和标题做匹配;原始 ID、日期、金额必须逐字符保留。
|
|
31
31
|
4. 用 `invoice.reim.workflow.resolve` 得到报销工作流,必要时按工作流分组。
|
|
32
32
|
5. 对每组并行调用 `workflow.createForm`(`workflow` 传 `{workFlowName}({workFlowId})`)、`invoice.reim.row-info-batch`、`invoice.browse-field.data`(发票 + 配对凭证的 `fid`)。
|
|
33
|
-
6. 按 [`reim-form-fill-rules.md`](reim-form-fill-rules.md) 组装 `createRequest` 的 `data
|
|
33
|
+
6. 按 [`reim-form-fill-rules.md`](reim-form-fill-rules.md) 组装 `createRequest` 的 `data`,直接调用 `workflow.createRequest` 存草稿(`action` 固定 `"draft"`,不问用户),结果原样粘贴 `finalMarkdown`。命中「话费补贴标准审批流程」或「话费报销」时,必须先读 [`reim-phone-subsidy-rules.md`](reim-phone-subsidy-rules.md),按月度标准核算实报金额,不能直接用发票金额填单。
|
|
34
34
|
7. 报销单创建成功后,后续修正使用 `workflow.editLoad` → `workflow.editPrepare` → 用户确认 → `workflow.editApply`,不要重复创建同一组发票的报销单。
|
|
35
35
|
|
|
36
36
|
完整编排见 [`reim-workflow.md`](reim-workflow.md)。
|
|
@@ -73,10 +73,10 @@ Windows PowerShell:
|
|
|
73
73
|
Set-Content -Encoding utf8 -LiteralPath .\reim-create-request.json -Value @'
|
|
74
74
|
{
|
|
75
75
|
"context": "<createForm 返回的 continuation>",
|
|
76
|
-
"requestName": "
|
|
76
|
+
"requestName": "示例7月上海交通费报销",
|
|
77
77
|
"action": "draft",
|
|
78
78
|
"data": {
|
|
79
|
-
"main": {"100003720000000088": "
|
|
79
|
+
"main": {"100003720000000088": "上海市内交通费(滴滴出行)"},
|
|
80
80
|
"details": {"100003690000000011": [{"100003720000016373": "108.2", "100003720000052200": "人民币(100001050000000001)"}]}
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -90,10 +90,10 @@ macOS/Linux(bash/zsh):
|
|
|
90
90
|
cat > ./reim-create-request.json <<'JSON'
|
|
91
91
|
{
|
|
92
92
|
"context": "<createForm 返回的 continuation>",
|
|
93
|
-
"requestName": "
|
|
93
|
+
"requestName": "示例7月上海交通费报销",
|
|
94
94
|
"action": "draft",
|
|
95
95
|
"data": {
|
|
96
|
-
"main": {"100003720000000088": "
|
|
96
|
+
"main": {"100003720000000088": "上海市内交通费(滴滴出行)"},
|
|
97
97
|
"details": {"100003690000000011": [{"100003720000016373": "108.2", "100003720000052200": "人民币(100001050000000001)"}]}
|
|
98
98
|
}
|
|
99
99
|
}
|
|
@@ -109,7 +109,7 @@ weaver-work-cli --json workflow run workflow.createRequest --input ./reim-create
|
|
|
109
109
|
|
|
110
110
|
## 注意
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
载入表单的 `workflow.createForm` **不传 `userQuestion`**、也不用 `workflow.createRequestDirect`:报销的 `data` 由本技能规则组装,不用流程侧智能填参。AI 报销**一律存草稿**(`action:"draft"`),组装完直接调用 `workflow.createRequest`,不让用户选「存草稿 / 提交审批」;草稿由用户在 E10 里核对后自己提交。同一组发票创建成功后禁止再次创建,修改只能走 `workflow.edit*`。
|
|
113
113
|
|
|
114
114
|
出差/差旅流程需要具体相关客户。未拿到用户提供的客户前,不要调用 `workflow.createRequest`。
|
|
115
115
|
|
|
@@ -67,7 +67,7 @@ weaver-work-cli --json invoice run invoice.reim.file-ocr.preview --input-json '{
|
|
|
67
67
|
| `invoiceId` | 发票唯一ID(后续匹配和填单使用) |
|
|
68
68
|
| `invoiceType` | 发票类型名称 |
|
|
69
69
|
| `invoiceTypeCode` | 发票类型编码 |
|
|
70
|
-
| `amount` |
|
|
70
|
+
| `amount` | 发票金额(价税合计) |
|
|
71
71
|
| `consumeContent` | 消费内容/商品名称 |
|
|
72
72
|
| `invoiceDate` | 开票日期(yyyy-MM-dd) |
|
|
73
73
|
| `invoiceNumber` | 发票号码 |
|
|
@@ -227,8 +227,10 @@ CLI 信封中列表在 `data.items`。下面是单条发票的票面结构(对
|
|
|
227
227
|
| `info.comm_info.pro.type` | `invoiceTypeCode` | 发票类型编码(见下方分类说明) |
|
|
228
228
|
| `info.comm_info.pro.date` | `invoiceDate` | 开票日期(yyyy-MM-dd) |
|
|
229
229
|
| `info.comm_info.pro.status` | — | 发票状态(**8=全额红冲,必须过滤掉**) |
|
|
230
|
-
| `info.comm_info.price.total` | `amount` |
|
|
231
|
-
| `info.comm_info.price.amount` | — |
|
|
230
|
+
| `info.comm_info.price.total` | `amount` | **价税合计(发票金额)**——报销金额一律用它 |
|
|
231
|
+
| `info.comm_info.price.amount` | — | 不含税金额,**不要拿来填报销金额**(字段名虽叫 `amount`) |
|
|
232
|
+
|
|
233
|
+
> ⚠️ 原始返回里叫 `amount` 的字段**不一定是价税合计**:`invoice.list` / `invoice.get` 的 `price.amount`、`invoice.get` 里的 `amount` 都是**不含税**金额(实测滴滴票 `price.amount=48.61`、`price.total=50.07`)。本技能文档里说的「发票 `amount`」专指上表映射后的**价税合计 `price.total`**。
|
|
232
234
|
| `info.comm_info.buyer.company` | `buyerName` | 购方公司名称 |
|
|
233
235
|
| `info.comm_info.payer.company` | `sellerName` | 销方公司名称 |
|
|
234
236
|
| `info.fylx` | — | 费用类型 ID(需根据 ID 查找对应 `expenseType` 名称) |
|
|
@@ -743,6 +745,9 @@ weaver-work-cli --json invoice run invoice.reim.row-info --input-json '{"invoice
|
|
|
743
745
|
| `itinerary` | 关联凭证 ID(多个用逗号拼接) | 相关凭证(`EinvoiceComponent`,每行最多 1 张) |
|
|
744
746
|
| `subjectId` | 费用科目 ID | 费用类型(科目) |
|
|
745
747
|
| `subjectName` | 费用科目名称 | 与 `subjectId` 拼成 `名称(ID)` |
|
|
748
|
+
| `sqje` / `sbje` | 整张发票的申请金额 | 仅参考;金额字段填发票价税合计(`price.total`) |
|
|
749
|
+
| `containsItinerary` | 是否关联了行程单 | — |
|
|
750
|
+
| `itineraryData` | **行程单逐段明细**数组,每段含 `date`、`sqje`(该段金额)、`fysm`(`{起点} - {终点}`)、`subjectId` / `subjectName`、`itinerary`(凭证 ID)、`invoiceId` | **暂不拆行**;只在 `invoice.get` 取不到起止点时给费用说明兜底,见 [reim-form-fill-rules.md](reim-form-fill-rules.md#4-行程单多段行程暂不拆行) |
|
|
746
751
|
|
|
747
752
|
|
|
748
753
|
### 返回示例
|
|
@@ -766,6 +771,7 @@ weaver-work-cli --json invoice run invoice.reim.row-info --input-json '{"invoice
|
|
|
766
771
|
- **优先级**:此 CLI 返回的 `date`、`fysm`、`itinerary`、`subjectId` 四个值**优先于 AI 自行推断的值**
|
|
767
772
|
- **容错**:如果某个字段为空/null,则回退到 AI 推断逻辑
|
|
768
773
|
- **itinerary 处理**:如果 `itinerary` 有值,直接作为该行的配对凭证,**替代原有的凭证配对逻辑**;先用 `invoice.browse-field.data` 取凭证对象再填入「相关凭证」。逗号分隔返回多个时,每行只挂最匹配的 1 张(规则见 [reim-form-fill-rules.md](reim-form-fill-rules.md#3-凭证与发票配对))
|
|
774
|
+
- **itineraryData 处理**:暂不拆行,不管几段都是一张发票一行;只用来给费用说明兜底(第一段起点 - 最后一段终点)
|
|
769
775
|
|
|
770
776
|
---
|
|
771
777
|
|
|
@@ -958,7 +964,7 @@ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid
|
|
|
958
964
|
| 动作 | 命令 | 契约 |
|
|
959
965
|
| --- | --- | --- |
|
|
960
966
|
| 载入报销表单 | `workflow.createForm`(`workflow` 传 `{workFlowName}({workFlowId})`) | [`workflow-create.md`](../../weaver-e10-workflow/references/workflow-create.md) |
|
|
961
|
-
|
|
|
967
|
+
| 创建报销单(固定存草稿) | `workflow.createRequest`(`context` + `data` + `action` + `requestName`) | 同上 |
|
|
962
968
|
| 修改已创建的报销单 | `workflow.editLoad` → `workflow.editPrepare` → `workflow.editApply` | [`workflow-edit.md`](../../weaver-e10-workflow/references/workflow-edit.md) |
|
|
963
969
|
|
|
964
|
-
`data` 的组装规则见 [reim-form-fill-rules.md](reim-form-fill-rules.md)
|
|
970
|
+
`data` 的组装规则见 [reim-form-fill-rules.md](reim-form-fill-rules.md),编排顺序见 [reim-workflow.md](reim-workflow.md) Step 3 ~ Step 6。
|
|
@@ -375,7 +375,7 @@ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid
|
|
|
375
375
|
{
|
|
376
376
|
"main": {
|
|
377
377
|
"1256786432515129369": "交通费报销-后端开发111-2026-07-25(1298294241967177729)",
|
|
378
|
-
"100003720000000088": "
|
|
378
|
+
"100003720000000088": "上海市内交通费(滴滴出行)",
|
|
379
379
|
"100003720000000687": "泛微上海(100504500000311504)"
|
|
380
380
|
},
|
|
381
381
|
"details": {
|
|
@@ -395,36 +395,15 @@ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid
|
|
|
395
395
|
}
|
|
396
396
|
```
|
|
397
397
|
|
|
398
|
-
### Step 5:
|
|
398
|
+
### Step 5: 直接存草稿
|
|
399
399
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
```markdown
|
|
403
|
-
即将创建报销单「交通费报销-后端开发111-2026-08-04」,请确认:
|
|
404
|
-
|
|
405
|
-
| 项目 | 值 |
|
|
406
|
-
| --- | --- |
|
|
407
|
-
| 报销工作流 | 总部费用报销 |
|
|
408
|
-
| 报销事由 | 2026-07-30 市内交通 - 滴滴出行 |
|
|
409
|
-
| 相关客户 | 泛微上海(100504500000311504) |
|
|
410
|
-
| 事前申请 | 交通费报销-后端开发111-2026-07-25(1298294241967177729) |
|
|
411
|
-
| 合计金额 | ¥108.20 |
|
|
412
|
-
|
|
413
|
-
| # | 发票号码 | 金额 | 费用日期 | 费用类型 | 费用说明 | 相关凭证 |
|
|
414
|
-
|---|----------|------|----------|----------|----------|----------|
|
|
415
|
-
| 1 | 36901189 | ¥108.20 | 2026-07-30 | 市内交通费(100502270000000006) | 仁济医院南院-浦江瑞和城 | ✅ 滴滴行程单 |
|
|
416
|
-
|
|
417
|
-
申请人、承担主体、上级、部门、合同号、报销方式由表单按当前登录人默认带出;币种为人民币。
|
|
418
|
-
请回复「存草稿」或「提交审批」;需要修改请直接告诉我。
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
用户回复「提交审批」→ 写入 `reim-create-request.json` 并调用:
|
|
400
|
+
组装完直接写入 `reim-create-request.json` 并调用,**不展示预览、不问「存草稿 / 提交审批」**:
|
|
422
401
|
|
|
423
402
|
```json
|
|
424
403
|
{
|
|
425
404
|
"context": "wc-9834fa828b86aed3",
|
|
426
|
-
"requestName": "
|
|
427
|
-
"action": "
|
|
405
|
+
"requestName": "后端开发111 7月上海交通费报销",
|
|
406
|
+
"action": "draft",
|
|
428
407
|
"data": {"main": {"...": "Step 4 的 main"}, "details": {"...": "Step 4 的 details"}}
|
|
429
408
|
}
|
|
430
409
|
```
|
|
@@ -441,7 +420,7 @@ macOS/Linux(bash/zsh):
|
|
|
441
420
|
weaver-work-cli --json workflow run workflow.createRequest --input ./reim-create-request.json
|
|
442
421
|
```
|
|
443
422
|
|
|
444
|
-
**返回 `
|
|
423
|
+
**返回 `CREATED`** → 把返回的 `finalMarkdown` **原样粘贴**作为回复(已含流程编号、链接、已填内容、明细表),不要自己重拼。
|
|
445
424
|
|
|
446
425
|
---
|
|
447
426
|
|
|
@@ -478,7 +457,7 @@ weaver-work-cli --json workflow run workflow.createRequest --input ./reim-create
|
|
|
478
457
|
```
|
|
479
458
|
|
|
480
459
|
**要点**:
|
|
481
|
-
-
|
|
460
|
+
- 一张发票一行,数组顺序就是明细行顺序(行程单有多段行程也不拆,见示例13)
|
|
482
461
|
- 两行都绑定同一个事前申请(明细「相关流程」同值)
|
|
483
462
|
- 每行「相关发票」只放该行发票的 1 个对象
|
|
484
463
|
|
|
@@ -651,30 +630,73 @@ AI 操作:
|
|
|
651
630
|
|
|
652
631
|
用户说:"帮我报销一下去重庆的发票,承担主体:边宝,合同编号:20250104933"
|
|
653
632
|
|
|
654
|
-
-
|
|
633
|
+
- 流程标题:`"龚为明8月去重庆交通费报销"`(「去重庆」取用户原话,没说从哪出发就不写出发城市;月份取发票费用日期 2026-08-19)
|
|
634
|
+
- 合同号传 `"20250104933"`;**承担主体、相关客户、相关项目都不传**(「边宝」也不传),直接存草稿
|
|
655
635
|
- 创建后 `linkageResult` 返回(2026-10-21 真机):`字段联动带出:…实报金额=50.07、承担主体=朱洪磊、相关客户=中国航空集团有限公司、合同号=20250104933、相关项目=中航集团办公平台改造及升级项目。`
|
|
656
636
|
- 原样粘贴 `finalMarkdown` 后补一句:「承担主体、相关客户、相关项目已按合同 20250104933 联动带出:朱洪磊 / 中国航空集团有限公司 / 中航集团办公平台改造及升级项目;你提到的承担主体「边宝」与合同不一致,已按合同联动为准。」
|
|
657
637
|
|
|
658
638
|
---
|
|
659
639
|
|
|
640
|
+
## 示例13:行程单有多段行程(不拆行)
|
|
641
|
+
|
|
642
|
+
还是示例12那张滴滴发票(¥50.07,发票 ID `1328381858116714513`,行程单 `1328381883894906889`)。`row-info-batch` 返回(2026-10-21 真机):
|
|
643
|
+
|
|
644
|
+
```json
|
|
645
|
+
{
|
|
646
|
+
"date": "2026-08-19", "sqje": "50.07", "fysm": "交通运输服务",
|
|
647
|
+
"itinerary": "1328381883894906889", "containsItinerary": true,
|
|
648
|
+
"itineraryData": [
|
|
649
|
+
{"date": "2025-12-31", "sqje": "14.67", "fysm": "大道|重庆财经学院-西门 - 鱼胡路-地铁站", "subjectName": "5301滴滴车票", "subjectId": "100502270000000177", "itinerary": "1328381883894906889"},
|
|
650
|
+
{"date": "2026-01-22", "sqje": "10.40", "fysm": "大道|重庆财经学院-西门 - 鱼胡路-地铁站", "subjectName": "5301滴滴车票", "subjectId": "100502270000000177", "itinerary": "1328381883894906889"},
|
|
651
|
+
{"date": "2026-04-09", "sqje": "25.00", "fysm": "大道|重庆财经学院-西门 - 大渡口区|重庆工业博物馆", "subjectName": "5301滴滴车票", "subjectId": "100502270000000177", "itinerary": "1328381883894906889"}
|
|
652
|
+
]
|
|
653
|
+
}
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
`itineraryData` 有 3 段,**仍然只填 1 行**:费用日期取外层 `date`,金额取发票金额,费用说明取 `invoice.get` 的起止点(from=`大道|重庆财经学院-西门`,to=`鱼胡路-地铁站`),取不到时才用 `itineraryData` 第一段起点 - 最后一段终点。
|
|
657
|
+
|
|
658
|
+
```json
|
|
659
|
+
"100003690000000011": [
|
|
660
|
+
{"100003720000000419": "2026-08-19", "100003720000016373": "50.07", "100003720000000360": "5301滴滴车票(100502270000000177)", "100003720000000361": "重庆财经学院-鱼胡路站", "100003720000052200": "人民币(100001050000000001)", "100003720000077896": [<发票对象>], "100003720000079682": [<行程单对象>]}
|
|
661
|
+
]
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
- 流程标题:`龚为明8月去重庆交通费报销`
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
## 示例14:按出差时间 + 城市查票(「报销上周去北京的费用」)
|
|
669
|
+
|
|
670
|
+
今天 2026-10-21,用户说"帮我报销上周去北京的费用"(2026-10-21 真机):
|
|
671
|
+
|
|
672
|
+
1. 出差时间 = 上周 2026-10-12 ~ 10-18 → 开票日期查 **2026-10-12 ~ 今天**
|
|
673
|
+
2. 查到 1 张火车票(10-19,¥166):`invoice.get` 起止站 杭州东 → 全椒,与北京无关
|
|
674
|
+
3. 没有与北京相关的票 → 回复用户:
|
|
675
|
+
|
|
676
|
+
> 你的票夹里没找到上周去北京的发票,所以没有往下建报销单。我按开票日期 2026-10-12 到今天查的,只有 1 张火车票(10-19,¥166),但它是杭州东 → 全椒,跟北京无关。可能是北京的发票还没导进票夹,或者日期不在上周。
|
|
677
|
+
|
|
678
|
+
- 不要因为这期间有票就拿来报;也不要自己把时间放宽到几个月前
|
|
679
|
+
|
|
680
|
+
---
|
|
681
|
+
|
|
660
682
|
## 关键检查清单
|
|
661
683
|
|
|
662
684
|
调用 `workflow.createRequest` 前确认:
|
|
663
685
|
|
|
664
686
|
1. [ ] `context` 是本组 `workflow.createForm` 返回的 `continuation`,没有复用别的报销单的句柄
|
|
665
|
-
2. [ ] `workflow.createForm` 传的是 Step 2.5 得到的 `{workFlowName}({workFlowId})`
|
|
666
|
-
3. [ ] `requestName`
|
|
687
|
+
2. [ ] `workflow.createForm` 传的是 Step 2.5 得到的 `{workFlowName}({workFlowId})`,**没有传 `userQuestion`**,也没用 `workflow.createRequestDirect`
|
|
688
|
+
3. [ ] `requestName` 是 `{申请人}{月份}{行程}{费用类型}报销`(如 `严玥宸10月上海去北京费用报销`):月份取费用日期(不是今天),出发城市没有凭猜,没有「(共N笔)」、金额、具体日期,不超过30字
|
|
667
689
|
4. [ ] `data` 的键全部来自本次 `createForm` 的 `fields[].id`,没有 `fields` 之外的字段(实报金额、附件数、承担人所有上级等不传)
|
|
668
690
|
5. [ ] 带 `initialValue` 且不需改写的字段没有重复传;**例外:每行明细都显式传了「币种」`人民币(100001050000000001)`**(不传会让「申请金额」联动失效)
|
|
669
691
|
6. [ ] 浏览按钮写 `名称(ID)`,没有裸 ID;Select 写选项名,不是 optionValue
|
|
670
692
|
7. [ ] 每行「相关发票」是 `invoice.browse-field.data` 返回的 1 个发票对象;有凭证时「相关凭证」也是 1 个对象,无凭证不传
|
|
671
|
-
8. [ ] 相关凭证(17/18/57/58
|
|
693
|
+
8. [ ] 相关凭证(17/18/57/58)没有单独成行;行程单有多段行程也是一张发票一行;**有行程单 / 交通类 / 出差报销的明细,费用说明是精简后的 `起点-终点`:**整串最多 1 个 `-`、没有 `|` 和空格**,不是原样抄的 `from` / `to` / `fysm`
|
|
672
694
|
9. [ ] 每行「费用类型(科目)」有值,匹配不到填 `其他-管理费用(100502270000000104)`
|
|
673
695
|
10. [ ] 文本字段没有 `*` 号
|
|
674
696
|
11. [ ] **出差/差旅流程:相关客户已由用户提供具体名称;未提供则不允许调用 `workflow.createRequest`**
|
|
675
697
|
12. [ ] 非出差流程:相关客户填 `泛微上海(100504500000311504)`;**用户给了合同号时承担主体 / 相关客户 / 相关项目都不传,以合同联动为准**
|
|
676
698
|
13. [ ] 话费报销:金额字段填的是核算后的实报金额
|
|
677
|
-
14. [ ]
|
|
699
|
+
14. [ ] `action` 是 `"draft"`,没有问用户「存草稿 / 提交审批」,也没有传 `"submit"`
|
|
678
700
|
|
|
679
701
|
修改报销单前确认:
|
|
680
702
|
|