weaver-work-cli 0.1.28 → 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 (40) hide show
  1. package/dist/shortcuts/invoice/host.js +2 -1
  2. package/dist/shortcuts/invoice/manifest.js +2 -1
  3. package/dist/shortcuts/invoice/operations/issuing-qys.js +132 -36
  4. package/dist/shortcuts/workflow/index.js +3 -0
  5. package/dist/shortcuts/workflow/operations/read.js +13 -6
  6. package/dist/shortcuts/workflow/operations/registry.js +2 -0
  7. package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +331 -0
  8. package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +133 -0
  9. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +326 -0
  10. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +113 -0
  11. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +259 -0
  12. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoListRows.js +64 -0
  13. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoOutputPlanner.js +28 -0
  14. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.aggregate.js +70 -0
  15. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +267 -0
  16. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +392 -0
  17. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +165 -0
  18. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +448 -0
  19. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +348 -0
  20. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +222 -0
  21. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +66 -0
  22. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +502 -0
  23. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +540 -0
  24. package/docs/_catalog.md +1 -0
  25. package/docs/invoice.md +3 -3
  26. package/docs/todo-smart-convert/README.md +171 -0
  27. package/docs/todo-smart-convert/data-contract.md +236 -0
  28. package/docs/todo-smart-convert/mock/ai-todo-query-target.json +209 -0
  29. package/docs/todo-smart-convert/subgroup-rules.md +245 -0
  30. package/package.json +1 -1
  31. package/scripts/package-skill.mjs +1 -1
  32. package/skill-template/domains/yepiaotong.md +2 -2
  33. package/skills/weaver-e10-workflow/SKILL.md +23 -1
  34. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +282 -0
  35. package/skills/weaver-e10-workflow/scripts/todo-summary.cjs +695 -0
  36. package/skills/weaver-e10-yepiaotong/SKILL.md +6 -6
  37. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +10 -7
  38. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +41 -14
  39. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +54 -26
  40. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +2 -2
@@ -2,9 +2,9 @@
2
2
  name: weaver-e10-yepiaotong
3
3
  display_name: 泛微业票通发票
4
4
  display_name_en: Weaver Invoice
5
- description: "泛微 E10 业票通发票管理:查询票夹、OCR/查验、附件、流程发票字段、报销填单、按契约锁台账发起开票流程。"
6
- description_zh: "泛微 E10 业票通发票管理。支持查询个人/企业票夹、查看详情、上传、OCR/查验预览、下载附件、流程表单发票字段数据,通过 prepare/apply 确认链处理导入、新增、编辑、删除;报销填单由本技能准备发票与预填数据,报销单创建/修改调用 weaver-e10-workflow 的发起/修改能力;AI 开票从契约锁合同台账取数,按合同号调用 weaver-e10-workflow 发起开票流程草稿,不支持绕过流程直接开票。"
7
- description_en: "Weaver E10 Yepiaotong invoice skill for folder queries, detail lookup, OCR and validation previews, attachment downloads, workflow invoice field data, reimbursement data preparation (forms are created and edited via weaver-e10-workflow), and AI invoicing that drafts an invoice-application workflow from the Qiyuesuo contract ledger (direct issuing is not supported)."
5
+ description: "泛微 E10 业票通发票管理:查询票夹、OCR/查验、附件、流程发票字段、报销填单、获取待开票合同数据后发起开票流程。"
6
+ description_zh: "泛微 E10 业票通发票管理。支持查询个人/企业票夹、查看详情、上传、OCR/查验预览、下载附件、流程表单发票字段数据,通过 prepare/apply 确认链处理导入、新增、编辑、删除;报销填单由本技能准备发票与预填数据,报销单创建/修改调用 weaver-e10-workflow 的发起/修改能力;AI 开票先获取待开票合同数据(含契约锁、泛微及其他合同),再按合同号调用 weaver-e10-workflow 发起开票流程草稿,不支持绕过流程直接开票。"
7
+ description_en: "Weaver E10 Yepiaotong invoice skill for folder queries, detail lookup, OCR and validation previews, attachment downloads, workflow invoice field data, reimbursement data preparation (forms are created and edited via weaver-e10-workflow), and AI invoicing that drafts an invoice-application workflow from pending contract data, including Qiyuesuo, Weaver, and other contracts (direct issuing is not supported)."
8
8
  version: 1.0.6
9
9
  author: 泛微网络科技股份有限公司
10
10
  agent_created: true
@@ -98,7 +98,7 @@ cliHelp: "weaver-work-cli invoice --help"
98
98
  | 报销表单字段填充与 JSON 组装规则 | AI 内部 | `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)` |
99
99
  | 话费补贴 / 话费报销硬拦截规则 | AI 内部 | `[reim-phone-subsidy-rules.md](references/reim-phone-subsidy-rules.md)` |
100
100
  | 报销端到端示例 | 参考 | `[reim-examples.md](references/reim-examples.md)` |
101
- | **开票(默认,唯一链路):按契约锁台账发起开票流程草稿** | `invoice run invoice.issuing.qys.list` -> `workflow run workflow.createForm/createRequest`(`weaver-e10-workflow`) | `[invoice-issuing-workflow.md](references/invoice-issuing-workflow.md)` |
101
+ | **开票(默认,唯一链路):获取待开票合同数据后发起开票流程草稿** | `invoice run invoice.issuing.qys.list` -> `workflow run workflow.createForm/createRequest`(`weaver-e10-workflow`) | `[invoice-issuing-workflow.md](references/invoice-issuing-workflow.md)` |
102
102
  | 开票流程填单规则(默认值:本次开票金额 = 总金额等) | AI 内部 | `[invoice-issuing-form-fill-rules.md](references/invoice-issuing-form-fill-rules.md)` |
103
103
  | 开票端到端示例 | 参考 | `[invoice-issuing-examples.md](references/invoice-issuing-examples.md)` |
104
104
  | 共享、转让、标签或 schema 未列出的能力 | 无可用命令 | `[invoice-disabled-capabilities.md](references/invoice-disabled-capabilities.md)` |
@@ -121,8 +121,8 @@ cliHelp: "weaver-work-cli invoice --help"
121
121
  - 报销单创建/修改依赖同级的 `weaver-e10-workflow` 技能(`../weaver-e10-workflow/`);该技能不存在时停止并告知用户需要安装,不要改用其他方式创建报销单。
122
122
  - **⚠️ 报销单「合同号」固定为 `20260999`**(除非用户当次明确给出别的合同号):`createForm` 已带出该默认值时不传;没带出或用户给了别的合同号时显式传。**用户给了合同号时,承担主体 / 相关客户 / 相关项目都不传,以合同联动带出的值为准(用户口头指定的承担主体也一样)**。口径见 `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)` 主表字段规则。
123
123
  - **⚠️ 明细「费用说明」写精简后的 `起点-终点`**(如 `重庆财经学院-鱼胡路站`):整串最多 1 个 `-`、不含 `|` 和空格;禁止原样填 `from` / `to` / 行程单 `fysm` 的原始地址(如 `大道|重庆财经学院-西门 - 鱼胡路-地铁站`)。精简规则见 `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)`「行程 / 出差费用说明」。
