@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.
Files changed (78) hide show
  1. package/CHANGELOG.md +324 -0
  2. package/LICENSE +21 -0
  3. package/README.md +232 -0
  4. package/README.zh.md +232 -0
  5. package/bin/people-cli_darwin_amd64 +0 -0
  6. package/bin/people-cli_darwin_arm64 +0 -0
  7. package/bin/people-cli_linux_amd64 +0 -0
  8. package/bin/people-cli_linux_arm64 +0 -0
  9. package/bin/people-cli_windows_amd64.exe +0 -0
  10. package/bin/people-cli_windows_arm64.exe +0 -0
  11. package/package.json +41 -0
  12. package/scripts/install-wizard.js +700 -0
  13. package/scripts/install.js +56 -0
  14. package/scripts/run.js +36 -0
  15. package/skills/people-attendance/SKILL.md +667 -0
  16. package/skills/people-attendance/references/people-attendance-submission.md +426 -0
  17. package/skills/people-attendance/scripts/resolve_date.py +894 -0
  18. package/skills/people-corehr/references/people-corehr-pre-hire-search.md +0 -0
  19. package/skills/people-corehr-employee/SKILL.md +111 -0
  20. package/skills/people-corehr-employee/references/people-corehr-employee-basic-info-query.md +97 -0
  21. package/skills/people-corehr-employee/references/people-corehr-employee-fields-list.md +87 -0
  22. package/skills/people-corehr-employee/references/people-corehr-employee-filter.md +403 -0
  23. package/skills/people-corehr-employee/references/people-corehr-employee-search.md +73 -0
  24. package/skills/people-corehr-job-change/SKILL.md +212 -0
  25. package/skills/people-corehr-job-change/references/people-job-change-business-rules.md +113 -0
  26. package/skills/people-corehr-job-change/references/people-job-change-lookup-filters.md +82 -0
  27. package/skills/people-corehr-job-change/references/people-job-change-output-and-empty.md +207 -0
  28. package/skills/people-corehr-job-change/references/people-job-change-search-advanced.md +226 -0
  29. package/skills/people-corehr-job-change/references/people-job-change-search-fields.md +119 -0
  30. package/skills/people-corehr-job-change/references/people-job-change-search-option.md +72 -0
  31. package/skills/people-corehr-job-change/references/people-job-change-search.md +215 -0
  32. package/skills/people-corehr-offboarding/SKILL.md +188 -0
  33. package/skills/people-corehr-offboarding/references/people-corehr-offboarding-business-knowledge.md +27 -0
  34. package/skills/people-corehr-offboarding/references/people-corehr-offboarding-search-option.md +187 -0
  35. package/skills/people-corehr-offboarding/references/people-corehr-offboarding-search.md +54 -0
  36. package/skills/people-corehr-organization/SKILL.md +42 -0
  37. package/skills/people-corehr-organization/references/aggregate.md +11 -0
  38. package/skills/people-corehr-organization/references/detail.md +39 -0
  39. package/skills/people-corehr-organization/references/field-values.md +44 -0
  40. package/skills/people-corehr-organization/references/hierarchy.md +61 -0
  41. package/skills/people-corehr-organization/references/lookup.md +41 -0
  42. package/skills/people-corehr-organization/references/metadata.md +40 -0
  43. package/skills/people-corehr-organization/references/tree.md +45 -0
  44. package/skills/people-corehr-prehire/SKILL.md +160 -0
  45. package/skills/people-corehr-prehire/references/command-resolution.md +48 -0
  46. package/skills/people-corehr-prehire/references/filter-fields.md +151 -0
  47. package/skills/people-corehr-prehire/references/return-fields.md +153 -0
  48. package/skills/people-corehr-prehire/references/templates.md +202 -0
  49. package/skills/people-corehr-prehire/references/troubleshooting.md +93 -0
  50. package/skills/people-corehr-query-id-by-name/SKILL.md +154 -0
  51. package/skills/people-corehr-renewal/SKILL.md +186 -0
  52. package/skills/people-corehr-renewal/references/people-corehr-renewal-fields-query.md +62 -0
  53. package/skills/people-corehr-renewal/references/people-corehr-renewal-routing.md +54 -0
  54. package/skills/people-corehr-renewal/references/people-corehr-renewal-search.md +137 -0
  55. package/skills/people-corehr-renewal/references/people-corehr-renewal.md +39 -0
  56. package/skills/people-corehr-workforce-plan/SKILL.md +52 -0
  57. package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan-detail-list.md +238 -0
  58. package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan-detail-summary.md +221 -0
  59. package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan.md +79 -0
  60. package/skills/people-hire/SKILL.md +255 -0
  61. package/skills/people-hire/references/people-hire-application.md +334 -0
  62. package/skills/people-hire/references/people-hire-evaluation-task-list.md +233 -0
  63. package/skills/people-hire/references/people-hire-evaluation.md +127 -0
  64. package/skills/people-hire/references/people-hire-interview-record.md +109 -0
  65. package/skills/people-hire/references/people-hire-interview-task-list.md +250 -0
  66. package/skills/people-hire/references/people-hire-interview.md +146 -0
  67. package/skills/people-hire/references/people-hire-job-process.md +93 -0
  68. package/skills/people-hire/references/people-hire-job-requirement.md +227 -0
  69. package/skills/people-hire/references/people-hire-job.md +277 -0
  70. package/skills/people-hire/references/people-hire-minutes.md +91 -0
  71. package/skills/people-hire/references/people-hire-talent.md +105 -0
  72. package/skills/people-hire/references/people-hire-test.md +197 -0
  73. package/skills/people-overtime/SKILL.md +992 -0
  74. package/skills/people-overtime/references/people-attendance-overtime-apply.md +491 -0
  75. package/skills/people-overtime/references/people-attendance-overtime.md +51 -0
  76. package/skills/people-overtime/references/people-attendance-submission.md +203 -0
  77. package/skills/people-overtime/scripts/resolve_date.py +894 -0
  78. package/skills/people-shared/SKILL.md +94 -0
