weaver-work-cli 0.1.29 → 0.1.32

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 (185) hide show
  1. package/dist/chunks/archive-UMGX72K6.js +2537 -0
  2. package/dist/chunks/archive-oa-N2IYBLF3.js +1317 -0
  3. package/dist/chunks/asset-GLEGKFG5.js +2109 -0
  4. package/dist/chunks/attachment-content-AQNX5N3S.js +23 -0
  5. package/dist/chunks/blog-E44OTVDA.js +2157 -0
  6. package/dist/chunks/caizhilian-DQUFZXZL.js +10087 -0
  7. package/dist/chunks/calendar-JKPIRKFD.js +1195 -0
  8. package/dist/chunks/chunk-2GA5ZIQL.js +1615 -0
  9. package/dist/chunks/chunk-4YC43QQ4.js +403 -0
  10. package/dist/chunks/chunk-6EFWDL7Y.js +161 -0
  11. package/dist/chunks/chunk-6RKD4DRZ.js +5556 -0
  12. package/dist/chunks/chunk-AJ62BGAW.js +29 -0
  13. package/dist/chunks/chunk-BUSC6UAE.js +43 -0
  14. package/dist/chunks/chunk-C6R3B2ML.js +358 -0
  15. package/dist/chunks/chunk-CVZ2JOSW.js +62 -0
  16. package/dist/chunks/chunk-DW6AUUKS.js +508 -0
  17. package/dist/chunks/chunk-E4Z23GHM.js +6962 -0
  18. package/dist/chunks/chunk-EG6ZU444.js +654 -0
  19. package/dist/chunks/chunk-EZALDOQH.js +383 -0
  20. package/dist/chunks/chunk-FMPJJYYI.js +106 -0
  21. package/dist/chunks/chunk-G2JSIUWF.js +769 -0
  22. package/dist/chunks/chunk-G3QJULO2.js +387 -0
  23. package/dist/chunks/chunk-GCG2NMWR.js +703 -0
  24. package/dist/chunks/chunk-GPMFD4RD.js +75 -0
  25. package/dist/chunks/chunk-H6XSTSLM.js +2357 -0
  26. package/dist/chunks/chunk-H7J4DC5R.js +464 -0
  27. package/dist/chunks/chunk-IURUFGZK.js +477 -0
  28. package/dist/chunks/chunk-LUSPKZKY.js +53 -0
  29. package/dist/chunks/chunk-NIAJ5ZCG.js +73 -0
  30. package/dist/chunks/chunk-NOODWMCL.js +584 -0
  31. package/dist/chunks/chunk-OOUTBLZ4.js +51 -0
  32. package/dist/chunks/chunk-P26ZWSKU.js +73 -0
  33. package/dist/chunks/chunk-QWY6PGL6.js +3472 -0
  34. package/dist/chunks/chunk-WKI2FBIQ.js +15606 -0
  35. package/dist/chunks/chunk-WSKBSQ2U.js +231 -0
  36. package/dist/chunks/chunk-YLCYX7LE.js +371 -0
  37. package/dist/chunks/chunk-YRVDW4WN.js +205 -0
  38. package/dist/chunks/chunk-ZEDWSH32.js +68 -0
  39. package/dist/chunks/continuation-2CKSBLA6.js +11 -0
  40. package/dist/chunks/continuation-HZIZRZBX.js +13 -0
  41. package/dist/chunks/continuation-NLECEJPX.js +11 -0
  42. package/dist/chunks/ebuilder-form-V5FG2EHC.js +2276 -0
  43. package/dist/chunks/ehr-HMFY6VIL.js +5241 -0
  44. package/dist/chunks/employee-SAK2QYXX.js +11 -0
  45. package/dist/chunks/esb-ZYSVB7SG.js +141 -0
  46. package/dist/chunks/fna-B7RKPAZD.js +1444 -0
  47. package/dist/chunks/host-45WED2KK.js +21 -0
  48. package/dist/chunks/host-I4Z6BFYX.js +23 -0
  49. package/dist/chunks/host-KNZ52LJZ.js +17 -0
  50. package/dist/chunks/host-OCH2BCCV.js +19 -0
  51. package/dist/chunks/hrm-2KAZGUHI.js +244 -0
  52. package/dist/chunks/im-ACJJWH4U.js +252 -0
  53. package/dist/chunks/invoice-ZK3WCX2U.js +5179 -0
  54. package/dist/chunks/jiuchuanhui-5PQD3IL2.js +1940 -0
  55. package/dist/chunks/lazy-dispatch-JQXBW3GM.js +28 -0
  56. package/dist/chunks/mail-S2HDDXO2.js +2695 -0
  57. package/dist/chunks/meeting-QVN3I37L.js +504 -0
  58. package/dist/chunks/msg-parse-4GSQ2WTO.js +41 -0
  59. package/dist/chunks/okr-QNG4VC2Q.js +2482 -0
  60. package/dist/chunks/plan-A25EMW6U.js +2025 -0
  61. package/dist/chunks/project-G6XV66DZ.js +1361 -0
  62. package/dist/chunks/registry-2VLUAESA.js +14 -0
  63. package/dist/chunks/registry-7C5UMIPL.js +19 -0
  64. package/dist/chunks/registry-DC6KR3NH.js +18 -0
  65. package/dist/chunks/registry-NYPYMZXG.js +16 -0
  66. package/dist/chunks/registry-TI3CIUXF.js +19 -0
  67. package/dist/chunks/room-recommend-WRTHO6Y2.js +20 -0
  68. package/dist/chunks/schedule-KFIITGSK.js +24 -0
  69. package/dist/chunks/state-Y2XBP6YE.js +15 -0
  70. package/dist/chunks/workflow-DJ7SYWAF.js +245 -0
  71. package/dist/cmd/argv.js +45 -0
  72. package/dist/cmd/docs/index.js +3 -3
  73. package/dist/cmd/lazy-dispatch.js +20 -0
  74. package/dist/cmd/root.js +2 -4
  75. package/dist/cmd/setup/index.js +2 -2
  76. package/dist/cmd/skills/index.js +2 -2
  77. package/dist/core/package-paths.js +61 -0
  78. package/dist/index.js +163 -7
  79. package/dist/internal/e10/auth/xiaoe.js +3 -3
  80. package/dist/internal/e10/request-runtime.js +18 -62
  81. package/dist/internal/skills/detector.js +2 -2
  82. package/dist/shortcuts/contract/data/performance-catalog.js +1306 -0
  83. package/dist/shortcuts/contract/host.js +91 -35
  84. package/dist/shortcuts/contract/index.js +213 -0
  85. package/dist/shortcuts/contract/manifest.js +928 -0
  86. package/dist/shortcuts/contract/ooxml/docx.js +295 -0
  87. package/dist/shortcuts/contract/ooxml/xlsx.js +221 -0
  88. package/dist/shortcuts/contract/ooxml/zip.js +158 -0
  89. package/dist/shortcuts/contract/operations/assistant.js +1156 -0
  90. package/dist/shortcuts/contract/operations/clause-library.js +522 -0
  91. package/dist/shortcuts/contract/operations/compare.js +193 -0
  92. package/dist/shortcuts/contract/operations/credit-page.js +34 -0
  93. package/dist/shortcuts/contract/operations/flow.js +98 -0
  94. package/dist/shortcuts/contract/operations/page.js +66 -0
  95. package/dist/shortcuts/contract/operations/performance.js +733 -0
  96. package/dist/shortcuts/contract/operations/quote.js +557 -0
  97. package/dist/shortcuts/contract/operations/recommend.js +78 -0
  98. package/dist/shortcuts/contract/operations/registry.js +18 -0
  99. package/dist/shortcuts/contract/operations/review.js +83 -0
  100. package/dist/shortcuts/contract/operations/shared.js +37 -0
  101. package/dist/shortcuts/contract/operations/upload.js +108 -0
  102. package/dist/shortcuts/contract/operations/write.js +3 -2
  103. package/dist/shortcuts/index.js +140 -40
  104. package/dist/shortcuts/invoice/manifest.js +34 -11
  105. package/dist/shortcuts/invoice/operations/reim-auto.js +9 -0
  106. package/dist/shortcuts/invoice/operations/reim.js +81 -5
  107. package/dist/shortcuts/invoice/operations/shared.js +12 -5
  108. package/dist/shortcuts/meeting/host.js +45 -3
  109. package/dist/shortcuts/meeting/invitation/docx.js +442 -0
  110. package/dist/shortcuts/meeting/operations/attachment-content.js +418 -0
  111. package/dist/shortcuts/meeting/operations/attachment.js +442 -0
  112. package/dist/shortcuts/meeting/operations/eb/cache.js +57 -0
  113. package/dist/shortcuts/meeting/operations/eb/catalog.js +343 -28
  114. package/dist/shortcuts/meeting/operations/eb/conflict.js +372 -11
  115. package/dist/shortcuts/meeting/operations/eb/create-flow.js +710 -0
  116. package/dist/shortcuts/meeting/operations/eb/decision.js +47 -1
  117. package/dist/shortcuts/meeting/operations/eb/factory.js +129 -11
  118. package/dist/shortcuts/meeting/operations/eb/index.js +122 -2
  119. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +378 -0
  120. package/dist/shortcuts/meeting/operations/eb/room-summary.js +84 -0
  121. package/dist/shortcuts/meeting/operations/eb/schedule.js +450 -0
  122. package/dist/shortcuts/meeting/operations/from-group-chat.js +576 -0
  123. package/dist/shortcuts/meeting/operations/invitation.js +458 -0
  124. package/dist/shortcuts/meeting/operations/minute-content.js +266 -0
  125. package/dist/shortcuts/meeting/operations/pipeline.js +489 -0
  126. package/dist/shortcuts/meeting/operations/qrcode.js +131 -0
  127. package/dist/shortcuts/meeting/operations/receipts.js +1 -1
  128. package/dist/shortcuts/meeting/operations/registry.js +18 -0
  129. package/dist/shortcuts/meeting/operations/summary.js +276 -0
  130. package/dist/shortcuts/meeting/operations/task-notify.js +325 -0
  131. package/dist/shortcuts/meeting/operations.js +42 -1
  132. package/dist/shortcuts/meeting/qr/encoder.js +427 -0
  133. package/dist/shortcuts/meeting/qr/render.js +103 -0
  134. package/dist/shortcuts/workflow/operations/form.js +17 -5
  135. package/docs/contract.md +39 -4
  136. package/docs/invoice.md +5 -5
  137. package/package.json +3 -2
  138. package/scripts/bundle.mjs +63 -0
  139. package/skill-template/business-info.json +25 -4
  140. package/skill-template/domains/jinchengda.md +16 -3
  141. package/skill-template/domains/yepiaotong.md +1 -1
  142. package/skills/weaver-e10-jinchengda/SKILL.md +111 -31
  143. package/skills/weaver-e10-jinchengda/references/contract-agent-entry.md +7 -13
  144. package/skills/weaver-e10-jinchengda/references/contract-ai-assistant.md +150 -0
  145. package/skills/weaver-e10-jinchengda/references/contract-ai-review.md +87 -0
  146. package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +111 -0
  147. package/skills/weaver-e10-jinchengda/references/contract-clause-recommender.md +0 -15
  148. package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +0 -13
  149. package/skills/weaver-e10-jinchengda/references/contract-credit-page.md +50 -0
  150. package/skills/weaver-e10-jinchengda/references/contract-disabled-capabilities.md +4 -2
  151. package/skills/weaver-e10-jinchengda/references/contract-doc-compare.md +74 -0
  152. package/skills/weaver-e10-jinchengda/references/contract-flow-launch.md +84 -0
  153. package/skills/weaver-e10-jinchengda/references/contract-performance-query.md +29 -0
  154. package/skills/weaver-e10-jinchengda/references/contract-quote-to-contract.md +28 -0
  155. package/skills/weaver-e10-jinchengda/references/contract-request-status.md +2 -21
  156. package/skills/weaver-e10-jinchengda/references/contract-request-write.md +0 -24
  157. package/skills/weaver-e10-jinchengda/references/contract-signing-subjects.md +0 -15
  158. package/skills/weaver-e10-jinchengda/references/contract-subject-create.md +0 -17
  159. package/skills/weaver-e10-jinchengda/references/contract-template-recommend.md +70 -0
  160. package/skills/weaver-e10-jinchengda/references/contract-template-selector.md +0 -15
  161. package/skills/weaver-e10-jinchengda/references/contract-workflow-discovery.md +0 -15
  162. package/skills/weaver-e10-jinchengda/references/source-manifest.json +1168 -152
  163. package/skills/weaver-e10-meeting/SKILL.md +493 -17
  164. package/skills/weaver-e10-meeting/references/meeting-change.md +4 -4
  165. package/skills/weaver-e10-meeting/references/meeting-create.md +6 -6
  166. package/skills/weaver-e10-meeting/references/meeting-eb.md +503 -27
  167. package/skills/weaver-e10-meeting/references/meeting-invitation.md +113 -0
  168. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +6 -6
  169. package/skills/weaver-e10-meeting/references/meeting-minute-file.md +425 -0
  170. package/skills/weaver-e10-meeting/references/meeting-queries.md +4 -4
  171. package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +15 -15
  172. package/skills/weaver-e10-meeting/references/meeting-verification.md +19 -11
  173. package/skills/weaver-e10-meeting.zip +0 -0
  174. package/skills/weaver-e10-yepiaotong/SKILL.md +9 -5
  175. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +1 -1
  176. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +6 -5
  177. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +14 -11
  178. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +97 -56
  179. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +84 -60
  180. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +142 -105
  181. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +53 -194
  182. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -7
  183. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +164 -72
  184. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +6 -0
  185. package/templates/meeting/invitation.docx +0 -0