124
- - **AI 开票(默认主链路,所有开票意图先走这条)**:`invoice.issuing.qys.list`(合同号传 `contractNo`,公司名等传 `keyword`;没有线索只问一句合同号或客户名)-> 按返回的 `groups`(一组 = 合同号 + 购方 = 一张流程)让用户选组 -> **购方无税号却是专票(`specialInvoiceWithoutTaxNo=true`)时硬拦截:没有税号只能开普票,请用户先在台账改为普票,不发起流程** -> 展示确认卡片(明确"只建草稿,不会直接开票";必填的「预计收款时间」在卡片里请用户从本月底 / 下月底 / 30 天后候选里选或直接给日期,不自己定默认值,**用户没给日期就不建草稿**)-> 用户确认 -> `workflow.createForm`(`weaver-e10-workflow`,固定传 `契约锁合同收款发票开具及快递申请(100003460000001852)`,**不传 `userQuestion`**,**不要按宽词“开票”检索**——会误中红冲流程)-> 按 `[invoice-issuing-form-fill-rules.md](references/invoice-issuing-form-fill-rules.md)` 组装 `data`(用户说了就按用户的,没说就按默认值,例如本次开票金额默认 = 总金额、开票事由自动生成、所售产品版本号取明细规格类型(与下拉选项完全一致才填);明细每行只传「金额(含税)」,其余列(货物名称、明细行id、单价、规格类型、税率、总开票金额 / 已开票金额 / 未开票金额等)由合同号联动带出,多传会让总开票金额带不出来;主表「开票内容」、明细「数量」和主表「开户行名称」「开户行银行帐号」创建时不传(开票内容的联动会冲掉合同号带出的明细整行;数量会被联动写成税率选项 id;开户行会被写成名称账号混写串);其余购方信息由合同号联动带出,不传);`requestName` 按 `开票申请-{购方名称}-{合同号}` 必传 -> `workflow.createRequest`(`action` 固定 `"draft"`)-> 原样粘贴 `finalMarkdown`,再用 `linkageResult` 的「是否存在合同明细数据」「总开票金额」和「本次开票总金额」核对明细是否带出、本次填的开票金额是否一致(台账开票金额为含税金额)-> **创建后补正**:`workflow.editLoad` 读草稿。开户行名称 / 账号取分组里 CLI 拆好的 `purchaserBankName` / `purchaserBankAccount`(为空时按「,账号:」拆只读字段「开户行及帐号」),`workflow.editPrepare` **只传主表这两个字段**,用户确认后 `workflow.editApply`。开票内容和明细数量**不经编辑链改**(编辑开票内容会报错,编辑明细会多出一行):在回复末尾提醒用户在 E10 里选开票内容(给出建议选项),并把每行数量改成台账 `items[].quantity`(按「明细行id」对应)。创建成功后修改只走 `workflow.editLoad/editPrepare/editApply`,禁止重复创建。详见 `[invoice-issuing-workflow.md](references/invoice-issuing-workflow.md)`。
125
- - **开票没有兜底链路(0.1.27 起)**:CLI 已移除 `invoice.issuing.make.prepare/apply`、`invoice.issuing.qys.prepare`、`invoice.issuing.result`,**不存在"直接开票/存待开台账"的接口**。用户说"直接开票""不走流程""存待开台账"时,一律走上面的主链路创建开票流程草稿,并向用户说明:开票必须经「契约锁合同收款发票开具及快递申请」流程审批后由流程侧完成;数据不在契约锁台账时,提示用户先在台账录入商品信息,再按主链路发起。
124
+ - **AI 开票(默认主链路,所有开票意图先走这条)**:`invoice.issuing.qys.list`(合同号传 `contractNo`,公司名等传 `keyword`;没有线索只问一句合同号或客户名)-> 按返回的 `groups`(一组 = 合同号 + 购方 = 一张流程)让用户选组 -> **购方无税号却是专票(`specialInvoiceWithoutTaxNo=true`)时硬拦截:没有税号只能开普票,请用户先在台账改为普票,不发起流程** -> 展示确认卡片(明确"只建草稿,不会直接开票";必填的「预计收款时间」在卡片里请用户从本月底 / 下月底 / 30 天后候选里选或直接给日期,不自己定默认值,**用户没给日期就不建草稿**)-> 用户确认 -> `workflow.createForm`(`weaver-e10-workflow`,按台账「核算公司」`sellerNames` 选择,名称必须完全相同:只有「上海亘岩网络科技有限公司」时传 `契约锁合同收款发票开具及快递申请(100003460000001852)`;是泛微网络、泛微软件、上海田亩、成都泛微、泛微国际、北京泛微、浙江泛微之一时传 `合同收款发票开具及快递申请(100003460000000214)`;为空或不在这份名单里时先问用户,选定前不建草稿。用户要退票、冲红或红冲时改为 `合同开票冲红流程(887410479139758085)`,不套用开票填单规则。**不传 `userQuestion`**,**不要按宽词“开票”检索**)-> 按 `[invoice-issuing-form-fill-rules.md](references/invoice-issuing-form-fill-rules.md)` 组装 `data`(用户说了就按用户的,没说就按默认值,例如本次开票金额默认 = 总金额、开票事由自动生成、所售产品版本号取明细规格类型(与下拉选项完全一致才填);「开票内容」只在 `契约锁合同收款发票开具及快递申请(100003460000001852)` 上按明细货物名称推断后传入,其他流程忽略该字段;明细每行只传「金额(含税)」,其余列(货物名称、明细行id、单价、规格类型、税率、总开票金额 / 已开票金额 / 未开票金额等)由合同号联动带出,多传会让总开票金额带不出来;明细「数量」和主表「开户行名称」「开户行银行帐号」创建时不传(数量会被联动写成税率选项 id;开户行会被写成名称账号混写串);其余购方信息由合同号联动带出,不传);`requestName` 按 `开票申请-{购方名称}-{合同号}` 必传 -> `workflow.createRequest`(`action` 固定 `"draft"`)-> 原样粘贴 `finalMarkdown`,再用 `linkageResult` 的「是否存在合同明细数据」「总开票金额」和「本次开票总金额」核对明细是否带出、本次填的开票金额是否一致(台账开票金额为含税金额)-> **创建后补正**:`workflow.editLoad` 读草稿。开户行名称 / 账号取分组里 CLI 拆好的 `purchaserBankName` / `purchaserBankAccount`(为空时按「,账号:」拆只读字段「开户行及帐号」),`workflow.editPrepare` **只传主表这两个字段**,用户确认后 `workflow.editApply`。只有契约锁开票流程才在创建时写入「开票内容」,不要再用编辑链改(`editPrepare` 会报错);没有匹配到选项时才提醒用户在 E10 选择。其他流程没有这个字段,不推断、不提醒。明细数量不经编辑链改(会多出一行):回复末尾把每行数量改成台账 `items[].quantity`(按「明细行id」对应)。创建成功后修改只走 `workflow.editLoad/editPrepare/editApply`,禁止重复创建。详见 `[invoice-issuing-workflow.md](references/invoice-issuing-workflow.md)`。
125
+ - **开票没有兜底链路(0.1.27 起)**:CLI 已移除 `invoice.issuing.make.prepare/apply`、`invoice.issuing.qys.prepare`、`invoice.issuing.result`,**不存在"直接开票/存待开台账"的接口**。用户说"直接开票""不走流程""存待开台账"时,一律走上面的主链路创建开票流程草稿,并向用户说明:开票必须经所选开票流程审批后由流程侧完成;数据不在待开票合同数据里时,提示用户先录入合同商品信息,再按主链路发起。
126
126
  - 开票流程的创建/修改依赖同级 `weaver-e10-workflow` 技能;该技能不存在时停止并告知用户需要安装,**不要尝试用其他方式直接开票**。
