# 假期余额导出参考 (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 --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 --format json ``` **场景 C — 多个部门**: 对每个部门分别执行 B,汇总去重。 **场景 D — 全公司**: 暂不支持,引导用户指定部门。 **场景 E — 用户已给 userId 列表**: 直接跳过本步。 ### 阶段 2:调用脚本生成 Excel ```bash python scripts/attendance_vacation_balance.py \ --users ,,... \ [--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_.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]` |