@@ -35,7 +35,7 @@
35
35
 
36
36
  | componentKey | 值写法 | 示例 |
37
37
  | --- | --- | --- |
38
- | `Text` / `TextArea` | 文本字符串,**禁止包含 `*` 号** | `"仁济医院南院-浦江瑞和城"` |
38
+ | `Text` / `TextArea` | 文本字符串,**禁止包含 `*` 号** | `"上海市内交通费(滴滴出行)"` |
39
39
  | `DateComponent` | `yyyy-MM-dd`(CLI 会按字段格式归一化) | `"2026-07-30"` |
40
40
  | `NumberComponent` / `Money` | 数字字符串,原样使用发票金额 | `"108.2"` |
41
41
  | `Select` | **选项名称**(不是 optionValue) | `"银行(个人报销)"` |
@@ -122,32 +122,30 @@
122
122
  | 分类 | invoiceTypeCode | 示例 | 填单行为 |
123
123
  |------|-----------------|------|----------|
124
124
  | **发票** | 除 17/18/57/58 以外 | 增值税发票(1/2/3/4)、电子发票(28/32/33)、火车票(12/47)、出租车发票(9) 等 | 每张发票 = 一行明细,放「相关发票」 |
125
- | **相关凭证** | 17, 18, 57, 58 | 小票/水单(17)、滴滴行程单(18)、支付凭证(57)、其他票据凭证(58) | **不能独立成行**,放进配对发票那一行的「相关凭证」 |
125
+ | **相关凭证** | 17, 18, 57, 58 | 小票/水单(17)、滴滴行程单(18)、支付凭证(57)、其他票据凭证(58) | **不能独立成行,也不写入明细「相关凭证」**,由「相关发票」联动带出 |
126
126
 