127
127
 
128
128
  ## 执行原则(减少误路由、误重试和无效消耗)
@@ -2,11 +2,11 @@
2
2
 
3
3
  ## 什么时候读取
4
4
 
5
- 需要参考开票完整对话流程时读取本文件。全部示例都是**唯一链路**(契约锁台账 → 开票流程草稿,规则见 [invoice-issuing-workflow.md](invoice-issuing-workflow.md))。CLI 已移除直接开票接口(0.1.27 起),用户说"直接开票 / 不走流程 / 存待开台账"时同样走主链路建流程草稿,并向用户说明开票必须经流程审批。
5
+ 需要参考开票完整对话流程时读取本文件。全部示例都是**唯一链路**(获取待开票合同数据 → 开票流程草稿,规则见 [invoice-issuing-workflow.md](invoice-issuing-workflow.md))。数据含契约锁、泛微及其他合同。CLI 已移除直接开票接口(0.1.27 起),用户说"直接开票 / 不走流程 / 存待开台账"时同样走主链路建流程草稿,并向用户说明开票必须经流程审批。
6
6
 
7
7
  ---
8
8
 
9
- # 主链路:按契约锁台账发起开票流程
9
+ # 主链路:获取待开票合同数据后发起开票流程
10
10
 
11
11
  ## 示例 1:按合同号开票
12
12
 
@@ -14,13 +14,15 @@
14
14
 
15
15
  **AI**:
16
16
 
17
- 1. `invoice.issuing.qys.list`,`keyword="南昌我爱我家"` → `groups` 命中 1 组(合同号 20266105541,1 行,技术服务费,6.0%,开票金额合计 20000.00)
17
+ 1. `invoice.issuing.qys.list`,`keyword="南昌我爱我家"` → `groups` 命中 1 组(合同号 20266105541,销售方「上海亘岩网络科技有限公司」,1 行,技术服务费,6.0%,开票金额合计 20000.00)。销售方是这个名称,所以选契约锁开票流程。核算公司是泛微网络、泛微软件、上海田亩、成都泛微、泛微国际、北京泛微、浙江泛微之一时,`createForm` 改为 `合同收款发票开具及快递申请(100003460000000214)`,字段 id 以当次 `createForm` 的中文名为准。那条流程没有「开票内容」,确认卡片和 `data` 都不要写这个字段。核算公司为空或不在这份名单里时先问用户,选定前不建草稿。用户要退票、冲红或红冲时改为 `合同开票冲红流程(887410479139758085)`,不套用开票填单规则。
18
18
  2. 展示确认卡片:
19
19
 
20
20
  > 将为以下合同发起「开票申请」流程(只存草稿,不会直接开票):
21
21
  >
22
22
  > 合同号:20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)
23
23
  > 购方:南昌我爱我家科技有限公司 税号:91360125083909438T
24
+ > 销售方:上海亘岩网络科技有限公司
25
+ > 开票流程:契约锁合同收款发票开具及快递申请
24
26
  > 发票类型:全电专票
25
27
  >
26
28
  > | 序号 | 商品 | 税率 | 开票金额(含税) |
@@ -33,6 +35,8 @@
33
35
  >
34
36
  > 开票事由:合同20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)技术服务费全额开票,金额20000元
35
37
  >
38
+ > 开票内容:技术服务费(按货物名称「技术服务费」匹配)
39
+ >
36
40
  > 预计收款时间:(必填)请选择:本月底 2026-10-31 / 下月底 2026-11-30 / 30 天后 2026-11-22,或直接给一个日期
37
41
  >
38
42
  > 请回复预计收款时间并确认发起。
@@ -43,8 +47,8 @@
43
47
 
44
48
  3. `workflow.createForm`,`workflow=["契约锁合同收款发票开具及快递申请(100003460000001852)"]`
45
49
  4. 按 [invoice-issuing-form-fill-rules.md](invoice-issuing-form-fill-rules.md) 组装 `data`,用户没有特殊说明,全部取默认值:
46
- - `data.main`:「合同号」`20266105541`;「相关合同审批流程」`南昌我爱我家科技有限公司开放平台续购20000元10000份(1326792548468580636)`;「产品类型」`契约锁`;「开票日期」取当天;「开票备注」`20266105541`;「预计收款时间」按"下月底"换算为 `2026-11-30`;「开票事由」自动生成为 `合同20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)技术服务费全额开票,金额20000元`。
47
- - 明细第 1 行取该组唯一台账行,只传「金额(含税)」`20000`(按总金额开)。货物名称、购买方名称、明细合同号、明细行id、单价、规格类型、单位、税率、总开票金额、已开票金额、未开票金额都由合同号联动带出,不传;开票内容、数量、开户行名称、开户行银行帐号创建时不传;金额(不含税)、税额不传。
50
+ - `data.main`:「合同号」`20266105541`;「相关合同审批流程」`南昌我爱我家科技有限公司开放平台续购20000元10000份(1326792548468580636)`;「产品类型」`契约锁`;「开票内容」`技术服务费`(货物名称与选项名完全相同);「开票日期」取当天;「开票备注」`20266105541`;「预计收款时间」按"下月底"换算为 `2026-11-30`;「开票事由」自动生成为 `合同20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)技术服务费全额开票,金额20000元`。
51
+ - 明细第 1 行取该组唯一台账行,只传「金额(含税)」`20000`(按总金额开)。货物名称、购买方名称、明细合同号、明细行id、单价、规格类型、单位、税率、总开票金额、已开票金额、未开票金额都由合同号联动带出,不传;数量、开户行名称、开户行银行帐号创建时不传;金额(不含税)、税额不传。
48
52
  - `requestName="开票申请-南昌我爱我家科技有限公司-20266105541"`。
49
53
 
50
54
  如果用户说"这次先开 1 万",明细「金额(含税)」改填 `10000`,开票事由改为 `合同20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)技术服务费开票,本次10000元,合同开票总额20000.00元`,其余不变。
@@ -61,10 +65,9 @@
61
65
  > 要把开户行名称和账号分开补进草稿吗?
62
66
 
63
67
  用户确认后 `workflow.editApply`。
64
- 8. 回复末尾提醒用户在 E10 里改的项:同一次 `editLoad` 里,开票内容为空,商品只有「技术服务费」,与选项完全相同;明细第 1 行数量是联动带出的 `1201835186337538063`,台账数量是 `1`。
68
+ 8. 回复末尾只提醒数量(开票内容已按货物名称「技术服务费」写入,不再提醒)。同一次 `editLoad` 里,明细第 1 行数量是联动带出的 `1201835186337538063`,台账数量是 `1`。
65
69
 
