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.
- package/dist/chunks/archive-UMGX72K6.js +2537 -0
- package/dist/chunks/archive-oa-N2IYBLF3.js +1317 -0
- package/dist/chunks/asset-GLEGKFG5.js +2109 -0
- package/dist/chunks/attachment-content-AQNX5N3S.js +23 -0
- package/dist/chunks/blog-E44OTVDA.js +2157 -0
- package/dist/chunks/caizhilian-DQUFZXZL.js +10087 -0
- package/dist/chunks/calendar-JKPIRKFD.js +1195 -0
- package/dist/chunks/chunk-2GA5ZIQL.js +1615 -0
- package/dist/chunks/chunk-4YC43QQ4.js +403 -0
- package/dist/chunks/chunk-6EFWDL7Y.js +161 -0
- package/dist/chunks/chunk-6RKD4DRZ.js +5556 -0
- package/dist/chunks/chunk-AJ62BGAW.js +29 -0
- package/dist/chunks/chunk-BUSC6UAE.js +43 -0
- package/dist/chunks/chunk-C6R3B2ML.js +358 -0
- package/dist/chunks/chunk-CVZ2JOSW.js +62 -0
- package/dist/chunks/chunk-DW6AUUKS.js +508 -0
- package/dist/chunks/chunk-E4Z23GHM.js +6962 -0
- package/dist/chunks/chunk-EG6ZU444.js +654 -0
- package/dist/chunks/chunk-EZALDOQH.js +383 -0
- package/dist/chunks/chunk-FMPJJYYI.js +106 -0
- package/dist/chunks/chunk-G2JSIUWF.js +769 -0
- package/dist/chunks/chunk-G3QJULO2.js +387 -0
- package/dist/chunks/chunk-GCG2NMWR.js +703 -0
- package/dist/chunks/chunk-GPMFD4RD.js +75 -0
- package/dist/chunks/chunk-H6XSTSLM.js +2357 -0
- package/dist/chunks/chunk-H7J4DC5R.js +464 -0
- package/dist/chunks/chunk-IURUFGZK.js +477 -0
- package/dist/chunks/chunk-LUSPKZKY.js +53 -0
- package/dist/chunks/chunk-NIAJ5ZCG.js +73 -0
- package/dist/chunks/chunk-NOODWMCL.js +584 -0
- package/dist/chunks/chunk-OOUTBLZ4.js +51 -0
- package/dist/chunks/chunk-P26ZWSKU.js +73 -0
- package/dist/chunks/chunk-QWY6PGL6.js +3472 -0
- package/dist/chunks/chunk-WKI2FBIQ.js +15606 -0
- package/dist/chunks/chunk-WSKBSQ2U.js +231 -0
- package/dist/chunks/chunk-YLCYX7LE.js +371 -0
- package/dist/chunks/chunk-YRVDW4WN.js +205 -0
- package/dist/chunks/chunk-ZEDWSH32.js +68 -0
- package/dist/chunks/continuation-2CKSBLA6.js +11 -0
- package/dist/chunks/continuation-HZIZRZBX.js +13 -0
- package/dist/chunks/continuation-NLECEJPX.js +11 -0
- package/dist/chunks/ebuilder-form-V5FG2EHC.js +2276 -0
- package/dist/chunks/ehr-HMFY6VIL.js +5241 -0
- package/dist/chunks/employee-SAK2QYXX.js +11 -0
- package/dist/chunks/esb-ZYSVB7SG.js +141 -0
- package/dist/chunks/fna-B7RKPAZD.js +1444 -0
- package/dist/chunks/host-45WED2KK.js +21 -0
- package/dist/chunks/host-I4Z6BFYX.js +23 -0
- package/dist/chunks/host-KNZ52LJZ.js +17 -0
- package/dist/chunks/host-OCH2BCCV.js +19 -0
- package/dist/chunks/hrm-2KAZGUHI.js +244 -0
- package/dist/chunks/im-ACJJWH4U.js +252 -0
- package/dist/chunks/invoice-ZK3WCX2U.js +5179 -0
- package/dist/chunks/jiuchuanhui-5PQD3IL2.js +1940 -0
- package/dist/chunks/lazy-dispatch-JQXBW3GM.js +28 -0
- package/dist/chunks/mail-S2HDDXO2.js +2695 -0
- package/dist/chunks/meeting-QVN3I37L.js +504 -0
- package/dist/chunks/msg-parse-4GSQ2WTO.js +41 -0
- package/dist/chunks/okr-QNG4VC2Q.js +2482 -0
- package/dist/chunks/plan-A25EMW6U.js +2025 -0
- package/dist/chunks/project-G6XV66DZ.js +1361 -0
- package/dist/chunks/registry-2VLUAESA.js +14 -0
- package/dist/chunks/registry-7C5UMIPL.js +19 -0
- package/dist/chunks/registry-DC6KR3NH.js +18 -0
- package/dist/chunks/registry-NYPYMZXG.js +16 -0
- package/dist/chunks/registry-TI3CIUXF.js +19 -0
- package/dist/chunks/room-recommend-WRTHO6Y2.js +20 -0
- package/dist/chunks/schedule-KFIITGSK.js +24 -0
- package/dist/chunks/state-Y2XBP6YE.js +15 -0
- package/dist/chunks/workflow-DJ7SYWAF.js +245 -0
- package/dist/cmd/argv.js +45 -0
- package/dist/cmd/docs/index.js +3 -3
- package/dist/cmd/lazy-dispatch.js +20 -0
- package/dist/cmd/root.js +2 -4
- package/dist/cmd/setup/index.js +2 -2
- package/dist/cmd/skills/index.js +2 -2
- package/dist/core/package-paths.js +61 -0
- package/dist/index.js +163 -7
- package/dist/internal/e10/auth/xiaoe.js +3 -3
- package/dist/internal/e10/request-runtime.js +18 -62
- package/dist/internal/skills/detector.js +2 -2
- package/dist/shortcuts/contract/data/performance-catalog.js +1306 -0
- package/dist/shortcuts/contract/host.js +91 -35
- package/dist/shortcuts/contract/index.js +213 -0
- package/dist/shortcuts/contract/manifest.js +928 -0
- package/dist/shortcuts/contract/ooxml/docx.js +295 -0
- package/dist/shortcuts/contract/ooxml/xlsx.js +221 -0
- package/dist/shortcuts/contract/ooxml/zip.js +158 -0
- package/dist/shortcuts/contract/operations/assistant.js +1156 -0
- package/dist/shortcuts/contract/operations/clause-library.js +522 -0
- package/dist/shortcuts/contract/operations/compare.js +193 -0
- package/dist/shortcuts/contract/operations/credit-page.js +34 -0
- package/dist/shortcuts/contract/operations/flow.js +98 -0
- package/dist/shortcuts/contract/operations/page.js +66 -0
- package/dist/shortcuts/contract/operations/performance.js +733 -0
- package/dist/shortcuts/contract/operations/quote.js +557 -0
- package/dist/shortcuts/contract/operations/recommend.js +78 -0
- package/dist/shortcuts/contract/operations/registry.js +18 -0
- package/dist/shortcuts/contract/operations/review.js +83 -0
- package/dist/shortcuts/contract/operations/shared.js +37 -0
- package/dist/shortcuts/contract/operations/upload.js +108 -0
- package/dist/shortcuts/contract/operations/write.js +3 -2
- package/dist/shortcuts/index.js +140 -40
- package/dist/shortcuts/invoice/manifest.js +34 -11
- package/dist/shortcuts/invoice/operations/reim-auto.js +9 -0
- package/dist/shortcuts/invoice/operations/reim.js +81 -5
- package/dist/shortcuts/invoice/operations/shared.js +12 -5
- package/dist/shortcuts/meeting/host.js +45 -3
- package/dist/shortcuts/meeting/invitation/docx.js +442 -0
- package/dist/shortcuts/meeting/operations/attachment-content.js +418 -0
- package/dist/shortcuts/meeting/operations/attachment.js +442 -0
- package/dist/shortcuts/meeting/operations/eb/cache.js +57 -0
- package/dist/shortcuts/meeting/operations/eb/catalog.js +343 -28
- package/dist/shortcuts/meeting/operations/eb/conflict.js +372 -11
- package/dist/shortcuts/meeting/operations/eb/create-flow.js +710 -0
- package/dist/shortcuts/meeting/operations/eb/decision.js +47 -1
- package/dist/shortcuts/meeting/operations/eb/factory.js +129 -11
- package/dist/shortcuts/meeting/operations/eb/index.js +122 -2
- package/dist/shortcuts/meeting/operations/eb/room-recommend.js +378 -0
- package/dist/shortcuts/meeting/operations/eb/room-summary.js +84 -0
- package/dist/shortcuts/meeting/operations/eb/schedule.js +450 -0
- package/dist/shortcuts/meeting/operations/from-group-chat.js +576 -0
- package/dist/shortcuts/meeting/operations/invitation.js +458 -0
- package/dist/shortcuts/meeting/operations/minute-content.js +266 -0
- package/dist/shortcuts/meeting/operations/pipeline.js +489 -0
- package/dist/shortcuts/meeting/operations/qrcode.js +131 -0
- package/dist/shortcuts/meeting/operations/receipts.js +1 -1
- package/dist/shortcuts/meeting/operations/registry.js +18 -0
- package/dist/shortcuts/meeting/operations/summary.js +276 -0
- package/dist/shortcuts/meeting/operations/task-notify.js +325 -0
- package/dist/shortcuts/meeting/operations.js +42 -1
- package/dist/shortcuts/meeting/qr/encoder.js +427 -0
- package/dist/shortcuts/meeting/qr/render.js +103 -0
- package/dist/shortcuts/workflow/operations/form.js +17 -5
- package/docs/contract.md +39 -4
- package/docs/invoice.md +5 -5
- package/package.json +3 -2
- package/scripts/bundle.mjs +63 -0
- package/skill-template/business-info.json +25 -4
- package/skill-template/domains/jinchengda.md +16 -3
- package/skill-template/domains/yepiaotong.md +1 -1
- package/skills/weaver-e10-jinchengda/SKILL.md +111 -31
- package/skills/weaver-e10-jinchengda/references/contract-agent-entry.md +7 -13
- package/skills/weaver-e10-jinchengda/references/contract-ai-assistant.md +150 -0
- package/skills/weaver-e10-jinchengda/references/contract-ai-review.md +87 -0
- package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +111 -0
- package/skills/weaver-e10-jinchengda/references/contract-clause-recommender.md +0 -15
- package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +0 -13
- package/skills/weaver-e10-jinchengda/references/contract-credit-page.md +50 -0
- package/skills/weaver-e10-jinchengda/references/contract-disabled-capabilities.md +4 -2
- package/skills/weaver-e10-jinchengda/references/contract-doc-compare.md +74 -0
- package/skills/weaver-e10-jinchengda/references/contract-flow-launch.md +84 -0
- package/skills/weaver-e10-jinchengda/references/contract-performance-query.md +29 -0
- package/skills/weaver-e10-jinchengda/references/contract-quote-to-contract.md +28 -0
- package/skills/weaver-e10-jinchengda/references/contract-request-status.md +2 -21
- package/skills/weaver-e10-jinchengda/references/contract-request-write.md +0 -24
- package/skills/weaver-e10-jinchengda/references/contract-signing-subjects.md +0 -15
- package/skills/weaver-e10-jinchengda/references/contract-subject-create.md +0 -17
- package/skills/weaver-e10-jinchengda/references/contract-template-recommend.md +70 -0
- package/skills/weaver-e10-jinchengda/references/contract-template-selector.md +0 -15
- package/skills/weaver-e10-jinchengda/references/contract-workflow-discovery.md +0 -15
- package/skills/weaver-e10-jinchengda/references/source-manifest.json +1168 -152
- package/skills/weaver-e10-meeting/SKILL.md +493 -17
- package/skills/weaver-e10-meeting/references/meeting-change.md +4 -4
- package/skills/weaver-e10-meeting/references/meeting-create.md +6 -6
- package/skills/weaver-e10-meeting/references/meeting-eb.md +503 -27
- package/skills/weaver-e10-meeting/references/meeting-invitation.md +113 -0
- package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +6 -6
- package/skills/weaver-e10-meeting/references/meeting-minute-file.md +425 -0
- package/skills/weaver-e10-meeting/references/meeting-queries.md +4 -4
- package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +15 -15
- package/skills/weaver-e10-meeting/references/meeting-verification.md +19 -11
- package/skills/weaver-e10-meeting.zip +0 -0
- package/skills/weaver-e10-yepiaotong/SKILL.md +9 -5
- package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +1 -1
- package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +6 -5
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +14 -11
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +97 -56
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +84 -60
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +142 -105
- package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +53 -194
- package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -7
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +164 -72
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +6 -0
- package/templates/meeting/invitation.docx +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# 发票与事前申请匹配规则
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文档定义发票与事前申请怎么关联。只比较两边的日期。一张发票在时间上只落在一条事前申请里就直接绑定;落在多条里,或日期缺失对不上,列给用户选。不用费用类型、金额、申请人或标题关键词决定绑哪一条。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## 核心时间关系
|
|
8
8
|
|
|
9
|
-
>
|
|
10
|
-
> 即:`事前申请.createTime ≤ 发票.invoiceDate
|
|
9
|
+
> **事前申请发起日期不晚于开票日期。**
|
|
10
|
+
> 即:`事前申请.createTime 的日期部分 ≤ 发票.invoiceDate`。**同一天算对上**,默认允许绑定。
|
|
11
11
|
|
|
12
12
|
这是匹配和预筛选的基础约束。
|
|
13
13
|
|
|
@@ -22,249 +22,108 @@
|
|
|
22
22
|
2. **预筛选**:利用发票日期缩小事前申请查询范围
|
|
23
23
|
- 提取发票数据中最早和最晚的 `invoiceDate`
|
|
24
24
|
- 事前申请日期必然 ≤ 开票日期,因此:
|
|
25
|
-
- `cusCreateDateEnd` = 最晚 invoiceDate
|
|
25
|
+
- `cusCreateDateEnd` = 最晚 invoiceDate(CLI 会再 + 1 天后发给接口;不按开票日收窄上界时不要传,交给东八区当天 + 1 天)
|
|
26
26
|
- `cusCreateDateStart` = 最早 invoiceDate 往前推 90 天
|
|
27
27
|
3. 调用 `invoice.reim.requests.list`(带日期筛选条件)获取候选列表
|
|
28
|
-
4.
|
|
28
|
+
4. 按下面的时间规则关联;不确定时先问用户,再往下填单
|
|
29
29
|
|
|
30
30
|
### 场景B:先有事前申请 → 筛选并匹配发票
|
|
31
31
|
|
|
32
32
|
1. 已获取事前申请列表(含 `requestname`, `createTime`, `creatorId` 等)
|
|
33
|
-
2.
|
|
33
|
+
2. **预筛选**:利用事前申请日期缩小发票查询范围(使用**消费日期** `consumption_tm_begin` / `consumption_tm_end`)
|
|
34
34
|
- 提取事前申请列表中最早的 `createTime`
|
|
35
|
-
-
|
|
36
|
-
- `
|
|
37
|
-
- `
|
|
38
|
-
3. 调用 `invoice.list
|
|
39
|
-
4.
|
|
35
|
+
- 消费日期必然 ≥ 事前申请日期,因此:
|
|
36
|
+
- `consumption_tm_begin` = 最早 createTime 对应的秒级时间戳(00:00:00)
|
|
37
|
+
- `consumption_tm_end` = 当前日期 23:59:59 的秒级时间戳
|
|
38
|
+
3. 调用 `invoice.list`(带消费日期筛选条件)获取候选列表
|
|
39
|
+
4. 按下面的时间规则关联;不确定时先问用户,再往下填单
|
|
40
40
|
|
|
41
41
|
### 场景C:并行获取
|
|
42
42
|
|
|
43
43
|
两者并行获取时不做预筛选,获取全量数据后在匹配阶段统一过滤。
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
三种场景使用同一套时间规则,只是取数和预筛选不同。
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|
|
49
|
-
##
|
|
49
|
+
## 关联规则(只看时间)
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
比较日期,不比较钟点。事前申请发起日取 `createTime` 的日期部分,发票日期取 `invoiceDate`。
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
> **同一天视为对上,默认允许绑定。** 事前申请发起日与开票日期是同一天时(例如事前申请 `2026-10-27 17:30` 发起,发票开票日期 `2026-10-27`),不要因为发票没有钟点、「无法判断先后」就不绑定或改成问用户。
|
|
54
54
|
|
|
55
|
+
一张发票算进某条事前申请,必须同时满足:
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
| expenseType 含"交通"/"市内交通" 或 sellerName 含"滴滴"/"曹操"/"高德" | requestname 含"交通"/"差旅" |
|
|
59
|
-
| expenseType 含"住宿" 或 sellerName 含"酒店"/"宾馆"/"民宿" | requestname 含"住宿"/"差旅" |
|
|
60
|
-
| expenseType 含"餐饮" 或 sellerName 含"餐饮"/"饭店"/"美团" | requestname 含"餐饮"/"招待"/"业务招待" |
|
|
61
|
-
| expenseType 含"办公" 或 consumeContent 含"办公用品"/"文具" | requestname 含"办公"/"采购" |
|
|
62
|
-
| expenseType 含"通讯" 或 sellerName 含"中国移动"/"中国联通"/"中国电信" | requestname 含"通讯"/"话费" |
|
|
57
|
+
- `invoiceDate` ≥ 事前申请发起日(含同一天)
|
|
58
|
+
- `invoiceDate` ≤ 事前申请发起日 + 90 天
|
|
63
59
|
|
|
60
|
+
**话费报销**没有 90 天上限:只要 `invoiceDate` ≥ 事前申请发起日(含同一天)即可。查询仍按 [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) 回溯 3 年。关联时不看标题里有没有「话费」。
|
|
64
61
|
|
|
65
|
-
|
|
62
|
+
每张发票单独判断:
|
|
66
63
|
|
|
67
|
-
|
|
64
|
+
| 时间上能对上的事前申请 | 怎么处理 |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| 正好 1 条 | 直接绑定。不问「要不要关联」,也不用费用类型、金额、申请人或谁更近去改绑 |
|
|
67
|
+
| 2 条及以上 | 不确定。把这几条的名称和发起日期列出来,让用户选一条。选定前不要往下填「相关流程」 |
|
|
68
|
+
| 0 条 | 这张发票不绑定。非差旅 / 外出可以继续报销。差旅 / 外出仍按 [reim-workflow.md](reim-workflow.md) Step 4.7 让用户选事前申请 |
|
|
69
|
+
| 发票没有 `invoiceDate` | 不确定。列出本次查到的事前申请,让用户选 |
|
|
68
70
|
|
|
69
|
-
|
|
70
|
-
判定规则:
|
|
71
|
-
事前申请发起日期 = createTime 的日期部分
|
|
72
|
-
发票日期 = invoiceDate
|
|
73
|
-
|
|
74
|
-
硬约束:invoiceDate >= createTime(发票日期不早于事前申请日期)
|
|
75
|
-
→ 不满足此条件的直接排除,不参与评分
|
|
76
|
-
|
|
77
|
-
匹配条件(满足硬约束后):
|
|
78
|
-
invoiceDate 在 [createTime, createTime + 90天] 范围内
|
|
79
|
-
|
|
80
|
-
更精确的匹配(如 requestnametitle 中包含日期范围信息):
|
|
81
|
-
invoiceDate 在 [起始日期, 结束日期 + 7天] 范围内
|
|
82
|
-
|
|
83
|
-
时间距离越近,匹配分越高:
|
|
84
|
-
- invoiceDate 在 createTime 后 7 天内 → 加满分
|
|
85
|
-
- invoiceDate 在 createTime 后 7~30 天 → 加大部分分
|
|
86
|
-
- invoiceDate 在 createTime 后 30~90 天 → 加少量分
|
|
87
|
-
|
|
88
|
-
**话费报销例外**:话费补贴事前申请可能在审批通过后长期有效,
|
|
89
|
-
不受 90 天窗口限制。只要 invoiceDate >= createTime 即可匹配,
|
|
90
|
-
不因时间距离远而降分。详见 reim-phone-subsidy-rules.md。
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### 维度3:金额校验
|
|
94
|
-
|
|
95
|
-
发票金额不应大幅超出事前申请中的预算金额。
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
判定规则:
|
|
99
|
-
从 requestnametitle 中提取"报销总金额"字段
|
|
100
|
-
如果能提取到金额:invoice.amount <= 预算金额 * 1.2(允许20%浮动)
|
|
101
|
-
如果无法提取金额:跳过此维度
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### 维度4:部门/人员匹配
|
|
71
|
+
一条事前申请可以绑多张发票。一张发票只能绑一条。多张发票都不确定、候选又是同一批时,一次问完:用户可以说「都用某一条」,但这一条必须落在该发票的时间候选里,否则指出哪张对不上,再问。
|
|
105
72
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
判定规则:
|
|
110
|
-
当前用户 = 事前申请.creatorId → 自动满足
|
|
111
|
-
不同用户时需额外确认
|
|
112
|
-
```
|
|
73
|
+
不要打分,不要看置信度,不要因为标题含「交通」「差旅」就选中某一条。
|
|
113
74
|
|
|
114
75
|
---
|
|
115
76
|
|
|
116
|
-
##
|
|
117
|
-
|
|
118
|
-
### 计分规则
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
| 维度 | 匹配 | 得分 |
|
|
122
|
-
| ------ | ---------------------------------- | ---- |
|
|
123
|
-
| 费用类型匹配 | 完全匹配 | +40 |
|
|
124
|
-
| 费用类型匹配 | 部分匹配(同大类) | +20 |
|
|
125
|
-
| 时间范围匹配 | invoiceDate 在 createTime 后 7 天内 | +30 |
|
|
126
|
-
| 时间范围匹配 | invoiceDate 在 createTime 后 7~30 天 | +20 |
|
|
127
|
-
| 时间范围匹配 | invoiceDate 在 createTime 后 30~90 天 | +10 |
|
|
128
|
-
| 时间范围匹配 | invoiceDate < createTime(不满足硬约束) | 直接排除 |
|
|
129
|
-
| 金额校验 | 不超预算 | +20 |
|
|
130
|
-
| 金额校验 | 超预算20%以内 | +10 |
|
|
131
|
-
| 部门匹配 | 同一人 | +10 |
|
|
132
|
-
|
|
77
|
+
## 怎么问用户
|
|
133
78
|
|
|
134
|
-
|
|
79
|
+
只在不确定时暂停。列出发票号码、开票日期,以及每条候选的 `requestname` 和发起日期,让用户按序号或名称选。
|
|
135
80
|
|
|
81
|
+
```markdown
|
|
82
|
+
这张发票在时间上对上了 2 条事前申请,请选一条:
|
|
136
83
|
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
|
140
|
-
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## 匹配约束
|
|
84
|
+
| # | 发票号码 | 开票日期 | 可选事前申请 | 发起日期 |
|
|
85
|
+
| --- | --- | --- | --- | --- |
|
|
86
|
+
| 1 | 36901189 | 2026-07-30 | 交通费报销-后端开发111-2026-07-01 | 2026-07-01 |
|
|
87
|
+
| 2 | 36901189 | 2026-07-30 | 上海出差申请-后端开发111-2026-07-20 | 2026-07-20 |
|
|
88
|
+
```
|
|
147
89
|
|
|
148
|
-
|
|
149
|
-
2. **不强制匹配**:不确定时宁可不匹配,让用户手动选择
|
|
150
|
-
3. **优先级冲突**:当一张发票可匹配多条事前申请时,选择总分最高的;分数相同时选时间最接近的
|
|
151
|
-
4. **无事前申请**:发票可以不绑定事前申请,直接用于报销(`preApprovalId` 为 null)
|
|
90
|
+
用户选定后,用 `{requestname}({requestid})` 写入对应明细「相关流程」。
|
|
152
91
|
|
|
153
92
|
---
|
|
154
93
|
|
|
155
|
-
##
|
|
94
|
+
## 关联结果
|
|
156
95
|
|
|
157
96
|
```json
|
|
158
97
|
{
|
|
159
98
|
"matchResults": [
|
|
160
99
|
{
|
|
161
100
|
"invoiceId": "1295366637717012482",
|
|
162
|
-
"invoiceInfo": "滴滴出行 ¥108.2
|
|
101
|
+
"invoiceInfo": "滴滴出行 ¥108.2 2026-07-30",
|
|
163
102
|
"preApprovalId": "1298294241967177729",
|
|
164
103
|
"preApprovalWorkflowId": "1181057526276915214",
|
|
165
|
-
"preApprovalName": "交通费报销-后端开发111-2026-07-
|
|
166
|
-
"
|
|
167
|
-
"matchScore": 85,
|
|
168
|
-
"matchReasons": ["费用类型匹配:交通费", "时间范围匹配", "同一申请人"]
|
|
104
|
+
"preApprovalName": "交通费报销-后端开发111-2026-07-25",
|
|
105
|
+
"matchReason": "开票日期 2026-07-30 只落在 2026-07-25 这一条的 90 天内"
|
|
169
106
|
}
|
|
170
107
|
],
|
|
171
|
-
"
|
|
108
|
+
"pendingChoice": [
|
|
172
109
|
{
|
|
173
110
|
"invoiceId": "INV003",
|
|
174
|
-
"
|
|
175
|
-
"
|
|
111
|
+
"invoiceDate": "2026-07-30",
|
|
112
|
+
"candidates": [
|
|
113
|
+
{"requestId": "REQ001", "requestName": "交通费报销-后端开发111-2026-07-01", "createTime": "2026-07-01"},
|
|
114
|
+
{"requestId": "REQ002", "requestName": "上海出差申请-后端开发111-2026-07-20", "createTime": "2026-07-20"}
|
|
115
|
+
]
|
|
176
116
|
}
|
|
177
117
|
],
|
|
178
|
-
"
|
|
118
|
+
"unmatchedInvoices": [
|
|
179
119
|
{
|
|
180
|
-
"
|
|
181
|
-
"
|
|
182
|
-
"reason": "
|
|
120
|
+
"invoiceId": "INV004",
|
|
121
|
+
"invoiceInfo": "文具 ¥35.00 2026-07-28",
|
|
122
|
+
"reason": "开票日期没有落在任何事前申请的时间范围内"
|
|
183
123
|
}
|
|
184
124
|
]
|
|
185
125
|
}
|
|
186
126
|
```
|
|
187
127
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
## 匹配流程伪代码
|
|
191
|
-
|
|
192
|
-
```
|
|
193
|
-
function matchInvoicesWithApprovals(invoices, approvals):
|
|
194
|
-
results = []
|
|
195
|
-
unmatchedInvoices = []
|
|
196
|
-
|
|
197
|
-
for each invoice in invoices:
|
|
198
|
-
bestMatch = null
|
|
199
|
-
bestScore = 0
|
|
200
|
-
|
|
201
|
-
for each approval in approvals:
|
|
202
|
-
score = 0
|
|
203
|
-
reasons = []
|
|
204
|
-
|
|
205
|
-
// 维度1:费用类型
|
|
206
|
-
if matchExpenseType(invoice, approval):
|
|
207
|
-
score += 40
|
|
208
|
-
reasons.push("费用类型匹配")
|
|
209
|
-
elif partialMatchExpenseType(invoice, approval):
|
|
210
|
-
score += 20
|
|
211
|
-
reasons.push("费用类型部分匹配")
|
|
212
|
-
|
|
213
|
-
// 维度2:时间范围
|
|
214
|
-
if invoiceDateInRange(invoice.invoiceDate, approval):
|
|
215
|
-
score += 30
|
|
216
|
-
reasons.push("时间范围匹配")
|
|
217
|
-
elif invoiceDateInFloatRange(invoice.invoiceDate, approval, 3):
|
|
218
|
-
score += 15
|
|
219
|
-
reasons.push("时间范围浮动匹配")
|
|
220
|
-
|
|
221
|
-
// 维度3:金额校验
|
|
222
|
-
budgetAmount = extractBudget(approval.requestnametitle)
|
|
223
|
-
if budgetAmount and invoice.amount <= budgetAmount * 1.2:
|
|
224
|
-
score += 20
|
|
225
|
-
reasons.push("金额校验通过")
|
|
226
|
-
elif budgetAmount and invoice.amount <= budgetAmount * 1.5:
|
|
227
|
-
score += 10
|
|
228
|
-
reasons.push("金额略超预算")
|
|
229
|
-
|
|
230
|
-
// 维度4:同一申请人
|
|
231
|
-
if currentUserId == approval.creatorId:
|
|
232
|
-
score += 10
|
|
233
|
-
reasons.push("同一申请人")
|
|
234
|
-
|
|
235
|
-
if score > bestScore:
|
|
236
|
-
bestScore = score
|
|
237
|
-
bestMatch = {approval, score, reasons}
|
|
238
|
-
|
|
239
|
-
if bestScore >= 40:
|
|
240
|
-
confidence = "high" if bestScore >= 70 else "medium"
|
|
241
|
-
results.push({invoice, bestMatch, confidence})
|
|
242
|
-
else:
|
|
243
|
-
unmatchedInvoices.push(invoice)
|
|
244
|
-
|
|
245
|
-
return {results, unmatchedInvoices}
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
---
|
|
249
|
-
|
|
250
|
-
## 从 requestnametitle 提取信息
|
|
251
|
-
|
|
252
|
-
事前申请的 `requestnametitle` 格式通常为:
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
交通费报销-后端开发111-2026-07-31 (相关客户:XXX, 相关项目:XXX, 承担主体: XXX, 流程编号:Weaver-FYBX202607000069, 报销总金额:14.47 , 费用承担公司:XXX)
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
可提取的信息:
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
| 信息 | 提取方式 | 用途 |
|
|
262
|
-
| ----- | -------------------- | ------ |
|
|
263
|
-
| 费用类型 | 标题开头(如"交通费报销"→"交通费") | 费用类型匹配 |
|
|
264
|
-
| 申请人 | 标题第二段(如"后端开发111") | 人员校验 |
|
|
265
|
-
| 日期 | 标题第三段(如"2026-07-31") | 时间匹配 |
|
|
266
|
-
| 相关客户 | 非出差:固定填 `"100504500000311504"`(泛微上海);**出差流程:必须由用户提供具体客户,未提供不允许报销** | 填单时使用 |
|
|
267
|
-
| 相关项目 | 括号内"相关项目:"后面的值 | 填单时使用 |
|
|
268
|
-
| 报销总金额 | 括号内"报销总金额:"后面的数字 | 金额校验 |
|
|
269
|
-
| 流程编号 | 括号内"流程编号:"后面的值 | 参考信息 |
|
|
128
|
+
`pendingChoice` 非空时先问用户,不要把这些发票当成已绑定。
|
|
270
129
|
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
| 明细里 `createForm` 返回的可写金额字段(申请金额等;实报金额、人民币金额不可写,不传) | 填本规范算出的**实报金额**,不要填发票原价 |
|
|
87
87
|
| 主表金额字段(仅当出现在 `createForm` 的 `fields` 里时才传) | 各行实报金额之和 |
|
|
88
88
|
| 费用类型(科目) | 通讯科目,写成 `"{科目名称}(100502270000000010)"`(`invoice.reim.row-info` 的 `subjectId` 已是通讯类时可直接用,名称取 `subjectName`) |
|
|
89
|
-
| 费用说明 |
|
|
89
|
+
| 费用说明 | **不传。** 由「相关发票」联动带出,不要写成月份、账单或实报金额说明 |
|
|
90
90
|
|
|
91
91
|
> 这是「金额一律填发票 `amount`」的**唯一覆盖规则**,只适用于本规范命中的话费报销。发票原始 `amount` 仍须原样保留在上下文中,不得改写发票数据本身。
|
|
92
92
|
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
|
|
110
110
|
```
|
|
111
111
|
cusCreateDateStart = 最早发票 invoiceDate 往前推 1095 天(3 年)
|
|
112
|
-
cusCreateDateEnd = 最晚发票 invoiceDate
|
|
112
|
+
cusCreateDateEnd = 最晚发票 invoiceDate(CLI 会再 + 1 天后发给接口)
|
|
113
113
|
```
|
|
114
114
|
|
|
115
115
|
示例(发票日期 2026-09-20):
|
|
@@ -117,7 +117,7 @@ cusCreateDateEnd = 最晚发票 invoiceDate
|
|
|
117
117
|
```json
|
|
118
118
|
{
|
|
119
119
|
"pageNo": 1,
|
|
120
|
-
"pageSize":
|
|
120
|
+
"pageSize": 100,
|
|
121
121
|
"requestname": "话费",
|
|
122
122
|
"cusCreateDateStart": "2023-09-20",
|
|
123
123
|
"cusCreateDateEnd": "2026-09-20"
|
|
@@ -130,10 +130,10 @@ cusCreateDateEnd = 最晚发票 invoiceDate
|
|
|
130
130
|
|
|
131
131
|
默认匹配规则要求 `invoiceDate 在 [createTime, createTime + 90天]`。**话费报销不适用此窗口**,因为一次审批可覆盖数年的月度报销。
|
|
132
132
|
|
|
133
|
-
|
|
134
|
-
- **取消 90 天窗口限制**:只要 `invoiceDate >= createTime
|
|
135
|
-
-
|
|
136
|
-
-
|
|
133
|
+
话费报销关联时:
|
|
134
|
+
- **取消 90 天窗口限制**:只要 `invoiceDate >= createTime 的日期部分`(发票日期不早于事前申请发起日期,同一天也算)即可进入候选
|
|
135
|
+
- 查询时用 `requestname="话费"` 缩小列表;关联本身不再看标题、费用类型或金额
|
|
136
|
+
- 时间上只剩 1 条 → 直接绑定。还剩多条 → 把名称和发起日期列给用户选
|
|
137
137
|
|
|
138
138
|
---
|
|
139
139
|
|