@lark-people/cli 0.0.0-beta.1
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/CHANGELOG.md +324 -0
- package/LICENSE +21 -0
- package/README.md +232 -0
- package/README.zh.md +232 -0
- package/bin/people-cli_darwin_amd64 +0 -0
- package/bin/people-cli_darwin_arm64 +0 -0
- package/bin/people-cli_linux_amd64 +0 -0
- package/bin/people-cli_linux_arm64 +0 -0
- package/bin/people-cli_windows_amd64.exe +0 -0
- package/bin/people-cli_windows_arm64.exe +0 -0
- package/package.json +41 -0
- package/scripts/install-wizard.js +700 -0
- package/scripts/install.js +56 -0
- package/scripts/run.js +36 -0
- package/skills/people-attendance/SKILL.md +667 -0
- package/skills/people-attendance/references/people-attendance-submission.md +426 -0
- package/skills/people-attendance/scripts/resolve_date.py +894 -0
- package/skills/people-corehr/references/people-corehr-pre-hire-search.md +0 -0
- package/skills/people-corehr-employee/SKILL.md +111 -0
- package/skills/people-corehr-employee/references/people-corehr-employee-basic-info-query.md +97 -0
- package/skills/people-corehr-employee/references/people-corehr-employee-fields-list.md +87 -0
- package/skills/people-corehr-employee/references/people-corehr-employee-filter.md +403 -0
- package/skills/people-corehr-employee/references/people-corehr-employee-search.md +73 -0
- package/skills/people-corehr-job-change/SKILL.md +212 -0
- package/skills/people-corehr-job-change/references/people-job-change-business-rules.md +113 -0
- package/skills/people-corehr-job-change/references/people-job-change-lookup-filters.md +82 -0
- package/skills/people-corehr-job-change/references/people-job-change-output-and-empty.md +207 -0
- package/skills/people-corehr-job-change/references/people-job-change-search-advanced.md +226 -0
- package/skills/people-corehr-job-change/references/people-job-change-search-fields.md +119 -0
- package/skills/people-corehr-job-change/references/people-job-change-search-option.md +72 -0
- package/skills/people-corehr-job-change/references/people-job-change-search.md +215 -0
- package/skills/people-corehr-offboarding/SKILL.md +188 -0
- package/skills/people-corehr-offboarding/references/people-corehr-offboarding-business-knowledge.md +27 -0
- package/skills/people-corehr-offboarding/references/people-corehr-offboarding-search-option.md +187 -0
- package/skills/people-corehr-offboarding/references/people-corehr-offboarding-search.md +54 -0
- package/skills/people-corehr-organization/SKILL.md +42 -0
- package/skills/people-corehr-organization/references/aggregate.md +11 -0
- package/skills/people-corehr-organization/references/detail.md +39 -0
- package/skills/people-corehr-organization/references/field-values.md +44 -0
- package/skills/people-corehr-organization/references/hierarchy.md +61 -0
- package/skills/people-corehr-organization/references/lookup.md +41 -0
- package/skills/people-corehr-organization/references/metadata.md +40 -0
- package/skills/people-corehr-organization/references/tree.md +45 -0
- package/skills/people-corehr-prehire/SKILL.md +160 -0
- package/skills/people-corehr-prehire/references/command-resolution.md +48 -0
- package/skills/people-corehr-prehire/references/filter-fields.md +151 -0
- package/skills/people-corehr-prehire/references/return-fields.md +153 -0
- package/skills/people-corehr-prehire/references/templates.md +202 -0
- package/skills/people-corehr-prehire/references/troubleshooting.md +93 -0
- package/skills/people-corehr-query-id-by-name/SKILL.md +154 -0
- package/skills/people-corehr-renewal/SKILL.md +186 -0
- package/skills/people-corehr-renewal/references/people-corehr-renewal-fields-query.md +62 -0
- package/skills/people-corehr-renewal/references/people-corehr-renewal-routing.md +54 -0
- package/skills/people-corehr-renewal/references/people-corehr-renewal-search.md +137 -0
- package/skills/people-corehr-renewal/references/people-corehr-renewal.md +39 -0
- package/skills/people-corehr-workforce-plan/SKILL.md +52 -0
- package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan-detail-list.md +238 -0
- package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan-detail-summary.md +221 -0
- package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan.md +79 -0
- package/skills/people-hire/SKILL.md +255 -0
- package/skills/people-hire/references/people-hire-application.md +334 -0
- package/skills/people-hire/references/people-hire-evaluation-task-list.md +233 -0
- package/skills/people-hire/references/people-hire-evaluation.md +127 -0
- package/skills/people-hire/references/people-hire-interview-record.md +109 -0
- package/skills/people-hire/references/people-hire-interview-task-list.md +250 -0
- package/skills/people-hire/references/people-hire-interview.md +146 -0
- package/skills/people-hire/references/people-hire-job-process.md +93 -0
- package/skills/people-hire/references/people-hire-job-requirement.md +227 -0
- package/skills/people-hire/references/people-hire-job.md +277 -0
- package/skills/people-hire/references/people-hire-minutes.md +91 -0
- package/skills/people-hire/references/people-hire-talent.md +105 -0
- package/skills/people-hire/references/people-hire-test.md +197 -0
- package/skills/people-overtime/SKILL.md +992 -0
- package/skills/people-overtime/references/people-attendance-overtime-apply.md +491 -0
- package/skills/people-overtime/references/people-attendance-overtime.md +51 -0
- package/skills/people-overtime/references/people-attendance-submission.md +203 -0
- package/skills/people-overtime/scripts/resolve_date.py +894 -0
- package/skills/people-shared/SKILL.md +94 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# job_change search-option
|
|
2
|
+
|
|
3
|
+
`search-option` 是普通 job-change 查询的第一步运行时校准,不是最终查询结果。
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
每个普通异动查询最多调用一次;必须用内置 `--jq` 只取本题需要的字段:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
people-cli corehr job_change search-option --as user --jq '<jq expression>'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
这是本轮唯一允许的运行时校准形态。只提取与本轮用户问题、默认返回字段、潜在筛选字段相关的小片段;禁止无 `--jq` 的 `search-option`,禁止 `head` / `grep` / 截断读取,禁止把完整 `system_filters` / `system_columns` dump 到上下文或最终答案。
|
|
14
|
+
|
|
15
|
+
## Bounded jq
|
|
16
|
+
|
|
17
|
+
需要同时校准筛选字段和值、以及显式返回字段时,用一个 `--jq` 返回两组小对象;`KEYWORD_REGEX` 必须按用户原词和同义词替换,禁止返回完整 enums/tree:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
people-cli corehr job_change search-option --as user --jq '{
|
|
21
|
+
filters: [.data.system_filters[]? | select((.field // .field_api_name // .filter_api_name) as $f | ["transform_reason","details_of_job_status_change","status"] | index($f)) | {field:(.filter_api_name // .field // .field_api_name), type, names, target_object_api_name, enums:([.enums[]? | select((((.label // "")+" "+(.value // "")+" "+(.description // "")) | test("KEYWORD_REGEX"; "i")))] )}],
|
|
22
|
+
columns: [.data.system_columns[]? | select((.field_api_name // .field) as $f | ["effective_date","status","transform_type","transform_reason","original_department","target_department","original_work_location","target_work_location","employment.employee_number"] | index($f)) | {field:(.field_api_name // .field), type, names}]
|
|
23
|
+
}'
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
只找某个枚举/原因时,精确命中字段并过滤候选,不要用中文关键词扫全量:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
people-cli corehr job_change search-option --as user --jq '.data.system_filters[]? | select((.field // .field_api_name // .filter_api_name) == "transform_reason") | {field:(.filter_api_name // .field // .field_api_name), type, names, enums:([.enums[]? | select((((.label // "")+" "+(.value // "")+" "+(.description // "")) | test("KEYWORD_REGEX"; "i")))] )}'
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
只确认工作地点/部门等返回列时,按 API 字段白名单取列,不要按“部门/工作地点”关键词扫所有员工字段:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
people-cli corehr job_change search-option --as user --jq '[.data.system_columns[]? | select((.field_api_name // .field) as $f | ["original_department","target_department","original_work_location","target_work_location"] | index($f)) | {field:(.field_api_name // .field), type, names}]'
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
首步校准必须解决两件事:
|
|
39
|
+
|
|
40
|
+
1. **怎么筛选**:从 `system_filters` 匹配用户语义,确认字段 API 名、字段类型、lookup 目标对象、enum/tree/select 合法候选。
|
|
41
|
+
2. **能否返回**:从 `system_columns` 匹配用户显式要求的返回字段,确认该字段是否支持返回。
|
|
42
|
+
|
|
43
|
+
## Rules
|
|
44
|
+
|
|
45
|
+
- 单次校准产物必须复用:不要为了看结构、找字段、验证筛选效果而再次调用 `search-option`,也不要先 `head` 后再全量读取。若一次 `--jq` 没覆盖必需字段,按运行时解析不可用输出,不要再补查第二次;下一个动作只能最终 search 或不可完成说明。
|
|
46
|
+
- 已从 `search-option` 校准出字段和值,且最终 `+job-change-search` 返回合法 JSON 后,结果可信;不要再调 `--help`、替代 flag、raw `filter_str` 或反向状态值做对照实验。
|
|
47
|
+
- 用户原词只是匹配线索,不是最终枚举值。例:“已取消”要映射到当前状态枚举里的合法项;若运行时合法项是“已撤销”,最终查询写“已撤销”。
|
|
48
|
+
- 解析“已生效/生效的异动/某月生效的所有异动”时,状态集合只能包含当前枚举中表示已实际生效、已完成、已转换的合法候选。`Approved` / 审批通过 / 已批准是待生效,不是已生效,必须排除;“无需审批/免审批”只有在运行时语义明确表示已实际生效时才可纳入,不能仅凭无需审批就当作已生效。
|
|
49
|
+
- 筛选字段只能来自 `system_filters`;返回字段只能来自 `system_columns`。禁止把返回列当筛选 key,也禁止把筛选项当返回字段。
|
|
50
|
+
- 命中筛选项后,从完整对象中确认最终字段:优先 `filter_api_name`,否则 `field`;两者都没有时停止。
|
|
51
|
+
- 异常类型是例外易错字段:运行时对象可能同时包含展示字段 `exception_type` 和底层 `api_name=transform_exception_type`,且中文名为“异常类型”。校准时应把它识别为异常类型字段,枚举值仍从该对象的 `enums` 中按业务 label 选取;不要因为只按某一个字段名查不到就改用异常处理状态、异动状态或异动变更内容。
|
|
52
|
+
- lookup 类型只确认字段;对象名称由 `+job-change-search --lookup-filters` 内部解析并写入最终 `filter_str`。标准 job_change 字段可省略 `target_object_api_name`,由 shortcut 自动补齐;非标准/自定义字段才使用运行时返回的目标对象。
|
|
53
|
+
- `select_query` / `select_query_all` / `tree_query_all` 类型若用户给的是展示名/名称,也按引用字段校准:字段名取运行时 `filter_api_name` 或 `field`。标准字段不要手写 `target_object_api_name`;非标准字段优先取运行时返回的 `target_object_api_name`,缺失时使用运行时 `api_name`。不要把展示名直接作为 `--dynamic-filters` 的值。
|
|
54
|
+
- enum/tree/select 类型必须使用当前运行时合法候选;找不到或多候选无法唯一确定时澄清或输出不可用结果。
|
|
55
|
+
- “涉及某类变更内容”的查询必须优先匹配 `system_filters` 里的“异动变更内容/Details of job status change”筛选项,并从其 enum 中取合法值;不要把“序列变更、直属上级变更、工作地点变更”等仅当作返回字段对比任务。
|
|
56
|
+
- 校准“异动变更内容”枚举时,“变更/变化/调整/发生变化”是用户语义后缀,不是必然的枚举文本。先用用户原词匹配;若未命中,再去掉这些后缀匹配字段本体。例如“直属上级变更”应命中运行时枚举 label “直属上级” 并使用其 value,如 `direct_manager`;不能把“直属上级变更”原样写入 `values`。
|
|
57
|
+
- “有值/不为空/存在”是存在性语义,不是枚举值。若命中字段是 enum/tree/select 且有候选,将该字段当前全部合法候选放入 `values` 数组;若无候选且没有明确非空操作符,停止说明无法安全表达。
|
|
58
|
+
- 自定义字段不得写死字段名、组织名、枚举值或候选 ID。
|
|
59
|
+
|
|
60
|
+
## After Calibration
|
|
61
|
+
|
|
62
|
+
- 普通枚举/文本筛选条件:优先用 `+job-change-search --dynamic-filters '[{"field_name":"<FIELD_API_NAME>","values":["<RUNTIME_VALID_VALUE>"]}]'`。
|
|
63
|
+
- `select_query` 名称筛选:标准字段用 `--lookup-filters '[{"field_name":"<FIELD_API_NAME>","values":["<名称>"]}]'`;非标准字段才加运行时目标对象。
|
|
64
|
+
- 员工姓名:用 `--lookup-filters '[{"field_name":"employment","values":["<姓名>"]}]'`。
|
|
65
|
+
- 当前所属/员工部门:用 `--lookup-filters '[{"field_name":"employment.department","values":["<部门名>"]}]'`。
|
|
66
|
+
- 其它引用字段名称:用 `search-option` 或字段聚类确认 `field_name`;标准字段的目标对象交给 shortcut 自动补齐,非标准字段才显式传运行时 `target_object_api_name`。
|
|
67
|
+
- 返回字段:用 `--select-field-names '["<SUPPORTED_DISPLAY_NAME>"]'` 或合法 `--select-fields`。
|
|
68
|
+
- 真正查询记录必须回到 [people-job-change-search.md](people-job-change-search.md)。
|
|
69
|
+
|
|
70
|
+
## If Unavailable
|
|
71
|
+
|
|
72
|
+
若当前环境未注册 `search-option`,只能使用已知稳定 shortcut 能力做有限兜底;凡是依赖运行时字段、枚举、树值或自定义字段才能确认的条件,必须说明无法安全解析,不能猜。
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# job_change search
|
|
2
|
+
|
|
3
|
+
构造和执行异动记录搜索。先读主 [SKILL.md](../SKILL.md)。
|
|
4
|
+
|
|
5
|
+
## Search Order
|
|
6
|
+
固定用短路径填槽:
|
|
7
|
+
|
|
8
|
+
1. `search-option --as user`:普通查询最多 1 次,只看当前 query 所需字段、枚举、lookup 目标和返回列。
|
|
9
|
+
2. `lookup-filters first`:名称型 lookup 条件直接放进最终 `+job-change-search --lookup-filters`,由 search 内部解析 ID 并写入 `filter_str`。
|
|
10
|
+
3. `+job-change-search --format json --as user`:条件可执行后必须执行真实搜索。
|
|
11
|
+
4. `page_token`:仅在用户明确要求翻页、全部、完整列表、继续翻页,或问题属于汇总/统计/数量/分组/“都去了哪些”等全量才准确场景时,有界翻页聚合。
|
|
12
|
+
5. 输出:只基于最后一次真实搜索或按分页策略完成的有界聚合。
|
|
13
|
+
|
|
14
|
+
探查预算:调用过 `search-option` 后禁止再调 `--help` / `schema`,禁止反复 dump 全量 `system_filters`,禁止用 python 全量扫描元数据。若 lookup-filters 解析失败、最终搜索报错、JSON 形态不符合固定对象或分页解析失败,直接输出结构化不可完成原因,不回退到显式名称转 ID、继续探查、写临时脚本或改参重试到超时。
|
|
15
|
+
|
|
16
|
+
## Intent Routes
|
|
17
|
+
| 用户意图 | 槽位填法 | 下一步 |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| 时间范围/某月生效 | 日期转 `--effective-date-start/end`;“已生效/生效的异动”才从状态枚举选已生效集合 | 直接 search |
|
|
20
|
+
| 某部门的异动/某部门有哪些异动 | 部门有员工当前、异动前、异动后三种口径;未指明时默认 `target_department`,答案说明按异动后部门查询 | search |
|
|
21
|
+
| 调入/目标部门 | 用 `target_department`;名称用 `--lookup-filters`;追加 `details_of_job_status_change=department` | search |
|
|
22
|
+
| 调出/来源部门 | 用 `original_department`;名称用 `--lookup-filters`;追加 `details_of_job_status_change=department` | search |
|
|
23
|
+
| 当前所属/员工部门 | 用 `--lookup-filters field_name=employment.department`,target 由 shortcut 自动补齐 | search |
|
|
24
|
+
| 新/目标工作地点;原/旧工作地点 | 分别用 `target_work_location` / `original_work_location` 的 `--lookup-filters`,target 由 shortcut 自动补齐 | search |
|
|
25
|
+
| 员工姓名 | `--lookup-filters field_name=employment` | search |
|
|
26
|
+
| 状态/类型/原因 | 从 `search-option` 当前候选映射到合法值 | `--dynamic-filters` 后 search |
|
|
27
|
+
| 变更内容门禁 | 凡是筛"发生某字段变更/调入调出/异动到/从 X 到 Y/转为/同步变"都判断并追加对应 `details_of_job_status_change`;只做"是否变更"输出标注时不追加 | search |
|
|
28
|
+
| 自定义筛选字段 | 只校准当前字段是否在 `system_filters` | `--dynamic-filters` 后 search |
|
|
29
|
+
| 自定义返回字段 | 只校准当前字段是否在 `system_columns` | `--select-field-names` 后 search |
|
|
30
|
+
| 都去了哪些/汇总/统计/数量/分组 | search 带必要返回字段;最多先按 `page_token` 聚合 200 条 | 输出部分或完整聚合结果;若仍有更多,询问是否继续 |
|
|
31
|
+
|
|
32
|
+
## Field Mapping
|
|
33
|
+
|
|
34
|
+
| 用户语义 | 搜索表达 |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| 生效日期/生效时间 | `--effective-date-start/end`,不追加状态 |
|
|
37
|
+
| 已生效的异动/生效的异动记录 | 日期范围 + `status`,状态只取运行时"已生效"语义;`Approved` / 审批通过 / 已批准属于待生效,"无需审批/直接异动"属于未生效,禁止算已生效 |
|
|
38
|
+
| 审批中/已取消/已拒绝/已完成 | `--dynamic-filters '[{"field_name":"status","values":["<运行时合法状态展示值>"]}]'` |
|
|
39
|
+
| 异动类型 / “某某类型的异动” / “某某异动类型的单据” | 字段固定走运行时异动类型/`transform_type` 候选;禁止改查同名/近名自定义标记字段、员工字段或“命中=true”字段;“实习生转正式类型”按异动类型,不按人员类型;若同时问部门也变了,同次追加 `details_of_job_status_change=department`;"调薪"不走类型,见是否调薪 |
|
|
40
|
+
| 异动原因 | `transform_reason`,候选值来自 `search-option` |
|
|
41
|
+
| 调薪/是否调薪/今年调薪的人员 | 校准布尔字段"是否调薪"并筛选 true,通常字段为 `is_adjust_salary`;不要误用"调级调薪"异动类型 |
|
|
42
|
+
| 未生效/直接异动 | 未生效按审批通过 + 无需审批两个状态分别查 `data.total`;直接异动只查无需审批;不要只读 `search-option` |
|
|
43
|
+
| 目标/调入部门 | `--lookup-filters field_name=target_department`;若语义是调入/转入/调入到,追加 `details_of_job_status_change=department` |
|
|
44
|
+
| 未限定方向的“某部门的异动/有哪些异动”;目标/调入部门 | `--lookup-filters field_name=target_department`;未限定方向时输出说明按异动后部门查询 |
|
|
45
|
+
| 原/调出/来源部门 | `--lookup-filters field_name=original_department`;若语义是调出/转出/去了哪些部门,追加 `details_of_job_status_change=department` |
|
|
46
|
+
| 当前在某部门/某部门员工/当前所属 | `--lookup-filters field_name=employment.department` |
|
|
47
|
+
| 新/目标工作地点;原/旧工作地点 | 分别用 `target_work_location` / `original_work_location` 的 `--lookup-filters`;地点名称不要写成文本动态筛选 |
|
|
48
|
+
| 异动到/调到/变更到/转为某目标值 | 目标侧字段筛选 + 对应 `details_of_job_status_change`;如到北京 = `target_work_location` lookup 北京 AND 变更内容含工作地点;转正式成功=已生效 + `target_workforce_type` 正式 + 人员类型变更 |
|
|
49
|
+
| 异动后有新试用期/有新试用期的同学 | 生效日期范围 + 试用期变更内容 + 返回"是否有试用期";仅该字段为 true 的记录算命中,和实习生转正式/人员类型无关 |
|
|
50
|
+
| 涉及序列/直属上级/工作地点等变更内容 | 明确要求发生该变更才用 `details_of_job_status_change` 筛选;问"有没有/是否变化"只返回原/新字段做标注 |
|
|
51
|
+
| 多字段是否变化并标注原因/是否调薪 | `--select-fields` 显式包含所有被标注维度的 original/target 字段、`transform_reason`、`is_adjust_salary`;不依赖默认字段 |
|
|
52
|
+
| 某字段有值/不为空 | 先从 `search-option.system_filters` 校准字段;若是 enum/tree/select,则 values 填该字段全部运行时合法候选,禁止写 `"有值"` |
|
|
53
|
+
| 员工姓名 | `--lookup-filters field_name=employment`,不要用 `--dynamic-filters field_name=employment` |
|
|
54
|
+
| 展示名/自定义返回字段 | 先校准 `system_columns`,再用 `--select-field-names` |
|
|
55
|
+
| 展示名/自定义筛选字段 | 先校准 `system_filters`,再用 `--dynamic-filters` |
|
|
56
|
+
用户原词不是枚举最终值。例:用户说“已取消”,若当前状态枚举合法项是“已撤销”,最终查询写“已撤销”。状态业务口径:审批中、审批通过、无需审批、已生效、已撤销、已拒绝;"已生效"只包含已生效。"未生效"包含待生效/审批通过/已批准和无需审批/直接异动。"查 2026 年 5 月生效的所有异动"属于已生效状态语义:使用 `2026-05-01` 至 `2026-05-31` 的生效日期范围,并从 `search-option` 的状态枚举中选择已生效合法候选作为 `status` values;必须排除 `Approved` / 审批通过 / 已批准 / 无需审批。
|
|
57
|
+
常见用户语义补充:哪些人=姓名+工号;异常=异常状态/异常处理人/状态分别校准;合同信息变更筛选只用 `details_of_job_status_change=["contract"]`,合同下级字段(公司、类型、编号、签订/期限类型、起止日期)仅用于返回展示;试用期=对应原/新预计结束日期;"新试用期/异动后有试用期"必须返回并校验"是否有试用期"为 true;原因=`transform_reason`(异动原因),不能用 `details_of_job_status_change`(变更内容)代替;字段缺失基于 `system_columns` 最多补一次合法返回字段重搜,仍缺写"未返回",不继续查 `schema`/`help`。
|
|
58
|
+
`details_of_job_status_change` 门禁补充:构造最终 search 前必须先问"这个条件是在筛变更发生,还是只作为返回/标注?"。筛变更发生时追加对应 details value:部门 `department`、工作地点 `work_location`、序列 `job_family`、职级 `job_level`、职务 `job`、直属上级 `direct_manager`、虚线上级 `dotted_manager`、人员类型 `employee_type`、合同 `contract`、司龄起算日期 `seniority_date`;试用期用运行时"试用期"父节点/合法值。若是"工作地点有没有变化/职级是否变更/每组标注是否变更"这类输出标注,只返回 original/target 字段并在答案中比较,不把该 details value 作为过滤条件。
|
|
59
|
+
多字段变化标注补充:用户点名多个维度"分别有没有变化/是否变化"时,最终搜索前必须把这些维度展开为返回字段对。例如职务、序列、职级、人员类型、工作地点分别对应 `original_job/target_job`、`original_job_family/target_job_family`、`original_job_level/target_job_level`、`original_workforce_type/target_workforce_type`、`original_work_location/target_work_location`。若还要求异动原因和是否调薪,同时返回 `transform_reason` 和 `is_adjust_salary`;若响应只给原因标识字段,答案层读取实际返回字段。返回缺失时逐项写未返回/无法判断,不能省略。
|
|
60
|
+
部门方向性动作补充:用户说"调入/调出/转入/转出/调入到/从某部门调出/去了哪些部门/调到哪些部门"时,必须同时筛 `details_of_job_status_change=["department"]`,因为目标/原部门字段匹配不等于本次异动发生了部门变更。"调出的人/调入的人/已经调出/已经调入/去了哪些部门"默认是已发生人员流动,追加严格已生效状态;若用户明确要求全部状态才不加。
|
|
61
|
+
## Lookup Filters
|
|
62
|
+
名称型对象筛选优先使用 `+job-change-search --lookup-filters`,不要在 runner 中显式调用名称转 ID。`field_name` 使用 job_change 搜索字段,即运行时字段或字段聚类里的 `business_field_name` / field api name。标准 job_change 字段只传 `field_name` + `values`,`target_object_api_name` 由 shortcut 自动补齐;非标准/自定义字段才使用运行时或字段聚类返回的引用对象名。`search-option.system_filters` 返回 `select_query` / `select_query_all` / `tree_query_all` 且用户提供展示名/名称时也按引用字段处理:`field_name` 取运行时 `filter_api_name` 或 `field`;不要把展示名直接写入 `--dynamic-filters`。
|
|
63
|
+
|
|
64
|
+
**Lookup 命中即可信**:`--lookup-filters` 命中后由 shortcut 内部解析 ID 并写入 `filter_str`,结果集已经包含该部门/地点对象(含同名下级节点)的全部命中。**禁止**对 `original_department.name` / `target_department.name` / `employment.department.name` / `*_work_location.name` 做等值或字符串包含的客户端二次过滤,**禁止**用"原部门 ≠ 目标部门"剔除同部门内异动——同部门内异动也属于"调走/调入"语义。只有用户显式提出"必须跨城市/必须跨部门/必须不同 X"等额外约束时,才能对**稳定 ID**(不是 name)做客户端比较,并在最终 search 的 `select_fields` 中提前请求对应原/新字段。
|
|
65
|
+
|
|
66
|
+
常见字段聚类,完整映射见 [people-job-change-lookup-filters.md](people-job-change-lookup-filters.md):
|
|
67
|
+
- `employment` -> `employment`
|
|
68
|
+
- `original_department` / `target_department` / `employment.department` -> `department`
|
|
69
|
+
- manager 字段 -> `employment`;`job` / `job_family` / `job_level` / `company` / `service_company` 等引用字段 -> 对应运行时或字段聚类返回的对象名;工作地点字段固定使用 `location`
|
|
70
|
+
|
|
71
|
+
不要写死组织名、员工名、评测字段值或候选 ID。"我管理的部门/我管理范围"是当前用户权限范围,不是部门名;仅用 `--as user` 承载,禁止把它传入 `--lookup-filters`,也不要调用组织/员工接口反查管理部门。若 `search-option` 或字段聚类无法确认非标准字段的 `field_name` / `target_object_api_name`,或者最终 search 返回 lookup 解析失败、多候选、无权限等错误,输出结构化不可完成/澄清原因;不要回退到显式名称转 ID 反复尝试。
|
|
72
|
+
|
|
73
|
+
工作地点名称解析规则:用户说“工作地点是 X / 新工作地点 X / 调到 X 地点”时,按 `target_work_location` lookup;用户说“原工作地点 / 从 X 地点调出”时,按 `original_work_location` lookup。不要把地点名称放进 `--dynamic-filters`,不要写 `target_object_api_name=work_location`,也不要因为第一次解析不到就删掉地点条件宽搜。
|
|
74
|
+
|
|
75
|
+
## JSON and Pagination Contract
|
|
76
|
+
最终 search 一律加 `--format json`,并只读取固定 JSON 对象:`data.items[]`、`data.has_more`、`data.page_token`、`data.total`。
|
|
77
|
+
|
|
78
|
+
默认不在最终 search 上使用 `--jq`。如果工具输出过大、确实需要用 `--jq` 稳定暴露分页元信息,`--jq` 必须保留完整原始记录数组,形态只能类似:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
--jq '{__meta:{total:.data.total,has_more:.data.has_more,page_token:(.data.page_token // null),page_count:(.data.items|length),reject_export:(.data.reject_export // null)},items:.data.items}'
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
禁止在最终 search 中使用 meta-only 或裁剪明细的 `--jq`,例如只输出 `total/has_more/page_token`、只输出 `groups`、或把 `items` 改写成少数字段对象。只要原始响应非空,后续答案必须还能从 `items` 中读取当前页全部记录明细;若上一次搜索因 `--jq` 裁剪导致没有原始 `items`,这次结果不能作为最终答案,必须用相同筛选条件重新执行一次保留原始 `items` 的搜索。
|
|
85
|
+
|
|
86
|
+
总数口径:
|
|
87
|
+
- 答案里的“总数/共有/一共”只能来自 `data.total`。
|
|
88
|
+
- 本页数量只能写成“本页返回 N 条”;分页聚合数量只能写成“已聚合 N 条”;禁止把本页数量当总数,禁止把前 200 条部分聚合当全量总数。
|
|
89
|
+
- 若接口未返回 `data.total`,写“接口未返回总数”;此时只能说明本页数量或已聚合数量。
|
|
90
|
+
|
|
91
|
+
分页策略:
|
|
92
|
+
- 用户没有明确指定需要翻页、全部、完整列表、继续翻页时,不翻页;只返回当前页结果,并说明 `total`、`has_more`、`page_size` 和本页数量。
|
|
93
|
+
- 用户要求全部信息时,默认最多返回/聚合 200 条;若 `has_more=true`,说明仍有更多并询问是否继续,不要无限翻到 `has_more=false`。
|
|
94
|
+
- 汇总类问题(有哪些、都去了哪些、汇总、统计、数量、分组)最多先处理前 200 条;若仍有更多,必须说明这是前 200 条的部分统计,不代表全量,并询问是否继续。
|
|
95
|
+
- 用户明确说继续时,再按下一批最多 200 条继续。
|
|
96
|
+
- 任一页请求失败、`has_more=true` 但缺 `data.page_token`、或 JSON 解析异常时,输出结构化不可完成原因,不得调 `help` / `schema`、写临时脚本或反复重试到超时。
|
|
97
|
+
|
|
98
|
+
聚合规则:
|
|
99
|
+
- “都去了哪些部门”只从已返回或已聚合记录的 `target_department` 展示名取值,去重并计数后输出;缺失则记为“未返回”。若只处理前 200 条且仍有更多,必须标注部分统计。
|
|
100
|
+
- “有哪些异动记录”输出 `data.total`、已查询日期范围、当前批次或已聚合记录明细,并说明 `has_more`;若仍有更多,询问是否继续。不得把当前批次/明细条数写成总数。
|
|
101
|
+
- 普通明细查询未明确要求翻页时,展示当前页并说明 `total`、`has_more`、`page_size`。
|
|
102
|
+
|
|
103
|
+
## Preferred Commands
|
|
104
|
+
|
|
105
|
+
运行时校准:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
people-cli corehr job_change search-option --as user
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
部门/状态/类型/原因等动态筛选:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
people-cli corehr +job-change-search \
|
|
115
|
+
--page-size 10 \
|
|
116
|
+
--format json \
|
|
117
|
+
--effective-date-start '<DATE_START>' \
|
|
118
|
+
--effective-date-end '<DATE_END>' \
|
|
119
|
+
--dynamic-filters '[{"field_name":"<FIELD_API_NAME>","values":["<RUNTIME_VALID_VALUE>"]}]' \
|
|
120
|
+
--as user
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
目标部门名称筛选:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
people-cli corehr +job-change-search \
|
|
127
|
+
--page-size 10 \
|
|
128
|
+
--format json \
|
|
129
|
+
--lookup-filters '[{"field_name":"target_department","values":["<DEPARTMENT_NAME>"]}]' \
|
|
130
|
+
--as user
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
当前所属/员工.部门筛选:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
people-cli corehr +job-change-search \
|
|
137
|
+
--page-size 10 \
|
|
138
|
+
--format json \
|
|
139
|
+
--lookup-filters '[{"field_name":"employment.department","values":["<DEPARTMENT_NAME>"]}]' \
|
|
140
|
+
--as user
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
员工姓名:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
people-cli corehr +job-change-search \
|
|
147
|
+
--page-size 10 \
|
|
148
|
+
--format json \
|
|
149
|
+
--lookup-filters '[{"field_name":"employment","values":["<EMPLOYEE_NAME>"]}]' \
|
|
150
|
+
--as user
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
引用字段名称筛选:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
people-cli corehr +job-change-search \
|
|
157
|
+
--page-size 10 \
|
|
158
|
+
--format json \
|
|
159
|
+
--lookup-filters '[{"field_name":"<JOB_CHANGE_FIELD_API_NAME>","values":["<OBJECT_NAME>"]}]' \
|
|
160
|
+
--as user
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
显式返回字段:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
people-cli corehr +job-change-search \
|
|
167
|
+
--page-size 10 \
|
|
168
|
+
--format json \
|
|
169
|
+
--select-field-names '["<SUPPORTED_FIELD_NAME>"]' \
|
|
170
|
+
--as user
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
指定变更内容,同时返回变更前后信息:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
people-cli corehr +job-change-search \
|
|
177
|
+
--page-size 10 \
|
|
178
|
+
--format json \
|
|
179
|
+
--dynamic-filters '[{"field_name":"details_of_job_status_change","values":["<运行时合法变更内容枚举值>"]}]' \
|
|
180
|
+
--select-fields '["effective_date","status","transform_type","original_job_family","target_job_family","original_direct_manager","target_direct_manager"]' \
|
|
181
|
+
--as user
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
字段有值 + 指定变更内容:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
people-cli corehr +job-change-search \
|
|
188
|
+
--page-size 10 \
|
|
189
|
+
--format json \
|
|
190
|
+
--dynamic-filters '[{"field_name":"<FIELD_API_NAME>","values":["<候选1>","<候选2>","<候选N>"]},{"field_name":"details_of_job_status_change","values":["<运行时合法变更内容枚举值>"]}]' \
|
|
191
|
+
--select-field-names '["<字段展示名>"]' \
|
|
192
|
+
--select-fields '["effective_date","status","transform_type","original_work_location","target_work_location"]' \
|
|
193
|
+
--as user
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Constraints
|
|
197
|
+
|
|
198
|
+
- 默认 `--page-size 10`。
|
|
199
|
+
- 单次用户请求最多返回/聚合 200 条;用户明确继续时,再取下一批最多 200 条。
|
|
200
|
+
- 最终 search 必须加 `--format json`,只读取 `data.items[]`、`data.has_more`、`data.page_token`、`data.total`;不要用 `--jq` 裁掉原始 `items`,需要元信息时也必须保留 `items:.data.items`。
|
|
201
|
+
- 不传 `--user-id-type open_id`;保持默认 `people_corehr_id`。
|
|
202
|
+
- 普通查询最多一次 `search-option`;调过后不再调 `help` / `schema` / 全量 dump。
|
|
203
|
+
- 未指定返回字段时,优先不传 `--select-fields`,使用 shortcut 默认返回姓名、工号、头像、生效日期、异动类型、状态。
|
|
204
|
+
- 若显式传 `--select-fields`,只传合法字段;禁止 `employment.*` 通配符。显式字段只用于追加用户点名的业务信息,最终答案仍必须展示姓名、工号、头像、生效日期、异动类型、状态这 6 个基础字段;若基础字段确实未返回,写"未返回/无权限",不能省略或用 ID 代替。
|
|
205
|
+
- 用户点名要求展示/标注多个字段时,必须在唯一最终 search 中显式请求这些字段;默认字段不包含职务、序列、职级、人员类型、工作地点、异动原因、是否调薪等明细。
|
|
206
|
+
- 用户问"涉及 X 变更"时,若 `search-option` 暴露"异动变更内容"筛选项,必须先用该枚举筛选,再用 `--select-fields` 返回对应 original/target 字段;不要先拉全量后本地判断是否变更。异动类型/状态/原因/自定义字段等普通筛选 + 一个变更内容发生,可在同一次 `--dynamic-filters` 数组内表达 AND;只有多个条件都属于 `details_of_job_status_change` 变更内容时,才按每个语义组分别搜索后按 `job_change_id` 取交集。
|
|
207
|
+
- 用户问“字段有值/不为空”时,如果该字段在 `search-option` 中有枚举候选,用全量候选表达“有值”;如果没有候选或非空操作符,不要用 `"有值"` 猜测,按无法安全表达处理。
|
|
208
|
+
- 所有 raw `filter_str` 字段值必须是数组,日期区间字段除外。
|
|
209
|
+
- 翻页只能使用返回的 `page_token`;不要调大 page size、重复首屏查询、`grep/head` 或判断 NDJSON 来模拟解析/翻页。
|
|
210
|
+
- 用户问“有哪些/都去了哪些/汇总/统计/数量/分组”时,若返回 `has_more=true` 或 `page_token`,最多先处理前 200 条;分页失败时输出不可完成原因,不得把首屏当完整答案。
|
|
211
|
+
- 部门、lookup、枚举多候选时必须澄清;必需条件失败时不执行宽搜。最终搜索报错时直接按不可用结果回答,不在同一 case 内调 help/schema 或反复改参调试。`search-option` / `--help` 只用于校准或解析,不得作为终点;最终答案必须来自最后一次真实 `+job-change-search` 或等价搜索结果。
|
|
212
|
+
|
|
213
|
+
## Output
|
|
214
|
+
|
|
215
|
+
按 [people-job-change-output-and-empty.md](people-job-change-output-and-empty.md) 输出。非空结果必须包含记录数量和关键记录摘要;空结果必须说明查询条件;统计/聚合只能基于已搜索和按 `page_token` 有界翻到的数据;无法满足完成态时输出结构化不可完成原因。
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: people-corehr-offboarding
|
|
3
|
+
description: "CoreHR 离职查询入口。触发词:离职/offboarding、离职/期望离职/申请/发起/流转日期、申请/审批/流转/交接/合同状态、离职原因/标注、部门离职人员、任职公司/合同主体/工作地点/职务/序列/职级/职等/人员类型/人员子类型、竞业启动、入职不到一年/司龄。适用边界:仅处理授权范围内离职单与可筛选档案字段;薪酬明细、身份证/银行账户、完整档案、跨部门/全公司导出、流程节点细节和竞业协议详情直接拒答。"
|
|
4
|
+
metadata:
|
|
5
|
+
requires:
|
|
6
|
+
bins: ["people-cli"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# people-corehr-offboarding
|
|
10
|
+
|
|
11
|
+
## reference索引
|
|
12
|
+
|
|
13
|
+
- [search](references/people-corehr-offboarding-search.md):`+offboarding-search` 业务查询主入口,含 CLI 专属参数、日期/状态/进度口径。
|
|
14
|
+
- [search-option](references/people-corehr-offboarding-search-option.md):`search-option` 元数据查询,含调用与裁剪、canonical 字段定位、候选归一算法、高风险字段错误恢复。
|
|
15
|
+
- [business-knowledge](references/people-corehr-offboarding-business-knowledge.md):业务背景知识,含职级体系(L1–L10 与 1-1\~5-2 两套)的全序与范围展开规则。
|
|
16
|
+
|
|
17
|
+
## 0. 必须调用的工具 / CLI(显眼硬约束)
|
|
18
|
+
|
|
19
|
+
- 读取规则:先读本文件;reference 只按场景渐进读取,不要每次全量读取所有 reference。基础查询读取 [search](references/people-corehr-offboarding-search.md) 第 1/2 节与 [search-option](references/people-corehr-offboarding-search-option.md) 第 2/3 节;命中 P1/候选失败/高风险字段时再读 search-option 第 4/4.1/5 节;命中 P2 职级范围时才读 [business-knowledge](references/people-corehr-offboarding-business-knowledge.md) 第 1 节;没有触发的 reference 不打开。
|
|
20
|
+
- 主业务查询只能用:`people-cli corehr +offboarding-search --as user`,禁止编造数据和模拟查询。
|
|
21
|
+
- 每次查询前必须先调用一次 `people-cli corehr offboarding search-option --as user --jq '<single bounded jq object>'` 获取本题需要的字段与筛选项元数据(system_filters / system_columns),用于确认 canonical key、筛选项是否存在、候选展示名;它不是业务结果,最多调用一次,不能进入 final。`--jq` 必须在一个对象里同时裁剪本题需要的 filters、columns 与枚举候选,具体模板见 [search-option](references/people-corehr-offboarding-search-option.md) 第 2 节;禁止无 `--jq` 调用、禁止输出完整元数据、禁止为补字段第二次调用。
|
|
22
|
+
- 只允许 `--as user`;禁止 `--as bot`、禁止主动 auth login、禁止 MCP、禁止把飞书文档操作混入主流程。若必须操作飞书文档,只能用 `lark-cli`。
|
|
23
|
+
- 参数硬约束:每次业务查询(含重试和分页)的 `--params` 都必须显式包含 `"page_size":"10"`、`"user_id_type":"people_corehr_id"`、`"department_id_type":"people_corehr_department_id"`,基础形态固定为 `--params '{"page_size":"10","user_id_type":"people_corehr_id","department_id_type":"people_corehr_department_id"}'`;分页时只追加 `page_token`,不得省略或改回其它 ID 类型。`--search-filter-by-name` 必须是 JSON 对象;`--select-fields` 必须是 JSON 数组,基线固定为 `["status","offboarding_date","expected_offboarding_date","employment","employment.employee_number"]`,禁止传 CSV 或散乱字符串;所有名单/标准查询都从该基线追加目标字段;完成时间类最小字段见 [search](references/people-corehr-offboarding-search.md) 第 2 节。
|
|
24
|
+
- 执行前自检:`search-option` 与业务命令若包含 shell 管道、`2>&1`、`head`、`tail`、`grep`、`python`、临时文件、输出重定向、自然语言注释或 `--help`,必须丢弃并重写为裸 `people-cli` 调用;分页命令也必须保持裸 JSON 参数,不得用截断输出拼 final。
|
|
25
|
+
- 跨平台命令规则:所有代码块换行仅用于阅读;真实执行时必须作为一条裸 `people-cli` 命令传递参数,不使用 Bash `\`、PowerShell反引号、CMD `^` 续行,也不套 `sh -c` / `powershell -Command`。JSON 与 jq 表达式各自作为单个参数传入,避免由 shell 二次解析。
|
|
26
|
+
- `search-option` 调用约束:命令固定为 `people-cli corehr offboarding search-option --as user --jq '<single bounded jq object>'`,禁止臆造 `--fields/--field` 等参数。`--jq` 必须先按 [search-option](references/people-corehr-offboarding-search-option.md) 第 2 节的固定 alias 逻辑从完整 query 生成 `alias_fields`,再只保留本题需要的字段、候选与返回列;不得跳过 alias 映射仅凭模型猜 canonical field。query 必须做 JSON string escaping,关键词正则必须来自已归一的业务语义/同义词并转义正则元字符,禁止直接拼入未经处理的用户原文。档案字段失败最多一次同 canonical key 原文/完整展示值重试,之后必须非空收口。
|
|
27
|
+
- 入口 skill 错路由/不可用/返回无关内容时,不解释、不重试 Skill;立即按本文件 CLI 模板直接执行一次。CLI 不可恢复则输出工具错误业务句。
|
|
28
|
+
|
|
29
|
+
## 1. 执行总则(强制两步,必须走完)
|
|
30
|
+
|
|
31
|
+
固定按两步执行,两步全部完成才算结束,禁止只执行一半(只查 search-option 不查业务、或跳过 search-option 直接查业务都视为未完成/无效):
|
|
32
|
+
|
|
33
|
+
1. 先判拒答/澄清;否则进入查询。
|
|
34
|
+
2. **第一步**:每次查询前先调用一次带内置 `--jq` 的 `search-option` 获取离职字段信息(system_columns)与筛选项字段信息(system_filters),确认 canonical key、筛选项是否在 `system_filters`、候选展示名,参考 [search-option](references/people-corehr-offboarding-search-option.md)。一次 bounded jq 必须覆盖本题全部筛选字段、返回列和所需枚举;禁止把全量读进上下文,禁止 help/schema、源码/目录探索、shell 管道、临时文件或脚本解析。若一次校准没有覆盖必需字段,按字段未生效收口,不得补调第二次。
|
|
35
|
+
3. **第二步**:在 system_filters 中匹配用户需要的筛选项 field,构造 `--search-filter-by-name` 的 key/value(除时间类字段外,key 必须是 system_filters 的 `field`,不得用 system_columns 字段或臆造;value 必须是筛选条件名称/中文展示名而非 ID,由 shortcut 运行时解析),并把每个查询条件的 canonical field 去重追加到 `--select-fields`,再通过 `+offboarding-search` 发起业务查询,参考 [search](references/people-corehr-offboarding-search.md)。只完成第一步(停在 search-option/候选探索)一律无效,必须继续第二步并按收尾模板输出,或确实无法查询时按字段未生效/工具错误收口。
|
|
36
|
+
4. 拿到 search-option 元数据后,若自定义字段、档案字段候选仍不确定,或 shortcut 报字段/枚举解析错误,最多再一次修正重试或收口(search-option 总计仍只调用一次)。
|
|
37
|
+
5. "我所在/我管理/我支持/我负责的某组织"是授权范围限定,不是部门名称本身;只有短语里有具体业务组织核心名时才构造 `employment.department=<核心名>`。若用户只说"我管理的部门/我负责的团队/我所在组织"而没有具体组织名,禁止把整句、"部门/团队/组织"泛称或猜测出的组织写入 `employment.department`;只能让 `--as user` 的可见范围生效,或在无法确认管理范围时澄清/字段未生效,final 不得宣称已覆盖管理范围全量。
|
|
38
|
+
6. 若一次入口调用未产生任何真实业务命令,或只停在读文件/理解 skill/候选探索,立即补齐第二步 `+offboarding-search`(模板见 [search](references/people-corehr-offboarding-search.md) 第 1 节);仍失败才输出工具错误。
|
|
39
|
+
7. 不写死租户元数据:不记录具体组织、人员、公司、地点、枚举候选、原因候选、自定义字段展示名或评测答案;只写通用语义规则和运行时解析算法。
|
|
40
|
+
8. 组织核心词抽取先于候选解析:去掉"我所在的/我管理的/我支持的/我负责的"等权限前缀,仅剥离"大部门/部门/团队/组织"等通用尾词,不写死任何组织别名;若剥离后为空或只剩泛称,不构造 `employment.department`,也不得自行扩散到相似子组织/实验室/项目组候选。第二步业务命令必须继承已确认的组织归一值,禁止追加 `head/tail/grep/python`。部门多候选时只围绕 `employment.department` 同字段精确候选确认或收口,不得改成相似子组织;重试必须保留日期、状态等全部主条件。
|
|
41
|
+
9. 筛选字段决策树:先用 search-option 确认 canonical field 在 `system_filters` 还是 `system_columns`。**只要用户对该字段提出筛选条件,且该字段存在于 `system_filters`,必须构造 `--search-filter-by-name`,并把同一个 canonical field 追加到 `--select-fields` 供结果回显;不得忽略该字段后改成本地过滤/排序。比较、范围、枚举、多值也先按同一 field 进入 `--search-filter-by-name`,失败后只允许同字段修正一次或字段未生效收口。** 服务端筛选已经成功返回的记录不得因为部分行未返回目标字段展示值而被过滤掉,final 中保留该记录并把该列写成“字段未返回”。只有字段不在 `system_filters`、但在 `system_columns` 可展示时,才允许不写入 filter,把该字段加入 `select-fields`,先按其它主条件查出完整可分页数据,再基于返回 display/code 做本地过滤或排序;columns-only 本地过滤时,目标字段缺失的记录不能被判定为命中,但也不能用主范围 total 冒充目标结果。若字段同时不在 filters 和 columns,或全部返回值只有 wk_id/内部 id、display 缺失且没有 applied/resolved filter 证明,立即字段未生效,不得继续多轮探查或用主范围 total 冒充目标结果。本地过滤/排序完成后,final 必须逐条展示命中记录的离职字段与对应值详情(姓名、工号、离职日期、期望离职日期、离职申请状态及全部筛选字段的实际值);默认最多展示 CLI 返回顺序前 10 条,禁止只聚合成总结/数量结论后直接返回。
|
|
42
|
+
|
|
43
|
+
## 2. 执行模板
|
|
44
|
+
|
|
45
|
+
- 标准命令模板与参数细节见 [search](references/people-corehr-offboarding-search.md) 第 1 节,本节只列执行流程与名单/复合统计口径。
|
|
46
|
+
- 档案/自定义/竞业候选查询:`search-option` 一次 + `+offboarding-search` 一次;失败最多修正重试一次。
|
|
47
|
+
- `+offboarding-search` 的 `--search-filter-by-name` 必须与 query 语义逐项对齐并保留全部主条件;除时间类字段外,key 必须是 search-option `system_filters` 的 `field`,value 必须是筛选条件名称/中文展示名而非 ID;字段失败时只围绕同一 canonical key 原文/候选重试,不得用相似字段、部门全量或本地过滤冒充。每个 name filter 的 key 都必须进入 `select-fields`。
|
|
48
|
+
- `select-fields` 必须以 JSON 数组 `[]` 传参,按“基线字段 + 全部查询条件 canonical field + 用户要求的展示字段”做去重并集。基线固定为 `["status","offboarding_date","expected_offboarding_date","employment","employment.employee_number"]`,不得传 CSV 或散乱字符串;部门、日期、状态、原因、员工方向等凡参与 `--search-filter-by-name` 的 field 都必须追加,不能只追加所谓目标字段。`--search-filter-by-id` 使用 native ID key 时,追加其在 search-option 中对应的 canonical 展示字段,例如 `department_ids -> employment.department`、`employment_ids -> employment`;不得把 `department_ids/employment_ids` 这类传输 key 当 select field。另按需追加标注字段、`minor_reason`、`initiator_id`、`apply_finish_time`、`checklist_*`、`non_compete` 或对应 `employment.<field>`。
|
|
49
|
+
- 发起/申请/流转/单人进度场景必须补齐展示字段:姓名、工号、`offboarding_date`、`expected_offboarding_date`、离职申请 `status`,并按口径补 `initiating_time/apply_date/apply_finish_time/checklist_status/checklist_start_time/checklist_finish_time/initiator_id`;发起类固定明细顺序为姓名、工号、离职日期、期望离职日期、离职申请状态、发起时间,不得只展示姓名和状态。单人“离职进度/状态”默认以离职申请 `status` 为进度,只有用户说“流程/流转/交接进度”才追加 checklist 字段。
|
|
50
|
+
- 档案字段筛选必须 select 目标字段与 `expected_offboarding_date`;职务/序列/员工方向/地点/人员类型/子类型/职级/合同主体/任职公司/合同状态等服务端筛选成功后,部分记录未展示目标字段或只展示内部 id 时仍保留该记录,目标字段列写“字段未返回/仅返回内部 id”。只有完全无法证明服务端 filter 生效,或 columns-only 本地过滤无法读取目标字段时,才按字段未生效收口。用户说“具有/带有某字段信息”但未给具体字段值时,该字段只是展示字段,不构造空值、exists、通配符或“有”过滤;展示字段缺失的记录仍展示并标记“字段未返回”。
|
|
51
|
+
- 统计/名单固定 `page_size=10`。普通名单默认只展示首批最多 10 条,不为扩大展示量自动翻页;比较、派生、复合统计等必须基于完整数据的任务,若 `has_more=true`,必须按 CLI 返回的翻页 token/下一页参数循环到 `has_more=false`。不能翻完时只可输出派生待确认/工具错误,写明已处理 M 条,禁止输出最终 K。后台 `has_more` 仅用于决定是否继续取数,不得直接当作用户侧“是否已展示全部”的结论。
|
|
52
|
+
- 名单类输出门禁:用户问“有哪些人/名单/同事/人员/记录”时,默认展示上限为 10 条,并按 CLI 返回顺序输出。固定字段优先为姓名、工号、离职日期、期望离职日期、离职申请状态以及每个筛选字段的实际值;发起类加发起时间;流转类必须同时列离职申请状态、发起时间、`checklist_status`、`checklist_start_time/checklist_finish_time`,不得把流转状态写成申请状态。只有实际列出的结构化记录数等于 `total` 时才能说“已全部展示”;只要 `total>已展示条数`,无论原始 `has_more` 是 true 还是 false,都必须写“共 N 条,本次展示 M 条,仍有更多记录未展示”,`total>10` 时 M 默认取 10。禁止在这种情况下用 `has_more=false` 暗示已经完整展示。
|
|
53
|
+
- “主范围中的子条件/其中/离职人员中某字段为某值”属于复合统计:必须执行两条业务查询,先查主范围 total,再查主范围+子条件 total;final 同时输出两者。主范围或子条件若 `has_more=true`,不能用当前页 items 数、截断片段、样例数或过滤页局部 total 当最终总量;若只完成子条件查询,必须说明缺少主范围 total,不得把子条件 total 当全量;若字段/applied filter 无法确认,用字段未生效/工具错误收口。
|
|
54
|
+
- “离职人员中/其中/其中字段为”即使子条件查询已成功,也必须补主范围 A;A 必须来自稳定 `total` 或翻页到 `has_more=false`,不能用当前页 10/items 数。final 固定写 `主范围 total=A;其中 ... total=B`;若 A 取不到或后台分页无法翻完,必须写“子条件 total=B;主范围 total 无法稳定确认,未完成复合统计”,禁止向用户回显 raw `has_more`、声明错误 A 或只答 B。
|
|
55
|
+
- 若用户只是问“某范围中字段为某值的有哪些”,目标查询成功后可直接输出子条件 total 与明细;不要为了补主范围再执行仅部门主范围查询覆盖目标结果。只有用户明确问“其中/占比/主范围共有多少”时才补主范围。
|
|
56
|
+
|
|
57
|
+
## 3. 日期、状态、进度
|
|
58
|
+
|
|
59
|
+
- 日期窗口换算(近/最近 vs 上一个、本周/某月/某年)、申请日期 vs 发起时间、流转/审批完成时间口径、status 判定与中文归一、单人进度输出,统一以 [search](references/people-corehr-offboarding-search.md) 第 2 节「日期、状态与进度」为准,本节不重复定义。
|
|
60
|
+
- 日期统一 `YYYY-MM-DD`;日期区间必须写成数组 `["YYYY-MM-DD","YYYY-MM-DD"]`;单点日期 `[date,date]`,不得写成散乱字符串。
|
|
61
|
+
- 核心要点(详见参考文档):“近/最近”用滚动窗口、“上一个/上”用自然周期;“申请日期”用 `apply_date`、“发起/提交/创建”用 `initiating_time`,口径不混写;status 与 checklist 完成态不混用;状态逐条按 display 中文归一,缺 display 无法区分时写“状态来源不稳定”或字段未生效。
|
|
62
|
+
|
|
63
|
+
## 4. 字段优先级矩阵
|
|
64
|
+
|
|
65
|
+
读取顺序:先匹配 P0;只有用户明确点名档案/引用字段时才进入 P1;只有用户要求比较、范围、司龄、去重人数、早晚于期望等派生问题时才进入 P2。未命中 P1/P2 触发词时,不要把低频字段规则带入普通名单/数量查询。
|
|
66
|
+
|
|
67
|
+
Owner 切分:本矩阵只负责把用户语义路由到 canonical key。候选归一、展示值保留、禁止互换、失败重试与字段未生效收口统一归 [search-option](references/people-corehr-offboarding-search-option.md) 第 4/4.1/5 节;日期/状态/进度口径归 [search](references/people-corehr-offboarding-search.md) 第 2 节;职级体系范围展开归 [business-knowledge](references/people-corehr-offboarding-business-knowledge.md) 第 1 节。
|
|
68
|
+
|
|
69
|
+
### P0 常用查询字段
|
|
70
|
+
|
|
71
|
+
| 用户语义 | canonical key / 策略 | 禁止 |
|
|
72
|
+
| --- | --- | --- |
|
|
73
|
+
| 部门/组织范围 | `employment.department`,主条件永远保留 | 不因候选缺失移除 |
|
|
74
|
+
| 员工姓名/工号 | `employment`,可与部门 AND;无需把姓名拆成其它字段 | 禁止用 `employment.name/name/person/initiator_id` 兜底成部门全量 |
|
|
75
|
+
| 离职人员/离职员工/离职同学/离职的同事/哪些人 | 只是人员展示/名单口径,不自动加 `status`;只有用户明确“已离职/完成离职/离职完成/已完成”才补终态 | 不因“离职人员/哪些人”泛称默认等同已离职 |
|
|
76
|
+
| 离职记录/离职单据/离职申请 | 默认单据口径,不自动加 `status`,按用户显式状态或全部单据查询 | 不把记录口径强行改成人员终态 |
|
|
77
|
+
| 离职申请/审批状态 | `status`;明确“已离职/完成离职”才加终态,明确“离职中/进行中”才加进行中;出现“待离职”且用户未指定其它离职申请状态时,固定加 `status:["无需审批","审批通过","审批中"]`(同字段 OR) | 不把“待离职”改成 `checklist_status`、`离职中` 或单一状态 |
|
|
78
|
+
| 离职流转/交接状态 | `checklist_status`;流转开始/结束用 `checklist_start_time/checklist_finish_time` | “流转进行中”不改 `status` |
|
|
79
|
+
| 实际/期望离职日期 | `offboarding_date` / `expected_offboarding_date`,闭区间数组 | 不自动叠加状态 |
|
|
80
|
+
| 申请日期 | `apply_date` | 不用发起时间冒充 |
|
|
81
|
+
| 发起/提交/创建时间 | `initiating_time` | 不用申请状态替代 |
|
|
82
|
+
| 离职申请结束/申请完成/审批完成时间 | `apply_finish_time` | 不用流转/交接完成时间冒充 |
|
|
83
|
+
| 流程完成/流转结束/交接完成月份 | 默认 `checklist_finish_time` | 不只靠完成态,不用 apply 失败覆盖 checklist 口径 |
|
|
84
|
+
| 主离职原因/HRBP原因 | `reason`;“主动-<叶子>”取叶子并在同字段候选中解析 | 不默认转自定义/员工原因 |
|
|
85
|
+
| 原因标注/自定义原因/员工原因 | 仅用户明确“标注/自定义/员工原因/字段名”才用 `custom_field_1` 或运行时标注字段 | 不冒充主原因 |
|
|
86
|
+
| 次要原因/HRBP次要原因 | `minor_reason`;只有明确“员工次要原因”才定位员工原因自定义字段 | 不改 `reason` |
|
|
87
|
+
| 发起人/提交人 | `initiator_id`,值交 shortcut 名称解析 | — |
|
|
88
|
+
|
|
89
|
+
### P1 明确点名才使用的档案/引用字段
|
|
90
|
+
|
|
91
|
+
共同规则:本表只定 canonical key;候选取值、禁止近义字段替代、同字段重试、display/applied filter 证明与失败收口统一按 search-option owner 章节执行。先确认同一 canonical field;若在 `system_filters` 中存在,必须用 `--search-filter-by-name`;若只在 `system_columns` 中存在,才按第 1 节第 9 条走展示后处理。
|
|
92
|
+
|
|
93
|
+
| 用户语义 | canonical key / 策略 | 细则 owner |
|
|
94
|
+
| --- | --- | --- |
|
|
95
|
+
| 工作地点/地点/城市 | `employment.work_location` | search-option §4.1/5 |
|
|
96
|
+
| 合同主体/合同公司 | `employment.company` | search-option §4.1/5 |
|
|
97
|
+
| 任职公司/Service company | `employment.service_company` | search-option §4.1/5 |
|
|
98
|
+
| 雇佣状态 | `employment.employment_status` | search-option §4.1/5 |
|
|
99
|
+
| 合同状态/合同已终止 | 优先真实合同状态;若运行时无合同状态 filter 但有合同结束/终止日期可展示字段,走 columns-only 完整分页后处理 | search-option §4.1/5 |
|
|
100
|
+
| 签署方式/电签 | `sign_type` | search-option §4/4.1 |
|
|
101
|
+
| 职务/岗位/职位 | `employment.job` | search-option §4/5 |
|
|
102
|
+
| 序列/职能序列 | `employment.job_family` | search-option §4/4.1 |
|
|
103
|
+
| 员工方向/Job direction | `employment.job_direction` | search-option §4.1/5 |
|
|
104
|
+
| 级别/职级/level | `employment.job_level`;范围语义见 P2 | search-option §4 + business-knowledge §1 |
|
|
105
|
+
| 职等/grade | `employment.job_grade` | search-option §4/5 |
|
|
106
|
+
| 人员类型/正式/全职 | `employment.workforce_type` | search-option §4.1/5 |
|
|
107
|
+
| 人员子类型/子类型 | `employment.employee_subtype` | search-option §4.1/5 |
|
|
108
|
+
| 薪资类型/工资制名称 | `employment.compensation_type` | search-option §4 |
|
|
109
|
+
| 排班/工作制 | `employment.work_shift` | search-option §4/5 |
|
|
110
|
+
| 直属上级/直接上级 | `employment.direct_manager`;仅 columns 可展示时才允许后处理 | search-option §4.1/5 |
|
|
111
|
+
| 启动竞业协议/竞业启动 | `non_compete` | search-option §4.1/5 |
|
|
112
|
+
|
|
113
|
+
### P2 派生/比较/后处理字段
|
|
114
|
+
|
|
115
|
+
| 用户语义 | 执行策略 | 失败收口 |
|
|
116
|
+
| --- | --- | --- |
|
|
117
|
+
| 入职不到一年/司龄 | 先查部门+明确终态 `status`,select `employment.effective_time` 与实际离职日期;翻页完整后按自然周年比较 | 字段或分页不可用即派生待确认 |
|
|
118
|
+
| 实际离职早于/晚于期望 | 先按主条件加明确终态,select 基线字段,只从结构化命中列表计数 | 日期缺失或分页不可核验即派生待确认 |
|
|
119
|
+
| 职级范围/某级及以上/以下 | 固定 `employment.job_level`;先按 P0 区分人员/记录口径,再按 business-knowledge 判定体系,用运行时完整候选一次性数组 OR 查询 | 跨体系或候选失败即字段未生效,不回退主范围 |
|
|
120
|
+
| 职等/Pn 以上 | 优先服务端 `employment.job_grade`;仅 search-option 明确不支持且字段可读时后处理 | 字段不可读即字段未生效/派生待确认 |
|
|
121
|
+
| columns-only 字段筛选/排序 | 仅字段不在 `system_filters`、但在 `system_columns` 可展示时允许;必须拉完整分页后处理 | display/code 不可精确解析即字段未生效 |
|
|
122
|
+
|
|
123
|
+
字段组合规则:同一 `--search-filter-by-name` 对象内不同 key 是 AND;同一 key 的数组值表示该字段 OR/多值候选,不要拆多次查询后手工并集,除非 CLI 明确不支持数组且必须说明口径。
|
|
124
|
+
计数口径:默认报告 `+offboarding-search` 返回的离职单据 `total`。除非用户明确问“去重人数/多少个人”,不要按员工去重覆盖 total;如需补充去重,只能作为附加说明。
|
|
125
|
+
字段语义锁定:已确定的部门、人员、状态、日期、自定义字段和档案字段都是主条件;任何候选归一、字段修正或重试必须继承全部主条件,只替换出错字段的 key/value,不得丢日期、不改人员为部门全量、不把合同主体和任职公司互换。
|
|
126
|
+
字段展示值门禁:P1/P2 字段命中答案必须能从目标查询的 `select-fields`、items 或 applied/resolved filter 证明字段生效;所有查询条件 field 必须已加入 `select-fields`。若 applied/resolved filter 已证明服务端命中,部分记录的目标字段展示缺失或只返回内部 id/wk_id,不得过滤该记录,明细中标记“字段未返回/仅返回内部 id”。只有完全没有字段生效证明、配置错误、或样例反证目标字段时,才按字段未生效收口。字段可信时按默认上限逐条列出最多 10 条明细。
|
|
127
|
+
枚举/引用计数口径:P1 枚举/引用字段必须以运行时完整展示值或同字段可接受 code 作为过滤值;候选不确定或字段未生效时,不能把主范围 total/样例当成目标字段结果。
|
|
128
|
+
|
|
129
|
+
## 5. 最终输出契约(最高优先级)
|
|
130
|
+
|
|
131
|
+
- 最终结论只能落在这些结果类型之一:命中、空结果、无权限、拒答、澄清、字段未生效、派生待确认、工具错误。查询类必须包含 `total=`,名单类按第 2 节展示必要明细;`has_more` 是内部取数状态,不要求原样输出,用户侧统一用“已展示 M 条/仍有更多记录未展示”表达展示完整性。
|
|
132
|
+
- 查询结论只允许来自覆盖用户明确条件的 `+offboarding-search` 业务结果;`search-option`、候选探索、失败重试日志都不能作为 total、空结果或命中依据。同一问题有多次业务查询时,以覆盖目标条件的最后一次成功结果为准;复合统计、分页、派生比较、columns-only 后处理场景按对应多次结果合成。
|
|
133
|
+
- 每次 CLI/shortcut 查询返回后,先检查结构化错误字段 `msg`(兼容 `message/error`)的大小写无关文本。若包含 `无权限`、`没有权限`、`权限不足`、`no permission`、`no_permission`、`permission denied`、`access denied`、`not authorized` 或 `forbidden`,立即按“无权限”模板收口,不重试候选、字段或分页,不展示原始错误文本、错误码、命令或 trace。
|
|
134
|
+
- 只有成功的业务响应中存在数值 `data.total=0`,且未命中无权限分支时,才按空结果收口为“无数据”;不得把接口错误、空 `items`、字段未返回或候选失败误写成无数据。
|
|
135
|
+
- 有成功业务结果且已经覆盖用户条件时,直接按第 9 节模板收口;除分页、复合统计、派生比较、columns-only 后处理必需步骤外,不继续做候选探索或换口径查询。有效业务响应的 `total=0` 直接按空结果或字段无匹配收口,不补样例、不换口径重编。
|
|
136
|
+
- 不能完成业务查询时不得空答:字段/候选无法确认用“字段未生效”,派生或分页无法稳定完成用“派生待确认”,工具/API/解析失败用“工具错误”,拒答命中则直接用拒答模板;无权限错误始终优先使用“无权限”模板。
|
|
137
|
+
- 高风险字段(`employment.workforce_type/company/service_company/work_location/job_level/job_family/employment_status/direct_manager` 等)必须能由可读 display、applied/resolved filter、或同字段候选证明生效后才输出命中;否则按字段未生效/工具错误收口,不得把主范围 total 或样例当作目标字段结果。
|
|
138
|
+
- final 前必须做结构化自检:状态逐条中文归一且不得泄露 raw enum;工号只能来自 `employment.employee_number`,禁止用 employment_id/wk_id/internal id 冒充,缺失时写“工号缺失”;日期筛选字段的返回值必须落在用户要求的窗口内,样例反证窗口或字段口径时必须重试同字段一次,仍失败按字段未生效/工具错误;P1/P2 目标字段必须能展示目标值或由 applied/resolved filter 证明。若业务结果中只有部分记录缺少某个展示字段,保留这些记录并在对应列写“字段未返回”,不得从明细或 total 中剔除。
|
|
139
|
+
- `total>0` 的表格/明细禁止只有表头没有数据行;默认展示最多 10 条,且每个筛选字段都要作为明细列展示实际值。任何明细列只能来自本次 `select-fields` 或业务结果真实字段,禁止凭空加“实际离职公司”等未查询字段;若某字段只在部分记录缺失,保留记录并写“字段未返回”;若结构化结果无法抽取姓名/工号/状态/日期,先用基线字段重查一次,仍无法抽取则输出工具错误,不得用空表收口。
|
|
140
|
+
- final 不输出内部执行物:命令文本、trace、工具调用片段、原始 `search-option` 内容、内部候选 ID、未替换占位符。必要的业务 ID 只有在用户明确提供或结果展示需要时才可出现。
|
|
141
|
+
- 展示完整性只能由 `total` 与实际列出的结构化记录数判断,不能由原始 `has_more=false` 判断。`total<=10` 且实际列出 N=`total` 条时写“已展示全部 N 条”;`total>10` 或实际列出 M<`total` 条时写“共 N 条,本次展示 M 条,仍有更多记录未展示”。
|
|
142
|
+
|
|
143
|
+
## 6. 前置拒答 / 澄清
|
|
144
|
+
|
|
145
|
+
- 越权:全公司、跨部门、其他/别的/兄弟/非授权/不在支持范围内/明显非本授权范围的组织数据 → 直接拒答,说明需 HRBP/管理员授权或合规审批。
|
|
146
|
+
- 越权词优先级高于组织名解析:`其他/别的/兄弟/非授权` 后面即使跟着看似有效的组织名,也视为非授权范围;命中后禁止 search-option 和业务查询。
|
|
147
|
+
- 用户直接指定陌生/专用组织,且没有“我管理/我支持/我所在/我负责”等授权语境,尤其伴随“导出/全部/全量记录”时,按跨部门/非授权范围直接拒答;若部门解析错误含无匹配/可能无权限,也立即转拒答,禁止继续尝试大小写、后缀变体或写成字段未生效;陌生组织同时请求敏感详情时,拒答原因先写非授权/跨范围,再写敏感字段授权,禁止出现“按照 SKILL.md”等内部过程句。
|
|
148
|
+
- 高敏个人信息:证件、银行卡/银行账户、手机号、住址、个人邮箱、紧急联系人、完整人事档案明细 → 直接拒答。
|
|
149
|
+
- 其他敏感:薪资金额/薪酬明细/调薪/个税社保明细、全量导出/下载/打包、面谈原文、签署文件原件、竞品去向/竞业协议详情/追责详情 → 拒答。薪资类型/工资制名称是可筛选枚举,不等同薪资金额。
|
|
150
|
+
- 组合拒答:越权范围同时请求薪资类型、薪酬字段、级别/职级/职等、完整档案、竞业详情或其他敏感详情时,拒答原因必须同时列出“非授权/跨范围”和“薪酬/职级/敏感字段需正式授权”,且权限原因放在前面;在授权范围内,薪资类型/工资制名称仍可作为普通枚举筛选。
|
|
151
|
+
- 流程节点:问“卡在哪个节点/待办/交接处理到哪步”拒答;可建议改查离职申请状态、流转状态、发起/完成时间。
|
|
152
|
+
- 模糊身份或无界时间是唯一条件时澄清;同句已有部门/人员/日期/状态/字段主条件时不要拦截。
|
|
153
|
+
|
|
154
|
+
## 7. 候选解析与错误恢复
|
|
155
|
+
|
|
156
|
+
- 候选归一顺序、字段值规范化、高风险字段(`workforce_type/company/service_company/work_location/job_level/job_family/employment_status/direct_manager` 等)失败重试与收口、自定义字段/数字阈值/竞业启动/原因字段决策,统一以 [search-option](references/people-corehr-offboarding-search-option.md) 第 4/4.1/5 节为准,本节不重复定义。
|
|
157
|
+
- 核心要点(详见参考文档):先 canonical key 再看运行时候选;候选不唯一/不确定即字段未生效;重试只替换出错字段、继承全部主条件;高风险字段 read model/config/resolve/仅 wk_id 时字段未生效,不得改近义字段、不得用主范围 total 冒充目标结果。
|
|
158
|
+
|
|
159
|
+
## 8. 派生与二跳闭环
|
|
160
|
+
|
|
161
|
+
- 入职不到一年/司龄:
|
|
162
|
+
1. 先执行部门+`status=已离职` 的 `+offboarding-search`,select `status,offboarding_date,expected_offboarding_date,employment,employment.employee_number,employment.effective_time`,禁止只查部门主范围。
|
|
163
|
+
2. 若返回 `has_more=true` 且有 page_token,必须继续翻页到 `has_more=false`;只用 `employment.effective_time` 和实际 `offboarding_date`,任一缺失则该条排除并说明不可比较,不得用期望离职日期替代。
|
|
164
|
+
3. “不到一年”按自然周年:离职日期早于入职日期下一周年才命中;等于或晚于一周年不命中。默认输出去重人员 `total_person`,同时保留离职记录 total;最多前 10 条按 CLI 返回顺序或明确稳定排序输出,禁止用“主范围 total - 超过一年数”反推最终 K。
|
|
165
|
+
4. 派生待确认必须绑定真实业务查询的 `total/后台分页状态/已处理 M 条`,不得凭空给 total 或把 page_size 当 total;final 只写已处理数量和是否仍有数据未处理,不回显 raw `has_more`。
|
|
166
|
+
- 实际离职早于/晚于期望离职:先按主条件强制加明确终态 `status` 拉取基线字段 `status,offboarding_date,expected_offboarding_date,employment,employment.employee_number`;若 `has_more=true` 且有 page_token 必须翻页;必须构建结构化命中列表,只从命中列表计数和展示,任一日期缺失则跳过并说明,不得用自然语言记忆、总数减排除数或当前页 K 反推。无法核验已处理数/命中 K 时输出派生待确认。
|
|
167
|
+
- 职级范围(如某级及以上):固定 `employment.job_level`;“离职同学/离职员工/离职人员/哪些人”只是人员/名单展示口径,不自动加 `status`,只有用户明确“已离职/完成离职/离职完成/已完成”才加离职单终态;用户说“离职记录/单据/申请”时保留单据口径;按 [business-knowledge](references/people-corehr-offboarding-business-knowledge.md) 第 1 节判定职级体系并按全序展开,取值用运行时同字段 options 完整展示值校准,一次性数组 OR 目标查询;禁止跨体系混排、先查主范围采样、逐级命名试探或用部分候选收口。成功时固定输出 `total_person` 与离职记录 `total`;失败后字段未生效/字段无匹配,不能输出探索过程。
|
|
168
|
+
- 职等/Pn以上优先服务端 `employment.job_grade`;仅在 search-option 明确不支持且已拿到必要档案字段时才本地计算。
|
|
169
|
+
|
|
170
|
+
## 9. 收尾模板
|
|
171
|
+
|
|
172
|
+
- 命中且全量展示:`已按 <查询口径> 查询,total=N;已展示全部 N 条。明细:<姓名/工号/中文状态/离职日期/期望离职日期/全部筛选字段实际值>。`
|
|
173
|
+
- 命中但截断展示:`已按 <查询口径> 查询,total=N;本次展示 M 条,仍有更多记录未展示。明细:<姓名/工号/中文状态/离职日期/期望离职日期/全部筛选字段实际值>。` 默认 `M=min(N,10)`;若工具实际只提供更少结构化记录,M 必须写真实展示数。
|
|
174
|
+
- 空结果:`已按 <查询口径> 查询,total=0;无数据。`
|
|
175
|
+
- 单人进度:`已按 <查询口径> 查询,离职进度为<中文状态/状态分布>,共 N 条记录;<已展示全部 N 条/本次展示 M 条,仍有更多记录未展示>。明细:<每条的姓名/工号/中文状态/离职日期/期望离职日期/筛选字段实际值>。` 若 N>0 必须列出记录,禁止空表;状态不一致时写状态分布,不强行合成单一状态。
|
|
176
|
+
- 字段未生效:`未完成 <主条件+目标字段> 联合过滤;<目标字段>候选未确认/字段未生效/工具配置错误,主范围 total 不是该字段过滤数量。total=0。` 若有可信主查询且需要交代背景,可追加 `主范围 total=N`,但不能把它放在句首或当目标结果。
|
|
177
|
+
- 字段无匹配:`已按 <主条件+目标字段原文> 查询,total=0;未找到符合该字段值的离职记录。` 仅在业务命令明确返回无匹配/0 条时使用;不能由 search-option 单独推断。
|
|
178
|
+
- 复合统计:`已按 <主范围> 查询,主范围 total=A;其中 <子条件> total=B;<已展示全部 B 条/本次展示 M 条,仍有更多记录未展示>;明细:...。`
|
|
179
|
+
- 人数+记录双口径:`已按 <口径> 查询,离职同学/人员 total_person=P,离职记录 total=N;<已展示全部/本次展示 M 条,仍有更多记录未展示>;明细:<姓名/工号/日期/状态/筛选字段实际值>。` 无法去重时不得用记录数冒充人数。
|
|
180
|
+
- 派生待确认:`已按 <主条件> 查询,total=N;已处理 M 条,<派生字段>需员工档案/分页/日期比较能力确认,当前无法稳定给出完整过滤名单。`
|
|
181
|
+
- 无权限:`当前无权限查询 <查询范围或字段>,请联系管理员或 HRBP 申请相应权限。` 禁止追加接口原始 `msg`、错误码、命令、trace 或伪造的 `total=0`。
|
|
182
|
+
- 拒答:`无法提供/查询 <范围或字段>;原因是 <越权/高敏/敏感>[,且 <字段> 属于薪酬/职级/敏感信息或需合规授权],请通过对应 HRBP/管理员授权或合规审批。total=0。`
|
|
183
|
+
- 工具错误:`工具调用失败,未完成 <查询口径>;错误:<可公开的简要错误摘要>。total=0。` 若错误文本命中无权限关键词,必须改用“无权限”模板。
|
|
184
|
+
|
|
185
|
+
## 10. 已知 CLI/shortcut 能力缺口(只记录,不在 skill 硬编码候选)
|
|
186
|
+
|
|
187
|
+
- `employment.workforce_type/company/service_company/work_location/job_level/direct_manager/employment_status` 的 read model/config/resolve/unknown filter 错误、展示值或字段生效标记缺失,需要 CLI/shortcut 结构化修复;skill 只做同字段一次重试和失败收口,不能反复 search-option、改字段或用主范围冒充。
|
|
188
|
+
- 派生比较、入职不到一年、复合统计依赖稳定分页/批量二跳/`total_count`/`applied_filters`;能力不足时输出派生待确认,不本地脚本硬算。
|
package/skills/people-corehr-offboarding/references/people-corehr-offboarding-business-knowledge.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# offboarding 业务背景知识
|
|
2
|
+
|
|
3
|
+
本文件记录离职查询涉及的业务背景知识,供构造 `--search-filter-by-name` / 本地过滤排序 / 范围展开时参考。仅描述通用业务语义,不写死任何租户的具体枚举候选。
|
|
4
|
+
|
|
5
|
+
## 1. 职级体系(`employment.job_level`)
|
|
6
|
+
|
|
7
|
+
当前存在两套并行的职级体系,二者不可混用,比较大小前必须先判定属于哪一套:
|
|
8
|
+
|
|
9
|
+
### 体系一:L 序列(L1–L10)
|
|
10
|
+
|
|
11
|
+
- 取值形如 `L1, L2, ..., L10`。
|
|
12
|
+
- 大小关系:**L10 最大,L1 最小**,数字越大职级越高。
|
|
13
|
+
- “某级及以上 / Ln+”:从该级展开为同体系连续完整集合,如 `L3及以上` = `["L3","L4","L5","L6","L7","L8","L9","L10"]`。
|
|
14
|
+
- “某级及以下”:如 `L3及以下` = `["L1","L2","L3"]`。
|
|
15
|
+
|
|
16
|
+
### 体系二:点位序列(1-1 到 5-2)
|
|
17
|
+
|
|
18
|
+
- 取值形如 `1-1, 1-2, ..., 5-1, 5-2`,格式为 `<段>-<位>`。第二个数字最大为2.
|
|
19
|
+
- 大小关系:**5-2 最大,1-1 最小**;先比较段号(前一位),段号相同再比较位号(后一位),数字越大职级越高。
|
|
20
|
+
- “某级及以上 / 及以下”:按 `<段>-<位>` 的全序展开为同体系连续完整集合。
|
|
21
|
+
|
|
22
|
+
### 使用约束
|
|
23
|
+
|
|
24
|
+
- 判定用户输入属于哪一套体系:含字母 `L` 前缀的归体系一;形如 `数字-数字` 的归体系二。
|
|
25
|
+
- 跨体系不可比较、不可混入同一个数组 OR 查询。
|
|
26
|
+
- 范围(及以上/及以下/区间)必须在同一体系内按上述全序展开为完整连续候选集合,一次性数组 OR 查询;上文 `L3及以上=["L3"…"L10"]` 等是体系全序示例,实际取值仍需用运行时 search-option 同字段 options 的完整展示值校准,不照搬示例字面、不逐级试探。
|
|
27
|
+
- 排序时按对应体系的全序规则比较;本地过滤排序同样遵循该全序。
|