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.
Files changed (163) hide show
  1. package/README.md +7 -2
  2. package/dist/cmd/setup/index.js +1 -1
  3. package/dist/internal/e10/auth/commands.js +1 -6
  4. package/dist/internal/e10/auth/messages.js +3 -0
  5. package/dist/internal/e10/auth/session.js +8 -0
  6. package/dist/internal/e10/auth-recovery.js +148 -0
  7. package/dist/internal/e10/client.js +47 -15
  8. package/dist/internal/e10/context.js +8 -8
  9. package/dist/internal/e10/index.js +1 -0
  10. package/dist/internal/e10/request-runtime.js +51 -9
  11. package/dist/shortcuts/archive/host.js +3 -2
  12. package/dist/shortcuts/archive/manifest.js +1 -1
  13. package/dist/shortcuts/archive-oa/host.js +2 -1
  14. package/dist/shortcuts/archive-oa/manifest.js +1 -1
  15. package/dist/shortcuts/asset/host.js +7 -6
  16. package/dist/shortcuts/blog/host.js +4 -3
  17. package/dist/shortcuts/caizhilian/host.js +3 -2
  18. package/dist/shortcuts/caizhilian/manifest.js +1 -1
  19. package/dist/shortcuts/calendar/host.js +2 -1
  20. package/dist/shortcuts/contract/host.js +34 -59
  21. package/dist/shortcuts/ehr/host.js +2 -1
  22. package/dist/shortcuts/esb/host.js +2 -1
  23. package/dist/shortcuts/fna/host.js +6 -3
  24. package/dist/shortcuts/fna/manifest.js +10 -5
  25. package/dist/shortcuts/fna/operations/expense-chart.js +162 -0
  26. package/dist/shortcuts/fna/operations/registry.js +2 -0
  27. package/dist/shortcuts/hrm/host.js +2 -1
  28. package/dist/shortcuts/im/host.js +3 -2
  29. package/dist/shortcuts/invoice/host.js +9 -7
  30. package/dist/shortcuts/invoice/manifest.js +23 -142
  31. package/dist/shortcuts/invoice/operations/issuing-qys.js +266 -203
  32. package/dist/shortcuts/invoice/operations/registry.js +1 -6
  33. package/dist/shortcuts/jiuchuanhui/host.js +2 -1
  34. package/dist/shortcuts/mail/host.js +2 -1
  35. package/dist/shortcuts/meeting/host.js +2 -1
  36. package/dist/shortcuts/meeting/operations/eb/conflict.js +78 -12
  37. package/dist/shortcuts/okr/host.js +2 -1
  38. package/dist/shortcuts/plan/host.js +2 -1
  39. package/dist/shortcuts/project/host.js +2 -1
  40. package/dist/shortcuts/workflow/host.js +3 -5
  41. package/dist/shortcuts/workflow/index.js +4 -1
  42. package/dist/shortcuts/workflow/operations/chatscene.js +4 -22
  43. package/dist/shortcuts/workflow/operations/form.js +281 -166
  44. package/dist/shortcuts/workflow/operations/read.js +39 -8
  45. package/dist/shortcuts/workflow/operations/registry.js +2 -0
  46. package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +331 -0
  47. package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +133 -0
  48. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +326 -0
  49. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +113 -0
  50. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +259 -0
  51. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoListRows.js +64 -0
  52. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoOutputPlanner.js +28 -0
  53. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.aggregate.js +70 -0
  54. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +267 -0
  55. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +392 -0
  56. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +165 -0
  57. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +448 -0
  58. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +348 -0
  59. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +222 -0
  60. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +66 -0
  61. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +502 -0
  62. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +540 -0
  63. package/dist/shortcuts/workflow/stdout-compact.js +7 -0
  64. package/docs/SKILL.md +1 -1
  65. package/docs/_catalog.md +2 -1
  66. package/docs/agent-invoice.md +1 -1
  67. package/docs/caizhilian.md +1 -1
  68. package/docs/e10-auth.md +1 -1
  69. package/docs/fna.md +7 -3
  70. package/docs/invoice.md +4 -6
  71. package/docs/todo-smart-convert/README.md +171 -0
  72. package/docs/todo-smart-convert/data-contract.md +236 -0
  73. package/docs/todo-smart-convert/mock/ai-todo-query-target.json +209 -0
  74. package/docs/todo-smart-convert/subgroup-rules.md +245 -0
  75. package/package.json +1 -1
  76. package/scripts/package-skill.mjs +1 -1
  77. package/skill-template/business-info.json +4 -1
  78. package/skill-template/domains/caizhilian.md +2 -1
  79. package/skill-template/domains/qiyecheng.md +1 -0
  80. package/skill-template/domains/yepiaotong.md +6 -2
  81. package/skill-template/skill-template.md +1 -0
  82. package/skills/weaver-e10-blog/SKILL.md +6 -1
  83. package/skills/weaver-e10-blog/references/blog-query.md +3 -1
  84. package/skills/weaver-e10-caizhilian/SKILL.md +18 -9
  85. package/skills/weaver-e10-caizhilian/references/action-flow.md +70 -0
  86. package/skills/weaver-e10-caizhilian/references/agent-entry.md +6 -2
  87. package/skills/weaver-e10-caizhilian/references/auth-and-install.md +207 -0
  88. package/skills/weaver-e10-caizhilian/references/file-collection.md +56 -54
  89. package/skills/weaver-e10-caizhilian/references/file-upload.md +4 -4
  90. package/skills/weaver-e10-caizhilian/references/host-executor-prompt.md +32 -0
  91. package/skills/weaver-e10-caizhilian/references/host-platform-integration.md +46 -0
  92. package/skills/weaver-e10-caizhilian/references/rule-index.md +56 -0
  93. package/skills/weaver-e10-caizhilian/references/setting-attach.md +5 -16
  94. package/skills/weaver-e10-caizhilian/references/setting-backup.md +4 -13
  95. package/skills/weaver-e10-caizhilian/references/setting-encrypt.md +6 -15
  96. package/skills/weaver-e10-caizhilian/references/setting-storage-docs-summary.md +126 -0
  97. package/skills/weaver-e10-caizhilian/references/setting-storage-field-map.md +57 -0
  98. package/skills/weaver-e10-caizhilian/references/setting-storage.md +142 -482
  99. package/skills/weaver-e10-caizhilian/references/source-manifest.json +7 -7
  100. package/skills/weaver-e10-caizhilian/references/task-workflow.md +87 -0
  101. package/skills/weaver-e10-caizhilian/references/withheld.md +2 -2
  102. package/skills/weaver-e10-caizhilian/references/write-protocol.md +7 -0
  103. package/skills/weaver-e10-calendar/SKILL.md +6 -1
  104. package/skills/weaver-e10-esb/SKILL.md +8 -0
  105. package/skills/weaver-e10-esb/references/input-format.md +3 -1
  106. package/skills/weaver-e10-esb/references/source-manifest.json +5 -5
  107. package/skills/weaver-e10-hrm/SKILL.md +6 -1
  108. package/skills/weaver-e10-hrm/references/employee.md +1 -1
  109. package/skills/weaver-e10-hrm/references/org.md +1 -1
  110. package/skills/weaver-e10-hrm/references/position.md +1 -1
  111. package/skills/weaver-e10-jinchengda/SKILL.md +2 -1
  112. package/skills/weaver-e10-jinchengda/references/contract-agent-entry.md +1 -1
  113. package/skills/weaver-e10-jiuchuanhui/SKILL.md +6 -1
  114. package/skills/weaver-e10-jucailin/SKILL.md +6 -1
  115. package/skills/weaver-e10-jucailin/references/hr-contact.md +1 -1
  116. package/skills/weaver-e10-jucailin/references/salary.md +1 -1
  117. package/skills/weaver-e10-mail/SKILL.md +6 -1
  118. package/skills/weaver-e10-meeting/SKILL.md +11 -6
  119. package/skills/weaver-e10-meeting/references/meeting-eb.md +7 -3
  120. package/skills/weaver-e10-meeting/references/meeting-queries.md +3 -1
  121. package/skills/weaver-e10-meeting/references/meeting-verification.md +4 -2
  122. package/skills/weaver-e10-okr/SKILL.md +6 -1
  123. package/skills/weaver-e10-okr/references/source-manifest.json +5 -5
  124. package/skills/weaver-e10-plan/SKILL.md +6 -1
  125. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +3 -1
  126. package/skills/weaver-e10-plan/references/plan-report-query.md +3 -1
  127. package/skills/weaver-e10-plan/references/source-manifest.json +7 -7
  128. package/skills/weaver-e10-qiyecheng/SKILL.md +16 -6
  129. package/skills/weaver-e10-qiyecheng/references/catalog.md +6 -3
  130. package/skills/weaver-e10-qiyecheng/references/expense-center.md +2 -0
  131. package/skills/weaver-e10-qiyecheng/references/expense-chart.md +78 -0
  132. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +87 -33
  133. package/skills/weaver-e10-shared/SKILL.md +37 -14
  134. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +11 -8
  135. package/skills/weaver-e10-shared/references/non-interactive-environment.md +4 -4
  136. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +3 -1
  137. package/skills/weaver-e10-wenshuding/SKILL.md +6 -1
  138. package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
  139. package/skills/weaver-e10-workflow/SKILL.md +23 -1
  140. package/skills/weaver-e10-workflow/references/source-manifest.json +1 -2
  141. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +282 -0
  142. package/skills/weaver-e10-workflow/references/workflow-create.md +30 -55
  143. package/skills/weaver-e10-workflow/scripts/todo-summary.cjs +695 -0
  144. package/skills/weaver-e10-yepiaotong/SKILL.md +19 -17
  145. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +75 -78
  146. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +179 -0
  147. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +238 -0
  148. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +7 -7
  149. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +11 -5
  150. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +55 -33
  151. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +102 -23
  152. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +1 -1
  153. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +53 -42
  154. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +94 -214
  155. package/skills/weaver-e10-yimiaoban/SKILL.md +9 -2
  156. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +1 -1
  157. package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -1
  158. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +9 -9
  159. package/skills/weaver-e10-ziguanjia/SKILL.md +6 -1
  160. package/dist/shortcuts/invoice/operations/issuing.js +0 -198
  161. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +0 -161
  162. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-qys-ledger.md +0 -66
  163. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +0 -107
