Files
EP-Hub-Skill/.agents/skills/dingtalk-misc/references/attendance-vacation.md
T
2026-09-02 11:44:52 +08:00

141 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 假期余额导出参考 (attendance-vacation)
> 本文档由 `attendance.md` 路由调用。当用户提到“导出假期余额”、“假期余额列表”、“所有假期规则余额”、“假期余额 Excel”、“年假/病假/调休余额导出”等诉求时,必须先阅读本文档,再调用配套脚本。
## 强制门禁
**任何调用 `attendance_vacation_balance.py` 的请求,都必须经过本文档定义的工作流,禁止只凭脚本路径或 `--help` 自行拼命令。**
执行前必须确认:
- 人员范围:指定员工 / 部门 / 多部门;缺失时必须追问
- 导出范围:默认导出所有假期规则余额;用户指定“年假/病假/调休”等时才传 `--leave-keywords`
- 输出形式:生成 Excel,不在对话中粘贴完整表格
## 核心原则
Agent 只负责解析人员范围并获取 userId 列表;假期规则查询、`leaveCode` 解析、假期规则单位解析、余额查询、字段解析、用户信息补齐、Excel 生成都由脚本完成。
`--leave-keywords``attendance_vacation_balance.py` 的脚本入参,只用于按假期名称筛选导出列;**不是** `dws attendance vacation balance` 的入参。`vacation balance` 当前只支持批量 `--users` 和单个 `--leave-code`,因此脚本必须先获取假期规则列表,再按每个匹配到的 `leaveCode` 分别查询余额。
脚本输出结构参考钉钉假期余额列表:
- 每名员工一行
- 基础列固定:`姓名``部门``入职时间``首次工作时间`
- 假期规则横向动态展开为多列,表头必须携带 `vacation types` 返回的规则单位,例如 `年假(天)``病假(天)``调休(小时)`
- 特殊值统一展示为 `不限制余额``不适用``未设置`
- 当某个假期规则 `leaveCode` 查询余额时接口返回“假期类型没有余额”类业务错误,表示该规则不限制余额,脚本应为该规则列填充 `不限制余额`
- 当余额记录中返回 `visible=false`,表示该员工不适用该假期规则,脚本应为该员工 + 该规则单元格填充 `不适用`
- 当接口返回“员工未设置入职时间”或“员工未设置首次参加工作时间”类业务错误,表示该假期规则依赖员工时间字段且当前员工缺失配置,脚本应为该员工 + 该规则单元格填充 `不适用`
-`vacation types` 返回假期规则 `source=external`,表示该规则由开放接口写入;若这类外部规则调用余额接口失败且不是权限错误,脚本不应阻断导出,应为该员工 + 该规则单元格填充 `外部规则暂无余额,需通过接口初始化更新余额`
## 严格禁止 (NEVER DO)
- 禁止凭历史记忆复用 userId、deptId、leaveCode
- 禁止 Agent 手工汇总、转置或目测假期余额
- 禁止 Agent 自行只查单个 `leave-code` 再声称是“所有假期规则余额”;如需导出所有假期规则余额,必须交由脚本按假期规则列表逐个 `leaveCode` 查询并汇总
- 禁止直接输出裸 userId;脚本会通过 `contact user get` 转换姓名和部门
- 禁止把 Excel 明细内容完整贴在对话里,只返回路径和摘要
## 严格要求 (MUST DO)
- 所有 `dws` 命令必须携带 `--format json`
- 假期规则名称`--leave-keywords`与假期规则`leaveCode`的映射必须从 `vacation types` 实时建立,禁止硬编码
- 假期规则单位必须从 `vacation types` 实时读取,优先使用 `leaveViewUnit` 等展示单位字段,并在 Excel 表头中展示为 `假期名称(单位)`
- 假期规则来源必须从 `vacation types` 实时读取;当 `source=external` 时按外部接口写入规则处理
- 任何接口失败必须向用户清晰报错,禁止静默吞掉
- `vacation balance` 返回“假期类型没有余额”时不作为致命错误处理,应按该假期规则 `leaveCode` 生成 `不限制余额`
- `vacation balance` 返回员工维度 `visible=false` 时不作为查询失败处理,应按该员工 + 假期规则 `leaveCode` 生成 `不适用`
- `vacation balance` 返回“员工未设置入职时间”或“员工未设置首次参加工作时间”时不作为查询失败处理,应按该员工 + 假期规则 `leaveCode` 生成 `不适用`
-`source=external` 的外部假期规则,`vacation balance` 查询失败且不是权限错误时不作为导出失败处理,应按该员工 + 假期规则 `leaveCode` 生成 `外部规则暂无余额,需通过接口初始化更新余额`
## 涉及工具
| 工具 | 用途 | 安全等级 |
|------|------|---------|
| `dws attendance vacation types` | 获取当前可见的假期规则清单,用于建立假期名称/关键词 → `leaveCode` 的映射,读取 `leaveViewUnit` 等规则单位、`source` 规则来源,并决定 Excel 假期列顺序 | 只读 |
| `dws attendance vacation balance` | 按批量 `--users` + 单个 `--leave-code` 查询员工假期余额;由脚本按匹配到的 `leaveCode` 逐个调用 | 只读 |
| `dws aisearch person` | 按姓名搜索用户获取 userId(搜人首选) | 只读 |
| `dws contact user get` | 批量查询 userId → 用户信息(姓名/部门/入职时间等),用于 Excel 基础列补齐 | 只读 |
| `dws contact dept search` | 搜索部门获取 deptId | 只读 |
| `dws contact dept list-members` | 获取部门成员 userId 列表 | 只读 |
## 工作流
### 阶段 0:参数解析
1. 识别人员范围:
- 指定员工姓名:用 `dws aisearch person --query "<姓名>" --dimension name --format json` 获取 userId
- 指定部门:用 `dws contact dept search --query "<部门名>" --format json`,再用 `dws contact dept list-members --ids <deptId> --format json` 获取成员
- 已提供 userId:直接使用
2. 识别假期列范围:
- 未指定假期类型:导出所有假期规则余额,不传 `--leave-keywords`
- 指定假期类型:传 `--leave-keywords "年假,病假"`
### 阶段 1: 获取完整人员列表
**场景 A — 指定员工姓名**:
```bash
dws aisearch person --query "<员工姓名>" --dimension name --format json
```
**场景 B — 按部门查询**:
```bash
dws contact dept search --query "<部门名>" --format json
dws contact dept list-members --ids <deptId> --format json
```
**场景 C — 多个部门**: 对每个部门分别执行 B,汇总去重。
**场景 D — 全公司**: 暂不支持,引导用户指定部门。
**场景 E — 用户已给 userId 列表**: 直接跳过本步。
### 阶段 2:调用脚本生成 Excel
```bash
python scripts/attendance_vacation_balance.py \
--users <userId1>,<userId2>,... \
[--leave-keywords "年假,病假,调休"] \
[--out 假期余额列表.xlsx]
```
脚本内部自动执行:
1. `dws attendance vacation types --format json` 获取假期规则列表、`leaveCode`、展示单位、规则来源 `source` 和列顺序
2. 对匹配到的每个假期规则,调用 `dws attendance vacation balance --users <批量用户> --leave-code <单个leaveCode> --format json` 查询余额;`vacation balance` 不支持 `--leave-keywords`
3. 处理特殊业务返回:
- 返回“假期类型没有余额”类业务错误:该 `leaveCode` 对应列填充 `不限制余额`
- 返回员工维度 `visible=false`:该员工 + 该 `leaveCode` 单元格填充 `不适用`
- 返回“员工未设置入职时间”或“员工未设置首次参加工作时间”:该员工 + 该 `leaveCode` 单元格填充 `不适用`
- `source=external` 的外部假期规则查询失败且不是权限错误:该员工 + 该 `leaveCode` 单元格填充 `外部规则暂无余额,需通过接口初始化更新余额`
4. `dws contact user get --ids <批量用户> --format json` 获取姓名、部门等信息
5. 生成 Excel`attendance_vacation_balance_<yyyyMMdd_HHmmss>.xlsx`
### 阶段 3:返回结果
向用户返回脚本 stdout 摘要即可,必须包含:
- 输出文件路径
- 员工数量
- 假期规则列数
- 如传了 `--leave-keywords`,说明筛选关键词
不要粘贴 Excel 全量内容。
## 错误处理
| 错误 | 处理方式 |
|------|---------|
| 权限不足 | 提示当前账号无权查询目标员工假期余额,需管理员或管理范围权限 |
| 人员范围缺失 | 追问员工或部门,禁止猜测 |
| 无假期规则 | 提示未匹配到假期规则,建议先执行 `dws attendance vacation types --format json` 验证 |
| 假期类型没有余额 | 不作为失败返回;按对应假期规则 `leaveCode` 填充 `不限制余额` |
| `visible=false` | 不作为失败返回;按对应员工 + 假期规则 `leaveCode` 填充 `不适用` |
| 员工未设置入职时间 / 首次参加工作时间 | 不作为失败返回;说明该规则依赖员工时间字段,按对应员工 + 假期规则 `leaveCode` 填充 `不适用` |
| 外部假期规则查询失败 | 当假期规则 `source=external` 且失败不是权限错误时,不作为导出失败;按对应员工 + 假期规则 `leaveCode` 填充 `外部规则暂无余额,需通过接口初始化更新余额` |
| openpyxl 缺失 | 提示执行 `pip install openpyxl` |
| 接口返回结构不确定 | 使用脚本 `--inspect` 重新执行一次,查看首条原始结构 |
## 配套脚本
| 脚本 | 场景 | CLI 参数 |
|------|------|---------|
| [attendance_vacation_balance.py](../scripts/attendance_vacation_balance.py) | 假期余额列表 Excel 导出;脚本按假期名称关键词筛选规则,并逐个 `leaveCode` 调用余额查询 | `--users [--leave-keywords] [--out] [--inspect]` |