weaver-work-cli 0.1.28 → 0.1.31
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-U766FTFH.js +2537 -0
- package/dist/chunks/archive-oa-DMWEKX3L.js +1317 -0
- package/dist/chunks/asset-TCR7VDEV.js +2109 -0
- package/dist/chunks/attachment-content-AQNX5N3S.js +23 -0
- package/dist/chunks/blog-EVZWGDVM.js +2157 -0
- package/dist/chunks/caizhilian-JOWS6SL5.js +10087 -0
- package/dist/chunks/calendar-5WNCV66Q.js +1195 -0
- package/dist/chunks/chunk-2DUV44UX.js +15606 -0
- package/dist/chunks/chunk-324YPTC2.js +1607 -0
- package/dist/chunks/chunk-65QMVWHS.js +231 -0
- package/dist/chunks/chunk-6V7ZLF34.js +387 -0
- package/dist/chunks/chunk-AC7KJWC5.js +358 -0
- package/dist/chunks/chunk-AJ62BGAW.js +29 -0
- package/dist/chunks/chunk-BUSC6UAE.js +43 -0
- package/dist/chunks/chunk-CVZ2JOSW.js +62 -0
- package/dist/chunks/chunk-D4LTJSJD.js +477 -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-GCG2NMWR.js +703 -0
- package/dist/chunks/chunk-GPMFD4RD.js +75 -0
- package/dist/chunks/chunk-H3WDBYJW.js +508 -0
- package/dist/chunks/chunk-H6XSTSLM.js +2357 -0
- package/dist/chunks/chunk-J7RJTZSV.js +5556 -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-R2IJAK7T.js +464 -0
- package/dist/chunks/chunk-R7O5PUWO.js +205 -0
- package/dist/chunks/chunk-RCGYCOMG.js +6962 -0
- package/dist/chunks/chunk-VZTXRG6X.js +403 -0
- package/dist/chunks/chunk-WHD4XMRP.js +161 -0
- package/dist/chunks/chunk-YLCYX7LE.js +371 -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-NJ4YK6CC.js +2276 -0
- package/dist/chunks/ehr-MMYN36VA.js +5241 -0
- package/dist/chunks/employee-SAK2QYXX.js +11 -0
- package/dist/chunks/esb-HIWHOU7Q.js +141 -0
- package/dist/chunks/fna-KBACQTA5.js +1444 -0
- package/dist/chunks/host-3OHS5QUX.js +21 -0
- package/dist/chunks/host-IG6KEH5Q.js +19 -0
- package/dist/chunks/host-KQL5N4HO.js +23 -0
- package/dist/chunks/host-LLSZQCWR.js +17 -0
- package/dist/chunks/hrm-LYEC67ZQ.js +244 -0
- package/dist/chunks/im-RN2UKAEU.js +252 -0
- package/dist/chunks/invoice-EEPHLAF6.js +5179 -0
- package/dist/chunks/jiuchuanhui-WVVZYSJE.js +1940 -0
- package/dist/chunks/lazy-dispatch-MDOFFL2S.js +28 -0
- package/dist/chunks/mail-LNQLTF6L.js +2695 -0
- package/dist/chunks/meeting-XSD3BDVQ.js +504 -0
- package/dist/chunks/msg-parse-4GSQ2WTO.js +41 -0
- package/dist/chunks/okr-TMWTIU2K.js +2482 -0
- package/dist/chunks/plan-A2FSFA7T.js +2025 -0
- package/dist/chunks/project-T26QLBQF.js +1361 -0
- package/dist/chunks/registry-2VLUAESA.js +14 -0
- package/dist/chunks/registry-JCFEYXOE.js +18 -0
- package/dist/chunks/registry-NYPYMZXG.js +16 -0
- package/dist/chunks/registry-Q7OQJ3SU.js +19 -0
- package/dist/chunks/registry-ZJMJVWFA.js +19 -0
- package/dist/chunks/room-recommend-UR4ZDZS6.js +20 -0
- package/dist/chunks/schedule-5L2PM4M6.js +24 -0
- package/dist/chunks/state-Y2XBP6YE.js +15 -0
- package/dist/chunks/workflow-TR6PG2SL.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 +47 -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/host.js +2 -1
- package/dist/shortcuts/invoice/manifest.js +36 -12
- package/dist/shortcuts/invoice/operations/issuing-qys.js +132 -36
- 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/index.js +3 -0
- package/dist/shortcuts/workflow/operations/form.js +17 -5
- package/dist/shortcuts/workflow/operations/read.js +13 -6
- package/dist/shortcuts/workflow/operations/registry.js +2 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +331 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +133 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +326 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +113 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +259 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoListRows.js +64 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoOutputPlanner.js +28 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.aggregate.js +70 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +267 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +392 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +165 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +448 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +348 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +222 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +66 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +502 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +540 -0
- package/docs/_catalog.md +1 -0
- package/docs/contract.md +39 -4
- package/docs/invoice.md +7 -7
- package/docs/todo-smart-convert/README.md +171 -0
- package/docs/todo-smart-convert/data-contract.md +236 -0
- package/docs/todo-smart-convert/mock/ai-todo-query-target.json +209 -0
- package/docs/todo-smart-convert/subgroup-rules.md +245 -0
- package/package.json +3 -2
- package/scripts/bundle.mjs +63 -0
- package/scripts/package-skill.mjs +1 -1
- package/skill-template/business-info.json +25 -4
- package/skill-template/domains/jinchengda.md +16 -3
- package/skill-template/domains/yepiaotong.md +3 -3
- 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-workflow/SKILL.md +23 -1
- package/skills/weaver-e10-workflow/references/todo-smart-convert.md +282 -0
- package/skills/weaver-e10-workflow/scripts/todo-summary.cjs +695 -0
- package/skills/weaver-e10-yepiaotong/SKILL.md +15 -11
- package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +1 -1
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +10 -7
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +41 -14
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +54 -26
- 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 +8 -2
- package/templates/meeting/invitation.docx +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# 生成会议邀请函(docx)
|
|
2
|
+
|
|
3
|
+
> operation:`meeting.invitation.render` 风险等级:`read`(只读服务端,只在本地落一个 docx,**不发消息、不写任何接口**)
|
|
4
|
+
> 底层数据源:`meeting.eb.meeting.list` 单查(EB 版会议列表,47 个字段)
|
|
5
|
+
|
|
6
|
+
## 用途与边界
|
|
7
|
+
|
|
8
|
+
- **只生成、不发送**:在智能体工作台里按会议真实数据产出一份邀请函 docx,项目人员拿到后自行修改再对外发出。
|
|
9
|
+
- 邀请对象是**一个组织**(客户单位),因此**一份文档对应一个会议**,不做逐人循环、不做定向推送。
|
|
10
|
+
- 模板固定为「泛微标准模板」(随 CLI 包分发,位于 CLI 安装目录 `templates/meeting/invitation.docx`),**不支持替换模板**。
|
|
11
|
+
|
|
12
|
+
## 入参
|
|
13
|
+
|
|
14
|
+
| 参数 | 必填 | 说明 |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| `mtId` | ✓ | 会议 id(EB 版会议主键,长 id 用字符串) |
|
|
17
|
+
| `extra` | | 键值对。**① 租户自定义字段**,如 `{"guest_org":"某某集团"}`——会议接口不会返回这类字段,只能从这里传;**② 保留键 `agenda`** 手动指定议程(见下文「议程表」),仅在会议没有议题时生效 |
|
|
18
|
+
| `outputPath` | | 输出文件完整路径;缺省写到 `~/.weaver-work-cli/meeting/invitations/邀请函-{会议名}-{yyyyMMdd}.docx` |
|
|
19
|
+
|
|
20
|
+
## 出参
|
|
21
|
+
|
|
22
|
+
`filePath` / `fileName` / `bytes` / `meetingId` / `meetingName` / `filledFields[]` / `pendingFields[]`,以及 `warnings`(有待补充字段时会列出)。
|
|
23
|
+
|
|
24
|
+
议程相关三个字段:
|
|
25
|
+
|
|
26
|
+
| 字段 | 含义 |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| `agendaSource` | `meeting.topic`=按会议议题自动填 / `extra`=调用方传入 / `template`=**没有议题,保留模板示例行** |
|
|
29
|
+
| `agendaRows` | 实际写入议程表的行数(`template` 时为 0) |
|
|
30
|
+
| `agendaTableFilled` | 是否真的重建了议程表 |
|
|
31
|
+
|
|
32
|
+
> ⚠️ `agendaSource=template` 时会同时给一条 `warnings`:议程表里还是模板的示例行
|
|
33
|
+
> (“15分钟/泛微公司介绍”),提醒人工改成真实议程 —— 客户看到的邀请函不该印着别人的议程。
|
|
34
|
+
|
|
35
|
+
## 占位符(模板里写这些)
|
|
36
|
+
|
|
37
|
+
| 层 | 占位符 | 取值来源 | 取不到时 |
|
|
38
|
+
| --- | --- | --- | --- |
|
|
39
|
+
| 标准字段 | `{mt_name}` `{address}` `{hrm_members}` `{total_member}` `{mt_desc}` `{video_url}` `{caller}` `{contacter}` `{company_name}` `{org_members}` `{issuer_company}` `{begin_datetime}` `{end_datetime}` | 会议接口 / CLI 内置 | 高亮【待补充】 |
|
|
40
|
+
| 派生字段 | `{begin_date}` `{begin_weekday}` `{begin_time}` `{end_date}` `{end_time}` `{time_range}` `{issue_date}` | CLI 计算(`issue_date` = **生成当天**,不是会议日期) | 高亮【待补充】 |
|
|
41
|
+
| **同日智能时间** | `{begin_datetime}` `{end_datetime}` | 同日会议:begin=完整、end=**只给时间**,拼出 `2026-10-28 09:00~10:16`;跨日时 end 带完整日期 | 高亮【待补充】 |
|
|
42
|
+
| 外挂字段 | `{guest_org}` 或 `{extra.任意键}` | 入参 `extra` | 高亮【待补充】 |
|
|
43
|
+
| **接口任意字段** | `{该字段的 dataKey}`(如 `{name}` `{updater}`) | 会议接口返回的原始行 | 高亮【待补充】 |
|
|
44
|
+
|
|
45
|
+
> ⭐ **新增自定义字段不需要改 CLI**:`meeting.eb.meeting.list` 读侧**不投影、不过滤字段**,返回什么就原样带出;
|
|
46
|
+
> 渲染侧对「派生 → 标准 → extra → **接口原始字段**」四级兜底,所以只要在 eBuilder 接口里把字段加进返回列,
|
|
47
|
+
> 模板写 `{该字段的 dataKey}` 就能取值。对象型字段(人员/部门/关联记录)自动取 `name`;多选用「、」拼接。
|
|
48
|
+
> 前提是拿到**字段的 dataKey**(不是中文显示名)。
|
|
49
|
+
|
|
50
|
+
口径细节:
|
|
51
|
+
|
|
52
|
+
- **落款单位用 `{company_name}`(公司全称)**:模板落款行就是它。取值顺序为
|
|
53
|
+
`extra.company_name`(调用方指定,**对外开放时客户传自己的公司名**)→ CLI 内置默认
|
|
54
|
+
(「上海泛微网络科技股份有限公司」)。E10 组织树里只有「泛微网络」,没有工商全称,所以默认值写在 CLI 里而不是查接口。
|
|
55
|
+
- 另有两个备用占位符:`{org_members}`(会议参会部门,为空时回落到**发起人部门**再回落上级公司,见输出 `orgSource`)、`{issuer_company}`(发起人上级公司)。需要"部门级落款"时改用它们。
|
|
56
|
+
- 发起人部门/公司取会议行的 `creator`(人员 id),调 `hrm.employee.batch` 反查;查人失败**静默降级**,不影响邀请函生成。
|
|
57
|
+
- `{hrm_members}` 接口给的是**英文逗号**分隔的姓名串,CLI 会转成「、」。
|
|
58
|
+
- **取不到值的占位符不会留下 `{xxx}` 字面量**:会渲染成**黄色高亮**的 `【待补充】:字段名`,便于人工定位。
|
|
59
|
+
|
|
60
|
+
## 议程表:有议题就自动填,没有就保留原样
|
|
61
|
+
|
|
62
|
+
模板里的议程表是「表头 + 2 行示例数据」的固定结构。渲染时按下面的顺序取议程:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
① 会议议题(meeting.eb.topic.list,按 mt_id 过滤)
|
|
66
|
+
↓ 有议题就用议题,行数随议题数量增减(多余示例行会被裁掉)
|
|
67
|
+
② extra.agenda(调用方直传,仅在会议没有议题时生效)
|
|
68
|
+
↓ 也没有
|
|
69
|
+
③ 保留模板里的示例行(agendaSource=template,并给一条 warning)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
议题 → 列的映射(列顺序与模板一致,**表头不动**):
|
|
73
|
+
|
|
74
|
+
| 模板列 | 取值 | 来源 |
|
|
75
|
+
| --- | --- | --- |
|
|
76
|
+
| 议程安排 | **议题名称** `topic_title` | 议题库(**不能**用 `name`——那是 eBuilder 自动标题「议题库-某人 时间戳」) |
|
|
77
|
+
| 议程内容 | **议题内容概要** `topic_content` | 议题库 |
|
|
78
|
+
| 议程时间 | `09:00-09:15` | **会议议题明细** `meeting.eb.meeting.detail` → `details.detail1`(议题库表没有 start/end),按 `topic_num` ↔ `detail1.topic_no` 匹配;匹配不上留空 |
|
|
79
|
+
|
|
80
|
+
- 议题按开始时间升序排,没有时间的排最后(保持接口原顺序)。
|
|
81
|
+
- 建议题时**提议人员/提议单位会自动补默认值**:`proposal_person`=当前操作人、
|
|
82
|
+
`proposal_dept`=当前操作人所属部门 id(`hrm.employee.batch` 的 `departmentId`,查不到则留空不阻塞)。
|
|
83
|
+
- **行格式继承模板**:第 N 行沿用模板第 N 行的底纹/字体/对齐,超出时克隆最后一行,所以版式不变。
|
|
84
|
+
- `extra.agenda` 的写法是**每行一条、换行或分号分隔**,格式 `议程安排|议程内容|议程时间`
|
|
85
|
+
(即 `议题名称|内容概要|时间段`):
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{ "extra": { "guest_org": "某某集团", "agenda": "公司介绍|泛微整体介绍|14:00-14:30\n方案讲解|产品方案演示|14:30-16:00" } }
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- **议题表在部分租户未注册**(返回空数组属正常),此时会静默走 ②③,不会报错。
|
|
92
|
+
|
|
93
|
+
## 示例
|
|
94
|
+
|
|
95
|
+
Windows PowerShell:
|
|
96
|
+
|
|
97
|
+
```powershell
|
|
98
|
+
weaver-work-cli --json meeting run meeting.invitation.render --input-json '{"mtId":"<会议id>","extra":{"guest_org":"某某集团"}}'
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
macOS/Linux:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
weaver-work-cli --json meeting run meeting.invitation.render --input-json '{"mtId":"<会议id>","extra":{"guest_org":"某某集团"}}'
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 注意事项
|
|
108
|
+
|
|
109
|
+
- **不要用 `meeting.eb.meeting.detail` 取数据**:该接口**在部分环境只返回 `{id}`**(部分环境),取不到字段;
|
|
110
|
+
邀请函统一走 `meeting.eb.meeting.list` 单查。⚠️ 但另一类环境(部分环境)detail 会返回完整 51 个字段 ——
|
|
111
|
+
所以**不能一概而论,跨环境稳妥做法仍是 list 单查**。
|
|
112
|
+
- 生成后如需把文件发给对方,**本 operation 不提供发送能力**(IM/邮件都不走这里),由使用者自行处理。
|
|
113
|
+
- 模板出错时会在本地抛 `template_missing`,提示 CLI 包缺少 `templates/meeting/invitation.docx`;此时重装 CLI 即可,不要手工改模板路径。
|
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
Windows PowerShell:
|
|
22
22
|
|
|
23
23
|
```powershell
|
|
24
|
-
weaver-work-cli --json meeting run meeting.cancel.prepare --input-json '{"id":"
|
|
24
|
+
weaver-work-cli --json meeting run meeting.cancel.prepare --input-json '{"id":"<会议id>"}'
|
|
25
25
|
# 用户确认后(continuation 原样传入):
|
|
26
|
-
weaver-work-cli --json meeting run meeting.cancel.apply --input-json '{"confirm":true,"continuation":"<prepare返回>","id":"
|
|
27
|
-
weaver-work-cli --json meeting run meeting.delete.prepare --input-json '{"id":"
|
|
26
|
+
weaver-work-cli --json meeting run meeting.cancel.apply --input-json '{"confirm":true,"continuation":"<prepare返回>","id":"<会议id>"}'
|
|
27
|
+
weaver-work-cli --json meeting run meeting.delete.prepare --input-json '{"id":"<会议id>"}'
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
macOS/Linux(bash/zsh):
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
weaver-work-cli --json meeting run meeting.cancel.prepare --input-json '{"id":"
|
|
34
|
-
weaver-work-cli --json meeting run meeting.cancel.apply --input-json '{"confirm":true,"continuation":"<prepare返回>","id":"
|
|
35
|
-
weaver-work-cli --json meeting run meeting.delete.prepare --input-json '{"id":"
|
|
33
|
+
weaver-work-cli --json meeting run meeting.cancel.prepare --input-json '{"id":"<会议id>"}'
|
|
34
|
+
weaver-work-cli --json meeting run meeting.cancel.apply --input-json '{"confirm":true,"continuation":"<prepare返回>","id":"<会议id>"}'
|
|
35
|
+
weaver-work-cli --json meeting run meeting.delete.prepare --input-json '{"id":"<会议id>"}'
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
## 输出处理
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
# 给纪要挂附件并回填文字(上传 → 解析 → 写回)
|
|
2
|
+
|
|
3
|
+
> 涉及 operation:`meeting.attachment.upload`(新增,2026-10-26)、`meeting.eb.minute.create` / `.update`
|
|
4
|
+
> 风险等级:`read-before-write`(只写文件服务和纪要字段,不动会议主表)
|
|
5
|
+
|
|
6
|
+
## 为什么要这套东西
|
|
7
|
+
|
|
8
|
+
纪要的两个"内容"字段含义不同,别混:
|
|
9
|
+
|
|
10
|
+
| 字段 | 含义 | 谁生成 |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| `minutes_content` | **原始文字**:文档 OCR/文字提取结果,或音频转写原文(带 `角色1/角色2` 说话人) | 智能体解析附件后写入 |
|
|
13
|
+
| `parse_content` | **会议纪要文案**:按"生成纪要"提示词产出的结构化纪要(HTML 富文本) | 智能体根据 `minutes_content` 生成后写入 |
|
|
14
|
+
|
|
15
|
+
`doc_file` / `video_file` 存的是**附件 id**(接口文档口径:「按文件id」),不是 URL、不是路径。
|
|
16
|
+
|
|
17
|
+
## ⛔ 接口不会触发解析
|
|
18
|
+
|
|
19
|
+
实测验证:
|
|
20
|
+
|
|
21
|
+
- `create_mt_minute` / `update_mt_minute` **只写字段**,`video_taskId` / `parse_content` 始终为空;
|
|
22
|
+
- 服务端 ASR / 文字提取由**会议详情页**触发,接口调不动;
|
|
23
|
+
- 所以 CLI 建的音频/文档纪要,**不要对用户说"已开始解析"**。
|
|
24
|
+
|
|
25
|
+
## ✅ 正确分工:CLI 管传输与落库,智能体管解析
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
① meeting.attachment.upload 本地文件 → 附件 id
|
|
29
|
+
↓
|
|
30
|
+
② meeting.eb.minute.create / .update 写 file_type + doc_file/video_file
|
|
31
|
+
↓
|
|
32
|
+
③ 智能体自己解析(见下表) 得到原文
|
|
33
|
+
↓
|
|
34
|
+
④ meeting.eb.minute.update minutes_content = 原文
|
|
35
|
+
↓
|
|
36
|
+
⑤ 智能体按"生成纪要"提示词生成结构化纪要
|
|
37
|
+
↓
|
|
38
|
+
⑥ meeting.eb.minute.update parse_content = 纪要文案
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 第 ③ 步:不同类型的附件用什么解析
|
|
42
|
+
|
|
43
|
+
| 附件类型 | 怎么解析 | 说明 |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| `.mp4` / `.mp3` / `.m4a` / `.wav` / `.amr` … | **智能体自带的音频转写能力** | 支持 mp4,最大 1GB / 5 小时,带说话人分离与时间轴,无需本地 ffmpeg |
|
|
46
|
+
|
|
47
|
+
#### ⚠️ 说话人分离 ≠ 认人:转写结果里没有姓名
|
|
48
|
+
|
|
49
|
+
转写输出的形如 `[起始秒,结束秒,说话人编号]`,**第三个字段只是"同一个人"的聚类编号**(0/1/2…),
|
|
50
|
+
不是姓名、也不是账号 id。E10 平台自己的纪要同样如此 —— 现有数据的 `minutes_content` 里写的就是
|
|
51
|
+
`角色1:…` / `角色2:…`。
|
|
52
|
+
|
|
53
|
+
**所以:不许把编号直接写成真人姓名。** 没有声纹注册就没有身份对应关系,硬写就是编造。
|
|
54
|
+
|
|
55
|
+
可用但不保证准确的推断方式(必须标"待确认",不能当事实写进纪要):
|
|
56
|
+
|
|
57
|
+
1. **点名 + 紧随回应**:A 喊了某人名字,紧接着编号 N 应答 → N 大概率是那个人
|
|
58
|
+
(例:"哎,韩超,你来操作吗?" → 下一位说话的编号多半是韩超);
|
|
59
|
+
2. **参会人名单收敛**:把候选限制在 `hrm_members` 名单内,编号数量若等于名单人数,可按"主持/被点名"辅助排序;
|
|
60
|
+
3. **自我介绍**:"我是 XX" 这类自报家门最可靠,优先采信。
|
|
61
|
+
|
|
62
|
+
工程上最稳的做法:`minutes_content` 保留 `角色N` 原样,在纪要末尾附一张**待确认对照表**
|
|
63
|
+
(`角色1 = ______`),让人工一次性填完;或让主持人开场各自报名。
|
|
64
|
+
**`parse_content` 里凡涉及"谁说的",只要来源是推断,就必须写明"(据对话推断,待确认)"。**
|
|
65
|
+
|
|
66
|
+
| `.docx` | 直接解包读 `word/document.xml` 的文本(CLI 侧有零依赖 ZIP 读取器,也可在智能体侧读) | 表格按 Markdown 还原 |
|
|
67
|
+
| `.pdf` / 图片 / 扫描件 | 智能体直接读该文件(多模态 + OCR) | 逐页提取 |
|
|
68
|
+
| `.xlsx` / `.pptx` | 按工作表 / 幻灯片顺序提取 | |
|
|
69
|
+
|
|
70
|
+
> 要点:**CLI 不需要内置 ASR/OCR**。解析交给智能体,CLI 只负责"文件进得去、文字写得回"。
|
|
71
|
+
|
|
72
|
+
## `meeting.attachment.upload`
|
|
73
|
+
|
|
74
|
+
### 入参
|
|
75
|
+
|
|
76
|
+
| 参数 | 必填 | 说明 |
|
|
77
|
+
| --- | --- | --- |
|
|
78
|
+
| `file` | ✓ | 本地文件绝对路径 |
|
|
79
|
+
| `name` | | 附件显示名,默认取文件名 |
|
|
80
|
+
| `module` | | 文件归属模块,默认 `meeting` |
|
|
81
|
+
| `fileFrom` | | 来源标记,默认 `meeting_info` |
|
|
82
|
+
| `permission` | | 文件权限,默认 `3` |
|
|
83
|
+
| `shareUsers` / `shareGroups` | | 额外分享给的用户/群(可选) |
|
|
84
|
+
| `timeoutMs` | | 上传超时,默认 300000(5 分钟)。大文件别调小 |
|
|
85
|
+
|
|
86
|
+
### 出参
|
|
87
|
+
|
|
88
|
+
`fileId`(**这就是要塞进 `doc_file` / `video_file` 的值**)/ `name` / `size` / `md5` / `module` /
|
|
89
|
+
`uploadType` / `reused` / `recovered` / `durationMs` / `next`
|
|
90
|
+
|
|
91
|
+
### 两个保护行为(都是实测踩出来的)
|
|
92
|
+
|
|
93
|
+
- **秒传**:同 md5 的文件已在文件服务里,直接返回已有 `fileId`(`reused: true`),不再传文件体。
|
|
94
|
+
- **超时复核**:实传超时/断连后会自动再预检一次;若按 md5 查到文件已落地,按成功返回
|
|
95
|
+
(`recovered: true` + warning)。**避免"报错但其实成功了"导致重复上传。**
|
|
96
|
+
⚠️ 拿到 `recovered: true` **绝对不要重试上传**。
|
|
97
|
+
|
|
98
|
+
### 限制
|
|
99
|
+
|
|
100
|
+
- 上传前会把整个文件读进内存,**>256MB 直接拒绝**(`file_too_large`)。
|
|
101
|
+
- 大文件上传耗时只受网络上行限制,接口本身很快(预检热态约 1s)。
|
|
102
|
+
|
|
103
|
+
## 示例
|
|
104
|
+
|
|
105
|
+
Windows PowerShell:
|
|
106
|
+
|
|
107
|
+
```powershell
|
|
108
|
+
# ① 上传音频,拿附件 id
|
|
109
|
+
weaver-work-cli --json meeting run meeting.attachment.upload --input-json '{"file":"./rec.mp4"}'
|
|
110
|
+
|
|
111
|
+
# ② 建音频纪要并挂上附件(file_type=1 音频 / 0 文档)
|
|
112
|
+
weaver-work-cli --json meeting run meeting.eb.minute.create.prepare --input-json '{"mt_id":"<会议id>","mt_minutes_subject":"周会录音","file_type":"1","video_file":"<上一步 fileId>"}'
|
|
113
|
+
weaver-work-cli --json meeting run meeting.eb.minute.create.apply --input-json '{"confirm":true,"continuation":"<上一步 continuation>"}'
|
|
114
|
+
|
|
115
|
+
# ③ 智能体解析音频 → 把原文写回 minutes_content
|
|
116
|
+
weaver-work-cli --json meeting run meeting.eb.minute.update.prepare --input-json '{"id":"<纪要id>","mt_id":"<会议id>","minutes_content":"<解析出的原文>"}'
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
macOS/Linux:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# 命令与 Windows PowerShell 完全一致,仅路径写法不同
|
|
123
|
+
weaver-work-cli --json meeting run meeting.attachment.upload --input-json '{"file":"./rec.mp4"}'
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 判断解析状态(别信 `minutes_status`)
|
|
127
|
+
|
|
128
|
+
全库 33 条纪要中 28 条 `minutes_status=1(生成中)`,但内容早就有了 —— 该字段不推进。按这个判:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
video_taskResult == '1' 且 parse_content 非空 → 已完成
|
|
132
|
+
video_taskResult == '2' → 生成失败
|
|
133
|
+
两者皆空 → 从未触发解析
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## 文件模块(module)怎么选 —— 实测
|
|
137
|
+
|
|
138
|
+
| module 值 | 结果 |
|
|
139
|
+
| --- | --- |
|
|
140
|
+
| `meeting` | ✅ 合法,上传成功(17291B 文档约 0.93s 返回 fileid) |
|
|
141
|
+
| `meetingeb` | ❌ `code:20005 模块参数错误` |
|
|
142
|
+
| `im` / `mail` | ✅ 合法,但属于别的业务线 |
|
|
143
|
+
|
|
144
|
+
**结论:EB 版会议不需要单独的模块名,就用 `module=meeting`。** 文件模块是「业务模块」维度,不是「应用版本」维度。
|
|
145
|
+
|
|
146
|
+
其余实测口径:
|
|
147
|
+
|
|
148
|
+
- 纪要 `doc_file` / `video_file` 里存的就是**一个纯 id**(无 URL、无 JSON)。
|
|
149
|
+
对比页面创建的纪要(`doc_file=<页面创建的doc_file>`)与本 CLI 上传后写入的(`doc_file=<CLI写入的doc_file>`),
|
|
150
|
+
字段形态完全一致。
|
|
151
|
+
- 秒传返回结构与 im 不同:业务模块走 `data.uploadModuleDto.fileid`,im 走 `data.imUploadInfoDto.fileObj.id`。
|
|
152
|
+
**两套都要认**,否则会出现"秒传成功却取不到 id"。
|
|
153
|
+
- ⚠️ 秒传不是每次都命中:同一文件按 `module=meeting` 传过一次后再预检,仍可能返回 `uploadType=common`。
|
|
154
|
+
去重维度不只看 md5(可能还带 refId/permission),**不要依赖秒传来保证不产生重复文件**。
|
|
155
|
+
|
|
156
|
+
## ESB 解析链路
|
|
157
|
+
|
|
158
|
+
三个动作流都可用 `esbFlowId` 或 `uniqueIndent` 触发,走 `esb.trigger.prepare → apply`。
|
|
159
|
+
|
|
160
|
+
> ⚠️ **表里的 id / primary_key 都是租户级配置**,各环境不同,换租户必须替换。
|
|
161
|
+
> `meeting.minute.fromGroupChat` 内置了参考租户的默认值(生成纪要 / 生成文档两条),
|
|
162
|
+
> 其他租户用入参 `flowGenerateMinutes` / `flowGenerateDocument` 覆盖;解析附件那条由调用方显式传 `esbFlowId`。
|
|
163
|
+
|
|
164
|
+
| 用途 | esbFlowId | primary_key | mainTable |
|
|
165
|
+
| --- | --- | --- | --- |
|
|
166
|
+
| **解析附件**(文档同步 / 音视频异步) | `<解析附件flowId>` | `<解析附件uniqueIndent>` | `mtAIMinutePageID*`、`minuteId*`、`mt_id*`;可选 `doc_file` / `video_file` / `file_type` |
|
|
167
|
+
| **保存解析并生成文档** | `<生成文档flowId>` | `<生成文档uniqueIndent>` | `parse_content*`、`mt_minute_id*` |
|
|
168
|
+
| 解析文本生成智能纪要(备用) | `<生成纪要flowId>` | `<生成纪要uniqueIndent>` | `minuteId*` |
|
|
169
|
+
|
|
170
|
+
调用示例(解析附件):
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
weaver-work-cli esb run esb.trigger.prepare --input-json '{"employeeId":"<员工id>","esbFlowId":"<解析附件flowId>","customParams":{"mainTable":{"minuteId":"<纪要id>","mt_id":"<会议id>","file_type":"1","video_file":"<附件id>","mtAIMinutePageID":""}}}'
|
|
174
|
+
weaver-work-cli esb run esb.trigger.apply --input-json '{"continuation":"<上一步返回值>","confirm":true}'
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### ⚠️ 音频:不要同步等,也**不要**去调「获取解析纪要音频结果」
|
|
178
|
+
|
|
179
|
+
- 那个流程是**1 分钟一轮的定时任务**,它会自己把结果写回表单;
|
|
180
|
+
- 我们再去调 = 第二个消费者,可能重复处理/覆盖;
|
|
181
|
+
- 正确做法:触发后立刻返回,**60 秒后用 `meeting.minute.parseStatus` 查一次**。
|
|
182
|
+
|
|
183
|
+
### 状态推进规则(全链路实测验证后的口径)
|
|
184
|
+
|
|
185
|
+
| 阶段 | `minutes_status` | 谁写的 |
|
|
186
|
+
| --- | --- | --- |
|
|
187
|
+
| 刚挂附件、未解析 | `0` 解析中 | CLI(建纪要时传) |
|
|
188
|
+
| 音频解析中 | `3` 文字提取中 | **服务端**,同时写 `video_taskId`、`video_taskResult=0` |
|
|
189
|
+
| 原文就绪(文档/音频**都一样**) | `4` 文字提取完成 | **服务端**(文档同步、音频异步,都会写 4) |
|
|
190
|
+
| 纪要文案已生成 | `1` 生成中 | **ESB「解析文本生成纪要」`…633`** |
|
|
191
|
+
| 文档已生成并回写 OA | `2` 已完成 + `mt_minutes=<文档id>` | **ESB「保存解析并生成文档」`…628`** |
|
|
192
|
+
|
|
193
|
+
`meeting.minute.writeContent` 的自动规则(只在你自己写内容时用,正常 ESB 链路不用它):
|
|
194
|
+
|
|
195
|
+
| 写入内容 | 自动置为 |
|
|
196
|
+
| --- | --- |
|
|
197
|
+
| `parse_content`(纪要文案) | **1 生成中**(2 留给 ESB 在生成文档后写) |
|
|
198
|
+
| `minutes_content`(原文,文档和音频都一样) | **4 文字提取完成** |
|
|
199
|
+
|
|
200
|
+
> ⚠️ 两条实测更正:
|
|
201
|
+
> ① 音频原文就绪是 **4**,不是 2(此前按"音频终态=2"实现,实测推翻);
|
|
202
|
+
> ② 写完纪要文案是 **1 生成中**,不是 2 —— 2 由 ESB `…628` 在文档生成后自己写。
|
|
203
|
+
> 照这两个口径走,才不会出现"同一平台两种状态"的矛盾。
|
|
204
|
+
|
|
205
|
+
### 单次查进度:`meeting.minute.parseStatus`
|
|
206
|
+
|
|
207
|
+
返回 `state` 与**下一步动作** `nextAction`,Agent 照 `nextAction` 做即可,不用自己推理:
|
|
208
|
+
|
|
209
|
+
| `state` | `nextAction` | 含义 / 该做什么 |
|
|
210
|
+
| --- | --- | --- |
|
|
211
|
+
| `idle` | `trigger_parse` | 未触发解析:确认已挂附件后调 ESB「解析附件」`<解析附件flowId>` |
|
|
212
|
+
| `pending` | `wait_then_check` | 后台在跑:**60 秒后再查一次**,不要连续轮询 |
|
|
213
|
+
| `extracted` | `generate_minutes` | 原文就绪(状态 4):调 ESB「解析文本生成纪要」`<生成纪要flowId>`,只传 `minuteId` |
|
|
214
|
+
| `minutes_ready` | `generate_document` | 纪要文案就绪(状态 1):**直接调 ESB「保存解析并生成文档」`<生成文档flowId>`**,不用问用户 |
|
|
215
|
+
| `done` | `none` | 文档已生成(`mt_minutes` 有值、状态 2),链结束 |
|
|
216
|
+
| `failed` | `manual_check` | 后台失败:到会议详情页看原因,**不要标成已完成** |
|
|
217
|
+
|
|
218
|
+
另有 `contentReady` / `minutesReady` / `documentReady` 三个布尔,**判断进度用它们,不要用 `minutes_status`**。
|
|
219
|
+
|
|
220
|
+
### 实测
|
|
221
|
+
|
|
222
|
+
**文档路径已跑通,实测时序:**
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
① attachment.upload 2.3 s → fileId
|
|
226
|
+
② minute.create.apply 8.1 s ← 带 doc_file 附件时明显变慢(纯文本纪要仅 0.1 s)
|
|
227
|
+
③ esb.trigger.apply >60 s ← 超时!但动作流仍在后台跑完(文档解析是**同步**的)
|
|
228
|
+
④ 约 1 分钟后查纪要 minutes_content 559 字 ✅ / minutes_status "4" ✅(服务端写的)
|
|
229
|
+
⑤ writeContent 写纪要文案 0.7 s → status 自动 2,回读一致
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**音频路径实测时序(同一环境,23.3MB mp4):**
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
① attachment.upload 10.3 s → fileId(真实传输,约 2.3 MB/s)
|
|
236
|
+
② minute.create.apply 0.1 s ← 音频纪要反而快
|
|
237
|
+
③ esb.trigger.apply 8.9 s ✅ **没有超时**(异步流程立即返回)
|
|
238
|
+
④ +31 s status=3 文字提取中 | video_taskId 已生成 | video_taskResult=0 | 原文 0 字
|
|
239
|
+
+111 s status=4 | video_taskResult=1 | 原文 3986 字
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
⇒ **文档是同步的(会顶到 60s 超时),音频是异步的(8.9s 返回)**,
|
|
243
|
+
两者在"原文就绪"后服务端都写 `status=4`。
|
|
244
|
+
|
|
245
|
+
**收尾两步(同一音频纪要实测,全链路闭环):**
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
⑥ ESB …633「解析文本生成纪要」mainTable: {minuteId}
|
|
249
|
+
→ 返回 resultCode 200 执行成功
|
|
250
|
+
→ parse_content 2733 字(结构化纪要:会议主题/时间/地点/召集人/参会人员…)
|
|
251
|
+
→ minutes_status **1(生成中)**
|
|
252
|
+
|
|
253
|
+
⑦ ESB …628「保存解析并生成文档」mainTable: {parse_content, mt_minute_id}
|
|
254
|
+
→ 返回 resultCode 200,responseData.customData.mainTable.wdID = <wdID>
|
|
255
|
+
→ 纪要的 mt_minutes 被回写为该文档 id
|
|
256
|
+
→ minutes_status **2(已完成)**
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
⇒ 所以这两个 ESB **自己做完了全部写入与状态推进**,CLI 不需要写 `parse_content`、也不需要改状态。
|
|
260
|
+
|
|
261
|
+
三条必须记住的结论:
|
|
262
|
+
|
|
263
|
+
1. **`esb.trigger.apply` 是同步阻塞的**:它等动作流跑完才返回。文档解析也可能超过 60 秒上限。
|
|
264
|
+
⇒ 超时报 `write_uncertain` **不代表没执行**,必须查纪要字段,不能盲目重试。
|
|
265
|
+
2. **服务端自己会推进状态**(这里写成了 `4 文字提取完成`)——
|
|
266
|
+
所以 `writeContent` 的自动状态只是兜底,**不要硬改成与事实不符的值**。
|
|
267
|
+
3. **`mtAIMinutePageID` 在本租户是 `<智能纪要页面id>`**(从页面创建的纪要反查得到)。
|
|
268
|
+
传给解析动作流后流程正常执行 ⇒ 它是一个**固定的页面 id**,不是每条纪要各自生成的。
|
|
269
|
+
对外开放时这个值随应用走,需按租户配置,不要写死成泛微的。
|
|
270
|
+
|
|
271
|
+
### ✅ 生成文档不用问用户
|
|
272
|
+
|
|
273
|
+
用户原话:"肯定要生成的啊,不要问"。所以 `minutes_ready` 状态下**直接**调 ESB `…628`,
|
|
274
|
+
生成完把结果(文档 id、状态 2)告诉用户即可,**不要停下来问"要不要生成"**。
|
|
275
|
+
|
|
276
|
+
(此前版本要求"先问用户",已按用户最新指令撤销。)
|
|
277
|
+
|
|
278
|
+
## 从群聊消息生成纪要
|
|
279
|
+
|
|
280
|
+
**入口是会议,不是群**:正常场景是"拿着会议生成纪要",群 id 从会议记录里取。
|
|
281
|
+
|
|
282
|
+
**现在一条命令搞定**:`meeting.minute.fromGroupChat`(`pipeline` = `text`/`minutes`/`document`)。
|
|
283
|
+
实测 pipeline=text 全流程 **0.5–1.2 秒**(读会议 0.2s + 拉消息 0.13s + 建纪要 0.11s),
|
|
284
|
+
换成 scripts 里手动串命令要 6 秒 —— 进程内调用省掉了 5 次 CLI 冷启动。
|
|
285
|
+
|
|
286
|
+
### ⚠️ 权限边界(别误判成接口问题)
|
|
287
|
+
|
|
288
|
+
读消息用的是**当前登录账号的会话**调 E10 自己的接口:
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
POST /api/em/msg/executeIm/chat/syncGroupMsg
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
所以:
|
|
295
|
+
|
|
296
|
+
- 只能读到**这个账号所在的群**;
|
|
297
|
+
- 会议关联的群如果当前账号不在里面(别人建的群),**返回空** —— 这是权限,不是 bug;
|
|
298
|
+
- 客户环境里用小E 服务账号跑时,要确认该账号在会议群里。
|
|
299
|
+
|
|
300
|
+
### 消息量大(几千/几万条)怎么办
|
|
301
|
+
|
|
302
|
+
真正的瓶颈不是拉取,是 **ESB 633 要把 `minutes_content` 整段喂给模型**,几十万字会失败或效果崩。
|
|
303
|
+
所以分三层挡:
|
|
304
|
+
|
|
305
|
+
| 层 | 手段 | 说明 |
|
|
306
|
+
| --- | --- | --- |
|
|
307
|
+
| **拉取收敛** | 默认时间窗 = `max(会议创建时间, 开始前 7 天)` ~ `min(现在, 结束后 2 小时)` | 会前在群里分工的那几天会被覆盖;跨度受 im 侧 7 天上限约束 |
|
|
308
|
+
| **采样去噪** | 条数 > `sampleThreshold`(默认 200)时自动采样 | 必留:被 @ 的、含"负责/决定/截止/完成/风险/方案"等关键词的;丢弃:单字回复(嗯/好/收到)、纯表情、连续同人复读;每人非关键消息最多 `perSenderLimit` 条(默认 60),防止刷屏者淹没别人 |
|
|
309
|
+
| **摘要版兜底** | 原文超 `maxTranscriptChars`(默认 20000 字)时自动降级 | 只保留**分工/结论/待办**类发言,表头写明"共 N 条、仅保留 K 条";完整原文另存文件;`digest=false` 可关(不推荐) |
|
|
310
|
+
| **分层生成** | `pipeline` 分档 | `text` 只出原文(秒级),确认无误再 `minutes`/`document` |
|
|
311
|
+
|
|
312
|
+
#### 实测
|
|
313
|
+
|
|
314
|
+
| 场景 | 拉取耗时 | 端到端 | 结果 |
|
|
315
|
+
| --- | --- | --- | --- |
|
|
316
|
+
| 默认(阈值 200 + 摘要 20000) | **2.36s**(1200 条 / 24 页) | **2.9s** | 采样保留 **114** 条、丢弃 1086;原文 11035 字 → 未触发摘要 |
|
|
317
|
+
| 关采样(`sampleThreshold:100000`) | 2.03s | 2.3s | 原文 **145,034 字** → 摘要版压到 **19,969 字**,完整原文落盘 |
|
|
318
|
+
|
|
319
|
+
⇒ **拉取不是瓶颈**(约 1.7–2ms/条,5000 条约 9s),真正要控的是喂给 ESB 的长度。
|
|
320
|
+
⇒ 采样后原文基本稳定在 1 万字上下(与消息总数几乎无关),所以"几千条"不会把纪要撑爆;
|
|
321
|
+
只有**关掉采样**时才需要摘要版兜底。
|
|
322
|
+
|
|
323
|
+
采样是**显式**的:返回 `sampled` / `sampledDropped`,`warnings` 里写明"已采样,保留 X 条、丢弃 Y 条"——
|
|
324
|
+
**必须如实告诉用户"这份纪要是采样后生成的"**,不能让他以为是全量。
|
|
325
|
+
|
|
326
|
+
### 摘要版(超长兜底,约定)
|
|
327
|
+
|
|
328
|
+
采样压完仍超 `maxTranscriptChars` 时,**不硬塞全文**,改为只保留有决策价值的发言:
|
|
329
|
+
|
|
330
|
+
| 返回字段 | 含义 |
|
|
331
|
+
| --- | --- |
|
|
332
|
+
| `digestMode` | 是否走了摘要版 |
|
|
333
|
+
| `digestDropped` | 摘要阶段丢弃的闲聊条数 |
|
|
334
|
+
| `digestTruncated` | 摘要本身仍超长、已按时间截断(保留最早发言,通常是分工与背景) |
|
|
335
|
+
| `fullTranscriptPath` | **完整原文落盘路径**(`<CLI state>/state/transcripts/<会议id>-<时间>.txt`) |
|
|
336
|
+
| `transcriptLength` / `fullTranscriptLength` | 实际写进纪要的字数 / 完整原文字数 |
|
|
337
|
+
|
|
338
|
+
写进 `minutes_content` 的内容长这样(实测,11 条消息里 5 条闲聊被过滤):
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
【群聊摘要:共 10 条消息,仅保留与分工/结论/待办相关的 5 条,省略 5 条】
|
|
342
|
+
2026/10/26 17:09:51 张三:@李四 你负责 测试
|
|
343
|
+
2026/10/26 17:10:04 张三:@user1@example.com 你负责会议纪要的功能开发
|
|
344
|
+
2026/10/26 17:10:12 张三:@user3@example.com 你负责 会议日历的开发
|
|
345
|
+
2026/10/26 17:10:20 张三:@user2@example.com 你负责 整体的进度跟进
|
|
346
|
+
2026/10/26 17:10:35 张三:然后 所有的功能 都需要 实时汇报进度
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
⛔ **`digestMode=true` 时必须告诉用户"这是摘要口径,不是逐字全文",并给出 `fullTranscriptPath`。**
|
|
350
|
+
否则用户会以为纪要漏了内容,而实际上是我们主动省略的。
|
|
351
|
+
|
|
352
|
+
需要全量时:调大 `sampleThreshold`、或传更窄的 `from`/`to`、或 `sampling=false`(几千条会非常慢,慎用)。
|
|
353
|
+
`maxTranscriptChars` 也可调大,但**超过模型上下文长度时 ESB 633 会直接失败**,不是慢的问题。
|
|
354
|
+
|
|
355
|
+
下面是它内部的口径(保留下来便于排错):
|
|
356
|
+
|
|
357
|
+
```
|
|
358
|
+
会议 id
|
|
359
|
+
→ meeting.eb.meeting.list 单查(按 mt_id)取 imchat_groupid
|
|
360
|
+
→ im.msg.sync.group { groupId, num: 50 }
|
|
361
|
+
→ 按 msgtime **升序重排**(接口返回是倒序:新→旧)
|
|
362
|
+
→ 过滤 typeName='通知'(入群/改名等系统消息),但要统计条数告诉用户
|
|
363
|
+
→ 拼原文:"时间 说话人:内容" 逐行
|
|
364
|
+
→ meeting.eb.minute.create(minutes_content=原文, minutes_status=4, mt_minutes_ai_page)
|
|
365
|
+
→ ESB 633(minuteId)→ parse_content + 状态 1
|
|
366
|
+
→ ESB 628(parse_content + mt_minute_id)→ 文档 + mt_minutes + 状态 2
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**⚠️ 群聊与用户材料是「合并」而不是二选一**:只要会议有 `imchat_groupid`,
|
|
370
|
+
即便用户另外给了 `files`(本地材料,能抽文本就抽)或 `content`(直接给的正文),
|
|
371
|
+
群聊记录照样并入,材料排在群聊前面(`===== 用户提供的会议材料 =====` / `===== 群聊记录(N 条)=====`)。
|
|
372
|
+
只有既没有群、也没有材料时才报 `group_missing`;有群但窗内无消息时只 warning、仍用材料建纪要。
|
|
373
|
+
|
|
374
|
+
### `im.msg.sync.group` 的返回口径
|
|
375
|
+
|
|
376
|
+
| 字段 | 说明 |
|
|
377
|
+
| --- | --- |
|
|
378
|
+
| `msgid` / `msgtime` / `time` | 消息 id / 秒级时间戳 / 显示时间 |
|
|
379
|
+
| `sender` | **自己发的消息返回 `我`**,别人的返回姓名 |
|
|
380
|
+
| `from_uid` | 发送人 **IM uid**(不是 HRM 员工 id) |
|
|
381
|
+
| `typeName` | `文本` / `通知`(系统消息)/ 图片、文件等 |
|
|
382
|
+
| `content` | 文本内容;非文本消息可能为空,请看 `media` |
|
|
383
|
+
|
|
384
|
+
参数:`groupId`(必填)、`num`、`latest`、`from`/`to`(时间范围)、`startId`/`endId`。
|
|
385
|
+
|
|
386
|
+
### ⚠️ 三个坑
|
|
387
|
+
|
|
388
|
+
1. **顺序是倒的**:接口按新→旧返回,拼原文前必须按 `msgtime` 升序重排,否则纪要时间线是反的。
|
|
389
|
+
2. **`sender='我'` 不是人名**:要显示真名得拿 `from_uid` 调 `im.person.resolveByIds` 换。
|
|
390
|
+
3. **IM uid ≠ HRM 员工 id**:从群消息里提任务、要写 `executors` 时,必须先 uid → 实名 → HRM id 两步转换;
|
|
391
|
+
而且**邮箱样式的账号(如 `user1@example.com`)也是真实员工**(批量导入的账号名就是邮箱)——
|
|
392
|
+
**必须用 `username` 查 HRM**:`hrm.employee.query {username:'user1@example.com'}`
|
|
393
|
+
→ `user1@example.com (1300000000000000005)`,且该 id **正好等于 IM 的 `from_uid`**。
|
|
394
|
+
⚠️ 用 `email` 或 `keyword` 查**查不到**(实测 0 条),别因此误判"这个人不存在"。
|
|
395
|
+
|
|
396
|
+
### 实测耗时(会议 AAAAAA / 群 1790…003 / 11 条消息)
|
|
397
|
+
|
|
398
|
+
```
|
|
399
|
+
读会议+取群 id 2.2 s
|
|
400
|
+
拉群消息 2.1 s
|
|
401
|
+
拼原文(365 字) 1.3 s
|
|
402
|
+
建纪要 0.6 s
|
|
403
|
+
ESB 633 生成纪要文案 37.4 s ← AI 生成,最慢的一步,不要以为卡死
|
|
404
|
+
ESB 628 生成文档 3.0 s
|
|
405
|
+
--------------------------------------------------
|
|
406
|
+
端到端 约 46 s(不含人工确认)
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### 决议任务怎么落
|
|
410
|
+
|
|
411
|
+
用户口径:任务**统一走决议任务**,由 ESB 自动生成督办任务,CLI 只需生成决议:
|
|
412
|
+
|
|
413
|
+
```
|
|
414
|
+
meeting.eb.decision.publish(mt_content + detail1,每条 detail1 = 一项任务)
|
|
415
|
+
→ 内部写决议 + 回写会议(is_decision=2 / mt_status=8)
|
|
416
|
+
→ ESB 自动按明细生成「决议任务」
|
|
417
|
+
meeting.eb.decisionTask.list ← 核对任务是否生成(实测 5 s 内可见)
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
⚠️ `decision.publish` 会把会议 `mt_status` 置成 **8(结束)** —— 对未来的会议也一样,属于服务端口径。
|
|
421
|
+
|
|
422
|
+
### ❗待办:`mtAIMinutePageID`
|
|
423
|
+
|
|
424
|
+
它是"发消息提醒时拼接跳转链接"用的页面 id(对应纪要表 `mt_minutes_ai_page`),
|
|
425
|
+
用户确认**可以先忽略、不影响主逻辑**,暂时传空串;后续由 ESB 侧回写或约定生成规则后再补。
|
|
@@ -20,9 +20,9 @@ weaver-work-cli --json meeting run meeting.list --input-json '{"filterDate":"202
|
|
|
20
20
|
weaver-work-cli --json meeting today
|
|
21
21
|
weaver-work-cli --json meeting run meeting.room.list --input-json '{"beginDate":"2026-09-11 09:00","endDate":"2026-09-11 10:00","onlyAvailable":true}'
|
|
22
22
|
weaver-work-cli --json meeting run meeting.type.list --input-json '{"name":"项目","includeCount":true}'
|
|
23
|
-
weaver-work-cli --json meeting run meeting.room.usage --input-json '{"roomid":"
|
|
23
|
+
weaver-work-cli --json meeting run meeting.room.usage --input-json '{"roomid":"<会议室id>","bywhat":4,"currentdate":"2026-09-11"}'
|
|
24
24
|
weaver-work-cli --json meeting run meeting.calendar.base --input-json '{}'
|
|
25
|
-
weaver-work-cli --json meeting run meeting.detail.field --input-json '{"id":"
|
|
25
|
+
weaver-work-cli --json meeting run meeting.detail.field --input-json '{"id":"<会议id>"}'
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
macOS/Linux(bash/zsh):
|
|
@@ -33,9 +33,9 @@ weaver-work-cli --json meeting run meeting.list --input-json '{"filterDate":"202
|
|
|
33
33
|
weaver-work-cli --json meeting today
|
|
34
34
|
weaver-work-cli --json meeting run meeting.room.list --input-json '{"beginDate":"2026-09-11 09:00","endDate":"2026-09-11 10:00","onlyAvailable":true}'
|
|
35
35
|
weaver-work-cli --json meeting run meeting.type.list --input-json '{"name":"项目","includeCount":true}'
|
|
36
|
-
weaver-work-cli --json meeting run meeting.room.usage --input-json '{"roomid":"
|
|
36
|
+
weaver-work-cli --json meeting run meeting.room.usage --input-json '{"roomid":"<会议室id>","bywhat":4,"currentdate":"2026-09-11"}'
|
|
37
37
|
weaver-work-cli --json meeting run meeting.calendar.base --input-json '{}'
|
|
38
|
-
weaver-work-cli --json meeting run meeting.detail.field --input-json '{"id":"
|
|
38
|
+
weaver-work-cli --json meeting run meeting.detail.field --input-json '{"id":"<会议id>"}'
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
## 输出处理
|
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
### 回执
|
|
10
10
|
|
|
11
11
|
- 回执更新**必须传回执记录主键 `id`**(不是 `memberId`);`prepare` 会自动按 `memberId` 回查定位。
|
|
12
|
-
- ⚠️ **`memberId`
|
|
12
|
+
- ⚠️ **`memberId` 字段语义**:`meeting.receipt.list` 返回的一条回执里,
|
|
13
13
|
**`memberId` 是「姓名」、`memberIdId` 才是「人员 id」**。因此 `receipt.update.prepare` 的 `memberId`
|
|
14
14
|
**两种写法都接受**(人员 id 或姓名);CLI 会按 `memberIdId` / `memberId` 依次匹配,并在写请求 body 里统一带上**解析后的人员 id**。
|
|
15
15
|
列表输出的原始字段保持原样(`memberId`=姓名、`memberIdId`=人员 id),**不要**把 `memberId` 当成 id 使用。
|
|
16
16
|
- `attendStatus` 枚举:`0`=未填写、`1`=参加、`2`=不参加(回执"否/请假"传 2)。
|
|
17
|
-
- 回执列表接口必须带 `isMobile`(CLI 缺省 `false`)**与 `memberType`(CLI 缺省 `1
|
|
17
|
+
- 回执列表接口必须带 `isMobile`(CLI 缺省 `false`)**与 `memberType`(CLI 缺省 `1`)**:实测
|
|
18
18
|
**不传 `memberType` 必报 500「系统内部错误」**(此前只挡住了 `isMobile`),两者均已由 CLI 托管,调用方无需显式传。
|
|
19
19
|
|
|
20
20
|
### 签到
|
|
@@ -32,28 +32,28 @@
|
|
|
32
32
|
Windows PowerShell:
|
|
33
33
|
|
|
34
34
|
```powershell
|
|
35
|
-
weaver-work-cli --json meeting run meeting.receipt.list --input-json '{"mtId":"
|
|
36
|
-
weaver-work-cli --json meeting run meeting.receipt.update.prepare --input-json '{"mtId":"
|
|
35
|
+
weaver-work-cli --json meeting run meeting.receipt.list --input-json '{"mtId":"<会议id>"}'
|
|
36
|
+
weaver-work-cli --json meeting run meeting.receipt.update.prepare --input-json '{"mtId":"<会议id>","memberId":"101","attendStatus":2,"remark":"请假"}'
|
|
37
37
|
# 用户确认后:
|
|
38
38
|
weaver-work-cli --json meeting run meeting.receipt.update.apply --input-json '{"confirm":true,"continuation":"<prepare返回的continuation>"}'
|
|
39
|
-
weaver-work-cli --json meeting run meeting.sign.list --input-json '{"mtId":"
|
|
39
|
+
weaver-work-cli --json meeting run meeting.sign.list --input-json '{"mtId":"<会议id>"}'
|
|
40
40
|
# 补签(id 取 sign.list 里的 signs[].id):
|
|
41
|
-
weaver-work-cli --json meeting run meeting.sign.mark.prepare --input-json '{"id":"
|
|
42
|
-
weaver-work-cli --json meeting run meeting.sign.mark.apply --input-json '{"confirm":true,"continuation":"<prepare返回的continuation>","id":"
|
|
41
|
+
weaver-work-cli --json meeting run meeting.sign.mark.prepare --input-json '{"id":"<签到记录id>"}'
|
|
42
|
+
weaver-work-cli --json meeting run meeting.sign.mark.apply --input-json '{"confirm":true,"continuation":"<prepare返回的continuation>","id":"<签到记录id>"}'
|
|
43
43
|
# 补签退 / 清除签到(同构,换 operation):
|
|
44
|
-
weaver-work-cli --json meeting run meeting.sign.back.prepare --input-json '{"id":"
|
|
45
|
-
weaver-work-cli --json meeting run meeting.sign.clear.prepare --input-json '{"id":"
|
|
44
|
+
weaver-work-cli --json meeting run meeting.sign.back.prepare --input-json '{"id":"<签到记录id>"}'
|
|
45
|
+
weaver-work-cli --json meeting run meeting.sign.clear.prepare --input-json '{"id":"<签到记录id>"}'
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
macOS/Linux(bash/zsh):
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
weaver-work-cli --json meeting run meeting.receipt.list --input-json '{"mtId":"
|
|
52
|
-
weaver-work-cli --json meeting run meeting.sign.list --input-json '{"mtId":"
|
|
53
|
-
weaver-work-cli --json meeting run meeting.sign.mark.prepare --input-json '{"id":"
|
|
54
|
-
weaver-work-cli --json meeting run meeting.sign.mark.apply --input-json '{"confirm":true,"continuation":"<prepare返回的continuation>","id":"
|
|
55
|
-
weaver-work-cli --json meeting run meeting.sign.back.prepare --input-json '{"id":"
|
|
56
|
-
weaver-work-cli --json meeting run meeting.sign.clear.prepare --input-json '{"id":"
|
|
51
|
+
weaver-work-cli --json meeting run meeting.receipt.list --input-json '{"mtId":"<会议id>"}'
|
|
52
|
+
weaver-work-cli --json meeting run meeting.sign.list --input-json '{"mtId":"<会议id>"}'
|
|
53
|
+
weaver-work-cli --json meeting run meeting.sign.mark.prepare --input-json '{"id":"<签到记录id>"}'
|
|
54
|
+
weaver-work-cli --json meeting run meeting.sign.mark.apply --input-json '{"confirm":true,"continuation":"<prepare返回的continuation>","id":"<签到记录id>"}'
|
|
55
|
+
weaver-work-cli --json meeting run meeting.sign.back.prepare --input-json '{"id":"<签到记录id>"}'
|
|
56
|
+
weaver-work-cli --json meeting run meeting.sign.clear.prepare --input-json '{"id":"<签到记录id>"}'
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
## 输出处理
|