127
127
  > **注意区分**:type=18 是滴滴的支付行程凭证(不能独立成行);滴滴开具的增值税电子普通发票 type=3,是正式发票,可独立成行。
128
128
 
129
- ### 3. 凭证与发票配对
129
+ ### 3. 相关凭证不赋值(由联动带出)
130
130
 
131
- | 来源优先级 | 规则 |
132
- |------------|------|
133
- | 1. `invoice.reim.row-info` 返回的 `itinerary` | 有值就直接作为该行的配对凭证,**替代下面的 AI 配对** |
134
- | 2. AI 配对 | 凭证 `amount` ≤ 发票 `amount`(前提,不满足不能配对)→ 金额一致或接近 → 开票日期前后 7 天内 → 销方相同或同一平台 → 费用类型同类 |
131
+ 明细「相关凭证」**不允许 AI 赋值**,创建和修改都不写入 `data`。挂上「相关发票」后由发票联动带出。
135
132
 
136
- - **每行最多挂 1 张凭证**:「相关凭证」字段只接受 1 个发票对象(传多个会返回 `MULTIPLICITY` 歧义)。`itinerary` 逗号分隔返回多个时,按上面 AI 配对的优先级选最匹配的 1 张,其余在确认预览里列为「未挂上的凭证」提示用户。
137
- - 凭证找不到可配对的发票 → 跳过该凭证(不单独成行),并在建单后的回复里提示用户。
133
+ - 不做凭证与发票配对;`row-info` 返回的 `itinerary` 也不用来写「相关凭证」
134
+ - 凭证的 `fid` 不传给 `invoice.browse-field.data`
135
+ - 用户指定了要挂哪张凭证也不写入;落库后仍空只告知「发票联动没有带出相关凭证」,不补写
138
136
 
139
137
  ### 4. 行程单多段行程:暂不拆行
140
138
 
141
- `row-info` 返回的 `itineraryData`(行程单逐段明细)**目前不用来拆行**:不管行程单有几段,仍然**一张发票一行**,日期 / 金额 / 科目用外层的 `date`、发票价税合计、`subjectName(subjectId)`。`itineraryData` 只在取不到起止点时给费用说明兜底(见「行程 / 出差费用说明」)。
139
+ `row-info` 返回的 `itineraryData`(行程单逐段明细)**目前不用来拆行**:不管行程单有几段,仍然**一张发票一行**,日期 / 金额 / 科目用外层的 `date`、发票价税合计、`subjectName(subjectId)`。`fysm` 和 `itineraryData` 都不要写进「费用说明」。
142
140
 
143
141
  ### 4. 取发票对象
144
142
 
145
- 把所有入选发票和配对凭证的 `fid` 一次传给 `invoice.browse-field.data`(`{"fids":[...]}`),按 `fid` 把返回对象放进对应行:
143
+ 把所有入选**发票**的 `fid` 一次传给 `invoice.browse-field.data`(`{"fids":[...]}`),不传凭证。按 `fid` 把返回对象放进对应行:
146
144
 
147
145
  | 明细字段 | 值 |
148
146
  | --- | --- |
149
147
  | 相关发票(`EinvoiceComponent`) | `[该行发票的对象]`(**必填**) |
150
- | 相关凭证(`EinvoiceComponent`) | `[配对凭证的对象]`;**无凭证则不传此字段** |
148
+ | 相关凭证(`EinvoiceComponent`) | **不传**,由发票联动带出 |
151
149
 
152
150
  ---
153
151
 
@@ -157,23 +155,23 @@
157
155
 
158
156
  | fieldName 关键词 | 怎么填 |
159
157
  |------------------|--------|
160
- | 承担主体 | **用户给了合同号 → 不传,以合同联动为准**(见下方)。否则为**当前用户**:表单默认带出当前用户时**不传**;`fields` 里该字段没有 `initialValue` 时填 `{currentEmployee.name}({currentEmployee.id})`(来自 `invoice.reim.employee-superiors`)。不能留空 |
158
+ | 承担主体 | **用户给了合同号,或确认采用的历史合同号不是 `20260999` → 不传,以合同联动为准**(见下方)。**总部费用报销且用户确认采用历史承担主体 → 传历史原值**(与 `initialValue` 相同时不传),见「总部费用报销历史参考」。否则为**当前用户**:表单默认带出当前用户时**不传**;`fields` 里该字段没有 `initialValue` 时填 `{currentEmployee.name}({currentEmployee.id})`(来自 `invoice.reim.employee-superiors`)。不能留空 |
161
159
  | 申请人 / 报销人 / 提单人员 | 同上:默认带出当前用户时不传 |
162
160
  | 部门 / 报销部门 | 默认带出时不传 |