@@ -26,8 +26,8 @@
26
26
  - **键只能取 `workflow.createForm` 返回的 `fields[].id`**:按 `fields[].name` 定位业务字段,取它的 `id`;明细字段的 `subFormId` 就是 `details` 的键。
27
27
  - **`fields` 里没有的字段一律不传**:`fields` 只下发可写字段。实报金额、人民币金额、附件数、报销人上级、承担人直接上级、承担人所有上级、人员ID、提单人员、报销总金额等由表单自身计算或联动带出,不在可写清单里,传了整单会被拒(`notEditable`)。
28
28
  - **带 `initialValue` 的字段默认不传**:CLI 会自动并入表单默认值;只有本文档规则要求的值与默认值不同,或用户本次明确改写时才传。**例外:明细「币种」每行必传**(见「费用明细字段规则」)。
29
- - `details` 每个数组元素是一行明细,**顺序 = 明细行顺序**,一张发票一行。
30
- - 流程标题用 `createRequest` 的 `requestName` 参数传(见下方「流程标题」)。
29
+ - `details` 每个数组元素是一行明细,**顺序 = 明细行顺序**,一张发票一行(行程单有多段行程也不拆,见「4. 行程单多段行程:暂不拆行」)。
30
+ - **流程标题必传**:用 `createRequest` 的 `requestName` 参数传(见下方「流程标题」),按公式生成,**禁止留用表单默认标题**——不传会静默使用默认标题且无任何提示。
31
31
 
32
32
  ---
33
33
 
@@ -49,16 +49,61 @@
49
49
 
50
50
  ## 流程标题(`requestName`)
51
51
 
52
- | 场景 | 格式 | 示例 |
53
- |------|------|------|
54
- | 有事前申请 | `{事前申请关键词}报销-{用户名}-{日期}(共N笔)` | `"北京出差报销-张三-2026-08-04(共2笔)"` |
55
- | 无事前申请 | `{费用类型汇总}报销-{用户名}-{日期}(共N笔)` | `"交通费+住宿费报销-张三-2026-08-04(共3笔)"` |
56
- | 单张发票 | `{费用类型}报销-{用户名}-{日期}` | `"交通费报销-张三-2026-08-04"` |
52
+ **格式:`{申请人}{月份}{行程}{费用类型}报销`**,像一句话一样读得通:"谁、几月、从哪去哪、报什么"。中间不加 `-` 等分隔符。
57
53
 