66
70
  > 提交前请在 E10 里改:
67
- > - 开票内容:请在 E10 里选择「技术服务费」
68
71
  > - 明细第 1 行数量:联动带出的是 1201835186337538063,请在 E10 改成 1
69
72
 
70
73
  ---
@@ -2,22 +2,20 @@
2
2
 
3
3
  ## 什么时候读取
4
4
 
5
- AI 开票组装 `workflow.createRequest` 的 `data` 时读取本文件(流程编排见 [invoice-issuing-workflow.md](invoice-issuing-workflow.md))。适用流程:`契约锁合同收款发票开具及快递申请(100003460000001852)`。
5
+ AI 开票组装 `workflow.createRequest` 的 `data` 时读取本文件(流程编排见 [invoice-issuing-workflow.md](invoice-issuing-workflow.md))。适用两条开票流程:销售方取台账「核算公司」,名称必须完全相同:为「上海亘岩网络科技有限公司」时用 `契约锁合同收款发票开具及快递申请(100003460000001852)`;为泛微网络、泛微软件、上海田亩、成都泛微、泛微国际、北京泛微、浙江泛微之一时用 `合同收款发票开具及快递申请(100003460000000214)`。核算公司为空或不在这份名单里时先问用户,选定前不建草稿。退票、冲红、红冲不读本文件,走 `合同开票冲红流程(887410479139758085)`。
6
6
 
7
7
  ## 总原则
8
8
 
9
9
  1. **用户说了就按用户的**:用户本轮对某个字段有特殊说明(金额、日期、事由、收件信息等),一律以用户为准。
10
10
  2. **用户没说就按下表默认值填**:下表给了默认值的字段直接填,不再问用户。
11
11
  3. **联动字段不传**:填了「合同号」之后,联动会带出主表的购方名称、税号、发票类型,以及明细的整行台账数据(货物名称、购买方名称、明细合同号、明细行id、单价、规格类型、单位、税率、税收分类编码、总开票金额、已开票金额、未开票金额),Agent 不传这些字段。
12
- 4. **创建时不传的三类字段**:
13
- - 「开票内容」:它自己的联动会把合同号带出的明细整行冲掉。草稿建好后请用户在 E10 里选。
12
+ 4. **创建时不传的两类字段**(详见下文「创建后补正」):
14
13
  - 明细「数量」:联动会把它写成错值,Agent 改不了。草稿建好后请用户在 E10 里改。
15
14
  - 主表开户行名称与账号:联动会把它们写成混写值。草稿建好后经编辑链补正。
15
+ 5. **「开票内容」只在契约锁流程填写**:只有创建 `契约锁合同收款发票开具及快递申请(100003460000001852)` 时,才加载下文「开票内容推断」并写入。其他流程(包括 `合同收款发票开具及快递申请`)没有这个字段:不推断、不传、不问、不提醒,也不要把值改填到名称相近的字段。
16
+ 6. **其余字段留空**:下表没有列出、用户也没说的字段,按 `workflow-create.md`「填值纪律」处理(`initialValue` → 历史一致值 → 留空)。留空的必填项会出现在草稿的 `missingFields` 里,由用户提交前补齐。
16
17
 
17
- 详见下文「创建后补正」。
18
- 5. **其余字段留空**:下表没有列出、用户也没说的字段,按 `workflow-create.md`「填值纪律」处理(`initialValue` → 历史一致值 → 留空)。留空的必填项会出现在草稿的 `missingFields` 里,由用户提交前补齐。
19
-
20
- 字段 id 以 `createForm` 返回的 `fields` 按中文名定位为准。下表括号里的 id 是当前版本的实测值,仅供核对。
18
+ 字段 id 以当次 `createForm` 返回的 `fields` 按中文名定位为准。下表括号里的 id 是契约锁开票流程的实测值;另一条开票流程必须改用同中文名的 id,中文名对不上就不要借用这里的 id。
21
19
 
22
20
  ## 主表
23
21
 