163
161
  | 报销人直接上级 / 报销人上级 / 承担人直接上级 | 默认带出时不传;没有默认值时填 `{directSuperior.name}({directSuperior.id})`(**不是 `allSuperiors[0]`**) |
164
162
  | 承担人所有上级 | 可写且没有默认值时填 `allSuperiors` 每项的 `名称(ID)` 组成的数组;不在 `fields` 里就不传 |
165
- | **合同号 / 合同编号** | **固定 `"20260999"`**(共享常量)。表单默认值已是 `20260999` 时不传;默认值为空或不同时显式传 `"20260999"`;**用户当次明确给出别的合同号时传用户的,并按下方「用户给了合同号:以合同联动为准」处理承担主体 / 相关客户 / 相关项目** |
163
+ | **合同号 / 合同编号** | **不问用户。** 默认 `"20260999"`。表单默认已是它、且本次仍用它时不传。用户本轮自己说了合同号才传用户的。否则按已确认的相关项目,从 `historyRequestData` 里该项目最近一条带出合同号;对不上或项目「不填」则用默认。带出的值不是 `20260999` 时,承担主体不传,见「用户给了合同号:以合同联动为准」 |
166
164
  | 报销方式 | 默认「银行(个人报销)」;表单默认值已是它时不传,否则传选项名 `"银行(个人报销)"` |
167
165
  | 报销事由 / 摘要 | **必传,不得留空**:按下方「报销事由」生成,与流程标题同一套口径;**禁止包含 `*` 号** |