58
- - 日期使用当前日期;N = 明细行总数(发票数量)
59
- - 从事前申请标题中提取核心关键词(去掉"申请"后缀)
60
- - 标题不超过 30 个字
61
- - 用户名取 `createForm` 返回的「申请人」默认值(即当前用户)
54
+ | 场景 | 示例 |
55
+ |------|------|
56
+ | 出差,多类费用(交通 + 住宿等) | `"严玥宸10月上海去北京费用报销"` |
57
+ | 出差,只知道目的地 | `"龚为明8月去重庆交通费报销"` |
58
+ | 跨月 | `"张三7-8月北京去广州费用报销"` |
59
+ | 市内交通(不出城) | `"张三7月上海交通费报销"` |
60
+ | 话费 | `"张三8月话费报销"`(月份写账单月份) |
61
+
62
+ | 组成 | 取值 |
63
+ | --- | --- |
64
+ | 申请人 | `createForm` 返回的「申请人」默认值(即当前用户) |
65
+ | 月份 | 取明细「费用日期」(`row-info` 的 `date` 优先,回退发票 `invoiceDate`),**不是创建当天**。同一个月 → `10月`;跨月同年 → `7-8月`;跨年或不是今年 → 带年份:`2025年12月`、`2025年12月-2026年4月` |
66
+ | 行程 | **出差 / 外地**:`{出发城市}去{目的城市}`;只知道目的地 → `去{目的城市}`。**市内**(所有票都在同一城市、没有出发 / 到达)→ `{城市}`。取不到城市就省略 |
67
+ | 费用类型 | 按明细科目 / `expenseType` 归类:1 类 → `{类}费`(`交通费`、`住宿费`、`餐饮费`、`话费`);2 类及以上 → `费用` |
68
+
69
+ **城市从哪来(按优先级):**
70
+
71
+ 1. 用户原话:「从上海去北京」→ 上海去北京;「去重庆的发票」→ 去重庆
72
+ 2. 火车票 / 机票:第一程的出发城市 → 最远一程的到达城市(站名、机场名换成城市:「上海虹桥」→ 上海)
73
+ 3. 事前申请(出差类)标题里的出差地点 → 目的城市
74
+ 4. 酒店所在城市 → 目的城市;打车发票销方名称里的城市(「重庆滴滴出行科技有限公司」→ 重庆)→ 有出差迹象时当目的城市,否则当市内城市
75
+ 5. **出发城市只取 1、2 两个来源**,不按员工常驻地去猜
76
+
77
+ **约束:**
78
+
79
+ - **执行口径:`createRequest` 必须显式传 `requestName`**,按上方公式生成;不传会静默留用表单默认标题(如「总部费用报销-{申请人}-{日期}」),无 warning
80
+ - 标题不超过 30 个字;超长时先去掉出发城市(保留 `去{目的城市}`),再把费用类型收成 `费用`
81
+ - 申请人姓名以数字结尾时,姓名和月份之间加一个空格,避免数字连在一起(`后端开发111 7月上海交通费报销`)
82
+ - **不要**写「(共N笔)」、金额、流程编号、具体日期:E10 保存后会自动在标题后拼 `(相关客户:…, 流程编号:…, 报销总金额:…)`
83
+ - 不用全角括号,不含 `*` 号
84
+ - 用户当次明确给了标题时原样用用户的
85
+
86
+ ## 报销事由
87
+
88
+ **格式:`{行程}{场景}{费用内容}`**,说清"去哪、干什么、花了什么"。行程取值与流程标题相同(`上海去北京` / `去重庆` / 市内写 `上海`)。
89
+
90
+ | 组成 | 取值 |
91
+ | --- | --- |
92
+ | 行程 | 同流程标题的「行程」 |
93
+ | 场景 | 用户说了目的(「拜访华为」「项目实施」)→ 原样用用户的说法;否则出差流程、出差类事前申请、或用户说了「出差」「去{外地城市}」→ `出差`;业务招待 → `招待`;其他省略 |
94
+ | 费用内容 | 各类费用用顿号连写:`交通费、住宿费`;只有 1 类且来自同一平台时补平台名:`交通费(滴滴出行)` |
95
+
96
+ | 场景 | 示例 |
97
+ | --- | --- |
98
+ | 出差,多类费用 | `上海去北京出差交通费、住宿费` |
99
+ | 出差,只知道目的地,单一平台 | `去重庆出差交通费(滴滴出行)` |
100
+ | 用户说了目的 | `去北京拜访华为交通费、住宿费` |
101
+ | 市内交通 | `上海市内交通费(滴滴出行)` |
102
+ | 话费 | `8月话费` |
103
+
104
+ **约束:** 不写日期、金额、发票号(明细里已有);不超过 50 字;不含 `*` 号;用户当次明确给了事由时原样用用户的。
105
+
106
+ **执行口径:主表「报销事由 / 摘要」必填**——`createRequest` 时必须按上方公式生成并显式写入 `data.main`,不得留空、不得依赖表单默认值。
62
107
 
63
108
  ---
64
109
 
@@ -89,7 +134,11 @@
89
134
  | 2. AI 配对 | 凭证 `amount` ≤ 发票 `amount`(前提,不满足不能配对)→ 金额一致或接近 → 开票日期前后 7 天内 → 销方相同或同一平台 → 费用类型同类 |
90
135
 
91
136
  - **每行最多挂 1 张凭证**:「相关凭证」字段只接受 1 个发票对象(传多个会返回 `MULTIPLICITY` 歧义)。`itinerary` 逗号分隔返回多个时,按上面 AI 配对的优先级选最匹配的 1 张,其余在确认预览里列为「未挂上的凭证」提示用户。
92
- - 凭证找不到可配对的发票 → 跳过该凭证(不单独成行),并在确认预览里提示用户。
137
+ - 凭证找不到可配对的发票 → 跳过该凭证(不单独成行),并在建单后的回复里提示用户。
138
+
139
+ ### 4. 行程单多段行程:暂不拆行
140
+
141
+ `row-info` 返回的 `itineraryData`(行程单逐段明细)**目前不用来拆行**:不管行程单有几段,仍然**一张发票一行**,日期 / 金额 / 科目用外层的 `date`、发票价税合计、`subjectName(subjectId)`。`itineraryData` 只在取不到起止点时给费用说明兜底(见「行程 / 出差费用说明」)。
93
142
 
