weaver-work-cli 0.1.36 → 0.1.38
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-XBVH7JU7.js → archive-PDV724YK.js} +5 -4
- package/dist/chunks/{archive-oa-MZM3EKFQ.js → archive-oa-4XE4MNXQ.js} +4 -3
- package/dist/chunks/{asset-4XO7UOUW.js → asset-PDL2QE2N.js} +8 -7
- package/dist/chunks/{attachment-content-VXSWANAC.js → attachment-content-MDDGOE5E.js} +3 -3
- package/dist/chunks/{blog-PGZKOPSC.js → blog-UYR3EUXW.js} +5 -4
- package/dist/chunks/{caizhilian-BH4ZVGUN.js → caizhilian-LG2X5NMF.js} +5 -4
- package/dist/chunks/{calendar-MXEMTIO4.js → calendar-FG4BAZHE.js} +4 -3
- package/dist/chunks/{chunk-NCOVUAZK.js → chunk-6FTTSA45.js} +4 -3
- package/dist/chunks/{chunk-HXJQI5NM.js → chunk-6LTFIFLM.js} +3 -2
- package/dist/chunks/{chunk-QYGO5EE2.js → chunk-CORFRD7Q.js} +4 -3
- package/dist/chunks/{chunk-QHFANTX7.js → chunk-DMV2TOMH.js} +1348 -90
- package/dist/chunks/{chunk-TC6MZAO3.js → chunk-ELYDWBZJ.js} +52 -2
- package/dist/chunks/{chunk-JCSN3JGM.js → chunk-FUWVHMVV.js} +7 -6
- package/dist/chunks/{chunk-BPE37FPB.js → chunk-GGJFMNJM.js} +3 -3
- package/dist/chunks/{chunk-6LLJFKJE.js → chunk-IZUDA353.js} +1 -1
- package/dist/chunks/{chunk-XMGSYD6S.js → chunk-J7USS3ED.js} +4 -4
- package/dist/chunks/{chunk-F746NKNF.js → chunk-JSMFPO43.js} +1 -1
- package/dist/chunks/{chunk-T72N74ZT.js → chunk-KKRL3REV.js} +5 -4
- package/dist/chunks/{chunk-VPUTVEMC.js → chunk-NI6GIPIM.js} +98 -3
- package/dist/chunks/{chunk-VPXOPQJI.js → chunk-NR6RKXPA.js} +2 -2
- package/dist/chunks/{chunk-JNG42JKG.js → chunk-OJQUJZQF.js} +4 -6
- package/dist/chunks/{chunk-I6QGIBDM.js → chunk-UJJD4QWF.js} +4 -3
- package/dist/chunks/{chunk-JUXVYKII.js → chunk-UZZBA6PV.js} +174 -14
- package/dist/chunks/{chunk-JYKABYCV.js → chunk-VRYHGG6O.js} +2 -2
- package/dist/chunks/{chunk-WXFPWCXG.js → chunk-XJY7G4DD.js} +3 -3
- package/dist/chunks/{chunk-5DQEEGCC.js → chunk-Z32KWY6G.js} +1 -1
- package/dist/chunks/{conflict-JAB2LJEZ.js → conflict-BQZEQ4SP.js} +2 -2
- package/dist/chunks/{contract-XI2EEIZU.js → contract-XIRAFTEV.js} +4 -3
- package/dist/chunks/{cowork-SCPGLBA4.js → cowork-BLG62BL2.js} +4 -3
- package/dist/chunks/{ebuilder-form-EYLHNOTA.js → ebuilder-form-NUKG5QW4.js} +3 -3
- package/dist/chunks/{ehr-EAP77IMT.js → ehr-2STW5ILH.js} +4 -3
- package/dist/chunks/{esb-2TGGXEE7.js → esb-UUDQUNKY.js} +4 -4
- package/dist/chunks/{fna-2X7ZE7BU.js → fna-6RCY4NU5.js} +4 -3
- package/dist/chunks/{host-C6EL2RKL.js → host-7RXEDMAH.js} +3 -3
- package/dist/chunks/{host-XCLDDXKQ.js → host-EJZFROU3.js} +3 -3
- package/dist/chunks/{host-I4NRK4MX.js → host-FWDOSRH5.js} +3 -3
- package/dist/chunks/{host-Q4LZGCRU.js → host-RHM3NPXV.js} +3 -3
- package/dist/chunks/{host-UEI5FGDM.js → host-UFF33TWJ.js} +3 -3
- package/dist/chunks/{hrm-YXERJM76.js → hrm-PKJ6ELSH.js} +3 -3
- package/dist/chunks/{im-A4VZN2TQ.js → im-YJAXS7CO.js} +3 -3
- package/dist/chunks/{invoice-2Z6YPMIS.js → invoice-HWVSXGX6.js} +3 -3
- package/dist/chunks/{jiuchuanhui-AR5GMKZB.js → jiuchuanhui-L7VKILZB.js} +4 -3
- package/dist/chunks/{lazy-dispatch-QXW7P4X3.js → lazy-dispatch-NMYEIHRH.js} +4 -4
- package/dist/chunks/{mail-7GZ6CPBJ.js → mail-B42RRU7G.js} +4 -3
- package/dist/chunks/{meeting-3NMGA3MB.js → meeting-CFYVBJSS.js} +13 -12
- package/dist/chunks/{okr-BZ6XUOAG.js → okr-GCLF6V7W.js} +4 -3
- package/dist/chunks/{plan-DR5CMUYP.js → plan-ZVL7GBRI.js} +4 -3
- package/dist/chunks/{project-6J63MK33.js → project-4YWAAE2K.js} +4 -3
- package/dist/chunks/{registry-VRTNC6UR.js → registry-EP4VTHZS.js} +8 -8
- package/dist/chunks/{registry-KDD7DHNK.js → registry-FRJ6H7BT.js} +4 -4
- package/dist/chunks/{registry-TKX2E7C7.js → registry-SG2PGVCF.js} +2 -2
- package/dist/chunks/{room-recommend-XCWRMB5P.js → room-recommend-R3JVUUAC.js} +4 -4
- package/dist/chunks/{schedule-IVBICP32.js → schedule-NIJBTYDO.js} +4 -4
- package/dist/chunks/{workflow-D74NFK3C.js → workflow-BB24DFBY.js} +4 -4
- package/dist/index.js +27 -27
- package/dist/internal/e10/auth-recovery.js +114 -1
- package/dist/internal/e10/client.js +16 -2
- package/dist/internal/e10/request-runtime.js +103 -7
- package/dist/shortcuts/archive/host.js +3 -2
- package/dist/shortcuts/archive-oa/host.js +2 -1
- package/dist/shortcuts/asset/host.js +6 -5
- package/dist/shortcuts/blog/host.js +3 -2
- package/dist/shortcuts/caizhilian/host.js +3 -2
- package/dist/shortcuts/calendar/host.js +2 -1
- package/dist/shortcuts/contract/host.js +2 -1
- package/dist/shortcuts/cowork/host.js +2 -1
- package/dist/shortcuts/ebuilder-form/host.js +3 -1
- package/dist/shortcuts/ehr/host.js +2 -1
- package/dist/shortcuts/esb/host.js +2 -1
- package/dist/shortcuts/fna/host.js +2 -1
- package/dist/shortcuts/hrm/host.js +2 -1
- package/dist/shortcuts/im/host.js +3 -2
- package/dist/shortcuts/invoice/host.js +5 -4
- package/dist/shortcuts/jiuchuanhui/host.js +2 -1
- package/dist/shortcuts/mail/host.js +2 -1
- package/dist/shortcuts/meeting/host.js +3 -2
- package/dist/shortcuts/meeting/invitation/text.js +71 -0
- package/dist/shortcuts/meeting/operations/eb/create-flow.js +1073 -50
- package/dist/shortcuts/meeting/operations/eb/crm-search.js +478 -0
- package/dist/shortcuts/meeting/operations/eb/factory.js +60 -1
- package/dist/shortcuts/meeting/operations/eb/index.js +2 -0
- package/dist/shortcuts/meeting/operations/invitation.js +122 -9
- package/dist/shortcuts/okr/host.js +2 -1
- package/dist/shortcuts/plan/host.js +2 -1
- package/dist/shortcuts/project/host.js +2 -1
- package/dist/shortcuts/workflow/operations/form.js +160 -2
- package/package.json +1 -1
- package/skills/weaver-e10-meeting/SKILL.md +250 -301
- package/skills/weaver-e10-meeting/references/meeting-eb.md +203 -0
- package/skills/weaver-e10-meeting/references/meeting-invitation.md +37 -5
- package/skills/weaver-e10-meeting.zip +0 -0
- package/skills/weaver-e10-okr/references/source-manifest.json +3 -3
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +3 -3
|
@@ -782,6 +782,78 @@ video_taskResult 为空 且 parse_content 为空 → 未触
|
|
|
782
782
|
实测遇到两次(`update_mt_decision_task` 首次调用、EB 列表接口),**重试即成功**,且数据未被写坏。
|
|
783
783
|
判定方法:报这个错时先 `list` 回查;没写进去再重试一次,**不要连试三次以上**。
|
|
784
784
|
|
|
785
|
+
## 提交方式:默认直提(2.41.0 起,2026-10-31 真机事故)
|
|
786
|
+
|
|
787
|
+
小e 的浏览器填单页(`<browsertool>` + `params.customParams`)**只给文本类字段赋值**:
|
|
788
|
+
|
|
789
|
+
| 字段类型 | customParams 传过去的效果 |
|
|
790
|
+
|---|---|
|
|
791
|
+
| 文本 / 多行文本 / 日期 / 数字 | ✅ 正常带出 |
|
|
792
|
+
| 浏览按钮(会议地点) | 未单独核实(用户只报了人员和客户为空) |
|
|
793
|
+
| 浏览按钮(**参会人员**) | ❌ 表单里空着 |
|
|
794
|
+
| 客户浏览按钮(**参会客户**) | ❌ 表单里空着 |
|
|
795
|
+
|
|
796
|
+
所以"我明明说了参会人和客户,表单里一个都没有"不是 CLI 没传,而是**那一档页面不支持**。
|
|
797
|
+
2026-10-31 起 `meeting.eb.meeting.create.flow.quick / apply` **默认 `submit_mode=direct`**:
|
|
798
|
+
直接 `workflow.createRequest action=submit` 写服务端,实测(requestId `1332418264069103616`):
|
|
799
|
+
|
|
800
|
+
- `hrm_members` / `crm_members` 全部落库,`meeting.eb.meeting.detail --id <meetingId>` 回读可见
|
|
801
|
+
(人员回姓名文本「王丹丹」、客户回 id「1258347137804009474」);
|
|
802
|
+
- 会议当场生成(`meetingId` 有值)→ 邀请函 `invitation.pending=false`,是**真实会议数据版**,
|
|
803
|
+
不再有「客户单位」「召集人」这些【待补充】;
|
|
804
|
+
- 返回里有 `requestId` + `meetingId`,⛔ 判成功看这两个 id,不要看有没有 `finalMarkdown`。
|
|
805
|
+
|
|
806
|
+
`submit_mode=browser` 保留原行为(预填 + 用户点提交),只在用户明确要求"自己核对表单"时用。
|
|
807
|
+
|
|
808
|
+
## 「召集人 / 联系人」缺省 = 当前登录人(2.43.0)
|
|
809
|
+
|
|
810
|
+
**为什么**:这两个字段以前只有显式传 `caller` / `contacter` 才有值,**换个人用(另一个账号)建会就整块空白** ——
|
|
811
|
+
流程单上看不出谁召集的,邀请函「召集人」落成【待补充】。现在默认"自己召集、自己联系"。
|
|
812
|
+
|
|
813
|
+
- 取 `session.userId` → `hrm.employee.batch` 换姓名 → 提交 `{id,name}`(Employee 组件要的形态);
|
|
814
|
+
- 各自独立兜底:只传了 `caller` 时,`contacter` 仍补当前登录人;显式传的值**一律不覆盖**;
|
|
815
|
+
- 返回 `preview.autoFilled = {"召集人":"卜伟领(4980…)","联系人":"卜伟领(4980…)"}` +
|
|
816
|
+
一条 warning「已按当前登录人补齐」;
|
|
817
|
+
- ⛔ 查不到姓名就**不填**(两个都缺时给 warning)—— 在 `userId ≠ 员工 id` 的租户里硬塞 id 会被服务端判
|
|
818
|
+
`NEEDS_CONFIRMATION`,提交直接卡住,比留空更糟。
|
|
819
|
+
|
|
820
|
+
真机实测(泛微生产 `e-cology.com.cn`,2026-10-31):`prepare` 里两个字段都是 `{id,name}`,
|
|
821
|
+
`apply` 后 `meetingId 1332426188317081604` 回读 `caller=卜伟领`、`contacter=卜伟领`,
|
|
822
|
+
邀请函正文「卜伟领 诚邀您参加…」。
|
|
823
|
+
|
|
824
|
+
## 提交前核对 & 客户联系人自动带入(2.44.0)
|
|
825
|
+
|
|
826
|
+
- `create.flow.prepare` 的 `preview.formPreview`:**人话 Markdown 表格**(字段名 → 值),
|
|
827
|
+
人员/客户都显示姓名不显示 id,空值 `—`。用途 = 替代走不通的浏览器填单核对环节:
|
|
828
|
+
**先贴给用户确认,再 apply/quick**。
|
|
829
|
+
- `create.flow.apply` / `quick` 的 `submittedPreview`:本次实际提交的字段表(同一渲染器),
|
|
830
|
+
提交后必须贴出来 —— 用户要「看得见填进去了什么」。
|
|
831
|
+
- 客户联系人**全自动**:传 `crm_members` 后,CLI 取该项的 `contacts`(`crm.search` 的 items 原样传过来就有),
|
|
832
|
+
没有就自己回查一次 `crm.search`,把**全部**联系人写成「参会客户明细」行
|
|
833
|
+
(`姓名` / `手机号码` / `备注=部门:X`)。要只留某几位才用 `crm_member_details` 覆盖。
|
|
834
|
+
- `meeting.eb.meeting.detail` 新增 `personnelText`(`caller`/`contacter`/`hrm_members`/`mt_creator`… → 姓名):
|
|
835
|
+
原字段是**原始存储值**(页面建单 = id、工作流建单 = 姓名文本),对外表述一律用 `personnelText`。
|
|
836
|
+
|
|
837
|
+
## 「参会客户」是 eBuilder 组件 —— 这是对的,别再劝人改表单(2.45.0 纠偏)
|
|
838
|
+
|
|
839
|
+
| 流程 | 「参会客户」字段 | 组件 |
|
|
840
|
+
| --- | --- | --- |
|
|
841
|
+
| 会议申请流程 `1326190634427154474`(文档里也写作「旧」) | `1332418251116929025` | `Ebuilder` |
|
|
842
|
+
| 会议申请流程(NEW)`1325677244111462606` | `1332437840406257666` | `Ebuilder` |
|
|
843
|
+
|
|
844
|
+
- ⛔ 2.44.0 及以前这里写的是「组件不吃客户值,要换回 Customer」——**这个判断是错的**(2026-10-31 用户纠正)。
|
|
845
|
+
同一张表单的「会议地点」也是 `Ebuilder`,一直写得进去;`Ebuilder` 就是吃 `{id,name}` 的浏览按钮。
|
|
846
|
+
- 流程单据 → 会议表的同步**由 ESB 动作流的字段映射负责**(2026-10-31 用户确认:「你发起流程后,
|
|
847
|
+
字段映射是靠 ESB 来的,这个我已经配置好了」),会议表那边落的是 `ufd_crm_members_new`。
|
|
848
|
+
⇒ **CLI 不再自己补写**会议表的 `crm_members`:那一列 dataKey 与页面字段不是同一个,
|
|
849
|
+
写它既不落页面、回读也永远为空,只会多出一条「客户没关联上」的假警报,把验收带偏。
|
|
850
|
+
需要回退旧行为时置 `WEAVER_MEETING_CRM_PATCH=1`(`patchMeetingCrmMembers` 仍在,只用于调试)。
|
|
851
|
+
- ⛔ 不要用会议表 `crm_members` 的空值判断客户有没有代进去;要看流程单据(`workflow.detail` 的
|
|
852
|
+
fieldValues 里带「客户名(id)」)或会议页面实际显示。
|
|
853
|
+
- 「参会客户明细」不受影响(普通明细表,姓名/手机照常落库)。
|
|
854
|
+
- `create.flow.prepare` 仍会按组件类型给一条说明(点名字段 id 与 `componentKey`),看到**照实转达**,
|
|
855
|
+
但**不要再建议改表单**。
|
|
856
|
+
|
|
785
857
|
## 流程建会字段:datakey(fieldId)固化
|
|
786
858
|
|
|
787
859
|
**为什么**:NEW 建会流程(`1325677244111462606`)的表单字段名带提示语 ——
|
|
@@ -889,3 +961,134 @@ weaver-work-cli meeting ops --capability eb.meeting # 按分组看(支持前
|
|
|
889
961
|
- **ESB 日程调用失败** → 退化为只看会议回执,`scheduleItems` 为空可判断;
|
|
890
962
|
- 被剔除的槽在 `skippedSlots` 里("人空闲但没房间"),可以据此解释为什么候选少。
|
|
891
963
|
|
|
964
|
+
## 指定的会议室怎么核验(2.39.3 起)
|
|
965
|
+
|
|
966
|
+
`prepare` 拿到 `address` 后,**先解析成台账里的真实房间**再核验,顺序是:
|
|
967
|
+
|
|
968
|
+
```
|
|
969
|
+
解析(id / 名称 / 名称(id)) → 存在性 → 封存状态 → 该时段占用 → 才允许进确认摘要
|
|
970
|
+
```
|
|
971
|
+
|
|
972
|
+
- **存在性**:名称在台账里找不到 → `selectionType: room` + 文案「没找到名为 X 的会议室」。
|
|
973
|
+
以前这种情况会被一路放行,地点按纯文本塞进表单,用户到流程页面提交时才被工作流打回
|
|
974
|
+
「请按名称选择」—— 报错位置离真实原因太远(2026-10-31 真机)。
|
|
975
|
+
- **封存(status=1)**:拦下并要求换房,不拿封存房去建会。
|
|
976
|
+
- **占用**:调 `meeting.eb.conflict.room`(`query_roomusage_list`)。
|
|
977
|
+
⛔ 2.39.2 及以前**只有纯数字 id 才查**,传名称(用户最常说的「测试会议室1」)整段被跳过,
|
|
978
|
+
一间已被占用的房照样进确认摘要 —— 这是 2026-10-31 用户质疑"最后一步才校验"时挖到的真因。
|
|
979
|
+
- **台账读失败 ≠ 房间不存在**:此时标记 `lookupFailed`,跳过占用判定但不拦(避免网络抖动被当成"没这间房");
|
|
980
|
+
能否核验要如实说,不能声称"已确认空闲"。
|
|
981
|
+
- 解析结果复用在三个地方:占用检测、确认摘要里的地点名、房间选项里「(你指定的,待确认)」的匹配。
|
|
982
|
+
|
|
983
|
+
## 参会客户:从名称到客户 id(2.39.5 定案)
|
|
984
|
+
|
|
985
|
+
会议流程主表上的「参会客户」是 **客户浏览按钮**(`CustomerComponent`,NEW 流程 fieldId `1326141435517583562`),
|
|
986
|
+
值必须是客户 id,传客户名称文本会被工作流打回。所以链路是「先查 → 用户确认 → 再传 id」:
|
|
987
|
+
|
|
988
|
+
| 步骤 | 调用 | 说明 |
|
|
989
|
+
|---|---|---|
|
|
990
|
+
| ① 查 | `meeting.eb.crm.search {"keyword":"上海泛微网络科技股份有限公司"}` | 走 ESB 动作流 `esbFlowId=904205116264026112`,入参字段 **`custom_name`** |
|
|
991
|
+
| ② 确认 | —— | ⛔ 不许自动取第一条(同 SKILL 规则 0.5);`exact:false` 时必须把命中名念给用户 |
|
|
992
|
+
| ③ 传值 | `create.flow.prepare` 的 `crm_members` | 把 search 的 `items` 原样传(`[{customerId,name}]`)最省事;`[{id,name}]`、`客户名(客户id)`、逗号分隔都认。⛔ **必须带名称**,只给 id 抛 `crm_name_required` |
|
|
993
|
+
|
|
994
|
+
**请求体(动作流契约,2026-10-31 真机核对)**
|
|
995
|
+
|
|
996
|
+
```json
|
|
997
|
+
{ "customParams": { "mainTable": { "custom_name": "泛微网络" } }, "esbFlowId": "904205116264026112" }
|
|
998
|
+
```
|
|
999
|
+
|
|
1000
|
+
返回 `actionData.responseData.customData.mainTable = { mc, sjID }`:`sjID`=客户 id,`mc`=客户名称。
|
|
1001
|
+
|
|
1002
|
+
**三条真机事实(别再用猜的)**
|
|
1003
|
+
|
|
1004
|
+
1. **入参字段名就是 `custom_name`**。之前试 `mc`/`sjmc`/`khmc`/`customerName` 全部无效、
|
|
1005
|
+
误判成"模板空所以参数进不去"—— 真因是字段名不对。`esb.input-format`(copyCustomData)对这个流返回
|
|
1006
|
+
`customParams: null`,含义是「**没配自定义入参模板 = 透传**」,不是「模板是空对象 = 丢弃入参」。
|
|
1007
|
+
⇒ CLI 现在:模板 `null` 时用默认字段名 `custom_name` 照常发;只有模板明确是 `mainTable: {}` 才判
|
|
1008
|
+
`blocked:"esb_template_empty"`。
|
|
1009
|
+
2. **一次只回 1 条**(服务端是"包含匹配 + 取首个命中"):`当前`/`pageSize`/`rows` 都不改变结果,
|
|
1010
|
+
所以"查 10 条给用户挑"做不到。实测:
|
|
1011
|
+
| 关键词 | 返回 |
|
|
1012
|
+
|---|---|
|
|
1013
|
+
| 深圳市腾讯斐泰科技有限公司 | 深圳市腾讯斐泰科技有限公司 / 1320482515670098010(`exact:true`)|
|
|
1014
|
+
| 腾讯 | 深圳市腾讯斐泰科技有限公司 / 1320482515670098010(`exact:false`)|
|
|
1015
|
+
| 泛微 | 泛微 / 1331361148057387759(库里真有叫「泛微」的客户,**不是**上海泛微)|
|
|
1016
|
+
| 泛微网络 | 泛微网络科技有限公司 / 1330932351389754061 |
|
|
1017
|
+
| 上海泛微网络科技股份有限公司 | 上海泛微网络科技股份有限公司 / 1315014081515634745 |
|
|
1018
|
+
| 不存在的客户XYZ | `{mc:"", sjID:""}` 空行 → `items: []` |
|
|
1019
|
+
⇒ 给全称最稳;片段命中名跟用户说的不一致时**必须回问**。
|
|
1020
|
+
3. **`hasData` 恒为 0**,命中时也是 0 ⇒ 判空只看 `mc`/`sjID`,不要看 `hasData`(CLI 已不再用它下结论)。
|
|
1021
|
+
|
|
1022
|
+
- 出参:`items:[{customerId,name}]`、`total`、`exact`(命中名==关键词)、`singleBestMatch`、
|
|
1023
|
+
`source`(命中 customData 哪条路径)、`keywordField`(实际传的入参字段)、`blocked`。
|
|
1024
|
+
- 解析兼容多种输出形态(动作流改结构不用改代码):`customData.mainTable` 单条、
|
|
1025
|
+
`.list/rows/items/data…`、`customData.detail1|detail2…`,行被 `{mainTable:{…}}` 包一层也能剥开;
|
|
1026
|
+
字段别名兼容 `id/customerId`、`name/sjmc`。
|
|
1027
|
+
- 「应到客户数」(fieldId `1326141435517583564`)按 `crm_members` 条数**自动算**;
|
|
1028
|
+
要覆盖就显式传 `crm_member_count`。
|
|
1029
|
+
|
|
1030
|
+
## 参会客户明细(明细表,2.39.6 起;2.39.7 打通落库)
|
|
1031
|
+
|
|
1032
|
+
宿主表单里另有一张**明细表**「参会客户明细」,列固定 5 个:姓名 / 性别 / 职位 / 手机号码 / 备注。
|
|
1033
|
+
|
|
1034
|
+
**联系人与地址来自 ESB 出参 `lxr` / `khdz`**(2026-10-31 用户加上后的实测形状):
|
|
1035
|
+
|
|
1036
|
+
| ESB 字段 | 含义 | 真机值示例 |
|
|
1037
|
+
|---|---|---|
|
|
1038
|
+
| `lxr` | 联系人明细(数组) | `{"field_…706":"利明","field_…708":"11111111111","field_…707":"信息部"}` |
|
|
1039
|
+
| ↳ `field_1173221220888062706` | 姓名 | 利明 / 胡老师 / 谷俊 |
|
|
1040
|
+
| ↳ `field_1173221220888062708` | 手机号 | 11111111111 |
|
|
1041
|
+
| ↳ `field_1173221220888062707` | 部门(部分行没有) | 信息部 |
|
|
1042
|
+
| `khdz` | 客户地址明细(数组) | ⛔ **只回明细行 id**,没有地址文本 |
|
|
1043
|
+
|
|
1044
|
+
`crm.search` 会把 `lxr` 归一化成 `items[].contacts = [{name,mobile,dept}]`(按姓名+手机号去重),
|
|
1045
|
+
`khdz` 归一化成 `items[].addresses`(当前恒为空,同时回 `addressHint` 说明"ESB 没输出地址文本")。
|
|
1046
|
+
|
|
1047
|
+
用法:
|
|
1048
|
+
- **有 `contacts`** → 把「姓名(部门)手机号」列成选项让用户挑一位,⛔ 不许自己选;
|
|
1049
|
+
- **没有 `contacts`** → 问用户联系人姓名+手机号(有的话再要职位/性别);
|
|
1050
|
+
- 选定后与客户一起提交 `crm_member_details:[{"xm","sjhm","zw","xb"}]`(部门放 `zw`)。
|
|
1051
|
+
- `prepare` 发现「传了客户没带明细」会 warning 提醒,别忽略。
|
|
1052
|
+
|
|
1053
|
+
| 项 | 值(e-cology「会议申请流程」真机) |
|
|
1054
|
+
|---|---|
|
|
1055
|
+
| 宿主流程 | `1326190634427154474` 会议申请流程(eBuilder 表单 `1179906784309559297`,表 `uf_mt_work_chkhmx`)|
|
|
1056
|
+
| subFormId | `1332370499762806784`(= `data.details` 的键)|
|
|
1057
|
+
| 列字段 id | 姓名 `1332370499762806785`(xm) / 性别 `…786`(xb) / 职位 `…787`(zw) / 手机号码 `…788`(sjhm) / 备注 `1332370774666043392`(bz) |
|
|
1058
|
+
|
|
1059
|
+
**入参**:`create.flow.prepare` 的 `crm_member_details`
|
|
1060
|
+
|
|
1061
|
+
```json
|
|
1062
|
+
[{"xm":"张三","xb":"男","zw":"采购经理","sjhm":"13800000000","bz":"主谈"}]
|
|
1063
|
+
```
|
|
1064
|
+
中文键(`姓名/性别/职位/手机号码/备注`)与 `name/mobile/title/remark` 等别名都认;
|
|
1065
|
+
姓名与手机号都为空的行走丢弃;subFormId 与列字段 id **不用传**,CLI 从 `workflow.createForm` 的字段清单里按列名反查
|
|
1066
|
+
(`resolveCrmDetailTarget`:挑「有姓名列」且命中列数最多的那张表,不会误选会议议题/会议服务)。
|
|
1067
|
+
|
|
1068
|
+
**⛔ 三个必须知道的现实(2026-10-31 真机核实)**
|
|
1069
|
+
|
|
1070
|
+
1. **明细字段只认「发起节点布局」**。表建好、表单字段管理里也有、节点字段权限(`viewRelateConfig`)也勾了 display,
|
|
1071
|
+
但**没摆上发起节点布局**、或**摆在隐藏行**上时,`getFormLayout` 的 `pageLayouts[0].comps` 里虽然能看到这张
|
|
1072
|
+
DetailTable,它下面 5 个列字段却会被判「不可见」→ `workflow.createForm` 的 `fields` 里没有它们 →
|
|
1073
|
+
`data.details` 一提交就被 `bindInputFields` 判 `NOT_FOUND`。
|
|
1074
|
+
CLI 现在会返回 `layoutWarning`("明细表 N 的 k 个字段全部被判为不可见(该明细表所在的行/列在表单布局里是隐藏的)"),
|
|
1075
|
+
**看到它就去查布局,不要回"表单里没有这张明细表"**。查法:`pageLayouts[0].config.workbook.Sheet1.rows[<DetailTable 的 excel.row>].visible`
|
|
1076
|
+
为 `false` ⇒ 那一行是隐藏行(真机实例:明细表在 row 8,`visible:false, attrs:{hide:true}`)。
|
|
1077
|
+
修法:设计器里把明细表挪到可见行 / 取消隐藏该行,保存发布后重新载入表单。
|
|
1078
|
+
2. **明细表和触发它的主表字段常配「显示联动」**(本租户:`参会客户` 为空 ⇒ 整表 `hideLine`;非空 ⇒ `show`)。
|
|
1079
|
+
这是**正常配置,不是配错**。旧逻辑把它与"隐藏行"一视同仁 ⇒ 整表字段被丢,建会写不进明细。
|
|
1080
|
+
现在 `buildCreateFormData` 会认这种 `detail` + `show` 规则:字段照常下发并标 `conditional: true`,
|
|
1081
|
+
`layoutWarning` 里点名触发字段(如「明细表 1332370499762806784 因显示联动隐藏,触发字段:参会客户」)。
|
|
1082
|
+
主表字段自己也配了 `show` 的(`参会客户` 就是)同样处理 —— 否则 `crm_members` 根本映射不到字段。
|
|
1083
|
+
⇒ 看到 `conditional: true` **照常填**,填上触发字段表单里就显示了。
|
|
1084
|
+
3. **同一条流程上两者可能都齐全,也可能只占一半**:
|
|
1085
|
+
- 「会议申请流程」`1326190634427154474`:**同时有**「参会客户」(`1329100543558172681`)与「参会客户明细」;
|
|
1086
|
+
- 「会议申请流程(NEW)」`1325677244111462606`:有「参会客户」(`1326141435517583562`)/「应到客户数」,**没有**明细表。
|
|
1087
|
+
⇒ 落到没有该字段的流程时,`prepare` 的 `unmapped` 会提示(`crm_member_count` 属自动派生,已静默忽略),
|
|
1088
|
+
如实告知用户即可。
|
|
1089
|
+
|
|
1090
|
+
**真机落库证据(2026-10-31,requestId `1332389461976473600`)**:单据详情 `workflow.detail` 回读 —— 姓名「张三」/
|
|
1091
|
+
性别「男」/ 职位「采购经理」/ 手机号码「13800000000」/ 备注「主谈」全部落库,`参会客户` = 「深圳市腾讯斐泰科技有限公司」。
|
|
1092
|
+
|
|
1093
|
+
**⛔ 参会客户只给 id 会被静默存空**:客户浏览按钮按**名称**落 `dataOptions.content`,`[{id:"…",name:""}]`
|
|
1094
|
+
提交后单据里是空值、**不报错**。CLI 现在抛 `crm_name_required` 拦住,必须传 `[{id,name}]` 或 `客户名(客户id)`。
|
|
@@ -40,7 +40,29 @@ weaver-work-cli --json meeting run meeting.invitation.render --input-json \
|
|
|
40
40
|
|
|
41
41
|
## 出参
|
|
42
42
|
|
|
43
|
-
`filePath` / `fileName` / `bytes` / `meetingId` / `meetingName` / `filledFields[]` / `pendingFields[]` / **`dataSource`**,以及 `warnings`(有待补充字段时会列出)。
|
|
43
|
+
`text` / `filePath` / `fileName` / `bytes` / `meetingId` / `meetingName` / `filledFields[]` / `pendingFields[]` / **`dataSource`**,以及 `warnings`(有待补充字段时会列出)。
|
|
44
|
+
|
|
45
|
+
### `text`:对话内直接展示的正文(2.42.0 起)
|
|
46
|
+
|
|
47
|
+
**这是给"在对话里看"用的**,与 docx 同源同字段(走同一个占位符解析器和同一份议程行),
|
|
48
|
+
只是换成 Markdown:标题 / 称呼 / 邀请语 / 会议要素 / 议程表 / 落款 / 备注。
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
# 邀请函
|
|
52
|
+
|
|
53
|
+
**尊敬的 某某集团:**
|
|
54
|
+
|
|
55
|
+
王丹丹 诚邀您参加「灰度测试对业务的好处沟通会」,现将会议安排通知如下:
|
|
56
|
+
|
|
57
|
+
- **会议名称**:…
|
|
58
|
+
- **会议时间**:2026-11-01 14:00~15:00
|
|
59
|
+
…
|
|
60
|
+
| 议程安排 | 议程内容 | 议程时间 |
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
⛔ 用户要的是**在对话里看到邀请函内容**(2026-10-31 明确纠正:"不是发文件,是直接在智能体对话中来展示的")。
|
|
64
|
+
所以回复必须把 `text` 全文贴出来,`filePath` 只是附带的"可下载打印"说明。
|
|
65
|
+
⛔ 别把 `text` 包进代码块(会变成一段代码,不像邀请函),也别只贴前几行。
|
|
44
66
|
|
|
45
67
|
| `dataSource` | 含义 |
|
|
46
68
|
| --- | --- |
|
|
@@ -54,6 +76,8 @@ weaver-work-cli --json meeting run meeting.invitation.render --input-json \
|
|
|
54
76
|
| `agendaSource` | `meeting.topic`=按会议议题自动填 / `extra`=调用方传入 / `template`=**没有议题,保留模板示例行** |
|
|
55
77
|
| `agendaRows` | 实际写入议程表的行数(`template` 时为 0) |
|
|
56
78
|
| `agendaTableFilled` | 是否真的重建了议程表 |
|
|
79
|
+
| `detailSupplemented` | 用 `meeting.eb.meeting.detail` 补回来的字段名(list 单查会丢「参会人员」,见「注意事项」) |
|
|
80
|
+
| `callerSource` | `meeting.caller` / `meeting.mt_creator` / `session.user`(发起人本人兜底) / `none` |
|
|
57
81
|
|
|
58
82
|
> ⚠️ `agendaSource=template` 时会同时给一条 `warnings`:议程表里还是模板的示例行
|
|
59
83
|
> (“15分钟/泛微公司介绍”),提醒人工改成真实议程 —— 客户看到的邀请函不该印着别人的议程。
|
|
@@ -132,8 +156,16 @@ weaver-work-cli --json meeting run meeting.invitation.render --input-json '{"mtI
|
|
|
132
156
|
|
|
133
157
|
## 注意事项
|
|
134
158
|
|
|
135
|
-
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
159
|
+
- **数据源:list 单查为主,detail 只用来「补空」**(2.42.0 起):
|
|
160
|
+
`meeting.eb.meeting.list` 单查在真机上会丢字段(2026-10-31 实测同一会议
|
|
161
|
+
`hrm_members` 在 list 里是空串、在 detail 里是「王丹丹」),所以 CLI 会用
|
|
162
|
+
`meeting.eb.meeting.detail` 补 **list 里为空的**白名单字段(`hrm_members`/`mt_desc`/`caller`/
|
|
163
|
+
`contacter`/时间/`total_member` 等),补回来的字段名列在出参 `detailSupplemented` 里。
|
|
164
|
+
⛔ **`address` 不从 detail 补** —— detail 的 `address` 是会议室 **id**,写进邀请函比空着更糟。
|
|
165
|
+
白名单外的新字段仍走 `{dataKey}` 兜底,跨环境语义不变。
|
|
166
|
+
- **召集人兜底顺序**:`meeting.caller`(会议自己填的)→ `meeting.mt_creator`(创建人)→
|
|
167
|
+
`session.user`(**发起人本人**,2.42.0 起)。看 `callerSource` 判断用的哪一个;
|
|
168
|
+
以前会议没填 caller 就直接【待补充】,邀请函开头那句「XXX 诚邀您参加」整句是空的。
|
|
169
|
+
- 生成后如需把文件发给对方,**本 operation 不提供发送能力**(IM/邮件都不走这里),由使用者自行处理;
|
|
170
|
+
对话里展示走 `text` 字段(见「出参」)。
|
|
139
171
|
- 模板出错时会在本地抛 `template_missing`,提示 CLI 包缺少 `templates/meeting/invitation.docx`;此时重装 CLI 即可,不要手工改模板路径。
|
|
Binary file
|
|
@@ -573,7 +573,7 @@
|
|
|
573
573
|
}
|
|
574
574
|
},
|
|
575
575
|
"artifactBaseline": {
|
|
576
|
-
"aggregateSha256": "
|
|
576
|
+
"aggregateSha256": "bae91aefcc30c01410c2288ae7b31fee438a77bdd50f5df894e7f10e249b6b5c",
|
|
577
577
|
"files": [
|
|
578
578
|
{
|
|
579
579
|
"path": "src/shortcuts/okr/errors.ts",
|
|
@@ -587,8 +587,8 @@
|
|
|
587
587
|
},
|
|
588
588
|
{
|
|
589
589
|
"path": "src/shortcuts/okr/host.ts",
|
|
590
|
-
"size":
|
|
591
|
-
"sha256": "
|
|
590
|
+
"size": 8072,
|
|
591
|
+
"sha256": "dd2a4a5773cd440e5f6136b7c106cf19f2dc26251d03ffb1d17983b921f27ae7"
|
|
592
592
|
},
|
|
593
593
|
{
|
|
594
594
|
"path": "src/shortcuts/okr/index.ts",
|
|
@@ -2270,7 +2270,7 @@
|
|
|
2270
2270
|
}
|
|
2271
2271
|
},
|
|
2272
2272
|
"artifactBaseline": {
|
|
2273
|
-
"aggregateSha256": "
|
|
2273
|
+
"aggregateSha256": "4fcf441cb7e08c3c5e2de04c10144efd27c673788b28904786592c981d6b05e5",
|
|
2274
2274
|
"files": [
|
|
2275
2275
|
{
|
|
2276
2276
|
"path": "docs/im.md",
|
|
@@ -2382,8 +2382,8 @@
|
|
|
2382
2382
|
{
|
|
2383
2383
|
"path": "src/shortcuts/im/host.ts",
|
|
2384
2384
|
"role": "generated-cli",
|
|
2385
|
-
"size":
|
|
2386
|
-
"sha256": "
|
|
2385
|
+
"size": 24373,
|
|
2386
|
+
"sha256": "6e219d2936358c6403e0b1eb6aafb5350cf43fbff75b599381a291008f683815"
|
|
2387
2387
|
},
|
|
2388
2388
|
{
|
|
2389
2389
|
"path": "src/shortcuts/im/index.ts",
|