@@ -0,0 +1,238 @@
1
+ # 编制明细查询(workforce_plan_detail.list)
2
+
3
+ > 本文档只覆盖原始明细行查询与展示。仅在用户明确需要真实行级数据、原始明细或特殊行(如缺维度、过滤全零)时使用本 reference。聚合、排序、Top N、分布统计不属于明细查询职责,禁止拉明细后让大模型自行聚合;此类需求由主 SKILL 路由到汇总能力。
4
+
5
+ ## 适用场景
6
+
7
+ 使用本 reference:
8
+
9
+ - 查询编制原始明细行。
10
+ - 查看缺维度行、全零行、过滤全零后的行级结果。
11
+ - 导出原始明细行到业务友好的 Excel。
12
+
13
+ 不要使用本 reference:
14
+
15
+ - 用户问 HC、在职、缺编、满编率、分布、Top N、排序、占比或对比;这些是聚合诉求,不属于明细查询
16
+ - 用户只是要方案列表、生效期或可用维度;这属于方案查询。
17
+
18
+ ## 执行流程
19
+
20
+ 1. 确认用户确实要行级明细;如果问题目标是统计或排序,不属于本 reference,停止并交由主 SKILL 重新路由。
21
+ 2. 未给 `workforce_plan_id` 时,先查 `workforce_plan list` 定位方案并保存 `dimension_lists`。
22
+ 3. 用 `dimension_lists` 校验维度 key;用户只给维度值名称时,按「维度筛选与澄清」调用 `+query-id-by-name --business-scene workforce_plan`,把唯一匹配的 `matched_id` 作为维度值 ID;多候选时先让用户确认。
23
+ 4. 调用 `people-cli schema corehr.workforce_plan_detail.list` 后,再执行 `workforce_plan_detail list`。
24
+ 5. 展示或导出时只做字段映射和展示格式转换,不做聚合、排序、Top N 或衍生指标计算。
25
+
26
+ ## 输出格式核心规则
27
+
28
+ 1. 每个维度独占一列,严禁合并到一列。
29
+ 2. 维度列名从编制方案 `dimension_lists` 获取,不得使用 key 原文。
30
+ 3. 数值列只展示 API 实际返回的字段:编制HC、在职人数、预增、预减为常规字段;缺编数、满编率、季度/预估字段返回才展示,未返回不要编造或自行计算。
31
+ 4. 严禁展示内部字段:`workforce_plan_detail_id`、`dimension_id`、`is_missing_dimension`、`is_all_zero_value`。
32
+ 5. 严禁编造数据,所有内容必须来自 API 返回。
33
+ 6. 缺维度行显示 `-`,不得跳过或隐藏。
34
+ 7. 回答必须包含当前页条数、`has_more`、前 10 行的所有维度列、编制HC、在职人数、预增、预减;缺编数、满编率若 API 返回也展示。
35
+ 8. 命令示例或执行计划不是答案;最终必须基于 `workforce_plan_detail list` 的真实输出回答。只有命令实际返回认证或权限错误时,才复述原始错误,并分别提示用户检查当前身份或补齐缺失权限。
36
+ 9. 不要根据用户描述中的业务场景把行级数据诉求降级成操作建议;判断依据是用户是否需要真实明细结果。需要真实明细结果时必须实际查询。
37
+
38
+ ## Excel 导出规则
39
+
40
+ 当用户要求“导出 / Excel / 表格文件 / xlsx / 下载明细 / 明细表”且目标是原始明细行时,先确认当前运行环境是否提供表格文件生成能力:支持时交付 `.xlsx` 文件和用户友好文案;不支持时仍执行查询,按「输出格式核心规则」返回前 10 行 Markdown 表格,并附当前页条数、已展示范围和 `has_more`,同时明确提示“当前环境不支持生成 xlsx”。不得伪造文件或下载地址,也不得直接输出 raw JSON。
41
+
42
+ 数据源要求:
43
+
44
+ - 只能使用 `workforce_plan_detail list` 默认 `json` 输出作为导出数据源。
45
+ - 禁止使用通用 `table` / `csv` 输出作为导出数据源。
46
+ - 禁止把 raw JSON 或 JSON envelope 直接平铺进 Excel。
47
+ - 模型只允许做字段映射和展示格式转换,不得聚合、求和、排序、Top N 或计算衍生指标;这些不属于明细查询职责。
48
+
49
+ Excel 主表取数路径:
50
+
51
+ - 从 `data.items` 生成主表行。
52
+ - Excel 只生成一张 sheet:`结果明细`。
53
+ - 不得额外生成 `查询说明` 或类似元信息 sheet。
54
+
55
+ 维度列规则:
56
+
57
+ - 每个维度独占一列,列名必须使用当前方案 `dimension_lists` 中对应 `dimension_key` 的维度名称。
58
+ - 单元格值来自 `dimension_info_datas[].dimension_info.name[]`。
59
+ - 缺失维度显示 `-`,不得跳过或隐藏。
60
+ - 不得直接把 `dimension_key` 当用户可见列名;只有方案未返回维度名称时才 fallback 到 key,并在最终回复中说明。
61
+
62
+ 数值列固定穷举;只展示 API 实际返回的字段,不允许模型自创:
63
+
64
+ | JSON 字段 | Excel 列名 | 展示规则 |
65
+ |---|---|---|
66
+ | `workforce_plan` | 编制HC | 原样展示 |
67
+ | `active_individuals` | 在职人数 | 原样展示 |
68
+ | `individuals_to_be_added` | 预增 | 返回才展示 |
69
+ | `individuals_to_be_removed` | 预减 | 返回才展示 |
70
+ | `vacancy` | 缺编数 | 返回才展示(明细行常不返回) |
71
+ | `fulfillment_rate` | 满编率 | 返回才展示(明细行常不返回),转成百分比 |
72
+ | `estimated_active_individuals_details` | 季度预估 | 按日期升序展示为 `YYYY-MM-DD=人数`;未返回则不展示或置空 |
73
+ | `multi_period_values` | 多周期编制HC | 只展示返回的周期和 `workforce_plan`,格式为 `YYYY-MM-DD=HC`;未返回则不展示或置空 |
74
+
75
+ 内部字段禁止写入 Excel:
76
+
77
+ - `workforce_plan_detail_id`
78
+ - `dimension_id`
79
+ - `is_missing_dimension`
80
+ - `is_all_zero_value`
81
+
82
+ 成功生成文件时,最终回复文案必须友好且简洁,至少说明:
83
+
84
+ - Excel 文件路径。
85
+ - 查询口径,例如方案、筛选维度、是否包含缺维度行、是否过滤全零行。
86
+ - 导出行数:使用本次 `data.items` 行数。
87
+ - 分页状态:`has_more` 和是否还有下一页;如果只导出当前页,必须说明“仅导出当前页”。
88
+ - 若当前环境无法生成 `.xlsx`,按本节开头的固定降级格式返回 Markdown 表格;不能伪造文件路径,也不能退化为 `.txt` 或 raw JSON 平铺文件。
89
+
90
+ ## 调用方式
91
+
92
+ 编制明细查询必须传入 `workforce_plan_id`。如果用户未提供:
93
+
94
+ 1. 先执行 `people-cli corehr workforce_plan list` 获取方案列表。
95
+ 2. 只根据真实返回的方案名称、ID、状态、生效期和 `dimension_lists` 自动匹配;无候选或多候选时列出候选让用户选择,不得固定 plan_id。
96
+ 3. 保存方案返回的 `dimension_lists`,后续展示维度列名必须使用它。
97
+
98
+ ```bash
99
+ people-cli schema corehr.workforce_plan_detail.list
100
+
101
+ people-cli corehr workforce_plan_detail list \
102
+ --params '{"page_size":10}' \
103
+ --data '{"workforce_plan_id":"<方案ID>","is_centralized_reporting_project":false}'
104
+ ```
105
+
106
+ 常用 query 参数(放 `--params`):
107
+
108
+ | 参数 | 类型 | 说明 |
109
+ |---|---|--------------------------|
110
+ | `page_size` | integer | 分页大小,最大 100;用户未指定数量时默认 10 |
111
+ | `page_token` | string | 下一页 token |
112
+
113
+ 常用 body 参数(放 `--data`):
114
+
115
+ | 参数 | 类型 | 说明 |
116
+ |---|---|---|
117
+ | `workforce_plan_id` | string | 必填。编制方案 ID |
118
+ | `dimension_id_in_datas` | array | 可选。维度筛选,每项含 `dimension_key` 和 `dimension_ids` |
119
+ | `include_missing_dimension_rows` | boolean | 可选。是否包含缺维度行 |
120
+ | `filter_all_zero_value_rows` | boolean | 可选。是否过滤全零行 |
121
+ | `is_centralized_reporting_project` | boolean | 查普通方案填 `false`;查集中填报项目必须为 `true` |
122
+ | `centralized_reporting_project_id` | string | 集中填报项目 ID;集中填报明细必填 |
123
+
124
+ 集中填报口径如果缺 `centralized_reporting_project_id` 或批次/项目,必须先澄清,不得只凭方案名、地点或人员类型继续查询。
125
+
126
+ ## 响应结构概览
127
+
128
+ ```
129
+ data.items[] — 编制明细行数组,每行包含:
130
+ ├── workforce_plan_detail_id — 明细行 ID(不展示)
131
+ ├── dimension_info_datas[] — 维度信息数组
132
+ │ ├── dimension_key — 维度类型 key
133
+ │ └── dimension_info — 维度详情对象
134
+ │ ├── dimension_id — 维度值 ID(不展示)
135
+ │ └── name[] — 国际化名称数组(展示用)
136
+ ├── workforce_plan — 编制规划值(HC)
137
+ ├── active_individuals — 在职人数
138
+ ├── individuals_to_be_added — 预增员数量(返回才展示)
139
+ ├── individuals_to_be_removed — 预减员数量(返回才展示)
140
+ ├── vacancy — 缺编数(常不返回,返回才展示)
141
+ ├── fulfillment_rate — 满编率(0.5 = 50%,常不返回,返回才展示)
142
+ ├── estimated_active_individuals_details[] — 预估在职人数明细(如需展示)
143
+ ├── multi_period_values[] — 多周期编制值(仅展示 workforce_plan)
144
+ ├── is_missing_dimension — 是否缺维度行(不展示)
145
+ └── is_all_zero_value — 是否全零行(不展示)
146
+ ```
147
+
148
+ 不要展示 API 未返回的字段。`vacancy_including_individuals_to_be_added_and_removed`、`fulfillment_rate_including_individuals_to_be_added_and_removed` 属于含在途口径,仅当用户明确要求且 API 返回时才展示。
149
+
150
+ 明细行字段名固定,**严禁臆想**;维度值是 `name[]` 国际化数组。优先选择当前回复语言对应的名称,缺失时回退到第一个可用名称。明细行 `vacancy`(缺编)、`fulfillment_rate`(满编率)常不返回(多数方案的明细行只给原始 HC、在职、预增、预减),返回才展示,需要可靠缺编/满编率时用汇总接口。Agent 可以直接解析默认 JSON;需要 jq-compatible 表达式时,可参考以下用户语言维度值和明细字段提取样例,`<language>` 使用当前回复语言对应的语言代码:
151
+
152
+ ```jq
153
+ .data.items[]
154
+ | ([.dimension_info_datas[]
155
+ | ((.dimension_info.name[]? | select(.lang=="<language>") | .value) // .dimension_info.name[0].value // "-")]
156
+ | join(" / ")) as $dim
157
+ | "\(if $dim=="" then "-" else $dim end)\tHC=\(.workforce_plan)\t在职=\(.active_individuals)\t预增=\(.individuals_to_be_added)\t预减=\(.individuals_to_be_removed)"
158
+ ```
159
+
160
+ 不强制使用 people-cli `--jq`、Agent 自带 jq 或用户环境中的 jq,也不要求额外安装。若选择 people-cli `--jq`,传入上面的表达式且保持默认 `json`,不要同时传非 `json` 的 `--format` 或 `--output`。
161
+
162
+ > 多维度行每行可能有多个维度值,必须用 `[...]| join` 聚成一个字段,不要让 `name[]` 展平成多行重复输出。
163
+
164
+ ## 维度筛选与澄清
165
+
166
+ 先用方案 `dimension_lists` 确认维度 key 是否存在。用户提供的是维度值名称而不是 ID 时,调用现有 `+query-id-by-name`;不要从 `dimension_lists` 中臆测维度值 ID:
167
+
168
+ ```bash
169
+ people-cli corehr +query-id-by-name \
170
+ --business-scene workforce_plan \
171
+ --language "<zh-CN 或 en-US>" \
172
+ --format json \
173
+ --queries '[{"field_api_name":"<业务字段API名>","target_object_api_name":"<目标对象API名>","query_name":"<维度值名称>"}]'
174
+ ```
175
+
176
+ 构造查询字段时,以当前方案的 `dimension_key` 为准:普通维度的业务字段和目标对象都使用该 key;`custom_org_01`~`custom_org_10` 的 `field_api_name` 追加 `__c`;`actual_work_location` 的 `target_object_api_name` 使用 `location`。仅当 `results[].matched_id` 唯一匹配,才将其写入 `dimension_id_in_datas[].dimension_ids`。无匹配时如实反馈;多匹配时按候选名称和路径让用户确认,禁止默认取第一条。禁止把任何环境或租户中的维度 key、维度值或固定数据预置为通用映射。
177
+
178
+ 维度解析前先剔除业务功能词:`我的团队`、`我团队`、`我团`、`人员管理` 单独出现或作为入口前缀时,只表示产品入口 / 业务模块,不是编制维度、部门、维度值或筛选条件。不得把这些词写入 `dimension_id_in_datas`,也不得因为它们不在 `dimension_lists` 中就要求用户澄清。只忽略完整词,不截断 `人员类型` 等真实维度词;若用户明确说“名为 <词> 的部门/维度值”,才按真实维度值处理。
179
+
180
+ 匹配规则:
181
+
182
+ - 用户说法能唯一命中 `dimension_lists[].name` 或 `dimension_lists[].key` 时,使用该条返回的 key。
183
+ - 用户说法无法唯一判断是维度名还是维度值时,必须停止并澄清。
184
+ - 用户说法没有命中或命中多个维度时,必须列出可用维度名称/key 并请用户选择,不能泛泛问“请确认”。
185
+ - 请求的维度没有出现在目标方案 `dimension_lists` 时,必须列出可用维度并让用户选择或更换方案,不能用相近维度替代。
186
+ - 维度值必须使用已确认的 ID;如果用户只给出名称,先执行 `+query-id-by-name`。无法唯一确认时列出候选让用户选择,不能自动取第一个。
187
+
188
+ 明细筛选使用已确认的维度 ID:
189
+
190
+ ```bash
191
+ people-cli corehr workforce_plan_detail list \
192
+ --params '{"page_size":10}' \
193
+ --data '{"workforce_plan_id":"<方案ID>","dimension_id_in_datas":[{"dimension_key":"<dimension_key_from_dimension_lists>","dimension_ids":["<维度值ID>"]}],"filter_all_zero_value_rows":true,"is_centralized_reporting_project":false}'
194
+ ```
195
+
196
+ ## 格式化规则
197
+
198
+ ### 维度列
199
+
200
+ - 表格左侧展示所有维度列。
201
+ - 维度列名从方案 `dimension_lists` 获取。
202
+ - 维度值从 `dimension_info.name[]` 获取。
203
+ - 缺失维度显示 `-`。
204
+
205
+ 示例:
206
+
207
+ ```text
208
+ | <维度A> | <维度B> | 编制HC | 在职人数 | 预增 | 预减 | 缺编数 | 满编率 |
209
+ |---|---|---|---|---|---|---|---|
210
+ | <维度值A> | <维度值B> | <HC> | <在职> | <预增> | <预减> | <缺编> | <满编率> |
211
+ | - | <维度值B> | <HC> | <在职> | <预增> | <预减> | <缺编> | <满编率> |
212
+ ```
213
+
214
+ ### 数值列
215
+
216
+ | JSON 字段 | 中文列名 | English Column | 格式化规则 |
217
+ |---|---|---|---|
218
+ | `workforce_plan` | 编制HC | Workforce Plan(HC) | 原样展示 |
219
+ | `active_individuals` | 在职人数 | Active Individuals | 原样展示 |
220
+ | `individuals_to_be_added` | 预增 | To Be Added | 返回才展示 |
221
+ | `individuals_to_be_removed` | 预减 | To Be Removed | 返回才展示 |
222
+ | `vacancy` | 缺编数 | Vacancy | 返回才展示(明细行常不返回) |
223
+ | `fulfillment_rate` | 满编率 | Fulfillment Rate | 返回才展示,乘以 100 并加 `%` |
224
+
225
+ 多周期数据如需展示,按 `multi_period_values[].period_date` 展示每个周期的 `workforce_plan`;若返回预增 / 预减,也可在用户要求多周期口径时展示。
226
+
227
+ 季度、未来日期或预估口径只展示 API 返回字段:`estimated_active_individuals_details` 展示返回日期和预计在职人数;`multi_period_values` 只展示返回的周期和编制值。缺编、含在途缺编、满编率等字段未返回时不得推导。
228
+
229
+ ## 聚合分析规则
230
+
231
+ - 本 reference 只做行级明细查询与展示,不做聚合、排序、Top N、分布统计、跨维度对比。
232
+ - 禁止通过 `workforce_plan_detail list` 拉明细后本地分组、求和、排序或 Top N。
233
+ - 只有用户明确要查看原始明细行时才使用本 reference;属于聚合/汇总的诉求停止并交由主 SKILL 重新路由。
234
+
235
+ ## 数据量较大时
236
+
237
+ - 默认展示前 10 行;若用户要求“多给一些”且明细行超过 20 行,展示前 20 行后注明当前页条数、已展示范围和 `has_more`。
238
+ - 若结果为空,固定回复:`未查询到符合条件的编制明细;当前页返回 0 条,has_more=false。`
@@ -0,0 +1,221 @@
1
+ # 编制汇总查询 (+workforce-plan-detail-summary)
2
+
3
+ 查询编制规划 HC 汇总数据:编制 HC、在职人数、预增、预减、缺编数、满编率等。支持维度筛选、分组聚合、排序和 Top N。结果获取、排序、Top N、截断都由 shortcut 完成;agent 只表达筛选、分组、排序意图,禁止拉明细后本地分组/求和/排序。最终答案必须是 people-cli 返回的业务数据,命令示例或执行计划不是答案。
4
+
5
+ > **认证与权限:** 沿用当前 people-cli 运行环境和身份,不预设登录态,也不主动执行登录、初始化或身份切换。汇总基础权限为 `corehr:workforce_detail:read`;未传 `--plan-id` 自动查询方案时还需要 `corehr:workforce_plan:read`;维度按名称解析时还需要 `corehr:corehr:query_id_by_name`。CLI 返回认证错误时提示用户检查当前身份,返回权限错误时提示补齐实际缺失的公共权限。
6
+
7
+ ## 适用场景
8
+
9
+ 使用本 reference:
10
+
11
+ - 查询编制 HC、在职人数、预增、预减、缺编数、满编率等汇总指标。
12
+ - 按方案维度筛选、分组、排序、Top N、分布、构成、占比、对比或趋势。
13
+ - 判断“哪些部门 / 地点 / 序列 / 维度值满足某个指标条件”。
14
+ - 导出汇总或分组结果到业务友好的 Excel(见「Excel 导出」)。
15
+
16
+ 不要使用本 reference:
17
+
18
+ - 用户要原始行级明细、缺维度行或过滤全零行 → detail-list reference。
19
+ - 用户只问方案列表、生效期或方案维度清单 → workforce-plan reference。
20
+
21
+ ## 执行流程(禁止跳步)
22
+
23
+ 1. **拆解诉求**:识别答案行粒度(单对象汇总 / 分组聚合 / 对比 / 占比 / 趋势 / 导出)、筛选条件、判断指标。
24
+ 2. **定位方案**:未给 `plan_id` 时先 `workforce_plan list` 定位方案并读取 `dimension_lists`。
25
+ 3. **解析维度**:筛选、分组、展示维度都必须来自目标方案 `dimension_lists`,按「维度解析」校验与澄清,禁止猜测。
26
+ 4. **构造命令**:按答案行粒度选参数(是否分组、排序、Top N、占比分母),分组维度(尤其树维度)的写法都见「分组与排序口径」。
27
+ 5. **核对再答**:按「输出与回答规则」整理事实表,逐行可核对后再下结论。
28
+
29
+ ## 命令参数
30
+
31
+ ```bash
32
+ people-cli corehr +workforce-plan-detail-summary [flags]
33
+ ```
34
+
35
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
36
+ |------|------|------|--------|------|
37
+ | `--plan-id` | string | 否 | - | 编制方案 ID。不传则自动按当前日期匹配生效方案 |
38
+ | `--plan-name` | string | 否 | - | 方案名称关键词,多方案时过滤;只匹配当前生效方案,历史方案需用 `--plan-id` |
39
+ | `--dimensions` | string_array | 否 | - | 筛选维度,格式 `type:name` 或 `type:=id`;多个维度必须重复传 `--dimensions`,禁止逗号合并 |
40
+ | `--include-children` | bool | 否 | true | 筛选维度是否包含下级 |
41
+ | `--group-by` | string_array | 否 | - | 分组维度,格式 `key`、`key:level`、`key:true/false`;树维度必须显式 `:true`/`:false`/`:<level>`。多个维度必须重复传 `--group-by`(如 `--group-by department:true --group-by job_family:true`),禁止写成 `department:true,job_family:true` 逗号形式(会报 invalid group-by format) |
42
+ | `--sort-by` | string | 否 | - | 排序字段:`workforce_plan`、`active_individuals`、`vacancy`、`fulfillment_rate`、`dimension_name` |
43
+ | `--sort-order` | string | 否 | desc | `asc` / `desc` |
44
+ | `--top` | int | 否 | 0 | 排序后保留前 N 条,使用时必须配 `--sort-by` |
45
+ | `--format` | string | 否 | json | 用户展示用 `pretty`;程序处理 / 排障 / 导出数据源用默认 `json` |
46
+ | `--dry-run` | - | 否 | - | 仅打印将要调用的 API,不实际执行 |
47
+
48
+ **`--format` 选择**:用户要直接看汇总/分组/排序/对比/示例时必须显式加 `--format pretty`;需要程序化处理、导出数据源、保留完整 envelope 或用 `--jq` 时保留默认 `json`。通用 `table` 格式只会把 envelope 平铺成 key-value,禁止用于用户展示。
49
+
50
+ ## 维度解析
51
+
52
+ `--dimensions` 两种写法:按名称 `type:name`(如 `<dimension_key>:<维度值名称>`),或直传 ID `type:=id`。多个维度重复 `--dimensions`,名称解析由 shortcut 并发执行。
53
+
54
+ 解析前先剔除业务功能词:`我的团队`、`我团队`、`我团`、`人员管理` 单独出现或作为入口前缀时只表示产品入口,不是维度/维度值/筛选条件,不得传入 `--dimensions`/`--group-by`/`query_id_by_name`,也不得因其不在 `dimension_lists` 中就要求澄清;只忽略完整词,不截断 `人员类型` 等真实维度词;用户明确说“名为 <词> 的部门/维度值”时才按维度值处理。
55
+
56
+ 匹配规则:
57
+
58
+ - 唯一命中 `dimension_lists[].name` 或 `.key` → 用该 key。
59
+ - 无法判断是维度名还是维度值、命中多个维度、维度值有多个候选 → **停止并列候选让用户选择**,禁止自动取第一个。
60
+ - 没命中任何维度 → 展示当前方案可用维度并询问,禁止猜测或改用相近维度。
61
+ - 禁止预置固定方案 ID、固定维度映射或固定维度值。
62
+ - 不假设不同维度 key 语义等价或可以相互替代;只使用当前方案 `dimension_lists` 中与用户口径明确匹配的维度,存在歧义时列出实际候选让用户确认。
63
+
64
+ 澄清模板:
65
+
66
+ ```text
67
+ 当前启用方案是 <方案名称>(<开始日期> 至 <结束日期>),已配置维度包括:<维度列表>。请求中的维度口径尚不能直接匹配到已配置维度,需要先确认使用哪个可用维度或更换方案。
68
+ ```
69
+
70
+ ## 分组与排序口径
71
+
72
+ 按答案行粒度选择参数:
73
+
74
+ | 答案行粒度 | 参数 |
75
+ |---|---|
76
+ | 单对象汇总 | 相同 `--dimensions`,不带 `--group-by` |
77
+ | 哪些对象满足条件 | `--group-by` = 输出行粒度,判断字段取返回行原始指标 |
78
+ | Top / 最多 / 最少 | `--sort-by` + `--sort-order` + `--top`(未明确 N 默认 `--top 5`) |
79
+ | 占比 / 构成 | 分母用 `.data.summary`(同条件总汇总),见「输出与回答规则」 |
80
+
81
+ ### 树维度判定
82
+
83
+ 非树维度(`job_level`、`employee_type`、`job`、`position`、`pathway` 等)只能写裸 `--group-by <key>`,禁止加 `:level`/`:true`/`:false`。
84
+
85
+ 树维度不接受裸 `--group-by <key>`,必须显式选 `:<level>`/`:true`/`:false`,从自然语言一次性自动判定,**禁止把“是否含下级”当澄清问题反问用户**。下表是当前 CLI 支持的树维度清单,唯一代码来源为 Shortcut 的 `treeDimensionKeys`;本 Skill 只在此处维护一份清单,代码修改 `treeDimensionKeys` 时必须同步本表。CLI 运行时校验是最终依据:若返回 `invalid group-by` 或非树维度错误,复述原始错误并按 CLI 提示处理,不自行猜测其他映射;后续 CLI 若通过 help/schema 暴露该清单,则优先读取运行时清单,静态表只作 fallback。
86
+
87
+ | 类别 | 树维度 key |
88
+ |---|---|
89
+ | 组织/部门 | `department` |
90
+ | 地点/实际工作地点 | `location`、`actual_work_location` |
91
+ | 序列 | `job_family` |
92
+ | 成本中心 | `cost_center` |
93
+ | 自定义组织 | `custom_org_01` ~ `custom_org_10` |
94
+
95
+ 判定优先级(高 → 低):
96
+
97
+ 1. 层级语义(一级/二级/顶层/第 N 级/下钻一层)→ `key:N`(N 仅 1-5)
98
+ 2. 明确含下级(含下级/管辖范围/全景汇总/汇总口径)→ `key:true`
99
+ 3. 明确不含下级(仅/节点自身/不含下级/只看 X 本身)→ `key:false`
100
+ 4. 分布/占比语义(分布/构成/占比/比例/share/各占多少)且未指定层级和含下级 → `key:false`(互斥分桶)
101
+ 5. 都不命中(各对象/Top N 等常见汇总排序)→ `key:true`(含下级,不反问)
102
+
103
+ | 写法 | 含义 |
104
+ |---|---|
105
+ | `<tree_key>` | 非法;必须显式 `:true`/`:false`/`:<level>` |
106
+ | `<tree_key>:N` | 第 N 层分组;同层互斥分桶,适合分布/占比 |
107
+ | `<tree_key>:true` | 节点及其下级;父子可能重叠,适合含下级排行/汇总,**不可相加、不可当互斥分母** |
108
+ | `<tree_key>:false` | 仅节点自身,不含下级;适合未指定层级的分布/构成/占比 |
109
+ | `<dimension_key>` | 非树维度裸 key 分组 |
110
+
111
+ 输出首行须标注口径,例如:`本次按 含下级 (department:true) 汇总;父子节点可能重叠,不可相加` / `本次按 一级部门 (department:1) 统计;同层分桶可用于占比` / `本次按 节点自身 (department:false) 统计;可用于分布`。
112
+
113
+ ## 跨年 / 多方案对比
114
+
115
+ 跨年或多方案对比时,先按 [`workforce-plan`](people-corehr-workforce-plan.md) 的「全量 / 历史方案定位」拿到各年度的 `workforce_plan_id`,再对每个方案分别 `--plan-id <id>` 查询、保持相同维度筛选与分组口径,最后按年度并列展示(每年标注方案名、plan_id、生效期、口径)。某年度方案不含对比维度时标注「当前方案不含 <维度名> 维度」,不跨年硬凑。
116
+
117
+ ## 典型用法
118
+
119
+ ```bash
120
+ # 树维度一级节点汇总 / 排序 / 占比
121
+ people-cli corehr +workforce-plan-detail-summary \
122
+ --group-by "<tree_dimension_key>:1" --sort-by workforce_plan --sort-order desc --top "<N>" --format pretty
123
+
124
+ # 树维度分布 / 构成 / 占比(未声明层级用节点自身,避免父子重叠)
125
+ people-cli corehr +workforce-plan-detail-summary \
126
+ --plan-id "<方案ID>" --group-by "<tree_dimension_key>:false" --sort-by workforce_plan --sort-order desc --format pretty
127
+
128
+ # 树维度含下级排行(父子可能重叠,不可相加)
129
+ people-cli corehr +workforce-plan-detail-summary \
130
+ --plan-id "<方案ID>" --group-by "<tree_dimension_key>:true" --sort-by vacancy --sort-order desc --top 5 --format pretty
131
+
132
+ # 非树维度稳定展示示例
133
+ people-cli corehr +workforce-plan-detail-summary \
134
+ --plan-id "<方案ID>" --group-by "<dimension_key>" --sort-by dimension_name --sort-order asc --top 10 --format pretty
135
+
136
+ # 按维度值过滤后再按另一维度分组
137
+ people-cli corehr +workforce-plan-detail-summary \
138
+ --plan-id "<方案ID>" --dimensions "<dimension_key_1>:<维度值名称1>" --group-by "<dimension_key_2>" --sort-by vacancy --sort-order desc --format pretty
139
+
140
+ # 多条件筛选汇总
141
+ people-cli corehr +workforce-plan-detail-summary \
142
+ --plan-id "<方案ID>" --dimensions "<dimension_key_1>:<维度值名称1>" --dimensions "<dimension_key_2>:<维度值名称2>" --format pretty
143
+ ```
144
+
145
+ ## 响应字段、路径与 jq-compatible 样例
146
+
147
+ 默认 `json` envelope 字段路径固定如下,**严禁臆想字段名**;维度值是 `{lang,value}` 国际化数组:
148
+
149
+ | 路径 | 含义 |
150
+ |---|---|
151
+ | `.data.summary` | 同条件不带 `group_by` 的总汇总(单汇总查询也走这里);总量 / 分母 / 整体口径优先取此 |
152
+ | `.data.grouped_summary_result.items[]` | 分组结果行;每行含维度信息和数值字段 |
153
+ | `.items[].dimension_info_datas[].dimension_key` | 该分组维度 key |
154
+ | `.items[].dimension_info_datas[].dimension_info.name[]` | 维度值国际化数组;优先取当前回复语言对应的 `value`,缺失时回退到第一个可用名称 |
155
+ | `.data.grouped_summary_result.total_count` | 排序 / Top 前的全量分组数;回答“共 X 个分组”用它 |
156
+ | `.data.grouped_summary_result.returned_count` | 本次返回条数;回答“示例 / 本次返回 X 个”用它 |
157
+ | `.data.grouped_summary_result.has_more` / `all_pages_drained` / `truncated_by_top` | 分页与截断状态 |
158
+
159
+ 数值字段(`summary` 与每个分组行通用):
160
+
161
+ | 字段 | 展示名 | 规则 |
162
+ |---|---|---|
163
+ | `workforce_plan` | 编制HC | 原样 |
164
+ | `active_individuals` | 在职人数 | 原样 |
165
+ | `individuals_to_be_added` | 预增 | 原样 |
166
+ | `individuals_to_be_removed` | 预减 | 原样 |
167
+ | `vacancy` | 缺编数 | 原样(HC - 在职,可为负=超编) |
168
+ | `fulfillment_rate` | 满编率 | 转百分比,`0.5`→`50.0%` |
169
+ | `estimated_active_individuals_details[]` | 季度预估 | 用户问季度/预估/未来/年末/走势时逐条展示 `YYYY-MM-DD=人数` |
170
+
171
+ Agent 可以直接按上述路径解析默认 JSON,不强制使用某一种 jq 实现。需要 jq-compatible 表达式时,可参考以下分组行提取样例;`<language>` 使用当前回复语言对应的语言代码:
172
+
173
+ ```jq
174
+ .data.grouped_summary_result.items[]
175
+ | ([.dimension_info_datas[]
176
+ | ((.dimension_info.name[]? | select(.lang=="<language>") | .value) // .dimension_info.name[0].value // "-")]
177
+ | join(" / ")) as $dim
178
+ | "\(if $dim=="" then "-" else $dim end)\tHC=\(.workforce_plan)\t在职=\(.active_individuals)\t预增=\(.individuals_to_be_added)\t预减=\(.individuals_to_be_removed)\t缺编=\(.vacancy)\t满编率=\(.fulfillment_rate)"
179
+ ```
180
+
181
+ 不强制使用 people-cli `--jq`、Agent 自带 jq 或用户环境中的 jq,也不要求额外安装。若选择 people-cli `--jq`,传入上面的表达式且保持默认 `json`,不要同时传非 `json` 的 `--format` 或 `--output`。
182
+
183
+ > 多维度分组时每行可能有多个维度值,必须用 `[...]| join` 聚成一个字段(如 `业务线 / 序列`),不要让 `name[]` 展平成多行重复输出。
184
+ > 数值字段(`workforce_plan`/`active_individuals`/`individuals_to_be_added`/`individuals_to_be_removed`/`vacancy`/`fulfillment_rate`)返回的是**字符串**(如 `"0"`、`"1"`)。使用 jq-compatible 表达式按数值筛选/比较时必须先 `tonumber`,例如 `select((.workforce_plan|tonumber)==1)`;直接 `==1`(数字)永不命中、得到空结果。提取结果为空时如实回答“无符合条件的行”,禁止编造数据。
185
+
186
+ 含在途缺编、含在途满编率仅在用户明确要求且 API 返回时展示。`--format pretty` 已按上表渲染并把季度预估展示为 `YYYY-MM-DD=<预计在职>`,供用户阅读。
187
+
188
+ ## 输出与回答规则
189
+
190
+ - 维度名称取自 `dimension_lists`、维度值取自 `dimension_info.name[]`,不得把 `dimension_key` 当显示名;缺失维度显示 `-`。
191
+ - 禁止编造 API 未返回的数据:方案名/ID/状态/日期/维度/维度值/人数/分页/预估/缺编字段无返回时只能答无法确认或需澄清。
192
+ - **占比分母**只能来自同筛选条件下不带 `--group-by` 的总汇总(优先 `.data.summary`)或互斥的 `key:false`/`key:N` 分桶;**禁止用 `key:true` 分组行求和当分母**;用户坚持含下级占比时只能称“覆盖口径占比”并说明合计可能超 100%。
193
+ - **排序 / Top N** 必须显式传参,只展示 shortcut 返回的排序后前 N,不得估算 total、重排或补齐未返回的分组。
194
+ - 分组回答必须含:`returned_count`、`total_count`、`has_more`、前 10 个分组的维度值与六项核心指标(编制HC、在职人数、预增、预减、缺编数、满编率)。指定 Top N 时展示排序后前 N。必须区分“本次返回 X 个分组”(`returned_count`)与“共汇总 X 个分组”(需 `all_pages_drained=true` 或 `total_count`);`has_more=true` 或 `page_token` 非空且需要完整统计时必须继续分页,否则标注仅当前页。
195
+ - 单汇总回答必须含六项核心指标(编制HC、在职人数、预增、预减、缺编数、满编率)。用户问季度/预估/未来/年末/走势时逐条展示 `estimated_active_individuals_details`。
196
+ - 层级维度按工具返回的显示名和层级信息展示。用户明确要求叶子级时,只在返回结果能够可靠识别叶子节点的情况下过滤;无法判断时说明限制,禁止根据名称猜测层级。
197
+ - 空结果固定回答:“未查询到符合条件的编制汇总;当前页返回 0 条,has_more=false”(has_more 以 API 为准),不编造分组。
198
+
199
+ **自检**:加了不同 `--dimensions` 返回完全相同 → 怀疑筛选未生效或维度值未命中;出现人员类型、组织、地点等业务术语 → 先判断是筛选条件还是输出维度;返回行同时含父子节点 → 先确认覆盖口径还是互斥分桶,含下级不简单求和;只拿到错误/空返回/缺字段 → 不给正向业务结论。
200
+
201
+ ## Excel 导出
202
+
203
+ 用户要求“导出 / Excel / xlsx / 下载结果”时,先确认当前运行环境是否提供表格文件生成能力:支持时交付 `.xlsx` 文件和简洁文案;不支持时仍执行查询,按「输出与回答规则」返回 Markdown 表格:单汇总展示一行,分组结果展示前 10 行,并附 `returned_count`、`total_count` 和 `has_more`,同时明确提示“当前环境不支持生成 xlsx”。不得伪造文件或下载地址,也不得直接输出 raw JSON。
204
+
205
+ - **数据源**:只用默认 `json` 输出;禁止用 `pretty`(反解析)、通用 `table`、或把 raw JSON/envelope 直接平铺进 Excel。
206
+ - **取数**:分组导出从 `.data.grouped_summary_result.items` 生成主表行,总计 / 占比分母从 `.data.summary` 读取(不对分组行求和);单汇总导出从 `.data.summary` 生成一行。模型只做字段映射和格式转换,不重新聚合/排序/Top N/计算。
207
+ - **列**:维度列名取 `dimension_lists` 维度名、值取 `dimension_info_datas[].dimension_info.name[]`,优先当前回复语言、缺失时回退第一个可用名称;缺失显示 `-`。数值列固定取「响应字段与路径」数值表,不自创列。
208
+ - **sheet**:只生成一张 `结果明细`(维度列 + 固定数值列);不生成 `查询说明` 等元信息 sheet;`plan_id`、`group_by`、`sort_by`、`top`、`total_count`、`returned_count`、`has_more` 等元信息只写进回复文案。
209
+ - **文案**:成功生成文件时,至少说明 Excel 路径、查询口径(方案/分组维度/排序/Top N)、导出行数(`returned_count`,总分组数用 `total_count`)、分页截断状态。若环境无法生成 `.xlsx`,按本节开头的固定降级格式返回 Markdown 表格;不伪造文件路径,也不退化为 `.txt` 或 raw JSON 平铺。
210
+
211
+ ## 异常处理
212
+
213
+ | 场景 | 行为 |
214
+ |------|------|
215
+ | 无生效方案 | 报错 `no active workforce plan covers current date` |
216
+ | 多个生效方案 | 列出方案并提示用 `--plan-id` 或 `--plan-name` |
217
+ | 维度格式错误 | 报错并提示 `type:name` / `type:=id` |
218
+ | 分组格式错误 | 报错并提示 `key` / `key:level` / `key:true/false` |
219
+ | 非树维度指定 level/include_children | 报错并提示只有树维度支持 |
220
+ | `--top` 未指定 `--sort-by` | 报错并要求明确排序字段 |
221
+ | scope 不足 | 复述 CLI 原始错误,提示用户补齐实际调用缺失的公共权限:基础汇总 `corehr:workforce_detail:read`、自动查方案 `corehr:workforce_plan:read`、名称换 ID `corehr:corehr:query_id_by_name` |
@@ -0,0 +1,79 @@
1
+ # 编制方案查询(workforce_plan.list)
2
+
3
+ 查询编制方案本身:方案列表、当前生效方案、方案状态、生效期、支持维度(`dimension_lists`)。本 reference 只覆盖方案查询,不涉及 HC 汇总、分组聚合或明细行。
4
+
5
+ ## 适用场景
6
+
7
+ 使用本 reference:
8
+
9
+ - 查询当前生效方案、方案状态、生效期、支持维度。
10
+ - 查询全量方案清单(含未启用 / 已过期)、启用与停用数量。
11
+ - 查询历史 / 多年方案,按年度取出 `workforce_plan_id`。
12
+
13
+ 不要使用本 reference:用户要 HC、在职、缺编、满编率、分布、Top N、排序、占比、原始明细行等数据,本 reference 不处理;只在用户需要定位方案、确认生效期或拿 `plan_id` / `dimension_lists` 时使用。
14
+
15
+ ## 命令格式
16
+
17
+ ```bash
18
+ # 调用前先看 schema
19
+ people-cli schema corehr.workforce_plan.list
20
+
21
+ # 查询当前生效方案(默认场景,必须显式传 active=true 只筛选启用方案)
22
+ people-cli corehr workforce_plan list --params '{"active":"true"}'
23
+
24
+ # 查询全量方案(含未启用 / 已过期),仅在用户明确要历史 / 全部方案时使用
25
+ people-cli corehr workforce_plan list --params '{"active":"false","get_all_plan":"true"}'
26
+ ```
27
+
28
+ 参数语义:`active` —— `true` 只获取已启用方案,`false` 获取所有;`get_all_plan` —— `true` 返回所有方案,`false` 仅当前生效。
29
+
30
+ ## 方案查询规则
31
+
32
+ - **默认显式筛选启用方案**:默认场景必须显式传 `active=true`,只查 `active=true` 且当前日期落在生效期内的方案,不要依赖接口隐式默认;回答必须包含命中数量、方案名称、启用状态、生效期和支持维度(`dimension_lists`)。
33
+ - **全量 / 历史方案**(用户说"所有方案 / 未启用方案 / 过期方案 / 历年方案 / 启用和停用数量 / 先看方案清单"):显式传 `active=false`、`get_all_plan=true`,分页直到全量;按返回值统计启用 / 未启用数量,输出前 10 个方案示例、状态、生效期、支持维度。
34
+ - **分页约束**:未完成全量分页时必须标注"当前页返回 X 个方案"并展示当前页前 10 个;只有完成分页后才能说"共查询到 X 个方案"。
35
+ - **方案命名词处理**:用户给出年份、官方、预算、方案名称等描述时,只把这些词作为方案列表的检索 / 筛选条件;无法唯一命中方案时列候选让用户确认,禁止把某个年份、固定 `plan_id` 或名称预置为固定方案。
36
+ - **答案来源**:最终答案必须来自 `workforce_plan list` 真实返回;命令示例、执行计划不是答案。无候选时回答"未查询到匹配方案",多候选时列出候选方案名 / ID / 状态 / 生效期让用户选择。
37
+
38
+ ## 方案对象字段结构与 jq-compatible 样例
39
+
40
+ `workforce_plan list` 返回的方案对象(`data.items[]`)字段名固定如下,**严禁臆想 `id` / `name` 等字段**:
41
+
42
+ | 字段 | 类型 | 说明 |
43
+ |---|---|---|
44
+ | `workforce_plan_id` | string | 方案唯一 ID,用于 `--plan-id` |
45
+ | `workforce_plan_name` | array | 方案名称,国际化数组 `[{lang,value}]`,非字符串 |
46
+ | `active` | bool | 是否启用 |
47
+ | `start_date` / `end_date` | string | 生效期,如 `2025-01-01` |
48
+ | `dimension_lists` | array | 支持维度,元素 `{key, name:[{lang,value}]}` |
49
+
50
+ Agent 可以直接按上述字段解析默认 JSON,不强制使用某一种 jq 实现。需要 jq-compatible 表达式时,可参考以下 ID、用户语言名称和生效期提取样例;`<language>` 使用当前回复语言对应的语言代码:
51
+
52
+ ```jq
53
+ .data.items[]
54
+ | .workforce_plan_id as $id
55
+ | ((.workforce_plan_name[]? | select(.lang=="<language>") | .value) // .workforce_plan_name[0].value) as $name
56
+ | "\($id)\t\($name)\t\(.start_date)~\(.end_date)\t active=\(.active)"
57
+ ```
58
+
59
+ 执行方式由当前环境决定:可以由 Agent 直接解析,也可以交给 Agent/系统提供的 jq-compatible 能力;若选择 people-cli `--jq`,传入上面的表达式且保持默认 `json`,不要同时传非 `json` 的 `--format` 或 `--output`。样例只规定字段路径和转换口径,不构成 jq 安装或实现依赖。
60
+
61
+ ## 全量 / 历史方案定位
62
+
63
+ 当需要按年度定位方案(如查历年方案清单、取出某年度方案 ID)时:
64
+
65
+ 1. 调用 `workforce_plan list --params '{"active":"false","get_all_plan":"true"}'`,分页直到全量,拉到所有方案(含未启用、已过期)。
66
+ 2. 用上节字段路径或 jq-compatible 样例按 `start_date` / `end_date` 定位目标年度方案,取出其 `workforce_plan_id`;同一年度多个方案时结合方案名确认,未唯一命中时列候选让用户选择。
67
+ 3. 某年度无对应方案 → 明确输出 `<YYYY 年> 无对应编制方案`,禁止编造或拿邻近年度方案顶替。
68
+
69
+ > 历史 / 未启用方案只能通过 `workforce_plan_id` 引用,无法用方案名称关键词匹配(名称匹配只作用于当前生效方案)。
70
+
71
+ ## 异常处理
72
+
73
+ | 场景 | 行为 |
74
+ |---|---|
75
+ | 无生效方案 | 报错 `no active workforce plan covers current date`,提示用户确认日期或换用全量方案查询 |
76
+ | 多个生效方案 | 列出候选方案名 / ID / 状态 / 生效期,让用户指定具体方案 |
77
+ | 未完成全量分页 | 标注“当前页返回 X 个方案”,禁止把当前页当总数 |
78
+ | 方案名 / 关键词无法唯一命中 | 列候选让用户确认,禁止预置固定 `plan_id` 或年份方案 |
79
+ | 认证或 scope 不足 | 复述 CLI 原始错误;认证失败时提示用户检查当前身份,权限不足时提示补齐 `corehr:workforce_plan:read` 后重试;不主动触发登录或身份切换 |