94
143
  ### 4. 取发票对象
95
144
 
@@ -115,16 +164,16 @@
115
164
  | 承担人所有上级 | 可写且没有默认值时填 `allSuperiors` 每项的 `名称(ID)` 组成的数组;不在 `fields` 里就不传 |
116
165
  | **合同号 / 合同编号** | **固定 `"20260999"`**(共享常量)。表单默认值已是 `20260999` 时不传;默认值为空或不同时显式传 `"20260999"`;**用户当次明确给出别的合同号时传用户的,并按下方「用户给了合同号:以合同联动为准」处理承担主体 / 相关客户 / 相关项目** |
117
166
  | 报销方式 | 默认「银行(个人报销)」;表单默认值已是它时不传,否则传选项名 `"银行(个人报销)"` |
118
- | 报销事由 / 摘要 | AI 生成:`"{日期} {费用类型} - {销方简称}"`,**禁止包含 `*` 号** |
167
+ | 报销事由 / 摘要 | **必传,不得留空**:按下方「报销事由」生成,与流程标题同一套口径;**禁止包含 `*` 号** |
119
168
  | 事前申请流程 / 相关流程(主表) | 有匹配到的事前申请时填 `{requestname}({requestid})`;无则不传 |
120
169
  | **相关客户** | **用户给了合同号 → 不传,以合同联动为准**(见下方)。否则:**非出差**:固定 `"泛微上海(100504500000311504)"`。**出差流程**:填用户提供的客户名称(可带多个写法,英文逗号分隔),由 CLI 解析,见下方「出差流程相关客户」 |
121
170
  | 相关项目 | **用户给了合同号 → 不传,以合同联动为准**。否则:事前申请 `requestnametitle` 里「相关项目:」有值时填该名称;否则不传 |
122
171
  | 费用承担公司 | 用户说了才填;否则按 `workflow-create.md`「历史流程数据参考规则」判断(历史取值一致可采用);仍定不了就不传,交给 `missingFields` |
123
172
  | 申请日期 / 报销日期 | 默认带出时不传;没有默认值时填当天 `yyyy-MM-dd` |
124
173
  | 附件 / 抄送人 | 用户本次给了才填(附件按 `workflow-create.md` 的上传口径),否则不传 |
125
- | 申请金额 / 人民币金额(主表,可写时) | 默认所有**发票**(不含凭证)`amount` 之和;话费报销为各行实报金额之和 |
174
+ | 申请金额 / 人民币金额(主表,可写时) | 默认所有**发票**(不含凭证)价税合计之和;话费报销为各行实报金额之和 |
126
175
 
127
- > **以下字段在报销单里绝不能是空值**:承担主体、报销人上级/承担人直接上级/承担人所有上级、合同号、相关客户、每行费用类型(科目)。它们要么由表单默认值带出,要么按上表显式传;若 `createRequest` 仍在 `missingFields` 里列出它们,按上表来源补上后用同一 `context` 重发,**不要问用户要 ID**。
176
+ > **以下字段在报销单里绝不能是空值**:承担主体、报销人上级/承担人直接上级/承担人所有上级、合同号、相关客户、每行费用类型(科目)、**报销事由**。它们要么由表单默认值带出,要么按上表显式传;**流程标题(`requestName`)同样必须显式传入**——不传会静默留用表单默认标题。若 `createRequest` 仍在 `missingFields` 里列出它们,按上表来源补上后用同一 `context` 重发,**不要问用户要 ID**。
128
177
 
129
178
  ### 用户给了合同号:以合同联动为准
130
179
 
@@ -134,7 +183,7 @@
134
183
 
135
184
  1. 传用户的合同号;**承担主体、相关客户、相关项目都不传**,交给合同联动带出——即使用户同时口头指定了承担主体,也以合同联动为准(不传,不在创建后改回)。
136
185
  2. 「相关客户」不再套用非出差固定值「泛微上海」;出差流程也不再要求用户另报客户(合同联动带出的客户即具体客户)。
137
- 3. 预览里这三项写「由合同 {合同号} 联动带出」,不要写成用户口述的值或默认值。
186
+ 3. 建单后的回复里如实写合同联动带出的值,不要写成用户口述的值或默认值。
138
187
  4. 创建后从返回的 `linkageResult`(「字段联动带出:…」)读出实际带出的承担主体 / 相关客户 / 相关项目告诉用户;用户口头指定的承担主体与联动结果不同时,一句话说明「已按合同联动为准」。
139
188
  5. 联动没带出某一项(`linkageResult` 里没有、或 `missingFields` 列出)→ 该项回到上表的常规规则补值,用同一 `context` 重发(已创建的单子走 `workflow.edit*` 补)。
140
189
 
@@ -148,8 +197,8 @@
148
197
  | fieldName 关键词 | 怎么填 |
149
198
  |------------------|--------|
150
199
  | 费用日期 / 发生日期 | **`row-info` 优先**:`date`;回退发票 `invoiceDate` |
151
- | **申请金额 / 实报金额 / 报销金额 / 人民币金额 / 含税金额**(凡可写的金额字段) | 该行发票 `amount`;**话费报销**改填 [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) 算出的实报金额 |
152
- | 费用说明 / 摘要 | **交通类**:只填 `{出发地精简}-{目的地精简}`;**其他**:`row-info` 优先 `fysm`,回退从 `consumeContent` 提取。**必须去掉所有 `*` 号,不能包含逗号** |
200
+ | **申请金额 / 实报金额 / 报销金额 / 人民币金额 / 含税金额**(凡可写的金额字段) | 该行发票**价税合计**(`amount` = `price.total`,不是不含税的 `price.amount`);**话费报销**改填 [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) 算出的实报金额 |
201
+ | 费用说明 / 摘要 | **有行程单 / 交通类 / 出差报销**:写精简后的 `起点-终点`,**整串最多 1 个 `-`、不含 `|` 和空格**,不能原样抄 `from` / `to` / `fysm`(见下方「行程 / 出差费用说明」);**其他**:`row-info` 优先 `fysm`,回退从 `consumeContent` 提取。**必须去掉所有 `*` 号,不能包含逗号** |
153
202
  | **费用类型(科目)** | **`row-info` 优先**:`{subjectName}({subjectId})`;`subjectId` 为空时按 [reim-expense-subject-rules.md](reim-expense-subject-rules.md) 匹配;全部未命中填兜底 `"其他-管理费用(100502270000000104)"`。**必须有值** |