168
- | 事前申请流程 / 相关流程(主表) | 有匹配到的事前申请时填 `{requestname}({requestid})`;无则不传 |
169
- | **相关客户** | **用户给了合同号 → 不传,以合同联动为准**(见下方)。否则:**非出差**:固定 `"泛微上海(100504500000311504)"`。**出差流程**:填用户提供的客户名称(可带多个写法,英文逗号分隔),由 CLI 解析,见下方「出差流程相关客户」 |
170
- | 相关项目 | **用户给了合同号 → 不传,以合同联动为准**。否则:事前申请 `requestnametitle` 里「相关项目:」有值时填该名称;否则不传 |
166
+ | **事前申请流程 / 相关流程(主表)** | **不允许赋值,创建时不传,保留空值。** 有没有匹配到事前申请都不写;事前申请只写到明细每行「相关流程」 |
167
+ | **相关客户** | **创建前主表必须有已确认的值**,明细字段可写时每行与主表一致。取值顺序:① 用户本轮给的客户名称 → **先** [相关客户模糊搜索](#相关客户模糊搜索) 再写成 `名称(ID)`;② 确认采用的历史相关客户(已是 `名称(ID)` 时直接传;只有名称时先搜);③ 非出差且仍用默认合同 `20260999` → `"泛微上海(100504500000311504)"`(已带 ID,不必再搜)。**合同号不是 `20260999` 时不再空着等联动**,必须先问到①或②再写入 `data`。用户说「不填」不算数。见下方「相关客户、相关项目必须在建单前确认」 |
168
+ | 相关项目 | **创建前必须问过用户**(或 Step 4.4 已确认采用非空历史项目)。用户给了名称 → 用本次「相关项目」字段 id 做 [相关客户模糊搜索](#相关客户模糊搜索)(同一 operation,换 `fieldId`)再写成 `名称(ID)`。用户明确说「不填」→ 创建时不传。**合同号不是 `20260999` 时同样先问,不要空着等联动。** |
171
169
  | 费用承担公司 | 用户说了才填;否则按 `workflow-create.md`「历史流程数据参考规则」判断(历史取值一致可采用);仍定不了就不传,交给 `missingFields` |
172
170
  | 申请日期 / 报销日期 | 默认带出时不传;没有默认值时填当天 `yyyy-MM-dd` |
173
171
  | 附件 / 抄送人 | 用户本次给了才填(附件按 `workflow-create.md` 的上传口径),否则不传 |
174
172
  | 申请金额 / 人民币金额(主表,可写时) | 默认所有**发票**(不含凭证)价税合计之和;话费报销为各行实报金额之和 |
175
173
 
176
- > **以下字段在报销单里绝不能是空值**:承担主体、报销人上级/承担人直接上级/承担人所有上级、合同号、相关客户、每行费用类型(科目)、**报销事由**。它们要么由表单默认值带出,要么按上表显式传;**流程标题(`requestName`)同样必须显式传入**——不传会静默留用表单默认标题。若 `createRequest` 仍在 `missingFields` 里列出它们,按上表来源补上后用同一 `context` 重发,**不要问用户要 ID**。
174
+ > **以下字段在报销单里绝不能是空值**:承担主体、报销人上级/承担人直接上级/承担人所有上级、合同号、**相关客户**、每行费用类型(科目)、**报销事由**。**差旅 / 外出报销时,每一行明细「相关流程」也绝不能空。** 它们要么由表单默认值带出,要么按上表显式传。**相关客户、相关项目必须在调用 `createRequest` 之前问清**(项目可「不填」),禁止先建空草稿再补。**相关客户不允许以「不填」结束。** **流程标题(`requestName`)同样必须显式传入**——不传会静默留用表单默认标题。若 `createRequest` 仍在 `missingFields` 里列出它们,按上表来源补上后用同一 `context` 重发;已建成的草稿走 `workflow.edit*`。**不要问用户要 ID**。
177
175
 
178
176
  ### 用户给了合同号:以合同联动为准
179
177
 
@@ -181,110 +179,126 @@
181
179
 
182
180
  用户当次给出了不同于 `20260999` 的合同号时:
183
181
 
184
- 1. 传用户的合同号;**承担主体、相关客户、相关项目都不传**,交给合同联动带出——即使用户同时口头指定了承担主体,也以合同联动为准(不传,不在创建后改回)。
185
- 2. 「相关客户」不再套用非出差固定值「泛微上海」;出差流程也不再要求用户另报客户(合同联动带出的客户即具体客户)。
186
- 3. 建单后的回复里如实写合同联动带出的值,不要写成用户口述的值或默认值。
182
+ 1. 传用户的合同号;**承担主体创建时不传**,交给合同联动带出——即使用户同时口头指定了承担主体,也以合同联动为准(不传,不在创建后改回承担主体)。
183
+ 2. **相关客户、相关项目不能空着等联动。** 创建前按下一节问到用户确认(项目可「不填」);已确认的值写入 `data`。「相关客户」不再套用非出差固定值「泛微上海」。
184
+ 3. 建单后的回复里如实写合同联动带出的承担主体,不要写成用户口述的值。
187
185
  4. 创建后从返回的 `linkageResult`(「字段联动带出:…」)读出实际带出的承担主体 / 相关客户 / 相关项目告诉用户;用户口头指定的承担主体与联动结果不同时,一句话说明「已按合同联动为准」。
188
- 5. 联动没带出某一项(`linkageResult` 里没有、或 `missingFields` 列出)→ 该项回到上表的常规规则补值,用同一 `context` 重发(已创建的单子走 `workflow.edit*` 补)。
186
+ 5. 客户 / 项目若被联动改成别的值,以联动为准告诉用户。若被冲空,用建单前已确认的值走 `workflow.edit*` 写回,不要再问一遍。承担主体联动没带出 → 仍按主表「承担主体」补当前用户,不为此再问一轮。
187
+
188
+ ### 相关客户模糊搜索
189
+
190
+ > 用户给出相关客户或相关项目名称时,**先搜再写**。不要把未消歧的简称直接丢给 `createRequest` / `editPrepare`:`createRequest` 的浏览按钮解析可能只命中其中一条,漏掉其他候选(例如「学院」会命中西安欧亚学院、山东康养职业学院等多条)。
191
+
192
+ 已是完整 `名称(ID)`(含默认「泛微上海」、用户刚从候选里选定的那条、历史单据带回的 `名称(ID)`)时不必再搜。
193
+
194
+ CLI operation:`invoice.reim.field.search`
195
+
196
+ | 入参 | 取值 |
197
+ | --- | --- |
198
+ | `keywords` | 用户原话,不要改写、不要补「有限公司」 |
199
+ | `fieldId` | 本次 `createForm` 的 `fields` 里对应字段的 `id`。相关客户名称含「相关客户」(总部费用报销是 `100003720000000687`);相关项目名称含「相关项目」(总部费用报销是 `100003720000006720`)。仍以本次 `fields` 为准 |
200
+ | `workflowId` | 本次报销工作流 ID(总部费用报销是 `100003460000000060`) |
201
+ | `nodeId` | 可省略;CLI 默认总部费用报销发起节点 `100004140000000271` |
202
+
203
+ macOS/Linux(bash/zsh):
204
+
205
+ ```bash
206
+ weaver-work-cli --json invoice run invoice.reim.field.search --input-json '{"keywords":"学院","fieldId":"100003720000000687","workflowId":"100003460000000060"}'
207
+ ```
208
+
209
+ Windows PowerShell:
210
+
211
+ ```powershell
212
+ weaver-work-cli --json invoice run invoice.reim.field.search --input-json '{"keywords":"学院","fieldId":"100003720000000687","workflowId":"100003460000000060"}'
213
+ ```
214
+
215
+ 按返回的 `match` 处理:
216
+
217
+ | `match` | 含义 | AI 怎么做 |
218
+ | --- | --- | --- |
219
+ | `unique` | 只命中 1 条 | **不必再问用户**。把 `selected` 写成 `"西安欧亚学院(100504500000088460)"` 填进「相关客户」 |
220
+ | `multiple` | 命中 2 条及以上 | **暂停**,把 `items` 的名称列给用户选(不要向用户要 ID)。用户选定后再写成 `名称(ID)` |
221
+ | `none` | 0 条 | 告知没搜到「{用户原话}」,请用户换更完整的客户名称。不要自己猜、不要用「泛微上海」顶替出差单 |
222
+
223
+ 用户选定或多条里点名某一条后,用那条的 `名称(ID)` 写入,不要再搜一轮。
224
+
225
+ ### 相关客户、相关项目必须在建单前确认
226
+
227
+ > **没有已确认的相关客户,或相关项目还没问过(也没说「不填」)时,禁止调用 `workflow.createRequest`。不要先建空草稿再问。**
228
+
229
+ | 字段 | 创建前怎么确认 |
230
+ | --- | --- |
231
+ | **相关客户** | **必须有值。** 已确认:用户本轮给了名称并已消歧;或同一次提问里确认采用了历史相关客户;或非出差且合同号仍是 `20260999`,可用 `"泛微上海(100504500000311504)"`。否则和相关项目**一次**问齐:「请一起填写相关客户和相关项目」。用户说「不填」、拒绝或不给名称 → **继续问,不能建单**。出差单不能用「泛微上海」顶替 |
232
+ | **相关项目** | **必须在同一次提问里问过。** 已确认:用户本轮给了名称并已消歧;或明确说「不填」;或确认采用了非空历史项目。不要单独再开一轮只问项目。给了名称就写入主表和可写的明细行 |
233
+
234
+ 未确认时一次让用户把客户和项目一起输入。**不要询问合同号。** 项目确认后,从 `historyRequestData` 里该项目最近一条带出合同号;没有则用 `20260999`。合同号不是 `20260999` 时承担主体不传,客户和项目仍写入 `data`,不要空着等联动。建单后若联动把已确认值冲空,用已确认值 `workflow.edit*` 写回,不要再问一遍。
235
+
236
+ ---
237
+
238
+ ## 总部费用报销历史参考
239
+
240
+ > 编排见 [reim-workflow.md](reim-workflow.md) Step 4.4。本节只规定项目确认之后合同号、客户、项目怎么落值。
241
+
242
+ 工作流是「总部费用报销」时,从本次 `workflow.createForm` 的 `historyRequestData` 取合同号、相关客户、相关项目。**不向用户询问合同号。** 客户和项目还要填时,同一次让用户一起输入。
243
+
244
+ 不要另调 `workflow.search` / `workflow.detail`。发票、金额、费用日期、费用说明、费用科目、附件、报销事由、流程标题不从历史带。
245
+
246
+ | 已确认的项目 | 合同号 |
247
+ | --- | --- |
248
+ | 用户本轮自己说了合同号 | 用用户的,不再推导 |
249
+ | 能对上历史里的相关项目 | 用该项目最近一条的合同号。是 `20260999` 或与表单默认相同则不传;不是则传该合同号,承担主体不传 |
250
+ | 「不填」,或历史里没有这个项目 | 用 `20260999`;表单默认已是它则不传。承担主体按当前用户 |
251
+
252
+ 客户、项目用用户这次确认的值写入。合同号不是 `20260999` 时,不要因为要等联动就把客户或项目留空。建单后用 `linkageResult` 告诉用户实际带出的承担主体和合同号。
189
253
 
190
254
  ---
191
255
 
192
256
  ## 费用明细字段规则
193
257
 
194
258
  > **定位明细表**:用 `fields` 里带「相关发票」(`EinvoiceComponent`)字段的那个 `subFormId`,只填这一张明细表;其他明细表(外包订单等)不填。
259
+ > **明细「费用说明 / 摘要」禁止自己生成。** 不传。挂上「相关发票」后由发票联动带出。不要用 `fysm`、消费内容、起止点或用户口述去写,也不要精简成 `起点-终点`。用户给了文字也不写入。落库后仍空只告知「发票联动没有带出费用说明」,不要补写。
260
+ > **明细列「费用明细」禁止填值。** `fields[].name` 是「费用明细」的那一列不要传,同样由发票联动带出。表单没有这一列就跳过,不要把它当成整张明细表。
195
261
  > 标注「`row-info` 优先」的字段:先取 `invoice.reim.row-info`(多张用 `invoice.reim.row-info-batch`)的返回值,为空/null 时才回退。
196
262
 
197
263
  | fieldName 关键词 | 怎么填 |
198
264
  |------------------|--------|
265
+ | **费用明细**(明细列,名称就是这两个词) | **不传。** 由「相关发票」联动带出。建单后 `linkageResult` / `previewDetails` 里这一列为空时,告诉用户「发票联动没有带出费用明细」,不要补写 |
199
266
  | 费用日期 / 发生日期 | **`row-info` 优先**:`date`;回退发票 `invoiceDate` |
200
267
  | **申请金额 / 实报金额 / 报销金额 / 人民币金额 / 含税金额**(凡可写的金额字段) | 该行发票**价税合计**(`amount` = `price.total`,不是不含税的 `price.amount`);**话费报销**改填 [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) 算出的实报金额 |
201
- | 费用说明 / 摘要 | **有行程单 / 交通类 / 出差报销**:写精简后的 `起点-终点`,**整串最多 1 个 `-`、不含 `|` 和空格**,不能原样抄 `from` / `to` / `fysm`(见下方「行程 / 出差费用说明」);**其他**:`row-info` 优先 `fysm`,回退从 `consumeContent` 提取。**必须去掉所有 `*` 号,不能包含逗号** |
268
+ | **费用说明 / 摘要** | **不传。** 由「相关发票」联动带出。不要用 `row-info.fysm`、`itineraryData`、`consumeContent` 或 `invoice.get` 的起止点自己生成,话费报销也不要写成账单说明。建单后仍空只告知,不要补写 |
202
269
  | **费用类型(科目)** | **`row-info` 优先**:`{subjectName}({subjectId})`;`subjectId` 为空时按 [reim-expense-subject-rules.md](reim-expense-subject-rules.md) 匹配;全部未命中填兜底 `"其他-管理费用(100502270000000104)"`。**必须有值** |
203
- | 相关流程(明细) | 该行发票绑定的事前申请 `{requestname}({requestid})`;未绑定则不传 |
270
+ | 相关流程(明细) | 该行发票绑定的事前申请 `{requestname}({requestid})`。**差旅 / 外出报销每一行都必须有值**,见「差旅 / 外出明细相关流程」;其他报销未绑定则不传 |
204
271
  | 相关客户(明细,若可写) | 与主表一致 |
205
272
  | 相关项目(明细,若可写) | 与主表一致 |
206
273
  | **币种** | **每行都显式传 `"人民币(100001050000000001)"`,即使表单已默认带出**。不传时 CLI 会把无行号的明细默认值塞进联动请求,服务端联动报错并静默返回空结果,「申请金额」联动带不出实报金额 / 人民币金额 / 报销总金额 |
207
274
  | 附件数(若可写) | `"1"` |
208
275
  | **相关发票** | `[该行发票对象]`(**必填**) |
209
- | **相关凭证** | `[配对凭证对象]`;无凭证不传 |
276
+ | **相关凭证** | **不传。** 由「相关发票」联动带出。建单后仍空只告知,不要补写 |
210
277
 
211
278
  > **⚠️ 明细金额字段**:遍历该行可写字段时,`componentKey` 为 `Money` / `NumberComponent` 且名称含"金额"的,**默认全部统一填该行发票的价税合计**,不要因为字段名不是"实报金额"就跳过,也不要拿 `invoice.get` 返回的 `amount`(不含税)顶替。例外只有话费报销。
212
279
 
213
- ### 行程 / 出差费用说明
280
+ ---
214
281
 
215
- **适用(满足任一)**:该行关联了行程单;或交通类发票(`expenseType` 含"交通"/"出行"/"打车",或 `consumeContent` 含"客运服务费"/"运输服务",或 `sellerName` 含"滴滴"/"享道"/"高德"/"曹操"等);或出差报销里的火车票 / 机票 / 打车票。
282
+ ## 差旅 / 外出明细相关流程(硬拦截)
216
283
 
217
- **格式:`起点-终点`**,地名精简到能看出"从哪到哪"即可;只有一端有值时只写那一端,不加 `-`。忽略 `row-info` 外层的 `fysm`(如「交通运输服务」)。
284
+ > **差旅 / 外出报销的每一行明细「相关流程」必须赋值。任一行为空,禁止调用 `workflow.createRequest`。用户说「不填」无效。**
218
285
 
219
- > ⛔ **禁止把原始地址原样填进费用说明**。`invoice.get` 的 `from` / `to`、行程单的 `fysm` 都是原始值(如 `大道|重庆财经学院-西门 - 鱼胡路-地铁站`),**必须先精简再填**。
220
- >
221
- > 填之前逐行自检,**任一条不满足就重新精简**:
222
- > - 整个费用说明里 **`-` 最多 1 个**(只用来隔开起点和终点;只有一端时 0 个)
223
- > - **不含 `|`**,不含空格
224
- > - 每个地名不超过 10 个字
225
- >
226
- > ❌ `大道|重庆财经学院-西门 - 鱼胡路-地铁站` ❌ `重庆财经学院-西门-鱼胡路-地铁站` ❌ `重庆财经学院西门 - 鱼胡路` ✅ `重庆财经学院-鱼胡路站`
286
+ **如何判断(满足任一即可):**
227
287
 
228
- **起止点来源(按优先级):**
288
+ | 判断依据 | 条件 |
289
+ |----------|------|
290
+ | 报销工作流名称 `workFlowName` | 含「差旅」「出差」或「外出」 |
291
+ | 事前申请名称 `requestname` | 含「出差」「差旅」或「外出」 |
292
+ | 用户表述 | 明确说「出差报销」「差旅报销」「外出报销」 |
229
293
 
230
- 1. **发票详情**:额外调用 `invoice.get` 取 `from` / `to`(详见 [reim-api-reference.md](reim-api-reference.md#57-获取发票详情交通类发票行程信息)),火车票 / 机票取出发站和到达站。
231
- 2. **行程单**:`row-info` 的 `itineraryData[].fysm`,格式是 `{起点} - {终点}`(**以空格-空格分隔**),取第一段的起点和最后一段的终点。每一端里 `|` 前面是区域 / 道路前缀,取 `|` 后面的部分再精简。
232
- 3. 都取不到 → 回退常规费用说明逻辑。
294
+ **每一行怎么填:** `{requestname}({requestid})`。按下面顺序取值,取到为止:
233
295
 
234
- **精简要点**:`-` 是起点和终点之间的分隔符,**地名内部不能再出现 `-`**——像「重庆财经学院-西门」「鱼胡路-地铁站」这种用 `-` 连着的门号 / 设施后缀,按下方「地名精简规则」去掉或并进地名。
296
+ 1. 该行发票已绑定的事前申请
297
+ 2. 本次只命中一条差旅 / 外出事前申请 → 未绑定的行也用这一条
298
+ 3. 有多条且该行未绑定 → 暂停,让用户指定这一行用哪一条
299
+ 4. 一条都没有 → 暂停。已有事前申请列表就列给用户选;还没有就先 `invoice.reim.requests.list`。选定后再按 `名称(requestid)` 写入
235
300
 
236
- | 原始(行程单 `fysm` / from-to) | 费用说明 |
237
- | --- | --- |
238
- | `大道\|重庆财经学院-西门 - 鱼胡路-地铁站` | `重庆财经学院-鱼胡路站` |
239
- | `大道\|重庆财经学院-西门 - 大渡口区\|重庆工业博物馆` | `重庆财经学院-重庆工业博物馆` |
240
- | from=`仁济医院南院区门诊部(南门)南侧`,to=`浦江瑞和城柒街区30号` | `仁济医院南院-浦江瑞和城` |
241
- | 火车票 上海虹桥 → 重庆北 | `上海虹桥-重庆北` |
242
- | 只有 from=`虹桥机场T2航站楼出发层` | `虹桥机场T2` |
243
-
244
- ### 地名精简规则
245
-
246
- **1. 去掉冗余修饰词**:方位后缀("西北侧"/"东侧"/"南侧"/"出发层"等)、"股份有限公司"/"有限公司"等企业后缀
247
-
248
- **2. 保留核心地名和关键标识**:门店名、品牌名、航站楼编号、车站名等
249
-
250
- **3. 括号内容处理**:
251
- - 括号内是核心补充信息(如区域名、业务中心名)→ 精简后保留
252
- - 括号内是方位/门号等冗余信息(如"南门"/"西2门")→ 视情况保留关键部分或去掉
253
- - 去掉门牌号(如"30号"/"3419号")
254
-
255
- **4. 长度控制**:每个地名精简后控制在 10 字以内
256
-
257
- **5. 行程单格式**:`|` 前是区域 / 道路前缀,去掉;地名内部的 `-` 后缀(`-西门`、`-地铁站`、`-2号口`)是门号 / 设施,门号去掉,「地铁站」并成「站」;精简结果里不能有 `-`
258
-
259
- **精简快速参考表**:
260
-
261
- | 原始地址 | 精简结果 | 处理说明 |
262
- |----------|----------|----------|
263
- | 仁济医院南院区门诊部(南门)南侧 | 仁济医院南院 | 去括号、去方位后缀、去附属设施 |
264
- | 浦江瑞和城柒街区30号 | 浦江瑞和城 | 去门牌号、去街区编号 |
265
- | 北京SKP(西2门)西北侧 | 北京SKP西2门 | 括号内"西2门"是出入口标识→保留;"西北侧"冗余→去 |
266
- | 虹桥机场T2航站楼出发层 | 虹桥机场T2 | T2是航站楼标识→保留;"航站楼出发层"冗余→去 |
267
- | 浦东国际机场T1航站楼到达层 | 浦东机场T1 | 去"国际"、"航站楼到达层" |
268
- | 上海市闵行区三鲁公路3419号 | 三鲁公路 | 去行政区划前缀、去门牌号 |
269
- | 泛微网络科技股份有限公司(北方大区业务运营中心) | 泛微网络(北方运营中心) | 去企业后缀,括号内精简保留 |
270
- | 北京南站 | 北京南站 | 已够短,原样保留 |
271
- | 上海南站地铁站2号出入口 | 上海南站 | 去"地铁站"、"出入口" |
272
- | 杭州萧山国际机场T3航站楼国内出发 | 萧山机场T3 | 去城市名、"国际"、"国内出发" |
273
- | 上海市浦东新区世纪大道100号环球金融中心 | 环球金融中心 | 去地址前缀,保留标志性建筑名 |
274
- | 中国人民解放军海军军医大学第一附属医院(长海医院) | 长海医院 | 括号内是通用简称→用简称 |
275
- | 上海火车站(北广场)东北侧 | 上海火车站 | 去广场方位和方向后缀 |
276
- | 大道\|重庆财经学院-西门 | 重庆财经学院 | 去 `\|` 前缀和 `-西门` 门号 |
277
- | 鱼胡路-地铁站 | 鱼胡路站 | 「地铁站」并成「站」,去掉内部 `-` |
278
- | 大渡口区\|重庆工业博物馆 | 重庆工业博物馆 | 去 `\|` 前的行政区 |
279
-
280
- **边界情况处理**:
281
-
282
- | 边界场景 | 处理方式 |
283
- |----------|----------|
284
- | from/to 只有经纬度或地址代码,无可读地名 | 跳过精简,回退到 `fysm` 或 `consumeContent` |
285
- | 精简后 from 和 to 相同(同一地点上下车) | 写成 `{地点}` 而非 `{地点}-{地点}` |
286
- | from 或 to 为空 | 只写有值的那个,不加 `-` 分隔符 |
287
- | 地名含英文(如 Costco、IKEA) | 原样保留英文品牌名,不翻译 |
301
+ 主表「事前申请流程 / 相关流程」不赋值,保留空值。用户拒绝、取消或不选 → **结束报销,禁止 `workflow.createRequest`**。明细「相关流程」不要留空,也不要填发票号、合同号或其他字段顶替。
288
302
 
289
303
  ---
290
304
 
@@ -302,10 +316,11 @@
302
316
 
303
317
  **操作步骤:**
304
318
 
305
- 0. 用户给了合同号 → 相关客户由合同联动带出,本节拦截不适用(见「用户给了合同号:以合同联动为准」)
306
- 1. 识别为出差后,**在调用 `workflow.createRequest` 之前必须暂停**
307
- 2. 明确提醒用户:「当前为出差报销,必须填写相关客户。请提供具体客户名称,否则无法继续报销。」
308
- 3. 用户给出客户名称 → 原样(可补全称/简称等写法,英文逗号并列)填进主表和明细的「相关客户」,由 `createRequest` 解析;返回 `NEEDS_CONFIRMATION`(`MULTIPLE_MATCHES` / `NOT_FOUND`)时按 `workflow-create.md` 的浏览按钮口径让用户选或重给名称
319
+ 0. 合同号不是 `20260999` 也不能改成「先建草稿等联动」。出差相关客户必须在 `createRequest` 前问到(或 Step 4.4 已确认采用历史客户),写入 `data` 再建单
320
+ 0.1. 用户确认采用了历史相关客户 → 将该历史原值填进「相关客户」,本节拦截解除
321
+ 1. 识别为出差后,**在调用 `workflow.createRequest` 之前必须暂停**(相关客户、相关项目都按上一节确认)
322
+ 2. 一次提醒用户:「当前为出差报销。请一起填写相关客户和相关项目。客户必须是具体名称,否则无法继续;项目没有可以说不填。合同号不用填。」
323
+ 3. 用户给出客户名称 → **先**按「相关客户模糊搜索」调用 `invoice.reim.field.search`:一条直接填 `名称(ID)`,多条列给用户选,零条请用户换名称。**不要**把未消歧简称直接丢给 `createRequest`
309
324
  4. 用户拒绝、取消、或不提供具体客户 → **结束报销流程,禁止调用 `workflow.createRequest`**
310
325
  5. **禁止**用固定值「泛微上海」顶替出差的相关客户
311
326
 
@@ -330,14 +345,36 @@
330
345
  > **⚠️ 创建多个报销单时,每个报销单都必须独立执行以下完整流程(各自一次 `createForm` → 一次 `createRequest`),不能省略任何步骤或字段。**
331
346
 
332
347
  0. **过滤红冲发票**:过滤 `info.comm_info.pro.status == 8`
333
- 1. **分类配对**:按 `invoiceTypeCode` 分为发票和相关凭证(17/18/57/58),凭证与发票配对(`itinerary` 优先)
334
- 2. **禁止 `*` 号**:所有文本值(费用说明、报销事由等)先去掉 `*`
335
- 3. **出差拦截**:出差/差旅流程先拿到用户提供的相关客户,否则停止
336
- 4. **话费拦截**:按 [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) 核对材料并算实报金额,否则停止
337
- 5. **主表**:按「主表字段规则」逐个落值;带默认值且无需改写的字段不传
338
- 6. **明细**:每张发票一行,按「费用明细字段规则」逐个落值;每行必须有费用日期、金额、费用说明、费用类型(科目)、相关发票、币种
339
- 7. **最终检查**:每行「费用类型(科目)」有值,没有就填 `"其他-管理费用(100502270000000104)"`;`data` 里没有 `fields` 之外的字段 id
340
- 8. 交给 [reim-workflow.md](reim-workflow.md) Step 5 直接调用 `workflow.createRequest` 存草稿
348
+ 1. **分类**:按 `invoiceTypeCode` 分为发票和相关凭证(17/18/57/58)。只有发票成行;凭证不成行、不配对、不写入「相关凭证」
349
+ 2. **禁止 `*` 号**:要写入的文本值(报销事由等)先去掉 `*`。费用说明不在写入范围内
350
+ 3. **历史参考**:总部费用报销按「总部费用报销历史参考」用已确认项目带出合同号,**不问合同号**
351
+ 4. **相关客户 / 相关项目**:同一次提问让用户一起填写。没确认 → **停止,禁止 `createRequest`**
352
+ 4.1. **差旅 / 外出相关流程**:按「差旅 / 外出明细相关流程」给每一行赋值。任一行没有事前申请 → **停止,禁止 `createRequest`**
353
+ 5. **话费拦截**:按 [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) 核对材料并算实报金额,否则停止
354
+ 6. **主表**:按「主表字段规则」逐个落值;带默认值且无需改写的字段不传
355
+ 7. **明细**:每张发票一行。「费用说明」「费用明细」「相关凭证」都不传,交给发票联动。差旅 / 外出再加每行「相关流程」
356
+ 8. **最终检查**:每行「费用类型(科目)」有值;`data` 里没有「费用说明」「费用明细」「相关凭证」的字段 id;差旅 / 外出每一行「相关流程」都是 `{requestname}({requestid})`;`data.main` 里没有「事前申请流程」;相关客户已有确认值;相关项目已在同一次提问里问过;没有向用户要合同号
357
+ 9. 交给 [reim-workflow.md](reim-workflow.md) Step 5 直接调用 `workflow.createRequest` 存草稿
358
+ 10. **落库后再查**:客户 / 项目是否被联动冲空。费用说明、费用明细、相关凭证仍空只告知联动没带出,不要补写。不能只贴草稿链接就结束
359
+
360
+ ---
361
+
362
+ ## 填写结果检查
363
+
364
+ > 发生在 `workflow.createRequest` 已经建成草稿之后。编排见 [reim-workflow.md](reim-workflow.md) Step 5.3。
365
+ > **相关客户、相关项目本应在建单前问清。** 这里只处理联动把已确认的客户 / 项目冲空。明细「费用说明」「费用明细」「相关凭证」仍空时只告诉用户「发票联动没有带出」,禁止补写。
366
+
367
+ 草稿落库后按下表检查。先看本次返回的 `previewDetails`、`fields`、`linkageResult`、`missingFields`;看不出时用 `requestId` 调一次 `workflow.editLoad` 的 `currentValues`。不要另建报销单,不要 `workflow.detail`。
368
+
369
+ | 检查项 | 没填上 | 告诉用户的原因 | 请用户给什么 |
370
+ | --- | --- | --- | --- |
371
+ | **相关客户** | **任何报销单**:主表「相关客户」为空,或明细有这个字段且该行也空。非出差且已是「泛微上海」不算 | 合同联动把建单前已确认的客户冲空了 | 本轮已经消歧过的 `名称(ID)` **直接写回,不要再问**。只有建单前漏问了才问客户名称(不接受「不填」) |
372
+ | 相关项目 | 主表「相关项目」为空,且用户没有说过「不填」;明细有这个字段时也为空 | 合同联动把建单前已确认的项目冲空了 | 已确认的项目名称直接写回。只有建单前漏问了才问「相关项目填什么」,可以说「不填」 |
373
+ | 明细「费用说明」 | 表单有这一列,落库后仍空 | 发票联动没有带出 | **不请用户填,也不补写,不要自己生成** |
374
+ | 明细「费用明细」 | 表单有这一列,落库后仍空 | 发票联动没有带出 | **不请用户填,也不补写** |
375
+ | 明细「相关凭证」 | 表单有这一列,落库后仍空 | 发票联动没有带出 | **不请用户挂,也不补写**;不要为了它向用户要行程单或起点终点 |
376
+
377
+ 非出差且相关客户已是「泛微上海」不报客户缺失。表里都合格则不额外说明。缺项在 `finalMarkdown` 后一次列完,**不能只贴草稿就结束**。已确认的客户 / 项目走 `workflow.editPrepare` → `workflow.editApply`,不再二次确认保存。相关项目用户说不填 → 保持现状,不再追问。**相关客户说「不填」无效。** 明细「费用说明」「费用明细」「相关凭证」即使用户给了内容也不写入。`editPrepare` / `editApply` 失败时如实转述错误,相关客户仍算没填上,不能把失败当成检查完成。
341
378
 
342
379
  ---
343
380