@@ -26,9 +24,9 @@ AI 开票组装 `workflow.createRequest` 的 `data` 时读取本文件(流程
26
24
  | 流程标题 `requestName` | `开票申请-{购方名称}-{合同号}` | `group.purchaserName`、`group.contractNo` |
27
25
  | 合同号(`100003720000056343`) | 本组合同号原值 | `group.contractNo` |
28
26
  | 相关合同审批流程(`100003720000056262`) | `{合同审批流程名称}({流程ID})` | `group.contractFlowName`、`group.contractFlowId`;ID 为空时留空 |
29
- | 开票内容(`100003720000056243`,必填) | **不传**(实测:创建时传了,明细的货物名称、总开票金额等整行都带不出来)。创建后请用户在 E10 里选:本组只有 1 个商品、且商品名与选项名**完全相同**时,在提醒里给出建议选项(如「技术服务费」);否则只提醒选择 | `group.goodsNames` 对照字段 `options` |
27
+ | 开票内容(`100003720000056243`,必填,下拉) | **仅** `契约锁合同收款发票开具及快递申请(100003460000001852)`。按「开票内容推断」从明细货物名称选出最符合的选项名并传入;用户本轮指定了且与某个选项名完全相同就用用户的。全部对不上时不传。其他流程忽略本行 | 明细货物名称对照字段 `options` |
30
28
  | 所售产品版本号(`100003720000056244`,下拉) | 取明细「规格类型」:`group.specifications` 只有 1 个值且与选项名**完全相同**(如 `V8.0`)时填该选项;不在选项里(如 `V8`、`8.0`)时留空,**不自行补全或改写**;有多个不同值时在确认卡片里问用户选哪个;为空时留空(不选「空」选项) | `group.specifications`(即台账「规格型号」)对照字段 `options` |
31
- | 产品类型(`100003720000056342`) | `契约锁` | 数据来自契约锁合同台账 |
29
+ | 产品类型(`100003720000056342`) | `契约锁` | 待开票合同数据;该下拉的默认选项仍是「契约锁」 |
32
30
  | 开票日期(`100003720000056255`) | 当天日期 | — |
33
31
  | 开票备注(`100003720000118915`) | 合同号 | `group.contractNo` |
34
32
  | 本次开票总金额、开票金额(本次开具发票金额) | **不传**:由表单按明细「金额(含税)」汇总(实测填 5900 后两者都联动为 5900.00) | 联动 |
@@ -41,6 +39,30 @@ AI 开票组装 `workflow.createRequest` 的 `data` 时读取本文件(流程
41
39
  | 发票类型 × 购方税号 | **购方没有税号只能开普票,不能开专票**。分组 `specialInvoiceWithoutTaxNo=true` 时不发起流程,让用户先在台账改为普票(见 [invoice-issuing-workflow.md](invoice-issuing-workflow.md) Step 2)。不要在 `data` 里改发票类型:联动值优先,会被覆盖 | `group.purchaserTaxNo`、`group.invoiceTypes` |
42
40
  | 收件人、联系电话、合同客户、相关合同(文档) | **不传**:填了「相关合同审批流程」后由联动带出;用户另有指定时才覆盖 | 联动 |
43
41
 
42
+ ### 开票内容推断
43
+
44
+ **只在创建 `契约锁合同收款发票开具及快递申请(100003460000001852)` 时加载本节。** 其他流程没有独立的「开票内容」字段,整节忽略:不推断、不写入 `data`、确认卡片不写这一行、创建后也不提醒用户去选。
45
+
46
+ 该流程主表只有一个「开票内容」。选项名以 `createForm` 返回的该字段 `options[].name` 为准,不要用记忆里的选项清单。
47
+
48
+ 货物名称按明细行取:优先 `items[].invoiceItemName`(开票名称),为空再用 `items[].goodsName`(商品名称)。这与 `group.goodsNames` 相同。
49
+
50
+ 每个货物名称只保留一个最符合的选项,命中即停:
51
+
52
+ 1. 与某个选项名完全相同。
53
+ 2. 否则,选项名是货物名称的子串时,取最长的选项名。货物名称「契约锁电子签章系统软件」同时包含「电子签章」和「契约锁电子签章系统软件」时,取后者。
54
+ 3. 否则,货物名称是选项名的子串时,取最短的选项名。货物名称「技术服务」只落在「技术服务费」里时,取「技术服务费」。
55
+ 4. 都没有:这个货物名称无匹配。
56
+
57
+ 整组怎么填:
58
+
59
+ - 有匹配的货物名称都指向同一个选项:创建时把该选项名写入「开票内容」。
60
+ - 指向不同选项:确认卡片里逐条列出「货物名称 → 选项」,请用户选一个。没选定之前不建草稿,不要自己挑一个。
61
+ - 全部无匹配:不传。创建后提醒「开票内容:明细货物名称没有对应的下拉选项,请在 E10 里选择」。
62
+ - 用户本轮给了开票内容:与某个选项名完全相同就用用户的;对不上时在确认卡片里列出原话和推断结果,请用户指定一个选项名。
63
+
64
+ 创建后不要再用 `editPrepare` 改这个字段,编辑链会报错。Step 6 仍要核对明细是否带出;「货物名称」或「总开票金额」没带出时,按流程文档警告用户在 E10 核对明细,不要为了补明细重发 `createRequest`。
65
+
44
66
  ### 开户行名称与账号
45
67
 
46
68
  是两个字段,**不能混填**:开户行名称只放银行名称(如 `招商银行福田支行`),开户行银行帐号只放账号(如 `8135 8668 8310 001`)。
@@ -63,7 +85,7 @@ AI 开票组装 `workflow.createRequest` 的 `data` 时读取本文件(流程
63
85
 
64
86
  | 字段 | 用户没说时的默认值 | 来源 |
65
87
  | --- | --- | --- |
66
- | 金额(含税)(`100003720000118901`),即本行**本次开票金额** | **按总金额开**:取该台账行的开票金额原值(台账开票金额本身就是含税金额,不再加税) | `items[].amount` |
88
+ | 金额(含税)(`100003720000118901`),即本行**本次开票金额** | **按总金额开**:等于**这一明细行自己的**「总开票金额」。台账上就是该行 `items[].amount`(含税,不再加税)。多行时一行一个值,按「明细行id」对应,不要把一行的金额写到另一行 | 该行「总开票金额」;创建前用 `items[].amount` |
67
89
  | 数量(`100003720000118911`) | **不传**;创建后请用户在 E10 里改成台账原值(用户指定了本次金额时也用台账数量) | `items[].quantity` |
68
90
  | 总开票金额、已开票金额、未开票金额 | **不传**:发起节点上是只读字段,传了会被 `createRequest` 以 `notEditable` 拒绝;由联动带出 | 联动 |
69
91
  | 货物名称、购买方名称、明细合同号、明细行id、单价、规格类型、单位、税率、税收分类编码 | **不传**,由联动从台账带出 | 联动 |
@@ -89,12 +111,16 @@ AI 开票组装 `workflow.createRequest` 的 `data` 时读取本文件(流程
89
111
 
90
112
  **请用户在 E10 里手工改**:Agent 不经编辑链改这两项。
91
113
 
92
- - 「开票内容」:编辑时会触发它自己的联动,`editPrepare` 实测报错。
93
- - 明细字段:经 `editPrepare` 改明细,保存后会多出一行,而不是改原行(实测)。
114
+ - 「开票内容」:创建时已经按推断写入。编辑会触发它自己的联动,`editPrepare` 报错,不要再改。只有「全部无匹配」没写入时才提醒用户选。
115
+ - 明细「本次开票金额」:用户没指定金额时,必须等于**同一明细行**的「总开票金额」。`editLoad` 后某一行为空,或不等于该行「总开票金额」,就只改这一列,补成该行「总开票金额」。
116
+ - `editPrepare` 报 `Cannot read properties of undefined (reading 'form_id')` 时,不要改 workflow 模块。编辑上下文没有 `layout.form_id`:在本机这条 `editLoad` continuation 载荷里补上 `layout.form_id`(用该载荷已有的 `form_id`),再重发 `editPrepare`。
117
+ - `editPrepare` 会给明细生成新的 `rowId`,直接保存会多出一行。保存前把「本次开票金额」这条明细的 `rowId` 改回该 `dataIndex` 在 `editLoad` 里的原 `rowId`,再 `editApply`。
118
+ - 用户已经要求按各行总开票金额赋值时,`editApply` 传 `confirm: true`。
119
+ - 其他明细列:不要经 `editPrepare` 改,保存后会多出一行,而不是改原行。
94
120
 
95
121
  | 字段 | 回复里怎么提醒 |
96
122
  | --- | --- |
97
- | 开票内容 | `开票内容:请在 E10 里选择「{建议选项}」`;没有建议选项时写 `开票内容:请在 E10 里选择` |
123
+ | 开票内容 | 仅契约锁开票流程。已写入时不提。没写入时写 `开票内容:明细货物名称没有对应的下拉选项,请在 E10 里选择`。其他流程不提 |
98
124
  | 明细「数量」 | 按草稿每行的「明细行id」(`1318645704062197885`)找到 `items[]` 里同一 `formDataId` 的台账行:`明细第 {N} 行数量:联动带出的是 {草稿值},请在 E10 改成 {items[].quantity}`;台账数量为空时写 `请按实际数量改正`;草稿值已经等于台账值时不提 |
99
125
 
100
126
  - 明细行按「明细行id」对应台账行,**不按行序猜**:联动带出的行序不一定等于 `group.formDataIds` 的顺序。
@@ -137,10 +163,11 @@ AI 开票组装 `workflow.createRequest` 的 `data` 时读取本文件(流程
137
163
 
138
164
  ## 确认卡片里要体现
139
165
 
140
- 确认卡片(见 [invoice-issuing-workflow.md](invoice-issuing-workflow.md) Step 3)在明细表后追加三行:
166
+ 确认卡片(见 [invoice-issuing-workflow.md](invoice-issuing-workflow.md) Step 3)在购方行下写销售方和所选开票流程,在明细表后追加这些行:
141
167
 
142
168
  - `本次开票金额:{合计}({默认按总金额开 / 按你指定的金额})`
143
169
  - `开票事由:{按上面公式生成的文本}`
170
+ - `开票内容:{选项名}(按货物名称「{名称}」匹配)`。**只有** `契约锁合同收款发票开具及快递申请` 才写这一行;多个货物名称对上不同选项时改为列出对应关系并请用户选;全部无匹配时写 `开票内容:没有能对应的下拉选项,先留空`。其他流程整行省略
144
171
  - `预计收款时间:{用户已给的日期}`;用户还没给时写 `预计收款时间:(必填)请选择:本月底 {日期} / 下月底 {日期} / 30 天后 {日期},或直接给一个日期`
145
172
 
146
173
  `group.specifications` 非空时再追加一行:
@@ -1,14 +1,14 @@
1
- # AI 开票:契约锁台账 → 开票流程草稿(主链路)
1
+ # AI 开票:获取待开票合同数据 → 开票流程草稿(主链路)
2
2
 
3
3
  ## 什么时候读取
4
4
 
5
5
  用户说"开票""开一下合同 XX 的票""把 XX 公司那份合同开票""按台账开票""发起开票流程"等开票意图时,**默认读取本文件**。
6
6
 
7
- **本文件是唯一开票链路(0.1.27 起)**:CLI 已移除 `invoice.issuing.make.prepare/apply`、`invoice.issuing.qys.prepare`、`invoice.issuing.result`,不再存在"直接开票""存待开台账"的接口。用户说"直接开票""不走流程""先存台账"时,一律按本链路发起开票流程草稿,并说明开票必须经「契约锁合同收款发票开具及快递申请」流程审批后由流程侧完成;数据不在契约锁台账时,提示用户先在台账录入商品信息。
7
+ **本文件是唯一开票链路(0.1.27 起)**:CLI 已移除 `invoice.issuing.make.prepare/apply`、`invoice.issuing.qys.prepare`、`invoice.issuing.result`,不再存在"直接开票""存待开台账"的接口。用户说"直接开票""不走流程""先存台账"时,一律按本链路发起开票流程草稿,并说明开票必须经所选开票流程审批后由流程侧完成;数据不在待开票合同数据里时,提示用户先录入合同商品信息。
8
8
 
9
9
  ## 链路概览
10
10
 
11
- 本链路**不直接开票**:Agent 只负责从契约锁合同商品台账找到要开票的合同,在 E10 按合同号发起「开票申请」流程并**存为草稿**;用户在 E10 核对后自己提交,审批通过后由流程侧完成开票。
11
+ 本链路**不直接开票**:Agent 先获取待开票合同数据(含契约锁、泛微及其他合同),在 E10 按合同号发起「开票申请」流程并**存为草稿**;用户在 E10 核对后自己提交,审批通过后由流程侧完成开票。
12
12
 
13
13
  | 步 | 命令 | 所属技能 | 风险 |
14
14
  | --- | --- | --- | --- |
@@ -19,30 +19,47 @@
19
19
 
20
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
21
 
22
- ## 开票流程常量
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。
23
43
 
24
44
  | 常量 | 值 |
25
45
  | --- | --- |
26
- | 开票流程 | `契约锁合同收款发票开具及快递申请(100003460000001852)` |
27
- | 关联字段 | 主表「合同号」(文本,字段 id `100003720000056343`);以 `createForm` 返回的 `fields` 按中文名「合同号」定位为准 |
46
+ | 关联字段 | 主表「合同号」;契约锁流程上的字段 id 是 `100003720000056343`,以 `createForm` 返回的 `fields` 按中文名「合同号」定位为准 |
28
47
  | 流程标题 `requestName` | `开票申请-{购方名称}-{合同号}` |
29
48
  | `action` | 固定 `draft` |
30
49
 
31
- `workflow.createForm` 一律传上表的 `名称(ID)`。**不要按宽词 `开票` 检索**:实测会唯一命中「合同开票冲红流程」(红冲流程,只有「业务红冲原因」「相关开票流程」两个字段)并直接载入表单;「合同开票申请」「发票开具」等同名候选也不是本链路的流程。
32
-
33
- 载入后必须核对,**两条都满足才往下填**,否则停止并请用户确认开票流程:
50
+ 载入后必须核对,**两条都满足才往下填**,否则停止并请用户确认流程:
34
51
 
35
- - `workflow.id` 等于上表 ID,或名称含「开票」且**不含**「冲红」「红冲」「作废」「退票」;
36
- - `fields` 里能按中文名找到主表「合同号」字段。
52
+ - `workflow.id` 等于上面选中的那条流程 ID;
53
+ - 开票流程的 `fields` 里能按中文名找到主表「合同号」。冲红流程改为能按中文名找到红冲原因或相关开票流程。
37
54
 
38
55
  ## 对话流程
39
56
 
40
- ### Step 1:找台账(`invoice.issuing.qys.list`)
57
+ ### Step 1:获取待开票合同数据(`invoice.issuing.qys.list`)
41
58
 
42
- - 用户给了合同号 → 传 `contractNo`;给了公司名、合同名或商品名 → 传 `keyword`。
59
+ - 用户给了合同号 → 传 `contractNo`;给了公司名、合同名或商品名 → 传 `keyword`。这一步叫「获取待开票合同数据」,数据里有契约锁、泛微和其他合同的待开票行。命令 id 仍是 `invoice.issuing.qys.list`,返回的 `items` / `groups` 结构不变。
43
60
  - 用户什么线索都没给(只说"帮我开票")→ **只问一句**:"要给哪个合同开票?请提供合同号或客户名称。"不要追问购方、金额、税率——这些都由台账和流程联动带出。
44
61
  - 不要传 `limit` 去翻全量;分组看 `groups`,逐行明细才看 `items`。
45
- - 台账查询返回 `api/business_error`「系统错误」(code 500)时,多半是当前登录租户里没有契约锁合同商品台账页面:如实告知并请用户确认登录的 E10 租户,不要重试、不要换关键词再查。
62
+ - 获取待开票合同数据返回 `api/business_error`「系统错误」(code 500)时,多半是当前登录租户里没有这份待开票合同数据:如实告知并请用户确认登录的 E10 租户,不要重试、不要换关键词再查。
46
63
 
47
64
  ### Step 2:按分组展示(`data.groups`)
48
65
 
@@ -52,7 +69,7 @@
52
69
  | --- | --- |
53
70
  | 0 | 用 `includeIssued=true` 再查**一次**,按组展示 `blockedRows` 与对应 `items[].blockers`(已开票 / 已关联开票流程 / 开票中 / 已废弃),说明这份合同当前没有可开票的行,**结束**。 |
54
71
  | 1 | 直接进 Step 3 确认卡片。 |
55
- | 多条 | 列出分组让用户选(合同号、合同审批流程、购方、行数、商品、开票金额合计),**不要替用户选**;一次只处理一组。 |
72
+ | 多条 | 列出分组让用户选(合同号、合同审批流程、购方、销售方、行数、商品、开票金额合计),**不要替用户选**;一次只处理一组。 |
56
73
 
57
74
  `scanComplete=false` 时提醒用户:台账超过扫描上限,结果可能不全。
58
75
 
@@ -70,6 +87,8 @@
70
87
 
71
88
  合同号:20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)
72
89
  购方:南昌我爱我家科技有限公司 税号:91360125083909438T
90
+ 销售方:上海亘岩网络科技有限公司
91
+ 开票流程:契约锁合同收款发票开具及快递申请
73
92
  发票类型:全电专票
74
93
  | 序号 | 商品 | 税率 | 开票金额(含税) |
75
94
  | 1 | 技术服务费 | 6.0% | 20000 |
@@ -77,32 +96,36 @@
77
96
 
78
97
  本次开票金额:20000(默认按总金额开)
79
98
  开票事由:合同20266105541(南昌我爱我家科技有限公司开放平台续购20000元10000份)技术服务费全额开票,金额20000元
99
+ 开票内容:技术服务费(按货物名称「技术服务费」匹配)
80
100
  预计收款时间:(必填)请选择:本月底 2026-10-31 / 下月底 2026-11-30 / 30 天后 2026-11-22,或直接给一个日期
81
101
  请回复预计收款时间并确认发起。
82
102
  ```
83
103
 
84
104
  - `group.purchaserBankName` 或 `group.purchaserBankAccount` 非空时,在「购方」行下加一行 `开户行:{purchaserBankName} 账号:{purchaserBankAccount}`,两个值分开写,不要用台账原始的混写串。
105
+ - 「销售方」「开票流程」两行按「选哪个开票流程」填写。核算公司为空、不在名单里,或有多个不同名称时,先按该节问用户,选定前不展示这条确认卡片、不建草稿。
85
106
  - 明细表的行取该组 `formDataIds` 对应的 `items[]`:商品取「开票名称」,为空取「商品名称」;金额取 `amount` 原值,不改写。
107
+ - 模板里的「开票内容」行只属于 `契约锁合同收款发票开具及快递申请`。其他流程没有这个字段,确认卡片不写这一行,也不推断、不问。
86
108
  - 「开票事由」按填单规则自动生成并展示在卡片里,不问用户;「预计收款时间」由用户决定,卡片里附上按当天日期算好的本月底、下月底、30 天后三个候选日期。**用户没给出日期就不建草稿**:只回"确认 / 继续"时再问一句,拿到日期再往下走;不要自己定默认日期,也不要留空先建(详见填单规则「预计收款时间」)。用户开票时已说了收款时间,卡片里直接展示换算后的日期,末行改为"确认发起吗?"。
87
109
  - `warnings` 非空时在卡片末尾逐条列出。命中"同合同另有 N 行已开票…"时追加一句:"流程按合同号联动,可能一并带出这些行,请在 E10 草稿里核对明细。"
88
110
  - 用户要改购方、金额、税率或商品 → 告知需先在台账修改,再重新从 Step 1 开始;**不要在流程里手工覆盖这些值**。
89
111
 
90
112
  ### Step 4:载入开票流程表单(`workflow.createForm`)
91
113
 
92
- - `workflow` 传「开票流程常量」里的 `名称(ID)`;**不传 `userQuestion`**,也不用 `workflow.createRequestDirect`。
93
- - 载入后按「开票流程常量」里的两条核对规则检查 `workflow.name` 与「合同号」字段;不满足就停止,不往下填,也不要换别的流程凑。
114
+ - `workflow` 传「选哪个开票流程」里选中的 `名称(ID)`;**不传 `userQuestion`**,也不用 `workflow.createRequestDirect`。
115
+ - 载入后按「选哪个开票流程」里的两条核对规则检查 `workflow.id` 与「合同号」字段(冲红流程改查红冲原因或相关开票流程);不满足就停止,不往下填,也不要换别的流程凑。
94
116
  - `createForm` 返回 OA 业务错误(如表单布局接口报错)时如实转述并停止,不重试、不换流程。
95
117
 
96
118
  ### Step 5:组装 `data` 并存草稿(`workflow.createRequest`)
97
119
 
98
- `data` 按 [invoice-issuing-form-fill-rules.md](invoice-issuing-form-fill-rules.md) 组装,一句话概括:**用户说了就按用户的,没说就按默认值**。创建时的默认值包括:合同号、相关合同审批流程、产品类型「契约锁」、开票日期取当天、开票备注填合同号、所售产品版本号取明细规格类型(须与下拉选项完全一致)、开票事由按公式自动生成;预计收款时间填用户在卡片环节给的日期(必须有,没有就回到 Step 3 问)。明细每行**只传**「金额(含税)」(按总金额开);货物名称、购买方名称、明细合同号、明细行id、单价、规格类型、单位、税率、总开票金额、已开票金额、未开票金额都由合同号联动带出,**传了反而会让总开票金额等三列带不出来**。
120
+ `data` 按 [invoice-issuing-form-fill-rules.md](invoice-issuing-form-fill-rules.md) 组装,一句话概括:**用户说了就按用户的,没说就按默认值**。创建时的默认值包括:合同号、相关合同审批流程、产品类型「契约锁」、开票日期取当天、开票备注填合同号、所售产品版本号取明细规格类型(须与下拉选项完全一致)、开票事由按公式自动生成;预计收款时间填用户在卡片环节给的日期(必须有,没有就回到 Step 3 问)。「开票内容」只在 `契约锁合同收款发票开具及快递申请(100003460000001852)` 上按明细货物名称推断并填写,其他流程忽略。明细每行**只传**「本次开票金额」(契约锁流程上的中文名是「金额(含税)」)。用户没指定金额时,默认等于**该明细行自己的**「总开票金额」(台账该行开票金额)。有多行就按「明细行id」各传各的,不要只传一行、也不要把一行的金额写到另一行。货物名称、购买方名称、明细合同号、明细行id、单价、规格类型、单位、税率、总开票金额、已开票金额、未开票金额都由合同号联动带出,**传了反而会让总开票金额等三列带不出来**。
99
121
 
100
- 主表「开票内容」、明细「数量」、主表「开户行名称」「开户行银行帐号」创建时**不传**,原因各不相同:
101
- - 「开票内容」自己的联动会把合同号带出的明细整行冲掉。
122
+ 明细「数量」、主表「开户行名称」「开户行银行帐号」创建时**不传**:
102
123
  - 联动会把数量写成税率选项 id。
103
124
  - 联动会把开户行写成名称账号混写串。
104
125
 
105
- 开户行两个字段在 Step 6 第 5 条经编辑链补正;开票内容、数量在 Step 6 第 6 条提醒用户在 E10 里改。其余购方信息不传;金额(不含税)、税额不传、不计算。
126
+ 「开票内容」只在 `契约锁合同收款发票开具及快递申请` 创建时传入,取值见填单规则「开票内容推断」。多个货物名称对上不同选项时,先在确认卡片里问用户,选定前不建草稿。其他流程不传这个字段。
127
+
128
+ 开户行两个字段在 Step 6 第 5 条经编辑链补正。契约锁流程上的开票内容不要再经编辑链改(`editPrepare` 会报错)。只有这条流程没推断出来时,才在 Step 6 第 6 条提醒用户在 E10 里选。数量仍在第 6 条提醒。其余购方信息不传;金额(不含税)、税额不传、不计算。
106
129
 
107
130
  - `requestName` **必传**:`开票申请-{购方名称}-{合同号}`,不留用表单默认标题。
108
131
  - `action` 固定 `"draft"`:用户说"直接提交"也只建草稿,并告诉用户去 E10 核对后提交。
@@ -117,7 +140,9 @@
117
140
  - 含「总开票金额=」和「货物名称=」(明细整行已从台账带出);
118
141
  - 「本次开票总金额」等于本次填入各行「金额(含税)」之和;按默认值开时,它等于 `group.totalAmount`。数值比较时 `5900.00` 与 `5900` 视为相等。
119
142
 
120
- 三项都满足时**不额外说明**。任一不满足时,在 `finalMarkdown` 之后**只追加一行**:`⚠️ 流程汇总的本次开票总金额为 X,与本次填写的开票金额 Y 不一致(或未带出合同明细),请在 E10 核对后再提交。`
143
+ 另外用 `editLoad` 的 `currentValues` 核对每一明细行:「本次开票金额」为空,或不等于该行「总开票金额」时,按填单规则「创建后补正」补成该行「总开票金额」,只改这一列。补完后「本次开票总金额」应等于各行「本次开票金额」之和。
144
+
145
+ 三项都满足、且每行「本次开票金额」已经等于该行「总开票金额」时**不额外说明**。补完仍不一致时,在 `finalMarkdown` 之后**只追加一行**:`⚠️ 流程汇总的本次开票总金额为 X,与本次填写的开票金额 Y 不一致(或未带出合同明细),请在 E10 核对后再提交。`
121
146
  3. `missingFields` 非空时原样转述(提交前需补齐);`finalMarkdown` 末尾已有这段提示时不要重复。
122
147
  4. `BROWSER_FILL`(小e 环境)只输出那段 `<browsertool>` 标签块,不做第 2 步核对。
123
148
  5. **补正开户行名称与账号**(`CREATED` 后都要做,取值规则见填单规则「创建后补正」):
@@ -126,15 +151,14 @@
126
151
  - 有要补的:`workflow.editPrepare` **只传主表这两个字段**,不传任何明细、不传开票内容。然后向用户列出补正项,并问「要把开户行名称和账号分开补进草稿吗?」,用户确认后 `workflow.editApply`。
127
152
  - 「开户行及帐号」格式无法拆分时不补这两项,告诉用户原值,请其在 E10 里手工拆填。
128
153
  - `editPrepare` / `editApply` 报错时原样转述,不重试;草稿本身已建好,不受影响。
129
- 6. **提醒用户在 E10 里改的项**:在本轮回复末尾加一段「提交前请在 E10 里改」,按填单规则「创建后补正」的提醒写法列出开票内容和需要改正的明细数量,如:
154
+ 6. **提醒用户在 E10 里改的项**:在本轮回复末尾加一段「提交前请在 E10 里改」。只有 `契约锁合同收款发票开具及快递申请` 才处理开票内容:已经写入时不提;没推断出来才写「开票内容:明细货物名称没有对应的下拉选项,请在 E10 里选择」。其他流程不要提开票内容。数量按填单规则提醒,如:
130
155
 
131
156
  ```text
132
157
  提交前请在 E10 里改:
133
- - 开票内容:请在 E10 里选择「技术服务费」
134
158
  - 明细第 1 行数量:联动带出的是 1201835186337538063,请在 E10 改成 1
135
159
  ```
136
160
 
137
- 不要为了这两项调用 `editPrepare`。
161
+ 没有要改的项就不要加这段。不要为了开票内容或数量调用 `editPrepare`。
138
162
 
139
163
  ### Step 7:之后的操作
140
164
 
@@ -144,6 +168,8 @@
144
168
 
145
169
  ## 命令
146
170
 
171
+ 下面这条是核算公司为「上海亘岩网络科技有限公司」时的开票草稿。核算公司是泛微网络、泛微软件、上海田亩、成都泛微、泛微国际、北京泛微、浙江泛微之一时,把 `workflow.createForm` 的流程换成 `合同收款发票开具及快递申请(100003460000000214)`,`data` 里的字段 id 改成该流程 `createForm` 返回的同中文名 id。
172
+
147
173
  macOS/Linux(bash/zsh):
148
174
 
149
175
  ```bash
@@ -159,6 +185,7 @@ cat > ./issuing-request.json <<'JSON'
159
185
  "100003720000056343": "20266105586",
160
186
  "100003720000056262": "深圳市康哲药业有限公司2026年度维护(1327967410806063252)",
161
187
  "100003720000056342": "契约锁",
188
+ "100003720000056243": "年度维护费",
162
189
  "100003720000056255": "2026-10-23",
163
190
  "100003720000056250": "2026-11-30",
164
191
  "100003720000118915": "20266105586",
@@ -188,6 +215,7 @@ Set-Content -Encoding utf8 -LiteralPath .\issuing-request.json -Value @'
188
215
  "100003720000056343": "20266105586",
189
216
  "100003720000056262": "深圳市康哲药业有限公司2026年度维护(1327967410806063252)",
190
217
  "100003720000056342": "契约锁",
218
+ "100003720000056243": "年度维护费",
191
219
  "100003720000056255": "2026-10-23",
192
220
  "100003720000056250": "2026-11-30",
193
221
  "100003720000118915": "20266105586",
@@ -205,6 +233,6 @@ weaver-work-cli --json workflow run workflow.createRequest --input .\issuing-req
205
233
  ## 注意
206
234
 
207
235
  - 台账里的合同号、购方、税号、金额、税率按原值使用,**不改写、不补位、不格式化**。
208
- - 本链路不读取、不上传任何附件或图片;用户另外提供文件要求"按文件开票"时,说明当前只支持按契约锁台账发起开票流程,需先把数据录入台账。
236
+ - 本链路不读取、不上传任何附件或图片;用户另外提供文件要求"按文件开票"时,说明当前只支持按待开票合同数据发起开票流程,需先把数据录入后再获取。
209
237
  - 一次只发起一组(一张流程);用户要求多份合同一起开时,逐组走 Step 3~6,每组各调一次 `createForm`,`continuation` 不跨组复用。
210
238
  - 写请求已发出但结果不确定时按 SKILL.md「写操作失败处理」处理,**禁止重放 `createRequest`**。
@@ -500,7 +500,7 @@
500
500
  },
501
501
  {
502
502
  "id": "invoice.issuing.qys",
503
- "sourcePath": "user-provided: 契约锁合同商品信息 /api/ebuilder/form/eblist/getData 字段表与返回样例",
503
+ "sourcePath": "user-provided: 待开票合同数据(含契约锁、泛微及其他合同)字段表与返回样例",
504
504
  "anchor": "source:qys-ledger",
505
505
  "status": "converted",
506
506
  "mapsToOperations": [
@@ -1727,7 +1727,7 @@
1727
1727
  {
1728
1728
  "sourcePath": "weaver-interface/backend/business-apis/inc/weaver-e10-yepiaotong/scripts/parse_document.py",
1729
1729
  "status": "withheld",
1730
- "reason": "附件字段提取原用于口述字段直接开票;直接开票接口已于 0.1.27 移除,开票字段一律以契约锁台账为准。"
1730
+ "reason": "附件字段提取原用于口述字段直接开票;直接开票接口已于 0.1.27 移除,开票字段一律以待开票合同数据为准。"
1731
1731
  },
1732
1732
  {
1733
1733
  "sourcePath": "weaver-interface/backend/business-apis/inc/weaver-e10-yepiaotong/SKILL.md",