154
203
  | 相关流程(明细) | 该行发票绑定的事前申请 `{requestname}({requestid})`;未绑定则不传 |
155
204
  | 相关客户(明细,若可写) | 与主表一致 |
@@ -159,13 +208,38 @@
159
208
  | **相关发票** | `[该行发票对象]`(**必填**) |
160
209
  | **相关凭证** | `[配对凭证对象]`;无凭证不传 |
161
210
 
162
- > **⚠️ 明细金额字段**:遍历该行可写字段时,`componentKey` 为 `Money` / `NumberComponent` 且名称含"金额"的,**默认全部统一填该行发票的 `amount`**,不要因为字段名不是"实报金额"就跳过。例外只有话费报销。
211
+ > **⚠️ 明细金额字段**:遍历该行可写字段时,`componentKey` 为 `Money` / `NumberComponent` 且名称含"金额"的,**默认全部统一填该行发票的价税合计**,不要因为字段名不是"实报金额"就跳过,也不要拿 `invoice.get` 返回的 `amount`(不含税)顶替。例外只有话费报销。
212
+
213
+ ### 行程 / 出差费用说明
214
+
215
+ **适用(满足任一)**:该行关联了行程单;或交通类发票(`expenseType` 含"交通"/"出行"/"打车",或 `consumeContent` 含"客运服务费"/"运输服务",或 `sellerName` 含"滴滴"/"享道"/"高德"/"曹操"等);或出差报销里的火车票 / 机票 / 打车票。
163
216
 
164
- ### 交通类发票费用说明
217
+ **格式:`起点-终点`**,地名精简到能看出"从哪到哪"即可;只有一端有值时只写那一端,不加 `-`。忽略 `row-info` 外层的 `fysm`(如「交通运输服务」)。
165
218
 
166
- 判断条件(满足任一):`expenseType` 含"交通"/"出行"/"打车",或 `consumeContent` 含"客运服务费"/"运输服务",或 `sellerName` 含"滴滴"/"享道"/"高德"/"曹操"等。
219
+ > ⛔ **禁止把原始地址原样填进费用说明**。`invoice.get` 的 `from` / `to`、行程单的 `fysm` 都是原始值(如 `大道|重庆财经学院-西门 - 鱼胡路-地铁站`),**必须先精简再填**。
220
+ >
221
+ > 填之前逐行自检,**任一条不满足就重新精简**:
222
+ > - 整个费用说明里 **`-` 最多 1 个**(只用来隔开起点和终点;只有一端时 0 个)
223
+ > - **不含 `|`**,不含空格
224
+ > - 每个地名不超过 10 个字
225
+ >
226
+ > ❌ `大道|重庆财经学院-西门 - 鱼胡路-地铁站` ❌ `重庆财经学院-西门-鱼胡路-地铁站` ❌ `重庆财经学院西门 - 鱼胡路` ✅ `重庆财经学院-鱼胡路站`
167
227
 
