weaver-work-cli 0.1.39 → 0.1.42
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/README.md +4 -2
- package/dist/chunks/{archive-ENZYBBME.js → archive-J4I6MCKF.js} +2 -2
- package/dist/chunks/{archive-oa-YWLEC5V4.js → archive-oa-BRZKKTO4.js} +2 -2
- package/dist/chunks/{asset-OOV6DWPA.js → asset-L7D4FAOZ.js} +2 -2
- package/dist/chunks/{asset-idle-RE632MY5.js → asset-idle-DADLLV75.js} +2 -2
- package/dist/chunks/{attachment-content-RWN2FCLL.js → attachment-content-K4C7VLWQ.js} +3 -3
- package/dist/chunks/{blog-PEPOJAL7.js → blog-BVGQ7NZL.js} +2 -2
- package/dist/chunks/{caizhilian-WYIQDVPJ.js → caizhilian-SAADNFD6.js} +2 -2
- package/dist/chunks/{calendar-CIARBAOX.js → calendar-Q7NQY5Z2.js} +61 -23
- package/dist/chunks/{chunk-F2EQXUEE.js → chunk-3KTFS4IA.js} +397 -159
- package/dist/chunks/{chunk-G2JSIUWF.js → chunk-4PD5NWAX.js} +89 -0
- package/dist/chunks/{chunk-HJYVHXUQ.js → chunk-4RAE6JXP.js} +1 -1
- package/dist/chunks/{chunk-CQHGNCK2.js → chunk-72CKAUAG.js} +41 -8
- package/dist/chunks/{chunk-K3RUEEOL.js → chunk-APVFJUQH.js} +2 -2
- package/dist/chunks/{chunk-BJGXMFGD.js → chunk-BBKDXQEC.js} +2 -2
- package/dist/chunks/chunk-BIPYLLVS.js +501 -0
- package/dist/chunks/{chunk-GVPJZXJ2.js → chunk-EKWAQSLU.js} +92 -50
- package/dist/chunks/{chunk-XXJOSZTQ.js → chunk-FOAA27U5.js} +381 -57
- package/dist/chunks/{chunk-I2HB737U.js → chunk-G4UR6NXN.js} +2 -2
- package/dist/chunks/{chunk-YS5DPN4T.js → chunk-GEWYMQME.js} +1 -1
- package/dist/chunks/{chunk-P2DAISYW.js → chunk-GHXCDPTM.js} +1 -1
- package/dist/chunks/{chunk-L4N7B7ZD.js → chunk-IZ7S7QUS.js} +4 -4
- package/dist/chunks/{chunk-NLK2RZKG.js → chunk-JPRO6ER2.js} +122 -2214
- package/dist/chunks/{chunk-36DIFZAH.js → chunk-LADPYOWC.js} +2 -2
- package/dist/chunks/chunk-LDZQPUIA.js +1238 -0
- package/dist/chunks/chunk-NKZRQXST.js +2546 -0
- package/dist/chunks/{chunk-EINRJHQ3.js → chunk-QKNKR4RH.js} +3 -3
- package/dist/chunks/{chunk-T7JDJJ7H.js → chunk-R4CHUSKC.js} +126 -19
- package/dist/chunks/{chunk-EZGFHJFW.js → chunk-SA6VBIHY.js} +88 -15
- package/dist/chunks/{chunk-ZXRNHZTE.js → chunk-TTPJJJC4.js} +2 -2
- package/dist/chunks/{chunk-KTCB5R5H.js → chunk-W7BEHOSR.js} +2 -2
- package/dist/chunks/{chunk-MUQUHKPG.js → chunk-YRSZQUD2.js} +2 -2
- package/dist/chunks/{conflict-DRMDOL56.js → conflict-F2OMZRTO.js} +2 -2
- package/dist/chunks/{contract-73MERZWN.js → contract-5BETHRSG.js} +2 -2
- package/dist/chunks/{cowork-HNGBPD7A.js → cowork-3MN6EQQO.js} +27 -10
- package/dist/chunks/create-flow-5FQNNMVO.js +55 -0
- package/dist/chunks/{ebuilder-form-OY6DVNRK.js → ebuilder-form-SBHOYBUD.js} +3 -3
- package/dist/chunks/{ehr-RAQNEQO7.js → ehr-KMOJULKG.js} +432 -1234
- package/dist/chunks/env-LB7NBL2O.js +19 -0
- package/dist/chunks/{esb-6XV7C7YV.js → esb-W2PJCFCX.js} +4 -4
- package/dist/chunks/factory-6ZFQXQ46.js +30 -0
- package/dist/chunks/{fna-XTSRB7G7.js → fna-ZQPCUV4R.js} +2 -2
- package/dist/chunks/group-chat-2HHAJN46.js +20 -0
- package/dist/chunks/{host-YMBXWFWX.js → host-4CBHGOHT.js} +3 -3
- package/dist/chunks/{host-A7J6GDUP.js → host-ATKVNZAT.js} +3 -3
- package/dist/chunks/{host-3F5UM5GN.js → host-BQH22NTQ.js} +3 -3
- package/dist/chunks/{host-YAQAPYNP.js → host-X2CSLFM6.js} +3 -3
- package/dist/chunks/{host-VGPVP7YF.js → host-YTODKMSL.js} +3 -3
- package/dist/chunks/{hrm-TLHKC545.js → hrm-FFM4UJFS.js} +4 -4
- package/dist/chunks/{im-YOUCFMUK.js → im-VEHKDQPB.js} +8 -8
- package/dist/chunks/{invoice-WNBS2B4C.js → invoice-LVIKSIIF.js} +3 -3
- package/dist/chunks/{jiuchuanhui-XABWS5RN.js → jiuchuanhui-X6DINO5P.js} +2 -2
- package/dist/chunks/{lazy-dispatch-NLZ5UQQI.js → lazy-dispatch-KSWTN5L6.js} +4 -4
- package/dist/chunks/{mail-LRYMBFNL.js → mail-VDKRGUD3.js} +9 -4
- package/dist/chunks/{meeting-ESXL6MFI.js → meeting-CLC6HP3Z.js} +12 -10
- package/dist/chunks/{okr-EOV65SSF.js → okr-CHG4OO3U.js} +2 -2
- package/dist/chunks/{plan-YFPVKW6Y.js → plan-XWR75667.js} +2 -2
- package/dist/chunks/{project-MDVZUYQW.js → project-5BXOOKMG.js} +40 -23
- package/dist/chunks/recruit-stage-DGMFNNDE.js +4507 -0
- package/dist/chunks/{registry-VT5Y2HLA.js → registry-7FFOXIAW.js} +4 -4
- package/dist/chunks/{registry-QCLZEDAP.js → registry-BKBZPBAJ.js} +10 -8
- package/dist/chunks/{registry-YX4CSEMD.js → registry-RHMW6ANW.js} +2 -2
- package/dist/chunks/{registry-NYPYMZXG.js → registry-Z43434VG.js} +1 -1
- package/dist/chunks/{room-recommend-L3MWH4JW.js → room-recommend-62H7ZQQ6.js} +4 -4
- package/dist/chunks/{schedule-UASAVDVD.js → schedule-FNXKH3DQ.js} +4 -4
- package/dist/chunks/{workflow-KDGIUCNW.js → workflow-ADHKCAJK.js} +4 -4
- package/dist/index.js +33 -28
- package/dist/internal/e10/auth/commands.js +110 -56
- package/dist/internal/e10/auth/messages.js +6 -0
- package/dist/internal/e10/auth/session.js +28 -1
- package/dist/internal/e10/auth/xiaoe.js +315 -48
- package/dist/internal/e10/auth-recovery.js +36 -5
- package/dist/internal/e10/client.js +13 -0
- package/dist/internal/e10/context.js +61 -9
- package/dist/internal/e10/index.js +1 -1
- package/dist/internal/e10/network-error.js +93 -0
- package/dist/internal/e10/request-runtime.js +15 -0
- package/dist/shortcuts/calendar/operations/read.js +31 -22
- package/dist/shortcuts/calendar/operations/write.js +45 -1
- package/dist/shortcuts/cowork/operations/discuss-write.js +5 -1
- package/dist/shortcuts/cowork/operations/item-write.js +5 -3
- package/dist/shortcuts/cowork/operations/member-write.js +3 -1
- package/dist/shortcuts/cowork/operations/permission-write.js +5 -1
- package/dist/shortcuts/cowork/operations/shared.js +7 -0
- package/dist/shortcuts/ehr/operations/attend-write.js +43 -1
- package/dist/shortcuts/ehr/operations/hr-contact.js +7 -4
- package/dist/shortcuts/ehr/operations/hr-report.js +13 -7
- package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +134 -59
- package/dist/shortcuts/ehr/operations/recruit-write.js +262 -17
- package/dist/shortcuts/ehr/operations/recruit.js +10 -4
- package/dist/shortcuts/ehr/operations/shared.js +47 -0
- package/dist/shortcuts/hrm/operations/org.js +118 -0
- package/dist/shortcuts/index.js +5 -0
- package/dist/shortcuts/mail/operations/mail-send.js +8 -2
- package/dist/shortcuts/meeting/operations/eb/catalog.js +9 -2
- package/dist/shortcuts/meeting/operations/eb/create-flow.js +461 -127
- package/dist/shortcuts/meeting/operations/eb/crm-search.js +87 -5
- package/dist/shortcuts/meeting/operations/eb/factory.js +33 -0
- package/dist/shortcuts/meeting/operations/eb/flow-memory.js +49 -0
- package/dist/shortcuts/meeting/operations/eb/group-chat.js +605 -0
- package/dist/shortcuts/meeting/operations/eb/index.js +2 -0
- package/dist/shortcuts/meeting/operations/eb/person-cache.js +96 -0
- package/dist/shortcuts/meeting/operations/eb/room-recommend.js +44 -6
- package/dist/shortcuts/meeting/operations/eb/room-summary.js +2 -0
- package/dist/shortcuts/meeting/operations/eb/usage-cache.js +99 -0
- package/dist/shortcuts/meeting/operations/from-group-chat.js +35 -12
- package/dist/shortcuts/project/operations/read.js +6 -25
- package/dist/shortcuts/project/operations/shared.js +22 -0
- package/dist/shortcuts/project/operations/write.js +28 -2
- package/dist/shortcuts/recruit-stage/context.js +119 -0
- package/dist/shortcuts/recruit-stage/continuation.js +73 -0
- package/dist/shortcuts/recruit-stage/errors.js +65 -0
- package/dist/shortcuts/recruit-stage/host.js +109 -0
- package/dist/shortcuts/recruit-stage/index.js +115 -0
- package/dist/shortcuts/recruit-stage/manifest.js +29 -0
- package/dist/shortcuts/recruit-stage/operations/interview-arrange.js +722 -0
- package/dist/shortcuts/recruit-stage/operations/interview-feedback.js +269 -0
- package/dist/shortcuts/recruit-stage/operations/jd-create.js +630 -0
- package/dist/shortcuts/recruit-stage/operations/list.js +431 -0
- package/dist/shortcuts/recruit-stage/operations/registry.js +38 -0
- package/dist/shortcuts/recruit-stage/operations/resume-import.js +1198 -0
- package/dist/shortcuts/recruit-stage/operations/search.js +158 -0
- package/dist/shortcuts/recruit-stage/operations/types.js +25 -0
- package/dist/shortcuts/recruit-stage/school-tiers.json +318 -0
- package/dist/shortcuts/recruit-stage/shared.js +608 -0
- package/dist/shortcuts/workflow/operations/form.js +21 -2
- package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +52 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +4 -2
- package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +19 -11
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +17 -24
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +14 -9
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +78 -10
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +3 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +17 -11
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +16 -40
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +3 -2
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +52 -15
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +16 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +151 -63
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.subGroup.js +56 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +53 -16
- package/docs/e10-auth.md +22 -1
- package/docs/operation-manual.md +8 -0
- package/package.json +1 -1
- package/scripts/install-skill-to-xiaoe.mjs +105 -0
- package/scripts/mcp-meeting.mjs +234 -0
- package/scripts/package-skill.mjs +4 -2
- package/skill-template/business-info.json +24 -0
- package/skill-template/domains/recruit-stage.md +29 -0
- package/skills/weaver-e10-calendar/SKILL.md +2 -1
- package/skills/weaver-e10-calendar/references/calendar-write.md +54 -0
- package/skills/weaver-e10-cowork/SKILL.md +1 -1
- package/skills/weaver-e10-cowork/references/cowork-write.md +3 -1
- package/skills/weaver-e10-jucailin/SKILL.md +1 -1
- package/skills/weaver-e10-jucailin/references/attend-write.md +8 -0
- package/skills/weaver-e10-jucailin/references/hr-contact.md +8 -0
- package/skills/weaver-e10-jucailin/references/hr-report.md +8 -0
- package/skills/weaver-e10-jucailin/references/recruit-create.md +2 -2
- package/skills/weaver-e10-jucailin/references/recruit-read.md +1 -1
- package/skills/weaver-e10-jucailin/references/recruit-write.md +4 -3
- package/skills/weaver-e10-mail/SKILL.md +1 -1
- package/skills/weaver-e10-mail/references/mail-send.md +2 -0
- package/skills/weaver-e10-meeting/SKILL.md +119 -26
- package/skills/weaver-e10-meeting/references/meeting-minute-file.md +25 -11
- package/skills/weaver-e10-meeting.zip +0 -0
- package/skills/weaver-e10-recruit-stage/SKILL.md +226 -0
- package/skills/weaver-e10-recruit-stage/agents/openai.yaml +119 -0
- package/skills/weaver-e10-recruit-stage/lib/recruit-xiaoe-file.mjs +188 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-arrange-interview.md +322 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-capability-check.md +127 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-check-install.md +65 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-detail-process.md +63 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-edit-interview-feedback.md +142 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-jd-create.md +73 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-jd-template.md +56 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-list-candidate.md +101 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-list-interview.md +148 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-match-candidates.md +77 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-output-links.md +59 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resolve-creator.md +69 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resolve-metadata.md +241 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resume-import.md +438 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resume-parse.md +128 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-search-candidate.md +146 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-urge-feedback.md +69 -0
- package/skills/weaver-e10-shared/SKILL.md +2 -2
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +4 -2
- package/skills/weaver-e10-shijingran/SKILL.md +3 -2
- package/skills/weaver-e10-shijingran/references/operations.md +3 -1
- package/skills/weaver-e10-shijingran/references/source-manifest.json +41 -40
- package/skills/weaver-e10-shijingran/references/write-operations.md +2 -0
- package/skills/weaver-e10-workflow/SKILL.md +7 -1
- package/skills/weaver-e10-workflow/aigroup/default.json +23 -9
- package/skills/weaver-e10-workflow/references/todo-smart-convert.md +37 -21
- package/skills/weaver-e10-workflow/tools/todo-summary.cjs +135 -43
- package/skills/weaver-e10-yepiaotong/SKILL.md +9 -10
- package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +6 -3
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 查看类产物的输出形态:**Markdown 链接**(不用 browsertool 卡片)
|
|
2
|
+
|
|
3
|
+
## 基础信息
|
|
4
|
+
|
|
5
|
+
| 项目 | 内容 |
|
|
6
|
+
|---|---|
|
|
7
|
+
| 输出物 | **两个 Markdown 链接**(`[标题](url)`):① 新建职位详情查看页 ② 招聘岗位列表(已定位新建职位的"列表+滑出详情"组合页) |
|
|
8
|
+
| 由谁渲染 | 对话正文的标准 Markdown 渲染(平台原生,**已实证可点击**) |
|
|
9
|
+
| 网络请求 | 无(url 由脚本 `--commit` 产出,Agent 只负责按格式搬运) |
|
|
10
|
+
| 所属模块 | recruit-stage |
|
|
11
|
+
| 用途类型 | 用户场景 |
|
|
12
|
+
|
|
13
|
+
> 这不是 HTTP 接口文档,是**输出格式契约**。url 由脚本产出(任务1:`viewLink` / `listLocateLink`;任务2:`talentCardUrl` / `talentListLocateUrl`)。
|
|
14
|
+
|
|
15
|
+
## 任务2(简历建档)的人才产物:也是两个 Markdown 链接
|
|
16
|
+
|
|
17
|
+
| 链接 | 字段 | 形态 |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| ① 人才卡片单页 | `talentCardUrl` | `{baseUrl}/sp/ebdpage/view/{ebdDetailPageId}?talentId={id}`(详情页 id 走环境缓存) |
|
|
20
|
+
| ② 人才库列表并打开该人才 | `talentListLocateUrl` | `{baseUrl}/sp/ebdfpage/list/{listId}?talentId={id}&recruitType=useSelf`(listId 取环境缓存 `lists.talent.listId`,跨环境动态组合) |
|
|
21
|
+
|
|
22
|
+
口径与任务1 一致:两个链接都放正文、缺哪个只给另一个;browsertool / 正文 `<artifact>` 标记一律不用(原因见下)。
|
|
23
|
+
|
|
24
|
+
## 为什么用普通链接(而不是 browsertool 卡片)——实测结论,勿回退
|
|
25
|
+
|
|
26
|
+
| 备选 | 实测结论 |
|
|
27
|
+
|---|---|
|
|
28
|
+
| **Markdown 链接(采用)** | ✅ 用户实测:可点击、浏览器已有 E10 登录态时免登录直接打开(2026-10-21) |
|
|
29
|
+
| `toolId: "fill_form"` 卡片 | ❌ 会执行一轮**真实填单动作**;在**非表单页**(职位详情/列表页)**卡死在「正在填单」**(2026-10-21 实测,第二张卡即此症状)。只有真正的**表单创建页**(如请休假 workflow 创建页)才适合 |
|
|
30
|
+
| `toolId: "open_web"` 卡片 | ⚠️ 未实测;其落点是宿主工作区视图(`bridge.open`),E10 页面可能再撞 SameSite 登录墙 —— 实证优先,不押注 |
|
|
31
|
+
| 正文手拼 `<artifact>` | 小E 规范禁止;且 10-16 起正文标记通道已变更 ⇒ 不可用 |
|
|
32
|
+
|
|
33
|
+
## 输出格式(脚本已生成,Agent 原样搬运)
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
[查看 Java开发工程师 职位详情](https://…/sp/ebdfpage/card/0/{objId}/{dataId})
|
|
37
|
+
[打开招聘岗位列表(已定位新建职位)](https://…/sp/ebdfpage/list/{listId}/card/0/{objId}/{dataId}/{listId}?id={dataId}&openSource=field&openSourceId={dataId}&openSourceAppId={appId})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| 链接 | 脚本字段 | 打开效果 |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| ① 职位详情查看页 | `viewLink`(url = `positionCardUrl`) | 单条职位的卡片详情页 |
|
|
43
|
+
| ② 列表 + 定位 | `listLocateLink`(url = `positionListLocateUrl`) | 招聘岗位列表 + 右侧滑出本次新建职位的详情 |
|
|
44
|
+
|
|
45
|
+
**组合页地址格式**(脚本 `buildListLocateUrl` 动态拼装,全部 id 运行时解析):
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
{base}/sp/ebdfpage/list/{listId}/card/0/{objId}/{dataId}/{listId}?id={dataId}&openSource=field&openSourceId={dataId}&openSourceAppId={appId}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- listId = 环境缓存 `lists.position.listId`(init 按菜单别名解析);objId = tag 解析;dataId = 本次落库结果;appId = 安装闸门发现
|
|
52
|
+
- **简化版实测可用**(2026-10-21,浏览器注入凭证验证):不需要 `EbdfListToCardKey`(会话级哈希)与 `targetConditionId`(每环境配置 id),去掉后照样打开列表并滑出详情
|
|
53
|
+
|
|
54
|
+
## 输出要求(给 Agent 的执行约定)
|
|
55
|
+
|
|
56
|
+
1. 两个链接**按顺序**放在回答里(详情在前、列表在后),原样搬运 `viewLink` / `listLocateLink` 字符串
|
|
57
|
+
2. 链接只是查看入口:职位在用户确认时已一次性落库,**重复点击不会重复创建**
|
|
58
|
+
3. 某个 url 拼不出来时只给另一个,并说明原因;不输出半截链接
|
|
59
|
+
4. 提醒一句:需浏览器已登录 E10 才能打开(登录态在浏览器里,与对话登录态相互独立)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: recruit-resolve-creator
|
|
3
|
+
description: Agent 辅助 — 把创建人/成员字段的自然语言名称解析为 EB 用户 ID
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 创建人名称 → ID 解析(Agent 辅助)
|
|
7
|
+
|
|
8
|
+
## 1. 基础信息
|
|
9
|
+
- 接口名称:浏览器字段联想(人员)
|
|
10
|
+
- 请求方式:`POST`
|
|
11
|
+
- 去域名路径:`/api/ebuilder/form/common/browser/complete/resource`
|
|
12
|
+
- 所属模块:招聘管理(recruit)
|
|
13
|
+
- 所属分组:解析 / Agent 辅助
|
|
14
|
+
|
|
15
|
+
## 2. 业务用途
|
|
16
|
+
列表后端要求 `field_2`(创建人)传**用户 ID**,而用户常说"创建人=招聘专员"。本接口把名称解析成 ID,作为搜索条件的必经步骤。
|
|
17
|
+
|
|
18
|
+
## 3. 前置条件
|
|
19
|
+
- 已知要解析的字段 `fieldId`(创建人 = `2`)。
|
|
20
|
+
- 已知名称字符串。
|
|
21
|
+
|
|
22
|
+
## 4. 请求参数
|
|
23
|
+
|
|
24
|
+
### 4.1 Body
|
|
25
|
+
| 字段 | 位置 | 类型 | 必填 | 约束 | 业务说明 |
|
|
26
|
+
|---|---|---|---|---|---|
|
|
27
|
+
| `formParam` | body | string(JSON) | 是 | 含 `fieldId`/`module` | `module` 固定 `ebuilderform` |
|
|
28
|
+
| `searchValue` | body | string | 是 | 名称 | 要解析的名称 |
|
|
29
|
+
| `fromSearch` | body | string | 是 | 固定 `1` | |
|
|
30
|
+
| `browserMultiple` | body | bool | 否 | 默认 true | |
|
|
31
|
+
|
|
32
|
+
## 5. 响应数据结构
|
|
33
|
+
| 字段 | 类型 | 说明 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `data.data` | array | 结果数组(注意:外层 `data` 是对象,数组在 `data.data`) |
|
|
36
|
+
| `data.data[].id` | string | 用户 ID(用作 `field_2` 条件值) |
|
|
37
|
+
| `data.data[].name` | string | 显示名 |
|
|
38
|
+
| `data.data[].content` / `title` | string | 附加信息 |
|
|
39
|
+
|
|
40
|
+
## 6. 请求示例
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"browserMultiple": true,
|
|
44
|
+
"formParam": "{\"fieldId\":\"2\",\"module\":\"ebuilderform\",\"filterItems\":[],\"dataDetails\":[],\"dataFilter\":false}",
|
|
45
|
+
"fromSearch": "1",
|
|
46
|
+
"searchValue": "招聘专员"
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 7. 响应示例
|
|
51
|
+
```json
|
|
52
|
+
{ "code": 200, "status": true,
|
|
53
|
+
"data": { "data": [ { "id": "1276064981631025154", "name": "招聘专员" } ], "template": {}, "extendButton": {} } }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 8. 错误码
|
|
57
|
+
| 错误码 | 含义 | AI 处理建议 |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| 来源文档未提供接口特有错误码 | — | 非 200 → 提示 认证可能过期(`weaver-work-cli auth status`) |
|
|
60
|
+
|
|
61
|
+
## 9. 调用参考
|
|
62
|
+
- Agent 辅助:用户给"创建人=名称"时调用,解析出的 `id` 作为搜索 `field_2` 条件。
|
|
63
|
+
- 命中 0 → 提示未找到该创建人。
|
|
64
|
+
- 命中 1 → 用其 `id` 继续搜索。
|
|
65
|
+
- 命中多个 → 列出选项并停住,由对话侧转述用户确认用哪一个(退出码 4)。
|
|
66
|
+
|
|
67
|
+
## 10. 注意事项
|
|
68
|
+
- 响应信封:`data` 是对象,结果在 **`data.data[]`**(外层还含 `template`/`extendButton`)。
|
|
69
|
+
- 同机制可用于其它浏览器 member 字段(替换 `fieldId`)。
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# 招聘元数据解析(运行时参数 → 实际 ID)
|
|
2
|
+
|
|
3
|
+
本文件说明:正式版 `recruit-ops` **不写死**任何租户相关的 EB 表单/列表/页面 ID。调用前,下列 `${...}` 形参必须按本文件规则解析为当前租户的真实值。
|
|
4
|
+
|
|
5
|
+
> 背景:EB 应用/表单在不同环境(开发/测试/生产)迁入迁出后,应用 id、表单 id、列表视图 id 都会变化。e-Builder 提供「打 tag → 按 tag 反找 id」机制(`技术文档-tag定位应用和表单.md`),用于跨环境适配。招聘应用 tag 为 `weaver-recruit-service`。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 两类参数:可 tag 解析 vs 仅租户提供
|
|
10
|
+
|
|
11
|
+
| 参数类别 | 能否 tag 解析 | 解析方式 / 来源 |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| 表单 `objId` / `passid` / `cid` | ✅ 可 | `getAppIds` → `getObjsByTag(appId, objTag)` |
|
|
14
|
+
| 应用 `appId` | ✅ 可(部分) | 安装闸门 `getAppIds?tag=weaver-recruit-service` 已返回 `data[0]` |
|
|
15
|
+
| 列表 `listId`(列表视图 id) | ❌ 不可 | EB 列表视图由前端创建,**api-index 明确"无法从 tag 推导"**;由当前租户部署提供 |
|
|
16
|
+
| 人才卡片页面 id(EB 详情链接) | ✅ 可 | 业务配置表 `config_key=28` 的 config(如 `/sp/ebdpage/view/{id}`)提取;兜底 `page/list` 按 name=「人才卡片」解析(见 SKILL.md「链接拼装」) |
|
|
17
|
+
| 字段 `field_<id>`(表单字段元数据 id) | ⚠️ 运行时解析 | 调用 `POST /api/ebuilder/common/ds/fields` 按 `config.dataKey` 解析(见 §5),**不写死**;结果已并入环境缓存 `fields[objId]`(`{dataKey: fieldId}`),安排面试直接取用 |
|
|
18
|
+
| 枚举选项 id(招聘状态/渠道/面试方式等) | ⚠️ 跨环境需刷新 | `data-dictionary.md` 是**当前环境快照**(依表结构固化);EB 数据字典属租户级,**换环境后 optionId 可能变化**,须经 `ds/fields` 的 `options` / 字典接口重新获取后更新,不得直接复用旧环境值 |
|
|
19
|
+
|
|
20
|
+
> 结论:本技能**只把表单 objId/passid 动态化**;`listId`/`viewId`/`pageId` 与菜单 id(cusMenuId)作为「部署参数」由租户提供(见 SKILL.md「部署参数」);**字段 id 由 `ds/fields` 运行时解析,不写死**。不要臆测这些 id。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. 表单 objId / passid 的 tag 解析链(必做)
|
|
25
|
+
|
|
26
|
+
### 2.1 步骤
|
|
27
|
+
|
|
28
|
+
1. **取 appId**(安装闸门已做,见 `recruit-check-install.md`):
|
|
29
|
+
`GET /api/bs/ebuilder/app/tags/getAppIds?tag=weaver-recruit-service` → `data[0]`。
|
|
30
|
+
2. **取表单列表**(传入 appId + 表单 tag):
|
|
31
|
+
`GET /api/ebuilder/form/obj/getObjsByTag?appId={appId}&tag={objTag}` → 返回 `List<Obj>`,每个含 `id`(即 objId)。
|
|
32
|
+
- 同一响应**同时返回布局 `formId`**(响应字段 `formId`):实测面试管理 `objId=937153849749069839` 时 `formId=937153849749069933` —— §2.3 的 `formId` 由此一并取得,无需另调接口。
|
|
33
|
+
3. **按 objTag 取对应 objId**,代入各接口文档的 `${..._FORM_OBJID}`。
|
|
34
|
+
|
|
35
|
+
> **tag 覆盖范围(当前确认)**:§2.2 表中全部 13 个表单 tag 均已用 `getObjsByTag` 可解析(含 补打的 取消入职-中间表 `uf_rcrt_entry_cancel`、改期入职-中间表 `uf_rcrt_entry_change`——表结构文档此前漏记「表单Key」);表单 objId 全部自动适配,无需部署参数。⚠️ **个别环境这两个中间表 tag 未补打(`data:[]`)**:按既定规则,**tag 解析不到 = 该环境版本未启用取消/改期入职功能 → 阻断该动作并友好提示,不执行、不兜底部署参数、不臆造**(不清晰的动作,宁可不执行,也不能乱执行)。禁止臆造 tag 或 id。
|
|
36
|
+
|
|
37
|
+
### 2.2 逻辑名 → objTag 映射
|
|
38
|
+
|
|
39
|
+
> objTag 为该表单在 EB 中打的标签(= 表结构文档「表单Key」)。**下表为权威映射,来源 `招聘管理-表结构文档.md`,已在当前环境用 `getObjsByTag` 逐一验证解析结果与表结构 OBJID 一致**;换环境直接用 tag 解析即可,无需改文档。
|
|
40
|
+
|
|
41
|
+
| 逻辑名(token) | objTag(权威) | 用于 | 当前环境 OBJID(验证参考) |
|
|
42
|
+
|---|---|---|---|
|
|
43
|
+
| `${TALENT_FORM_OBJID}`(人才库/应聘者表单) | `uf_rcrt_talent_pool` | 搜索/新建应聘者 的 `passid`/`cid`/`objId` | `937153849749069833` |
|
|
44
|
+
| `${INTERVIEW_PLAN_FORM_OBJID}`(面试计划表单) | `uf_rcrt_interview_plan` | 安排面试 的 `objId`/`formId` | `937153849749069839` |
|
|
45
|
+
| 面试反馈表单 | `uf_rcrt_interview_detail` | 查询面试结果 / 催评 `objId` | `937153849749069840` |
|
|
46
|
+
| `${DEMAND_FORM_OBJID}`(招聘需求表单) | `uf_rcrt_demand_manage` | 需求列表 `passid`/`cid` | `937153849749069830` |
|
|
47
|
+
| `${POSITION_FORM_OBJID}`(招聘职位表单) | `uf_rcrt_position_manage` | 职位列表 `passid`/`cid` | `937153849749069831` |
|
|
48
|
+
| `${ENTRY_FORM_OBJID}`(入职管理表单) | `uf_rcrt_entry_manage` | 待入职列表 / 办理入职 `passid`/`objId` | `937153849749069883` |
|
|
49
|
+
| Offer 管理表单 | `uf_rcrt_offer` | Offer 列表/详情 | `937153849749069892` |
|
|
50
|
+
| Offer 反馈表单 | `uf_rcrt_offer_sending` | 发 Offer 的 offer反馈记录 | `937153849749069893` |
|
|
51
|
+
| 应聘批次表单 | `uf_rcrt_candidate_manage` | initTalentBatch 关联 | `937153849749069834` |
|
|
52
|
+
| 办理入职-中间表 | `uf_rcrt_entry_transact` | 办入职中间流程 | `937153849749069899` |
|
|
53
|
+
| 取消入职-中间表 | `uf_rcrt_entry_cancel` | 取消入职 `runEsb.objId` | `937153849749069884` |
|
|
54
|
+
| 改期入职-中间表 | `uf_rcrt_entry_change` | 改期入职 `runEsb.objId` | `937153849749069885` |
|
|
55
|
+
| `${DICT_FORM_OBJID}`(数据字典表单) | `uf_rcrt_dictionary` | `ds/fields` 解析字典字段 | `937153849749069825` |
|
|
56
|
+
|
|
57
|
+
> **无 tag 的表单(须部署参数提供)**:无。取消入职-中间表(`uf_rcrt_entry_cancel`)、改期入职-中间表(`uf_rcrt_entry_change`)已确认**有 tag**(表结构文档此前漏记「表单Key」),已加入上表——`objId` 经 tag 解析即可,无需部署参数。中间表字段(取消原因 `cancel_reason`、原因 key `cancel_reason_key`、关联入职 `rzglid`、新入职日期等)仍经 `ds/fields` 按 OBJID 运行时解析,不写死字段 id。
|
|
58
|
+
|
|
59
|
+
> 注:同一 EB 表单在后端实际是 **三个不同 id,不可混用、不可相互替代**:
|
|
60
|
+
> - `objId`(数据对象 id):经 `getObjsByTag` 解析 → 用于 `passid`/`cid`、`runEsb.objId`、`customParam.objId`。
|
|
61
|
+
> - `formId`(布局表单 id):取 `getObjsByTag` 响应的 `formId` 字段(与 `objId` 同一次调用返回;实测面试管理 `objId=937153849749069839` → `formId=937153849749069933`)→ 用于 `saveFormData?formId=` 与 `formData.form.id`。
|
|
62
|
+
> - `formLayout.id`(表单布局 id):`GET /api/ebuilder/form/form/core/getFormLayout?formId=<formId>` 响应的 `formLayout.id`。**注意跨版本**:部分版本(如 10.0.2607.01)上该 GET 直接 **405**,需改用**POST 同路径**,body `{module:"ebuilderform", formId, terminalType:"PC"}`(缺 `module` 会 500)。`write-op.mjs::getFormLayout` / `getFormLayoutMeta` 已内置「GET → POST」自动回退,业务脚本不要各自拼。**部分环境实测 `formId≠layoutId`**(formId `937153849749069933` → layoutId `937153879646070681`),因此按钮动作链(`getFormButtons`)必须传按此解析出的 layoutId,传 formId 会解析不全。
|
|
63
|
+
> 三者不同(面试计划:`objId`=`937153849749069839`、`formId`=`937153849749069933`、`formLayout.id`=`937153879646070681`)。**写 `saveFormData` 时 `formData.form.id` 与 `formData.formLayout.id` 必须分别填 formId 与 formLayout.id,不得都填同一个 objId token**。多数接口另用 `objId` 作 `passid`/`cid`。
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 3. 仅租户提供的参数(部署参数)
|
|
68
|
+
|
|
69
|
+
以下 `${...}` 由当前租户部署给出。**其中列表 `listId`/`cusMenuId` 现可经 `allMenus` 自动发现**(见 §3.1);仅统计 pageId/sheetId 仍需人工或由页面提供;人才卡片页面 id 走业务配置表 key=28 / page/list(见 SKILL.md「链接拼装」,不依赖菜单树):
|
|
70
|
+
|
|
71
|
+
| token | 含义 | 用途 | 可自动发现? |
|
|
72
|
+
|---|---|---|---|
|
|
73
|
+
| `${TALENT_LIST_ID}` | 人才库列表视图 id | 搜索人才 `getListDatas` 的 `listId` + `ebBusinessId` | ✅ §3.1 |
|
|
74
|
+
| `${DEMAND_LIST_ID}` | 需求列表视图 id | 需求列表 `listId` | ✅ §3.1 |
|
|
75
|
+
| `${POSITION_LIST_ID}` | 职位列表视图 id | 职位列表 `listId` | ✅ §3.1 |
|
|
76
|
+
| `${ENTRY_LIST_ID}` | 入职列表视图 id | 待入职列表 `listId` | ✅ §3.1 |
|
|
77
|
+
| `${STATS_VIEW_ID}` / `${STATS_PAGE_ID}` | 招聘统计 EB 报表页 | 统计报表查看链接 | ✅ §3.1 菜单树(EMPTY→children) |
|
|
78
|
+
| `${RECRUIT_APP_ID}` | 招聘应用 id | 部分写操作上下文(亦可经安装闸门取得) | ✅ 安装闸门 |
|
|
79
|
+
| 催评 ESB 动作流 id | 仅催评 `runEsb.esbActionIds` | **运行时按钮配置解析**(见 §4):面试反馈列表 `getListButtons` 取 `actionType=esb` 且名称含「面试安排催评」的按钮 id(排除「批量催评」) | ✅ 按钮配置解析 |
|
|
80
|
+
| 面试通知 ESB 动作流 id | 安排面试第②步 `runEsb.esbActionIds` | **运行时按钮配置解析**(见 §4):面试计划表单 `getFormButtons` 取 `actionType=esb` 且名称含「新建日程」的按钮 id | ✅ 按钮配置解析 |
|
|
81
|
+
| `${ENTRY_MENU_ID}` | 待入职列表菜单 id(cusMenuId) | `recruit-entry-list` 列表请求的 `cusMenuId` | ✅ §3.1 |
|
|
82
|
+
| `${DEMAND_MENU_ID}` | 需求列表菜单 id(cusMenuId) | `recruit-list-demand` 列表请求的 `cusMenuId` | ✅ §3.1 |
|
|
83
|
+
| `${POSITION_MENU_ID}` | 职位列表菜单 id(cusMenuId) | `recruit-list-position` 列表请求的 `cusMenuId` | ✅ §3.1 |
|
|
84
|
+
| `${STATS_MENU_ID}` | 统计看板菜单 id(cusMenuId) | `recruit-stats` 的 `cusMenuId` | ✅ §3.1 菜单树 |
|
|
85
|
+
| `${TALENT_MENU_ID}` | 人才库列表菜单 id(cusMenuId) | `recruit-search-candidate` 列表请求 `cusMenuId` | ✅ §3.1 |
|
|
86
|
+
| `${TALENT_SELECTED_ID}` | 人才库列表选中上下文 id(selectedId) | `recruit-search-candidate` 列表请求 `selectedId` | ⚠️ 可省略(不带也返回数据) |
|
|
87
|
+
|
|
88
|
+
### 3.1 列表部署参数自动发现(allMenus,换环境免人工配置)
|
|
89
|
+
|
|
90
|
+
> **该机制为平台通用**:allMenus 自动发现 listId/cusMenuId,与人工维护值一致;换任意环境由探针自动发现,无需人工提供。
|
|
91
|
+
|
|
92
|
+
- **取全部菜单(含子级)**:`GET /api/cusapp/app/allMenus?isFront=1&appId={appId}&terminalType=PC&entranceType=PREVIEW`(entranceType 可省略,返回一致)→ `data.cusAppMenus[]`,**递归展开 `children[]` 得到完整菜单树**。
|
|
93
|
+
- **菜单项 pageType 语义(关键)**:
|
|
94
|
+
| pageType | 含义 | pageId 用途 |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `SEARCH` | 列表页 | `pageId`=**listId**、`id`=**cusMenuId** |
|
|
97
|
+
| `PAGE` | 普通页面(工作台/看板/详情页) | `pageId`=**viewId**(统计看板/详情页的 EB 页面 id) |
|
|
98
|
+
| `REPORT` | EDC 报表 | `pageId`=**sheetId/reportId**(EDC 报表 id) |
|
|
99
|
+
| `EMPTY` | 分组(无 pageId) | **递归 children[] 取子级**;`combinationId` 供 getCombMenus 细分 |
|
|
100
|
+
| `WORKFLOW` | 流程中心 | pageId=`all`/`todo`(固定) |
|
|
101
|
+
- **覆盖范围**:SEARCH 型 listId、PAGE 型 viewId、REPORT 型 sheetId 均可经菜单树自动发现(pageType 语义见上表),换环境自动刷新,无需写死具体 id。
|
|
102
|
+
- **结论:统计 pageId/sheetId 可经菜单树自动发现;人才卡片页面 id 走业务配置表 key=28 / page/list(修正,见 SKILL.md「链接拼装」),均不需要人工、不需要写死 id。**
|
|
103
|
+
- **验证**:用自动发现的 listId/cusMenuId 调 `getListDatas` 可直接拉到真实数据(人才/需求/职位/入职 4 列表 ✅);`selectedId` 不带也能返回数据(可省略)。
|
|
104
|
+
- 组合菜单内层(若需按 tab 细分):`GET /api/cusapp/app/getCombMenus?appId={appId}&pid={组合id}&type=1&terminalType=PC&showType=0&isComb=1&isFront=1` → `menuEntities[]`:`pageId`(=listId)、`id`(=selectedId)、`alias`(tab 名)。
|
|
105
|
+
- 工具:随包 `scripts/_init_env_cache.mjs` 的菜单树自动发现即覆盖上述逻辑(含统计/详情 pageId),无需包外工具。
|
|
106
|
+
|
|
107
|
+
### 3.2 兼容性与多级降级(菜单不全 / 名称变化 / 权限受限)
|
|
108
|
+
|
|
109
|
+
> 用户提出三场景:老版本环境菜单不全、菜单位置/名称调整、权限过滤菜单变少。**定位不依赖菜单名精确匹配、不依赖菜单齐全**,按下表分档降级:
|
|
110
|
+
|
|
111
|
+
| 层级 | 方式 | 依赖 | 适用场景 |
|
|
112
|
+
|---|---|---|---|
|
|
113
|
+
| **L1** | allMenus 菜单树**语义匹配**(menuName 关键词) | 菜单接口 | 新版本、菜单齐全 |
|
|
114
|
+
| **L2** | **B 通道** `dataset/v2/getAllData`(`mainTable.{{dataKey}}` 条件过滤)+ `getDataById` | 仅 tag→objId + ds/fields(零菜单依赖) | 菜单缺失/名称变/权限过滤/老版本(v2 可用)——**列表+查重均可用** |
|
|
115
|
+
| **L3** | 部署参数兜底(listId 用户一次性提供写入环境配置) | 用户 | 老版本无 v2 接口 |
|
|
116
|
+
|
|
117
|
+
**L1 语义匹配规则(不依赖精确菜单名)**:
|
|
118
|
+
- 关键词:人才 / 需求 / 职位 / 入职 / 统计 / 看板 / 面试 / Offer 等业务词,`menuName` 包含即候选;`pageType` 辅助判定(SEARCH=列表、PAGE=看板/详情、REPORT=报表)。
|
|
119
|
+
- **⚠️ 关键词需给多候选**:不同版本菜单名不同,按「业务 → 候选关键词组」匹配,首条命中即可:
|
|
120
|
+
- 人才库:`人才管理` / `人才库`
|
|
121
|
+
- 招聘需求:`招聘需求` / `需求`
|
|
122
|
+
- 招聘职位:`招聘职位` / `职位列表`
|
|
123
|
+
- Offer:`录用管理`(实名;offer有效期设置/offer设置 是配置页,不算)
|
|
124
|
+
- 统计:`招聘工作统计` / `招聘数据看板` / `招聘需求统计` / `招聘职位统计` / `人才库统计`
|
|
125
|
+
- 部分版本:人才→「人才库」、职位→「职位列表」、需求→「招聘需求」全命中 ✅;**「入职管理」与「Offer 管理」部分版本无同名菜单——不得用「应聘管理」/「offer设置」硬凑**(应聘管理=应聘者管理表单、offer设置=配置页,均非目标业务)
|
|
126
|
+
- 命中 0 个 → **降级 L2**,不报死、不臆测。
|
|
127
|
+
- 命中多个 → **列出候选(菜单名/类型/pageId)请用户确认**,不自动取第一个。
|
|
128
|
+
- **⚠️ 菜单不存在但业务表单存在(部分版本:入职/Offer 表单 objId 可 tag 解析、但无对应 SEARCH 菜单)**:说明该版本**未部署该功能菜单**。降级路径也找不到时,**如实提示「当前环境未提供入职管理/Offer 管理功能菜单」并停止**,绝不拿近似菜单顶替、不臆造 id。
|
|
129
|
+
|
|
130
|
+
**L2 B 通道要点(老版本/权限受限的主降级路径)**:
|
|
131
|
+
- 列表/查重:`POST /api/ebuilder/form/dataset/v2/getAllData`,`datajson={header:{objId}, mainTable:{<dataKey>: <值>}, pageInfo:{pageNo,pageSize}}`——条件用 **dataKey**(跨环境稳定),响应 `datas[].mainTable` 为 `{<dataKey>: {fieldId,fieldType,fieldValue}}`(**按 dataKey 为键的对象**,遍历其键识别字段),字段名经 ds/fields 映射(响应形态对齐官方 `ebuilder-data-apis`)。
|
|
132
|
+
- 详情:`dataset/v2/getDataById`(datajson.header.objId + 数据 id)。
|
|
133
|
+
- 写操作(新建/修改/删除):本技能走招聘应用专属端点 `POST /api/ebuilder/form/form/core/saveFormData`(带 `formData.form.id`+`formData.formLayout.id`,见各写操作文档),**非** OpenAPI `dataset/v2/saveFormData` 写族;二者请求体形态不同,不可混用。
|
|
134
|
+
- 局限:无 cusMenuId/selectedId 上下文 → 按钮类动作/部分写操作仍需 L1 菜单上下文;此时如实提示。
|
|
135
|
+
|
|
136
|
+
**老版本兼容判定**:
|
|
137
|
+
- `allMenus` 或 `dataset/v2/*` 返回 404/405 → 该环境不支持 → 自动降级;v2 也没有 → L3(提示「当前环境为老版本,请提供 X 列表 id 或升级环境」)。
|
|
138
|
+
- 菜单在但接口因权限返回 403/数据空 → 如实提示「当前账号无 X 功能权限」。
|
|
139
|
+
- **降级顺序**:L1 → L2 → L3,每一级失败都自动尝试下一级,最终无法定位时**停住并向用户说明原因**(不臆造 id、不静默返回空)。
|
|
140
|
+
|
|
141
|
+
> 注:当前租户下需求列表与职位列表共用同一菜单 id(同值),故 `${DEMAND_MENU_ID}` 与 `${POSITION_MENU_ID}` 取相同部署值。
|
|
142
|
+
> 部署参数获取方式:由 `weaver-work-cli` 的当前应用上下文提供,或由用户在首次使用时补充(一次性写入租户配置),不要每次调用都向用户索要。
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 4. 动作流 id(runEsb):运行时按钮配置解析,不写死 esbActionIds
|
|
147
|
+
|
|
148
|
+
本技能有 6 处 `runEsb` 触发(见各写操作文档):催评、安排面试的面试通知、发 Offer、办入职、取消入职、改期入职。`runEsb` 的 `esbActionIds` 随环境迁入/升级**必然变化**(实测:不同环境 esbActionIds 各不相同),且跨环境不可移植——**必须运行时解析,不得写死、不得用部署参数 token**。
|
|
149
|
+
|
|
150
|
+
- **解析机制(三环境实测验证)**:前端的 esb 动作流 id 来自「按钮配置接口」返回,天然是当前环境真实值,与页面点击同源:
|
|
151
|
+
- **表单类动作流**(发 Offer / 办入职 / 取消入职 / 改期入职 / 面试通知):先按 §2 的 tag 解析出表单 `objId`,再 `POST /api/ebuilder/form/data/getFormButtons`(`body` 见下),取 `actions[]` 中 `actionType="esb"` 且**按钮名称匹配业务动作**的 `id`。
|
|
152
|
+
- **列表类动作流(仅催评)**:面试反馈列表 `GET /api/ebuilder/form/list/getListButtons/{listId}?passid={列表passid}`,取 `buttons[].actions[]` 中 `actionType="esb"` 且名称含「面试安排催评」(**排除**「批量催评」)的 `id`。
|
|
153
|
+
- `getFormButtons` body:`{"layoutType":"formLayout","objId":"<表单objId>","dataId":"","formDataId":"","type":"1","fromRecycle":false,"otherOperator":"","objectAppId":"","browser":"Chrome","isTamper":"0"}`。
|
|
154
|
+
- **按钮名称 → 动作流 映射(名称跨环境稳定,用名称而非 id 匹配)**:
|
|
155
|
+
| 写操作 | 来源 | 匹配按钮名称关键词 |
|
|
156
|
+
|---|---|---|
|
|
157
|
+
| 发 Offer | getFormButtons(offer反馈表单 `uf_rcrt_offer_sending`) | 更新offer发送信息 |
|
|
158
|
+
| 办入职 | getFormButtons(入职管理表单 `uf_rcrt_entry_manage`) | offer转入职 |
|
|
159
|
+
| 取消入职 | getFormButtons(取消入职中间表 `uf_rcrt_entry_cancel`) | 入职管理-取消入职 |
|
|
160
|
+
| 改期入职 | getFormButtons(改期入职中间表 `uf_rcrt_entry_change`) | 入职管理-改期入职 |
|
|
161
|
+
| 面试通知 | getFormButtons(面试计划表单 `uf_rcrt_interview_plan`) | 新建日程(面试管理-新建日程) |
|
|
162
|
+
| 催评 | getListButtons(面试反馈列表) | 面试安排催评(排除批量催评) |
|
|
163
|
+
- **降级(用户 决策:不清晰的动作,宁可不执行,也不能乱执行)**:
|
|
164
|
+
- **取消/改期入职**:中间表 tag `uf_rcrt_entry_cancel` / `uf_rcrt_entry_change` 经 `getObjsByTag` 解析不到(`data:[]`)→ **判定该环境未启用此功能**,阻断动作并友好提示「当前环境未启用取消入职/改期入职功能」,**不执行、不兜底部署参数、不臆造**;
|
|
165
|
+
- **其余 4 项**(发 Offer / 办入职 / 面试通知 / 催评):表单 objId 解析到但 `getFormButtons`/`getListButtons` 无 `actionType=esb` 匹配按钮 → 停止并提示「当前环境未取到 X 动作流配置,请确认表单已部署或联系管理员」,**不得臆造 esbActionIds**。
|
|
166
|
+
- **为何不用 uniqueIndent**:`调用自定义动作流对接方式.docx` 自标 uniqueIndent「不推荐使用」,且其反查接口(uniqueIndent→actionId)在本环境从未确认、无实现;相比按钮配置解析(UI 同源、天然跨环境),uniqueIndent 路线属过度设计且未落地,**废弃**。
|
|
167
|
+
|
|
168
|
+
> 注:办入职第②步 `triggerActionFlow`(非 runEsb)走 `uniqueIndent` 稳定锚点(docx 该端点原生参数),本技能直接传入,不在此解析范围内。
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 5. 表单字段 id 运行时解析(ds/fields,不写死)
|
|
173
|
+
|
|
174
|
+
EB 表单字段的元数据 id(`fields[].id`,即列表过滤键 `field_<id>` 与 `saveFormData.dataDetails.formField.id`)随租户表单结构不同而变化,**不得写死**。调用前按下列方式解析:
|
|
175
|
+
|
|
176
|
+
1. **取字段列表**:`POST /api/ebuilder/common/ds/fields`,**必须是 `multipart/form-data` 请求(非 JSON body,传 JSON 会 400)**。各字段为独立 form part,值如下:`groupId`=应用 appId、`sourceId`=当前表单 objId、`sourceType`=`FORM`、`detailFieldsGroup`=`true`、`enableMerge`=`true`、`customParam`=`{"terminal":""}`、`params`=`[]`。返回 `data[]`(按 objId 分组,取主表分组)每项含 `fields[]`,字段含 `id`(字段元数据 id)、`name`(字段标识,自定义字段实测与其 `id` 相同)、`text`(显示名)、`config.dataKey`(业务数据键,建映射以此为准)。
|
|
177
|
+
2. **建映射**:以 `config.dataKey` 为键、`id` 为值,建立「业务字段 → fieldId」映射(**不要用 `name` 作业务键**——自定义字段实测 `name` 就等于其 `id`,是字段标识而非业务名,用它会拿不到字段;环境缓存 `fields[objId]` 即按此规则生成)。招聘常用字段建议的 dataKey(以实际返回为准,不要臆造):手机 `telephone`、**姓名 `candidate_name`(不是 `name`—— 实测人才表单无 `dataKey=name` 字段,用错会拿不到姓名字段 id)**、邮箱 `email`、招聘状态 `recruit_status`、简历来源 `937153853968539840`(表单字段,Ebuilder 引用渠道字典,取值=渠道 optionId;列表过滤仍可用 `channel`)。
|
|
178
|
+
3. **使用**:
|
|
179
|
+
- 列表过滤(`getListDatas` 的 `searchParamData.commonSearchFields`):键用 `field_{fieldId}`(实测该端点仅接受 `field_{id}` 格式),取映射后的 fieldId 拼接,值形态见各搜索文档 §4.4。
|
|
180
|
+
- 写操作(`saveFormData.dataDetails`):每项 `formField.id` 用映射后的 fieldId。
|
|
181
|
+
4. **安排面试字段(面试计划表单)**:同样经上面的 `ds/fields` 按 `config.dataKey` 解析,结果已并入环境缓存 `fields[objId]` 的 `{dataKey: fieldId}`(实测 6 个键可直接引用,仍以实际返回为准):`interviewer`(面试官,组件类型 `Employee`)、`position_manage_id`(应聘职位)、`talent_id`(候选人)、`candidate_manage_id`(候选批次)、`mobile`(候选人手机号)、`email`(候选人邮箱)。解析不到的字段一律停止,不得臆造 fieldId。
|
|
182
|
+
|
|
183
|
+
### 5.1 枚举选项动态获取(ds/options,换环境刷新字典用)
|
|
184
|
+
|
|
185
|
+
选择类字段(`Select`/`RadioBox`/`CheckBox`/关联字典)的选项 id(optionId)随租户不同,**换环境须动态获取,勿用 `data-dictionary.md` 旧值**(该文件为当前环境快照)。官方用法(对齐 `ebuilder-data-apis` 技能):
|
|
186
|
+
|
|
187
|
+
- `GET /api/ebuilder/common/ds/options?fieldName={fieldId}&objId={objId}&sourceType=FORM&groupId={appId}`(可加 `optionLevel=1`)
|
|
188
|
+
- 参数:`fieldName`=**字段元数据 id**(取 `ds/fields` 返回的 `fields[].id`,不是字段 `name` 也不是显示文本);`objId`=表单 objId;`sourceType`=`FORM`;`groupId`=appId。
|
|
189
|
+
- 返回选项 `id`/`name`/`pid`,建立「选项 id → 中文名」映射。
|
|
190
|
+
- 例:简历来源渠道(人才表单 `uf_rcrt_talent_pool` 中「简历来源」字段 id=937153853968539840,Ebuilder 引用渠道字典 `uf_rcrt_dictionary`)→ `ds/options?fieldName=937153853968539840&objId=937153849749069833&sourceType=FORM&groupId={appId}`。
|
|
191
|
+
|
|
192
|
+
> **⚠️ 字典引用类字段可能返回空**:`ds/options` 对**纯选择类字段**有效(部分版本的招聘状态 `recruit_status` 可解析出 4 项);但对**Ebuilder 字典引用类字段**(如部分版本的简历来源渠道 `channel`/`channel_key`/`source_channel_id` 均返回 `data:[]`)可能取不到选项。此时**不要臆造映射**,改用以下中文来源(按优先级):
|
|
193
|
+
> 1. 响应本身内联中文:部分版本的 `displayData[字段]` 值即中文(如 `demand_status=进行中`、`channel=内部推荐`),详情接口 `getCandidateCardBaseInfo` 的 `talent.channel` 也直出中文;
|
|
194
|
+
> 2. `data-dictionary.md` 当前环境快照(若该环境有);
|
|
195
|
+
> 3. 以上皆无 → 按「未知 ID 原样回退」显示裸 ID。
|
|
196
|
+
|
|
197
|
+
> 解析失败时:停止并提示"未能取得当前表单字段定义,请确认表单已部署或补充部署参数",**不得臆造 fieldId**。
|
|
198
|
+
|
|
199
|
+
## 6. 注意(易错)
|
|
200
|
+
|
|
201
|
+
- Long 型 id 一律按**字符串**处理,避免精度丢失。
|
|
202
|
+
- `passid`/`cid` 本质是同一表单的 objId,二者同值。
|
|
203
|
+
- 解析失败时(tag 无对应表单 / 返回空):停止并提示"当前租户未配置招聘应用的对应表单(tag=X),请联系管理员或补充部署参数",**不得臆造 id**。
|
|
204
|
+
- 同一 tag 在租户内可能存在多个应用实例(tag 策略限制)——优先取安装闸门返回的 `data[0]`,并向用户说明"检测到多个安装实例"。
|
|
205
|
+
|
|
206
|
+
## 7. 列表查询必带上下文参数(getListDatas,缺失 → total=0 假空)
|
|
207
|
+
|
|
208
|
+
`POST /api/ebuilder/form/list/getListDatas` 除 `listId`/`tableuid`/`searchParamData` 外,**还必须带下列上下文参数**,否则后端返回 `total=0`、`data:[]`(假空,并非真无数据):
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"searchParamData": { "searchType": "3", "type": "and" },
|
|
213
|
+
"terminal": "PC", "browser": "Chrome",
|
|
214
|
+
"requiredMatch": 1, "mapResult": 1, "recheckQuery": 1,
|
|
215
|
+
"isFollow": 0, "isShareToMe": 0, "filterCondition": {},
|
|
216
|
+
"cusMenuId": "<列表菜单 id,部署参数>",
|
|
217
|
+
"urlPageTitle": "<EB 页面标题,如 人才库>", "menuName": "<EB 页面标题,如 人才库>"
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
- `searchType` 固定 `"3"`;`requiredMatch`/`mapResult`/`recheckQuery` 固定 `1`;`isFollow`/`isShareToMe` 固定 `0`;`filterCondition` 固定 `{}`。
|
|
222
|
+
- 人才库列表额外需 `selectedId`(列表选中上下文 id,部署参数 `${TALENT_SELECTED_ID}`);需求/职位/入职列表可省略。
|
|
223
|
+
- 各列表文档 §6 请求示例已补全部必带参数;**缺失任一项都会导致查不到数据(假空),不要据此判断「列表为空」**。
|
|
224
|
+
|
|
225
|
+
## 8. 换环境(环境迁移)动态性核验清单
|
|
226
|
+
|
|
227
|
+
> 不同环境(开发/测试/生产)的 EB 应用/表单/列表/字典 id 均不同。**换环境后必须按下表逐项重新解析或替换,禁止沿用旧环境 id**;验证"是否全都匹配"即对照本清单逐项核对。
|
|
228
|
+
|
|
229
|
+
| # | id 类别 | 换环境行为 | 验证方式 |
|
|
230
|
+
|---|---|---|---|
|
|
231
|
+
| 1 | 应用 `appId` | 重新获取 | 安装闸门 `getAppIds?tag=weaver-recruit-service` → `data[0]` |
|
|
232
|
+
| 2 | 表单 `objId`/`passid`/`cid` | 自动适配 | `getObjsByTag(appId, 表单tag)` 逐表单解析 |
|
|
233
|
+
| 3 | 表单 `formId`/`formLayout.id` | 重新获取 | `getObjsByTag`(同响应 `formId` 字段)/ `GET /api/ebuilder/form/form/core/getFormLayout` / 详情接口返回 |
|
|
234
|
+
| 4 | 字段 id(`field_<id>`/`formField.id`) | 自动适配 | `ds/fields` 按 `name`/`config.dataKey` 解析;**接口文档字段表里的数字 id 仅为当前环境参考值,禁止直接使用** |
|
|
235
|
+
| 5 | 枚举选项 id(状态/渠道/面试方式等) | **需刷新** | `data-dictionary.md` 为当前环境快照;换环境后经 `ds/fields` 的 `options` 重新获取更新 |
|
|
236
|
+
| 6 | 动作流 `esbActionIds`(runEsb) | 自动适配 | 按 §4 按钮配置解析(getFormButtons/getListButtons,按按钮名称匹配),不写死、不依赖部署参数 |
|
|
237
|
+
| 7 | 列表 `listId`/`cusMenuId`/`selectedId` | **部署参数,需替换** | 由当前租户部署提供,换环境须更新为新环境值 |
|
|
238
|
+
| 8 | 人才卡片页面 id(EB 详情链接)、统计 `pageId`/`sheetId` | 自动适配(人才卡片) / 部署参数(统计) | 人才卡片 id 经业务配置表 key=28 / page/list 自动解析;统计 pageId/sheetId 经菜单树自动发现 |
|
|
239
|
+
| 9 | 示例记录 id(`data.id`/`talentId` 等 13 开头) | 仅示例 | 接口返回的动态值,示例仅示意,勿当入参 |
|
|
240
|
+
|
|
241
|
+
**换环境验证步骤(推荐)**:① 用新环境 baseUrl+认证跑一次"解析探针"(getAppIds → getObjsByTag → ds/fields → 各列表 getListDatas),输出新环境 id 全集;② 与技能中写死的 id 对照,找出"缺解析链路 / 解析不到"的项;③ 更新部署参数(listId/cusMenuId/selectedId/viewId/pageId/sheetId)与字典快照;④ 逐接口回归。
|