168
- 需**额外调用 `invoice.get`** 获取出发地和目的地(详见 [reim-api-reference.md](reim-api-reference.md#57-获取发票详情交通类发票行程信息)),费用说明**只填** `{出发地精简}-{目的地精简}`,忽略 `row-info` 的 `fysm`。`invoice.get` 未返回 from/to 时回退常规费用说明逻辑。
228
+ **起止点来源(按优先级):**
229
+
230
+ 1. **发票详情**:额外调用 `invoice.get` 取 `from` / `to`(详见 [reim-api-reference.md](reim-api-reference.md#57-获取发票详情交通类发票行程信息)),火车票 / 机票取出发站和到达站。
231
+ 2. **行程单**:`row-info` 的 `itineraryData[].fysm`,格式是 `{起点} - {终点}`(**以空格-空格分隔**),取第一段的起点和最后一段的终点。每一端里 `|` 前面是区域 / 道路前缀,取 `|` 后面的部分再精简。
232
+ 3. 都取不到 → 回退常规费用说明逻辑。
233
+
234
+ **精简要点**:`-` 是起点和终点之间的分隔符,**地名内部不能再出现 `-`**——像「重庆财经学院-西门」「鱼胡路-地铁站」这种用 `-` 连着的门号 / 设施后缀,按下方「地名精简规则」去掉或并进地名。
235
+
236
+ | 原始(行程单 `fysm` / from-to) | 费用说明 |
237
+ | --- | --- |
238
+ | `大道\|重庆财经学院-西门 - 鱼胡路-地铁站` | `重庆财经学院-鱼胡路站` |
239
+ | `大道\|重庆财经学院-西门 - 大渡口区\|重庆工业博物馆` | `重庆财经学院-重庆工业博物馆` |
240
+ | from=`仁济医院南院区门诊部(南门)南侧`,to=`浦江瑞和城柒街区30号` | `仁济医院南院-浦江瑞和城` |
241
+ | 火车票 上海虹桥 → 重庆北 | `上海虹桥-重庆北` |
242
+ | 只有 from=`虹桥机场T2航站楼出发层` | `虹桥机场T2` |
169
243
 
170
244
  ### 地名精简规则
171
245
 
@@ -180,6 +254,8 @@
180
254
 
181
255
  **4. 长度控制**:每个地名精简后控制在 10 字以内
182
256
 
257
+ **5. 行程单格式**:`|` 前是区域 / 道路前缀,去掉;地名内部的 `-` 后缀(`-西门`、`-地铁站`、`-2号口`)是门号 / 设施,门号去掉,「地铁站」并成「站」;精简结果里不能有 `-`
258
+
183
259
  **精简快速参考表**:
184
260
 
185
261
  | 原始地址 | 精简结果 | 处理说明 |
@@ -197,6 +273,9 @@
197
273
  | 上海市浦东新区世纪大道100号环球金融中心 | 环球金融中心 | 去地址前缀,保留标志性建筑名 |
198
274
  | 中国人民解放军海军军医大学第一附属医院(长海医院) | 长海医院 | 括号内是通用简称→用简称 |
199
275
  | 上海火车站(北广场)东北侧 | 上海火车站 | 去广场方位和方向后缀 |
276
+ | 大道\|重庆财经学院-西门 | 重庆财经学院 | 去 `\|` 前缀和 `-西门` 门号 |
277
+ | 鱼胡路-地铁站 | 鱼胡路站 | 「地铁站」并成「站」,去掉内部 `-` |
278
+ | 大渡口区\|重庆工业博物馆 | 重庆工业博物馆 | 去 `\|` 前的行政区 |
200
279
 
201
280
  **边界情况处理**:
202
281
 
@@ -258,7 +337,7 @@
258
337
  5. **主表**:按「主表字段规则」逐个落值;带默认值且无需改写的字段不传
259
338
  6. **明细**:每张发票一行,按「费用明细字段规则」逐个落值;每行必须有费用日期、金额、费用说明、费用类型(科目)、相关发票、币种
260
339
  7. **最终检查**:每行「费用类型(科目)」有值,没有就填 `"其他-管理费用(100502270000000104)"`;`data` 里没有 `fields` 之外的字段 id
261
- 8. 交给 [reim-workflow.md](reim-workflow.md) Step 5 展示预览、确认后调用 `workflow.createRequest`
340
+ 8. 交给 [reim-workflow.md](reim-workflow.md) Step 5 直接调用 `workflow.createRequest` 存草稿
262
341
 
263
342
  ---
264
343
 
@@ -145,5 +145,5 @@ cusCreateDateEnd = 最晚发票 invoiceDate
145
145
  4. 按账单构成剔除赠送套餐、家庭宽带,算出可报销账单金额
146
146
  5. 按 `min(可报销账单金额, 上限)` 得到实报金额,展示给用户确认
147
147
  6. 查询事前申请时使用 **3 年回溯**(`cusCreateDateStart` 往前推 1095 天),用 `requestname="话费"` 缩小范围
148
- 7. 匹配到事前申请后,用户确认,才允许进入 [reim-workflow.md](reim-workflow.md) Step 5(预览确认 → `workflow.createRequest`)
148
+ 7. 匹配到事前申请后,用户确认,才允许进入 [reim-workflow.md](reim-workflow.md) Step 5(`workflow.createRequest` 存草稿)
149
149
  8. 材料不齐、岗位未确认、账单构成无法拆分、或用户拒绝 → **结束流程,禁止创建**
@@ -37,6 +37,7 @@
37
37
  |------|-----|------|
38
38
  | 默认合同编号 | `"20260999"` | 用户当次未给出别的合同号时使用;表单默认值已是它时不必再传。用户给了别的合同号 → 承担主体 / 相关客户 / 相关项目以合同联动为准,见 [reim-form-fill-rules.md](reim-form-fill-rules.md#用户给了合同号以合同联动为准) |
39
39
  | 非出差相关客户 | `"泛微上海(100504500000311504)"` | 出差流程必须由用户提供具体客户 |
40
+ | 发票金额 | 价税合计 `info.comm_info.price.total` | 报销金额字段一律填它;**不是** `price.amount` / `invoice.get` 的 `amount`(都是不含税) |
40
41
  | 兜底费用科目 | `"其他-管理费用(100502270000000104)"` | 所有科目匹配策略均未命中时使用 |
41
42
  | 人民币币种 | `"人民币(100001050000000001)"` | 明细每行必传(即使表单默认带出),否则字段联动失效,见 [reim-form-fill-rules.md](reim-form-fill-rules.md) |
42
43
  | 报销方式默认值 | `"银行(个人报销)"` | Select 传选项名;表单默认带出时不传 |
@@ -115,7 +116,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
115
116
  - 最近一周无结果 → 自动用一个月参数再查
116
117
  - 直接调用 `invoice.reim.requests.list` 获取用户的事前申请
117
118
  - **获取到发票后,先展示发票汇总信息(张数、基础信息),明确告知用户查询范围,询问用户确认是否报销**
118
- - 用户确认后,自动执行匹配 → 载入报销表单 → 组装 `data` → 展示预览、用户确认 → `workflow.createRequest` 生成报销单
119
+ - 用户确认后,自动执行匹配 → 载入报销表单 → 组装 `data` → `workflow.createRequest` 直接存草稿
119
120
 
120
121
  ### 2. 根据用户意图智能构建查询条件
121
122
 
@@ -126,6 +127,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
126
127
  | "帮我报销" / "我要报销" | 查**最近一周**发票 → 无结果则查**最近一个月** → **展示发票汇总,询问确认** → 确认后走后续流程 |
127
128
  | "报销打车费" | 设置 `content="滴滴"` 筛选交通类 → **展示发票汇总,询问确认** → 确认后走后续流程 |
128
129
  | "报销上周的发票" | 设置时间范围为上周 → **展示发票汇总,询问确认** → 确认后走后续流程 |
130
+ | "报销上周去北京的费用" / "报销去重庆的发票" | 按**出差时间 + 城市**查票(见 Step 1A「出差 / 城市意图查票」)→ **展示发票汇总,询问确认** → 确认后走后续流程 |
129
131
  | "报销发票号码 xxx" | 设置 `number="xxx"` 精确匹配 → **展示发票汇总,询问确认** → 确认后走后续流程 |
130
132
  | 用户直接提供了发票数据 | **跳过 Step 1A** → **展示发票汇总,询问确认** → 确认后继续后续流程 |
131
133
  | 用户提供了 fileId | 先调用 `invoice.reim.file-ocr.preview`(Step 0)→ **展示发票汇总,询问确认** → 确认后继续 |
@@ -176,7 +178,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时只
176
178
  - 事前申请有数据 → 自动匹配,不需要用户确认"是否关联"
177
179
  - 事前申请为空 → 跳过匹配,直接用发票数据填单,不需要问用户
178
180
  - 匹配到唯一结果 → 直接使用,不需要用户确认
179
- - **只有在必须用户做选择时才暂停**(如:多候选需要选一个、发票列表为空无法继续、**出差流程必须填写相关客户**、创建前确认报销单内容)
181
+ - **只有在必须用户做选择时才暂停**(如:多候选需要选一个、发票列表为空无法继续、**出差流程必须填写相关客户**、话费材料不齐);**创建报销单不再暂停确认,直接存草稿**
180
182
  - **⚠️ 严禁篡改任何原始数据值**
181
183
 
182
184
  ---
@@ -211,7 +213,7 @@ Step 4: 组装 createRequest 的 data (reim-form-fill-rules.md)
211
213
  Step 4.5: 出差流程 → 提醒用户填写相关客户(未提供则不允许报销)
212
214
  Step 4.6: 话费报销 → 核对材料并按标准核算实报金额
213
215
  ↓
214
- Step 5: 展示预览 → 用户确认(存草稿 / 提交审批)→ workflow.createRequest → 原样展示 finalMarkdown
216
+ Step 5: workflow.createRequest(action 固定 draft,直接存草稿,不问用户)→ 原样展示 finalMarkdown
215
217
  ↓
216
218
  Step 6 (可选): workflow.editLoad / editPrepare / editApply → 用户修正
217
219
  ```
@@ -261,6 +263,26 @@ Step 6 (可选): workflow.editLoad / editPrepare / editApply → 用户修正
261
263
  4. 有结果 → Step 1C 展示汇总,告知"最近一周没找到,已扩大到一个月"
262
264
  5. 仍无结果 → 告知用户未找到发票,建议指定日期范围
263
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
+
264
286
  ### 日期筛选参数
265
287
 
266
288
  | 参数 | 用途 | 使用时机 |
@@ -410,6 +432,10 @@ Windows PowerShell:
410
432
  weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow":["总部费用报销(100003460000000060)"]}'
411
433
  ```
412
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
+
413
439
  从返回里取:
414
440
 
415
441
  | 返回键 | 用途 |
@@ -417,7 +443,8 @@ weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow
417
443
  | `continuation`(= `contextId`) | Step 5 `createRequest` 的 `context` |
418
444
  | `fields` | **可写字段全集**:按 `name` 找业务字段取 `id`;带 `subFormId` 的是明细字段;带 `initialValue` 的有默认值 |
419
445
  | `requestName` | 表单默认标题(报销单标题按 [reim-form-fill-rules.md](reim-form-fill-rules.md#流程标题requestname) 生成后用 `requestName` 参数覆盖) |
420
- | `historyRequestData` | 只用于本技能规则没覆盖的字段(如费用承担公司),口径见 `workflow-create.md`「历史流程数据参考规则」 |
446
+ | `historyRequestData` | 只用于本技能规则没覆盖的字段(如费用承担公司),口径见 `workflow-create.md`「历史流程数据参考规则」;**只有不传 `userQuestion` 时才返回** |
447
+ | `workflowMemory` | 该工作流的记忆(可能没有这个键);只能补本技能规则没覆盖的非必填字段,与本技能规则冲突时以本技能为准 |
421
448
 
422
449
  - `NEEDS_CLARIFICATION`(`workflow_not_exist` / `no_create_right`)→ 按 `workflow-create.md` 如实告知用户,停止本组。
423
450
  - 大表单超线(stdout 只有一句话 + `resultFile`)→ 按 `workflow-create.md` 读一次 `resultFile`,不要重跑。
@@ -430,12 +457,13 @@ weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow
430
457
  - 入参:`invoiceIds`=本组全部**发票**(不含凭证)ID,`requestid`=匹配到的事前申请 ID(无则留空)
431
458
  - 返回的 `date`、`fysm`、`itinerary`、`subjectId`、`subjectName` **在 Step 4 中优先使用**
432
459
  - 某张失败或字段为空 → 该行回退到 AI 推断逻辑
460
+ - `itineraryData`(行程单逐段明细)**暂不拆行**,仍一张发票一行,见 [reim-form-fill-rules.md](reim-form-fill-rules.md#4-行程单多段行程暂不拆行)
433
461
 
434
462
  ### 交通类发票额外处理
435
463
 
436
- 交通类发票(`expenseType` 含交通/出行/打车,或 `consumeContent` 含客运服务费/运输服务,或 `sellerName` 含滴滴/享道等)→ **额外并行调用 `invoice.get`** 获取出发地和目的地。
464
+ 交通类发票(`expenseType` 含交通/出行/打车,或 `consumeContent` 含客运服务费/运输服务,或 `sellerName` 含滴滴/享道等),以及出差报销里的火车票 / 机票 → **额外并行调用 `invoice.get`** 获取出发地和目的地。`invoice.get` 取不到起止点时,用行程单 `itineraryData` 兜底。
437
465
 
438
- > 详细精简规则见 [reim-form-fill-rules.md](reim-form-fill-rules.md#地名精简规则)
466
+ > 费用说明统一写 `起点-终点`,规则见 [reim-form-fill-rules.md](reim-form-fill-rules.md#行程--出差费用说明)
439
467
 
440
468
  ---
441
469
 
@@ -485,9 +513,13 @@ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid
485
513
  ```
486
514
 
487
515
  **关键约束:**
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`,**禁止留空**
488
518
  - 键只取 `createForm` 的 `fields[].id`;`fields` 里没有的字段不传,带默认值且不需改写的字段不传(例外:明细「币种」每行必传)
489
519
  - 浏览按钮写 `名称(ID)`;Select 写选项名;发票字段写 `[发票对象]`
490
520
  - 一张发票一行;相关凭证(17/18/57/58)放进配对发票那一行,每行最多 1 张
521
+ - 行程单有多段行程也**不拆行**
522
+ - 有行程单 / 交通类 / 出差报销的明细,费用说明写精简后的 `起点-终点`:**整串最多 1 个 `-`、不含 `|` 和空格**,禁止原样填 `大道|重庆财经学院-西门 - 鱼胡路-地铁站` 这类原始地址
491
523
  - **费用类型(科目)每行必须有值**,匹配不到填 `"其他-管理费用(100502270000000104)"`
492
524
  - **合同号固定 `"20260999"`**(除用户当次明确给出别的合同号);表单默认值已是它时不必传
493
525
  - **用户给了合同号 → 承担主体、相关客户、相关项目都不传,以合同联动为准**(用户口头指定的承担主体也不传);创建后从 `linkageResult` 读出实际带出的值告诉用户
@@ -523,40 +555,18 @@ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid
523
555
 
524
556
  ---
525
557
 
526
- ## Step 5: 预览确认 → `workflow.createRequest`
527
-
528
- > **⚠️ 报销单涉及金额,创建前必须先给用户看预览并取得明确确认**——这是本技能对 `workflow-create.md`「拼完 data 立即发 createRequest」的唯一加严,其余返回处置照 `workflow-create.md` 执行。
529
- > **⚠️ 出差流程拦截:相关客户未由用户提供具体信息前,禁止调用。**
530
- > **⚠️ 话费报销拦截:账单截图、账单构成或岗位标准未确认前,禁止调用。**
531
-
532
- ### 5.1 预览(创建前)
533
-
534
- 向用户展示一次,**字典类值一律带中文名 `名称(ID)`**(`data` 里本来就是这种写法,直接照抄):
535
-
536
- ```markdown
537
- 即将创建报销单「交通费报销-龚为明-2026-10-21(共2笔)」,请确认:
538
-
539
- | 项目 | 值 |
540
- | --- | --- |
541
- | 报销工作流 | 总部费用报销 |
542
- | 报销事由 | 2026-07-30 市内交通 - 滴滴出行 |
543
- | 相关客户 | 泛微上海(100504500000311504) |
544
- | 事前申请 | 交通费报销-后端开发111-2026-07-25(1298294241967177729) |
545
- | 合计金额 | ¥185.80 |
546
-
547
- | # | 发票号码 | 金额 | 费用日期 | 费用类型 | 费用说明 | 相关凭证 |
548
- |---|----------|------|----------|----------|----------|----------|
549
- | 1 | 36901189 | ¥108.20 | 2026-07-30 | 市内交通费(100502270000000006) | 仁济医院南院-浦江瑞和城 | ✅ 滴滴行程单 |
550
- | 2 | 36901200 | ¥77.60 | 2026-07-30 | 市内交通费(100502270000000006) | 虹桥机场T2-人民广场 | — |
551
-
552
- 申请人、承担主体、上级、部门、合同号、报销方式由表单按当前登录人默认带出;币种为人民币。
553
- 请回复「存草稿」或「提交审批」;需要修改请直接告诉我。
554
- ```
558
+ ## Step 5: 直接存草稿(`workflow.createRequest`,`action:"draft"`)
555
559
 
556
- - 有未挂上的凭证、未配对的凭证、话费核算明细时,在表格下方逐条列出
557
- - 用户没说清 → 默认按「存草稿」(`action:"draft"`)处理并在回复里说明
560
+ > **⚠️ AI 报销一律存草稿,组装完 `data` 直接调用,不展示「存草稿 / 提交审批」让用户选,也不再等创建前确认。** 草稿不进审批,用户在 E10 里核对后自己提交。
561
+ > - `action` 固定 `"draft"`,**不要传 `"submit"`**——即使用户说了「提交」,本流程也只建草稿,并在回复里告诉用户去 E10 页面核对后提交。
562
+ > - **`requestName` 必传**(按「流程标题」公式生成)、**`data.main` 必含「报销事由」**(按「报销事由」公式生成)——两者不传会静默留用表单默认标题 / 留空,且无 warning。
563
+ > - 用户在 Step 1C 已确认过用哪些发票;之后匹配、组装、创建一路自动执行。
564
+ >
565
+ > **以下拦截仍然有效(未满足前禁止调用):**
566
+ > - **出差流程**:相关客户未由用户提供具体信息(或合同联动带出)前,禁止调用。
567
+ > - **话费报销**:账单截图、账单构成或岗位标准未确认前,禁止调用。
558
568
 
559
- ### 5.2 创建
569
+ ### 5.1 创建
560
570
 
561
571
  macOS/Linux(bash/zsh):
562
572
 
@@ -575,10 +585,10 @@ weaver-work-cli --json workflow run workflow.createRequest --input .\reim-create
575
585
  ```json
576
586
  {
577
587
  "context": "<Step 3 createForm 返回的 continuation>",
578
- "requestName": "交通费报销-龚为明-2026-10-21(共2笔)",
588
+ "requestName": "龚为明7月上海交通费报销",
579
589
  "action": "draft",
580
590
  "data": {
581
- "main": {"100003720000000088": "2026-07-30 市内交通 - 滴滴出行", "100003720000000687": "泛微上海(100504500000311504)"},
591
+ "main": {"100003720000000088": "上海市内交通费(滴滴出行)", "100003720000000687": "泛微上海(100504500000311504)"},
582
592
  "details": {"100003690000000011": [{"100003720000016373": "108.2", "100003720000052200": "人民币(100001050000000001)"}]}
583
593
  }
584
594
  }
@@ -586,13 +596,14 @@ weaver-work-cli --json workflow run workflow.createRequest --input .\reim-create
586
596
 
587
597
  > `data` 含发票对象,体积较大,建议写成 UTF-8 文件用 `--input <path>` 传入。
588
598
 
589
- ### 5.3 返回处置
599
+ ### 5.2 返回处置
590
600
 
591
601
  **完全按 `workflow-create.md`「createRequest 返回后的处置」执行**:
592
602
 
593
603
  | 返回 | 处置 |
594
604
  | --- | --- |
595
- | `CREATED` / `CREATED_SUBMITTED` / `CREATED_SUBMIT_FAILED` | **原样粘贴 `finalMarkdown`**,一字不改;链接只出现在回复文本里 |
605
+ | `CREATED` | **原样粘贴 `finalMarkdown`**,一字不改;链接只出现在回复文本里。之后按需补几句:合同联动带出的值与用户口述不同、未挂上 / 未配对的凭证、话费核算明细、`missingFields` 提交前要补的字段 |
606
+ | `BROWSER_FILL`(小e 环境) | **没有写服务端、没有 `requestId`**:把 `finalMarkdown`(一段 `<browsertool>` 标签块)**整段原样输出**作为回复正文,不包代码块、不加任何前后说明,也不补上面那几句提醒;由页面打开新建页带入字段值,用户在页面上保存。之后**不要走 Step 6**(没有可改的单据) |
596
607
  | `NEEDS_INPUT` | 缺的是承担主体、上级、合同号、相关客户、科目等本技能有规则的字段 → 按 [reim-form-fill-rules.md](reim-form-fill-rules.md) 补值后用同一 `context` 重发;其余原样粘贴 `finalMarkdown` 一次问齐用户 |
597
608
  | `NEEDS_CONFIRMATION` | 按 `ambiguities` 处理(浏览按钮多候选让用户选;`MULTIPLICITY` 只保留 1 个值) |
598
609
  | `partial` / `write_uncertain` | 停止,不重放;只读回查一次后告知用户 |