Files
2026-09-02 11:44:52 +08:00

1455 lines
99 KiB
Markdown
Raw Permalink 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) 命令参考
> **【必读】日期范围严格计算规则 — 所有含 --start/--end 或 --from/--to 的命令均适用**
>
> **禁止随意猜测日期范围,必须按以下规则精确计算后再组装命令参数:**
>
> | 用户表达 | --start(含)| --end(含)| 说明 |
> |---------|------------|------------|------|
> | 本周 / 这周 / 当周 | 本周**周一** | 本周**周日** | 周一为一周的第一天,周日为最后一天 |
> | 上周 / 上一周 | 上周**周一** | 上周**周日** | 同上,往前推一周 |
> | 本月 / 这个月 / 当月 | 本月 **1 日** | 本月**最后一天**28/29/30/31| 必须计算当月实际天数 |
> | 上月 / 上个月 | 上月 **1 日** | 上月**最后一天** | 同上,往前推一个月 |
> | 今天 / 今日 | **今天** | **今天** | start == end |
> | 昨天 | **昨天** | **昨天** | start == end |
>
> **必须遵守:**
> 1. **本周一定是周一到周日**,严禁将"本周"解释为周一到周五或其他任意范围。
> 2. **本月一定是 1 日到该月实际最后一天**,严禁将"本月"截断为 1 日到 28 日或其他固定天数。
> 3. 计算日期时必须参考当前系统时间,不得使用硬编码或模糊估算。
> 4. 如果用户指定了具体日期范围(如"4月1日到4月15日"),直接使用用户给定的范围,不套用上述规则。
> 5. 日期格式统一按各命令要求:`shift list` / `check result` 等使用 `YYYY-MM-DD``report query-data` / `report query-leave` 等使用 `yyyy-MM-dd HH:mm:ss`start 取当天 `00:00:00`end 取当天 `23:59:59`)。
## 签到(checkin)— 优先路由
> **只要用户句中含"签到"二字(签到记录/签到数据/签到明细/外勤签到/导出签到/签到报表),就走本节,不要走 `check record`(打卡流水)。"签到" ≠ "打卡",签到是外勤场景的独立功能。**
### 导出 vs 查询 判断规则(必须先判断)
| 用户说 | 路由 |
|--------|------|
| 含"导出"/"报表"/"Excel"/"表格"/"生成"中**任何一个** + 含"签到" | → **导出签到报表**(走脚本) |
| 不含上述导出关键词,仅"查签到"/"签到记录"/"看看签到" | → **查询签到记录**(走命令) |
> **示例**:"帮我导出最近一个月的签到记录" → 含"导出" → 走报表脚本
> "查一下张三的签到记录" → 不含导出关键词 → 走查询命令
- **导出签到报表** → **必须先 `read_file` 读取 [attendance-report.md](./attendance-report.md) 后按其中的工作流执行(报表类型为"签到报表"**,对应脚本 `attendance_report_checkin.py`
- **严禁**绕过 `attendance-report.md` 直接调用脚本
- **严禁**自己手动分段调用 `dws attendance checkin records` 来拼数据,必须用脚本
- **查询签到记录**(无需导出,仅查看) → `dws attendance checkin records`(数据源为 MCP 工具 `get_checkin_record`
签到记录返回字段(`result.list` 数组,按 sortedProps 顺序):
- `corpId`string):企业 ID
- `name`string):用户名称
- `userId`string):用户 ID
- `timestamp`number):签到时间
- `place`string):签到地点
- `detailPlace`string):签到详细地点
- `longitude`number):签到地点经度
- `latitude`number):签到地点纬度
- `remark`string):备注信息
- `imageList`string[]):图片列表
- `customers`string):拜访客户
- `checkinType`string):签到类型
- `mobileId`string):设备 ID
## 命令总览
### 查询打卡结果
```
Usage:
dws attendance check result [flags]
Example:
dws attendance check result --users userId1,userId2 --start 2026-04-01 --end 2026-04-30 --limit 50
Flags:
--start string 起始日期, 格式 YYYY-MM-DD (必填)
--end string 结束日期, 格式 YYYY-MM-DD, 不超过 1 个月 (必填)
--limit int 分页大小, 默认 100, 范围 1-1000 (可选)
--offset int 分页偏移量, 默认 0 (可选)
--users string 用户 ID 列表, 逗号分隔, 最多 100 个 (必填)
```
返回每条记录含:用户 ID、工作日期、时间结果(Normal/Late/Early/Absenteeism/NotSigned)、位置结果、计划打卡时间、实际打卡时间、打卡流水 ID。时间跨度不超过 1 个月,最多 100 人。
### 查询打卡流水
```
Usage:
dws attendance check record [flags]
Example:
dws attendance check record --users userId1 --start 2026-04-01 --end 2026-04-30
Flags:
--start string 起始日期, 格式 YYYY-MM-DD (必填)
--end string 结束日期, 格式 YYYY-MM-DD, 不超过 1 个月 (必填)
--users string 用户 ID 列表, 逗号分隔 (必填)
```
返回每条记录含:用户 ID、实际打卡时间、打卡地址、打卡经纬度、打卡类型(OnDuty/OffDuty)、定位方式(Map/Wifi/etc)。时间跨度不超过 1 个月。
### 查询审批单(补卡/加班/请假/出差外出)
```
Usage:
dws attendance approve list [flags]
Example:
dws attendance approve list --users userId1 --types overtime,leave --start 2026-04-01 --end 2026-04-30
dws attendance approve list --users userId1 --types trip --start 2026-04-01 --end 2026-04-30 # 同时返回出差与外出
dws attendance approve list --users userId1 --types 加班,请假,补卡 --start 2026-04-01 --end 2026-04-30
Flags:
--start string 起始日期, 格式 YYYY-MM-DD (必填)
--end string 结束日期, 格式 YYYY-MM-DD (必填)
--types string 审批类型, 逗号分隔: overtime/加班、trip/travel/business_trip/出差/外出、leave/请假、patch/repair-check/补卡 (必填)
--users string 用户 ID 列表, 逗号分隔 (必填)
```
审批类型映射(关键词 → bizType):
- `overtime` / `加班``1`
- `trip` / `travel` / `business_trip` / `business-trip` / `出差` / `外出``2`**服务端查询接口 bizType=2 同时覆盖出差与外出,两者合并为同一类、不再细分**;传入任一别名都会返回这两类记录)
- `leave` / `请假``3`
- `patch` / `repair-check` / `repair_check` / `补卡``4`
> 查询不区分外出与出差,如果需要在提交入口区分外出(`TRAVEL`)与出差(`OUT`),请改用 `dws attendance approve templates --type travel|out`。
返回每条记录含:用户 ID、审批标签、审批子类型、审批类型、生效时间、时长、时长单位、流程实例 ID。
### 查询补卡/请假/加班/外出/出差审批提交链接 (必须走引导流程)
```
Usage:
dws attendance approve templates [flags]
Example:
dws attendance approve templates --type leave
dws attendance approve templates --type REPAIR_CHECK
dws attendance approve templates --type 加班
dws attendance approve templates --type travel # 外出,等价 --type TRAVEL
dws attendance approve templates --type 出差 # 出差,等价 --type OUT
Flags:
--type string 审批类型:repair-check/patch/补卡、leave/请假、overtime/加班、travel/外出、out/trip/出差,或 REPAIR_CHECK/LEAVE/OVERTIME/TRAVEL/OUT(必填)
```
当用户提到需要提交补卡、请假、加班、外出或出差时,优先使用该命令查询考勤审批表单模板提交链接,并引导用户点击返回的 `submitUrl` 提交。
`corpId``opUserId` 由系统参数自动注入,无需通过命令参数传入。
审批类型映射:补卡=`REPAIR_CHECK`,请假=`LEAVE`,加班=`OVERTIME`,外出=`TRAVEL`,出差=`OUT``trip` / `business_trip` / `business-trip` 亦映射为 `OUT`)。返回结果为列表,每条记录包含 `approveType``formName``processCode``submitUrl`
#### 引导用户自主选择合适的表单模板流程
如果返回多个表单模板,必须将多个可用模板都返回给用户,并引导用户根据实际场景自主选择合适的模板提交:
- 请假场景:可根据 `formName` 将与用户请假类型更匹配的模板放在前面展示。例如用户明确说年假、事假、病假、调休时,将名称中包含对应假期类型的模板靠前;如果用户只泛化表达“请假”,将名称最通用的请假模板靠前,例如“请假”“员工请假”“通用请假”等,避免把专项或特殊场景模板放在最前。
- 补卡/加班场景:可将名称与“补卡”或“加班”最直接匹配的模板放在前面展示。
- 回复用户时不要直接裸露任何 `submitUrl`,所有返回的表单模板都必须使用 Markdown 可点击链接格式展示:`[formName](submitUrl)`,例如 `[员工请假](https://...)`。如存在更匹配的模板,可以放在列表前面,但不要只返回推荐模板,必须同时返回其它可用模板供用户选择,且每个模板都应是用户可直接点击的 Markdown 链接。
### 导入排班记录(排班 = 为员工安排工作日期和班次, 写场景接口,必须走二次确认流程)
```
Usage:
dws attendance schedule import [flags]
Example:
dws attendance schedule import --group-id 123456 \
--schedules '[{"userId":"user001","classId":123,"workDate":"2026-04-22","checkBeginTime":"09:00","checkEndTime":"18:00"}]' \
--yes
Flags:
--group-id string 考勤组(必填,传入考勤组ID)
--schedules string 排班记录 JSON 数组(必填)
--yes 跳过确认提示
```
为排班制考勤组导入排班记录。`--schedules` 为 JSON 数组,每条记录包含:
- `userId`: 员工ID
- `classId`: 班次ID
- `workDate`: 工作日期(YYYY-MM-DD),如 2026-04-22
- `checkBeginTime`: 开始打卡时间
- `checkEndTime`: 结束打卡时间
- `isRest`: 是否休息日 Y/N(可选)
#### AI 调用 `schedule import` 的二次确认流程
`schedule import` 是写操作,会为考勤组导入或变更员工排班。AI 调用时必须按以下流程执行,不得在未确认的情况下直接导入:
1. **识别写操作**:用户表达“导入排班 / 设置排班 / 安排排班 / 给员工排班 / 批量排班”等意图时,命中 `schedule import`
2. **收集必要参数**:必须明确 `--group-id``--schedules`,并确认排班记录中的 `userId``classId``workDate``checkBeginTime``checkEndTime``isRest` 等字段。
3. **展示导入摘要并反问确认**:向用户展示考勤组 ID、导入员工数量、涉及日期范围、班次 ID 列表,以及排班记录明细摘要,并询问是否确认执行导入。
4. **用户确认后再执行导入**:只有用户明确确认后,才可以执行 `dws attendance schedule import ... --format json`
确认话术示例:
```text
即将导入排班记录,请确认:
- 考勤组 ID<GROUP_ID>
- 员工数量:<USER_COUNT>
- 日期范围:<START_DATE> ~ <END_DATE>
- 班次 ID<CLASS_IDS>
- 排班明细:
- <USER_ID><WORK_DATE> <CHECK_BEGIN_TIME>-<CHECK_END_TIME>,班次 <CLASS_ID>
是否确认执行导入?
```
如用户明确要求跳过确认,或命令中明确包含全局 `--yes`,可跳过二次确认。
### 获取排班记录
**禁止直接调用 `dws attendance schedule get`。必须先 `read_file` 读取 [attendance-schedule.md](./attendance-schedule.md) 后按其中的「排班查询导出工作流」执行。**
- 任何"查询排班"、"查看排班"、"XX考勤组的排班"、"X月份的排班"场景,**一律走 attendance-schedule.md 工作流**,由脚本 `attendance_schedule_export.py` 统一处理
- 脚本自动处理:分批查询(超 20 人自动分批)、userId→姓名转换、classId→班次名称转换、排班表格式 Excel 输出
- 违反后果:人数多时接口超时/报错、输出裸 userId 和 classId 用户看不懂、无排班表格式
- **此处不提供 `schedule get` 的 Usage/Flags,防止绕过工作流直接拼命令。完整参数由 attendance-schedule.md 工作流中的脚本内部使用。**
### 查询当前用户可管理的所有班次详情
```
Usage:
dws attendance class search [flags]
Example:
dws attendance class search
dws attendance class search --query "早班" --filter-type MINE_OWN
dws attendance class search --page 1 --limit 50
Flags:
--filter-type string 班次类型: ALL 全部班次 / MINE_OWN 我负责的 (可选)
--query string 班次名称关键字, 模糊搜索 (可选)
--page int 页码, 从 1 开始 (可选, 默认 1)
--limit int 每页条数, 最大 200 (可选, 默认 20)
```
### 查询班次详情
```
Usage:
dws attendance class get [flags]
Example:
dws attendance class get --class-id 1170996821
Flags:
--class-id int 班次 ID (必填)
```
根据班次 ID 查询该班次的完整详细信息。班次 ID 可从 `class search` 返回结果中提取,也有可能来源于用户手动输入。
### 创建班次 (写场景接口,必须走二次确认流程)
**强制执行流程**:此命令为写操作,Agent 调用时必须遵守以下流程:
1. 先向用户展示待执行操作的完整参数摘要,包括班次名称、上下班时间、休息时段等
2. 使用 `ask_human` 或返回待确认状态,等待用户明确确认
3. 用户确认后,再传全局 `--yes` 执行命令
**禁止未经用户确认直接执行或自动添加 `--yes`。**
```
Usage:
dws attendance class create [flags]
Example:
dws attendance class create --name "早班" --class-vo '{"sections":[{"times":[{"checkType":"OnDuty","checkTime":"08:00","across":0},{"checkType":"OffDuty","checkTime":"17:00","across":0}]}]}' --timeout 10
# 带休息时段(12:00-13:00 午休)
dws attendance class create --name "测试CLI" --class-vo '{"sections":[{"times":[{"checkType":"OnDuty","checkTime":"09:00","across":0},{"checkType":"OffDuty","checkTime":"18:00","across":0}]}],"setting":{"topRestTimeList":[{"checkType":"OnDuty","checkTime":"12:00","across":0},{"checkType":"OffDuty","checkTime":"13:00","across":0}]}}' --timeout 10
Flags:
--name string 班次名称 (必填)
--owner string 班次负责人 userId (可选)
--class-vo string 完整 TopAtClassVO JSON 字符串, 包含 sections 等复杂子对象 (必填)
```
创建一个新班次。`--name``--class-vo`(包含 `sections`)必填。`sections` 定义班次的上下班时间段,支持多段上下班,每段包含 `times` 数组(有且只能有两个对象:上班+下班)。由于保存班次耗时较久,建议加 `--timeout 10`
`checkTime` 字段统一使用 "HH:mm" 格式(如 "09:00"、"17:30"),CLI 自动转换为服务端所需格式。
`--class-vo` 支持字段:
- `name`(string, 必填) `owner`(string, 可选)
- `sections`([]object, 必填): 每个对象含 `times`([]object),每个 time 含 `checkType`(OnDuty/OffDuty, 必填) `checkTime`("HH:mm", 必填) `across`(0/1, 必填) `freeCheck`(bool) `beginMin`(number, -1不限制) `endMin`(number, -1不限制)
- `setting`(object, 可选): `seriousLateMinutes`(严重迟到分钟) `absenteeismLateMinutes`(旷工迟到分钟) `attendDays`(出勤天数) `topRestTimeList`([]object, 仅单段上下班时可用,最多3段: checkType/checkTime("HH:mm")/across)
### 更新班次 (写场景接口,必须走二次确认流程)
**强制执行流程**:此命令为写操作,Agent 调用时必须遵守以下流程:
1. 先向用户展示待执行操作的完整参数摘要,包括班次 ID、要修改的字段含义及新值
2. 使用 `ask_human` 或返回待确认状态,等待用户明确确认
3. 用户确认后,再传全局 `--yes` 执行命令
**禁止未经用户确认直接执行或自动添加 `--yes`。**
```
Usage:
dws attendance class update [flags]
Example:
dws attendance class update --class-id 1170996821 --name "新早班" --timeout 10
dws attendance class update --class-id 1170996821 --class-vo '{"sections":[{"times":[{"checkType":"OnDuty","checkTime":"08:30","across":0},{"checkType":"OffDuty","checkTime":"17:30","across":0}]}]}' --timeout 10
# 带休息时段(12:00-13:00 午休)
dws attendance class update --class-id 1170996821 --class-vo '{"sections":[{"times":[{"checkType":"OnDuty","checkTime":"09:00","across":0},{"checkType":"OffDuty","checkTime":"18:00","across":0}]}],"setting":{"topRestTimeList":[{"checkType":"OnDuty","checkTime":"12:00","across":0},{"checkType":"OffDuty","checkTime":"13:00","across":0}]}}' --timeout 10
Flags:
--class-id int 班次 ID (必填)
--name string 班次名称 (可选,不传则保持原值)
--owner string 班次负责人 userId (可选,不传则保持原值)
--class-vo string 完整 TopAtClassVO JSON 字符串,用于修改复杂子对象 (可选)
```
更新班次配置。`--class-id` 必填,其余均可选,仅需对要修改的字段进行赋值,未传字段会自动从已有配置补充。小改用单字段 flag(如 `--name`);修改上下班时间、休息时段等复杂子对象时用 `--class-vo` 传入完整 JSON。`--class-vo` 与单字段 flag 同时传入时,单字段 flag 优先级更高。
`checkTime` 字段统一使用 "HH:mm" 格式(如 "09:00"、"17:30"),CLI 自动转换为服务端所需格式。
`--class-vo` 支持字段(均可选,只需包含要修改的字段):
- `name`(string) `owner`(string)
- `sections`([]object): 每个对象含 `times`([]object),每个 time 含 `checkType`(OnDuty/OffDuty) `checkTime`("HH:mm") `across`(0/1) `freeCheck`(bool) `beginMin`(number, -1不限制) `endMin`(number, -1不限制)
- `setting`(object): `seriousLateMinutes` `absenteeismLateMinutes` `attendDays` `topRestTimeList`([]object: checkType/checkTime("HH:mm")/across)
由于保存班次耗时较久,建议加 `--timeout 10`
### 分页查询补卡规则,支持按名称搜素
```
Usage:
dws attendance adjustment search [flags]
Example:
dws attendance adjustment search --page 1 --limit 20
dws attendance adjustment search --query "标准" --page 1 --limit 50
Flags:
--page int 页码, 从 1 开始 (必填, 默认 1)
--query string 补卡规则名称关键字, 模糊搜索 (可选)
--limit int 每页条数, 200 以内 (必填, 默认 20)
```
### 查询补卡规则详情
```
Usage:
dws attendance adjustment get [flags]
Example:
dws attendance adjustment get --adjustment-id 12345
Flags:
--adjustment-id int 补卡规则主键 ID (必填)
```
根据补卡规则主键 ID 查询对应的补卡规则详情。主键 ID 可从 `adjustment search` 返回结果中提取,也有可能来源于用户手动输入。**注意:已被删除或被更新覆盖的补卡规则无法查询到。**
### 分页查询加班规则,支持按名称搜素
```
Usage:
dws attendance overtime search [flags]
Example:
dws attendance overtime search --page 1 --limit 20
dws attendance overtime search --query "节假日" --page 1 --limit 50
Flags:
--page int 页码, 从 1 开始 (必填, 默认 1)
--query string 加班规则名称关键字, 模糊搜索 (可选)
--limit int 每页条数, 200 以内 (必填, 默认 20)
```
### 查询加班规则详情
```
Usage:
dws attendance overtime get [flags]
Example:
dws attendance overtime get --overtime-id 12345
Flags:
--overtime-id int 加班规则主键 ID (必填)
```
根据加班规则主键 ID 查询对应的加班规则详情。主键 ID 可从 `overtime search` 返回结果中提取,也有可能来源于用户手动输入。**已被删除或更新覆盖的加班规则也可以查到。**
### 查询考勤组列表
```
Usage:
dws attendance group search [flags]
Example:
dws attendance group search --query "研发"
dws attendance group search --type FIXED --limit 50
dws attendance group search --page 1 --limit 20
Flags:
--query string 考勤组名称关键字, 模糊搜索 (可选)
--page int 页码, 从 1 开始 (必填, 默认 1)
--limit int 每页条数, 200 以内 (必填, 默认 20)
--query-ble 是否查询蓝牙设备列表 (可选, 默认 false)
--query-position 是否查询地理定位和 Wifi 名称 (可选, 默认 false)
--type string 考勤组类型: FIXED 固定班制 / TURN 排班制 / NONE 自由工时 (可选)
```
### 查询考勤组全量信息
```
Usage:
dws attendance group get [flags]
Example:
dws attendance group get --group-id 123456
Flags:
--group-id int 考勤组 ID (必填)
```
根据考勤组 ID 查询该考勤组的全量信息。考勤组 ID 可从 `group search` 返回结果中提取,也有可能来源于用户手动输入。如果只需查询成员、打卡地址、蓝牙、Wifi 子集,请使用 `group filtered-get` 以节省查询成本。
返回结果中如含成员 userId 列表,必须调用 `dws contact user get --ids <userId1>,<userId2>,...`(支持逗号分隔传多个 ID),将 userId 转换为员工姓名后再输出;不得直接输出裸 userId
### 按需查询考勤组部分信息
```
Usage:
dws attendance group filtered-get [flags]
Example:
dws attendance group filtered-get --group-id 123456 --member
dws attendance group filtered-get --group-id 123456 --position --wifi
Flags:
--group-id int 考勤组 ID (必填)
--member 是否查询考勤组成员信息 (可选, 默认 false)
--position 是否查询打卡地址 (可选, 默认 false)
--wifi 是否查询打卡 Wifi (可选, 默认 false)
--bles 是否查询打卡蓝牙 (可选, 默认 false)
```
强烈建议在仅需查询成员、打卡地址、蓝牙、Wifi 时调用该命令,避免全量查询带来的性能开销。考勤组 ID 可从 `group search` 返回结果中提取,也有可能来源于用户手动输入。
返回结果中如含成员 userId 列表,必须调用 `dws contact user get --ids <userId1>,<userId2>,...`(支持逗号分隔传多个 ID),将 userId 转换为员工姓名后再输出;不得直接输出裸 userId
### 更新考勤组成员 (写场景接口,必须走二次确认流程)
**强制执行流程**:此命令为写操作,Agent 调用时必须遵守以下流程:
1. 先向用户展示待执行操作的完整参数摘要,包括考勤组 ID、要添加/移除的成员列表
2. 使用 `ask_human` 或返回待确认状态,等待用户明确确认
3. 用户确认后,再传全局 `--yes` 执行命令
**禁止未经用户确认直接执行或自动添加 `--yes`。**
```
Usage:
dws attendance group update-members [flags]
Example:
dws attendance group update-members --group-id 123456 --add-users userId1,userId2
dws attendance group update-members --group-id 123456 --remove-users userId1
dws attendance group update-members --group-id 123456 --add-depts deptId1 --remove-users userId2
Flags:
--group-id int 考勤组 ID (必填)
--add-users string 添加考勤人员 userId 列表, 逗号分隔, 最多 20 个 (可选)
--remove-users string 删除考勤人员 userId 列表, 逗号分隔, 最多 20 个 (可选)
--add-extra-users string 添加无需考勤的人员 userId 列表, 逗号分隔, 最多 20 个 (可选)
--remove-extra-users string 删除无需考勤的成员 userId 列表, 逗号分隔, 最多 20 个 (可选)
--add-depts string 添加考勤部门 ID 列表, 逗号分隔, 最多 20 个 (可选),若要添加全公司,根部门id为-1
--remove-depts string 删除考勤部门 ID 列表, 逗号分隔, 最多 20 个 (可选),全公司根部门id为-1
```
对指定考勤组的成员进行增删操作。--group-id 必填,其余参数均为可选,但至少需要传入一个变更项,否则命令拒绝执行。每次调用各参数最多传 20 个 ID。"无需考勤"人员指考勤组内豁免打卡的成员(如高管)。
### 更新考勤组配置 (写场景接口,必须走二次确认流程)
**强制执行流程**:此命令为写操作,Agent 调用时必须遵守以下流程:
1. 先向用户展示待执行操作的完整参数摘要,包括考勤组 ID、要修改的字段含义及新值
2. 使用 `ask_human` 或返回待确认状态,等待用户明确确认
3. 用户确认后,再传全局 `--yes` 执行命令
**禁止未经用户确认直接执行或自动添加 `--yes`。**
```
Usage:
dws attendance group update [flags]
Example:
dws attendance group update --group-id 123456 --name "研发考勤组" --timeout 10
dws attendance group update --group-id 123456 --owner userId1 --timeout 10
dws attendance group update --group-id 123456 --classIds '[1374234767]' --timeout 10
dws attendance group update --group-id 123456 --group-vo '{"positions":[{"title":"总部","address":"北京市...","latitude":39.9,"longitude":116.4,"offset":200}]}' --timeout 10
Flags:
--group-id int 考勤组 ID (必填)
--name string 考勤组名称 (可选)
--type string 考勤组类型:FIXED 固定班制 / TURN 排班制 / NONE 自由工时 (可选)
--owner string 考勤组主负责人 userId (可选)
--enable-outside-check 是否允许外勤打卡 true/false (可选)
--classIds string 所选班次 id 列表, JSON 数组格式, 如 '[123,456]' (可选)
--group-vo string 完整 groupVO JSON 字符串, 用于修改复杂子对象 (可选)
```
更新考勤组配置。--group-id 必填,其余均可选,但至少需指定一个修改项。仅需对要修改的字段进行赋値,其余字段会自动从已有配置补充。小改用单字段 flag;修改打卡地址、wifi、蓝牙设备、循环排班等复杂子对象时用 `--group-vo` 传入完整 JSON。`--group-vo` 与单字段 flag 同时传入时,单字段 flag 优先级更高。
`--group-vo` 支持字段(均可选,只需包含要修改的字段):
- 基础:`name`(名称) `type`(FIXED/TURN/NONE) `owner`(主负责人 userId) `managerList`([]string 子负责人) `skipHolidays`(bool,只在固定班制和自由工时生效) `defaultGroup`(bool) `classIds`([]number,所选班次 id,只有固定班制和排班制才有班次,自由工时没有)
- 打卡范围:`trimDistance`(微调距离) `enablePositionOfGps/Wifi/Ble`(bool)
- 打卡地址:`positions`([]对象: title/address/latitude/longitude/offset,其中 offset 为该地址允许的打卡范围米)
- Wifi`wifis`([]对象: ssid/macAddr/groupId)
- 蓝牙:`bleDeviceVOList`([]对象: name/deviceUid/sn/productType/devServId)
- 外勤:`enableOutsideCheck`(bool) `enableOutsideCameraCheck/Remark/Apply`(bool) `outsideCheckApproveMode`(NO_NEED_APPROVE/APPROVE_FIRST/CHECK_FIRST/APPROVE_EVERYTIME) `outSideCheckApplyType`(1全天/2上班/3下班) `forbidHideOutSideAddress`(bool) `enableOutSideUpdateNormalCheck`(下班时允许外勤卡更新内勤卡) `enableOnDutyNormalUpdateOutsideCheck`(上班时允许内勤卡更新外勤卡)
- 打卡方式:`enableCameraCheck/openCameraCheck` `openFaceCheck` `enableFaceStrictMode` `enableFaceBeauty`(bool) `onlyMachineCheck`(bool) `permitMaxBeaconCount`(number) `disableCheckWhenRest`(bool,休息日打卡需审批,只在固定班制和排班制生效)
- 固定班制设置(FIXED):`defaultClassId`(number) `workDayClassList`([]number,共7个值代表周日到周六每天的班次id,为0表示当天休息,如[0,1279240003,0,0,0,0,0]表示只有周一上班)
- 排班制设置(TURN):`disableCheckWithoutSchedule`(booltrue=未排班时禁止打卡) `enableEmpSelectClass`(未排班时员工可选班次) `enableScheduleAutoMatch`(未排班时系统自动匹配)
- 循环排班(非必填,不设置则由管理员手动排班):`cycleDays`(number) `startCycleDate`(时间戳,毫秒) `cycleScheduleList`([]对象: cycleName/groupId/isValid(Y/N)/itemList[{classId/className/isValid}])
- 自由工时设置(NONE):`workDays`([1-7]1=周一7=周日) `freeCheckDayStartMinOffset`(number,距0点分钟数) `freeCheckCoreTime`(最短工作时长,分钟) `freeCheckDemandWorkMinutes`(要求打卡时长,分钟) `freeCheckSettingVO`(对象: freeCheckType(CYCLE上下班交替/MAX_TIME_UPDATE最大时间打卡)/freeWorkDayLackSwitch/freeOnDutyLackMinOffset/freeOffDutyLackMinOffset/delimitOffsetMinutesBetweenDays/freeCheckGapVO{onOffCheckGapMinutes/offOnCheckGapMinutes}) `freeGroupSpecialDayVO`(对象: specialOnDutyDays[]/specialOffDutyDays[])
### 创建考勤组 (写场景接口,必须走二次确认流程)
**强制执行流程**:此命令为写操作,Agent 调用时必须遵守以下流程:
1. 先向用户展示待执行操作的完整参数摘要,包括考勤组名称、类型、班次列表等
2. 使用 `ask_human` 或返回待确认状态,等待用户明确确认
3. 用户确认后,再传全局 `--yes` 执行命令
**禁止未经用户确认直接执行或自动添加 `--yes`。**
```
Usage:
dws attendance group create [flags]
Example:
dws attendance group create --name "研发考勤组" --type FIXED --group-vo '{"defaultClassId":1170996821,"workDayClassList":[0,1170996821,0,0,0,0,0]}' --timeout 10
dws attendance group create --name "自由工时分组" --type NONE --timeout 10
Flags:
--name string 考勤组名称 (必填)
--type string 考勤组类型:FIXED 固定班制 / TURN 排班制 / NONE 自由工时 (必填)
--owner string 考勤组主负责人 userId (可选)
--group-vo string 完整 groupVO JSON 字符串,用于传入复杂子对象 (可选)
```
创建一个新的考勤组。`--name``--type` 必填,`--type` 必须为 FIXED/TURN/NONE 之一。
**条件必填(type=FIXED 固定班制时)**`--group-vo` 必须包含 `workDayClassList`(工作日班次列表,不能为空,共 7 个值,代表周日到周六每天的班次 ID,为 0 表示当天休息)和 `defaultClassId`(默认班次 ID,不能为 null)。
`--group-vo` 可用字段说明(与 `group update``--group-vo` 一致,均可选,只需包含要设置的字段):
【基础信息】
id number 考勤组 id(创建时无需传入,由服务端分配)
name string 考勤组名称(必填)
type string 考勤组类型:FIXED(固定班制)/ TURN(排班制)/ NONE(自由工时)(必填)
owner string 考勤组主负责人 userId
managerList []string 考勤组子负责人 userId 列表
skipHolidays bool 节假日自动排休(只有固定班制和自由工时考勤组生效)
defaultGroup bool 是否默认考勤组
classIds []number 所选班次 id 列表(只有固定班制和排班制才有班次,自由工时没有)
【打卡范围与定位】
trimDistance number 定位允许微调距离(米)
enablePositionOfGps bool 打卡是否允许开启 GPS 定位
enablePositionOfWifi bool 打卡是否允许开启 Wifi 定位
enablePositionOfBle bool 打卡是否允许开启蓝牙定位
enableMacCheck bool 开启 MAC 地址校验
checkDistanceType string 打卡距离类型:NORMAL(正常) / OUTER_ADDRESS(仅允许在外勤地址打卡)
wifiCompanyId number 允许打卡的 Wifi 公司 ID
【打卡地址】
positions []object 打卡地址列表,每个对象字段:
title string 地址名称
address string 详细地址
latitude number 纬度
longitude number 经度
offset number 该地址允许的打卡范围(米)
【打卡 Wifi】
wifis []object 打卡 Wifi 列表,每个对象字段:
ssid string Wifi 名称
macAddr string MAC 地址
groupId number 所属考勤组 ID
【蓝牙设备】
bleDeviceVOList []object 蓝牙设备列表,每个对象字段:
name string 设备名称
deviceUid string 设备 ID
sn string 序列号
productType string 产品类型
devServId number 设备服务 ID
【外勤打卡设置】
enableOutsideCheck bool 是否允许外勤打卡
openOutsideCameraCheck bool 外勤打卡是否开启拍照
enableOutsideRemark bool 是否允许外勤备注
enableOutsideApply bool 外勤打卡是否需审批
forbidHideOutSideAddress bool 禁止隐藏外勤打卡地址
enableOutSideUpdateNormalCheck bool 下班时允许外勤卡更新内勤卡
enableOnDutyNormalUpdateOutsideCheck bool 上班时允许内勤卡更新外勤卡
outsideCheckApproveMode string 外勤审批模式:NO_NEED_APPROVE / APPROVE_FIRST / CHECK_FIRST / APPROVE_EVERYTIME
outSideCheckApplyType number 外勤打卡申请类型:1 全天 / 2 上班 / 3 下班
【打卡方式】
openCameraCheck bool 是否开启拍照打卡
enableFaceStrictMode bool 是否开启人脸严格模式
enableFaceBeauty bool 是否开启人脸美颜
onlyMachineCheck bool 是否仅允许考勤机打卡
permitMaxBeaconCount number 允许最大蓝牙信标数量
disableCheckWhenRest bool 休息日打卡需审批(只在固定班制和排班制生效)
【固定班制设置(FIXED)】
defaultClassId number 默认班次 ID
workDayClassList []number 工作日班次列表,共 7 个值代表周日到周六每天的班次 id,为 0 表示当天休息。
例如 [0,1279240003,0,0,0,0,0] 表示只有周一上班
【排班制设置(TURN)】
disableCheckWithoutSchedule bool 未排班时禁止打卡
enableEmpSelectClass bool 未排班时员工可选班次
enableScheduleAutoMatch bool 未排班时系统自动匹配
cycleDays number 循环排班周期天数
startCycleDate number 循环排班开始日期(时间戳,毫秒)
cycleScheduleList []object 循环排班列表:
cycleName string 循环排班名称
groupId number 考勤组 ID
isValid string 是否生效:Y/N
itemList []object 循环排班明细:
classId number 班次 ID
className string 班次名称
isValid string 是否生效:Y/N
【自由工时设置(NONE)】
workDays []number 工作日,[1-7]1=周一,7=周日
freeCheckDayStartMinOffset number 距 0 点分钟数
freeCheckCoreTime number 最短工作时长(分钟)
freeCheckDemandWorkMinutes number 要求打卡时长(分钟)
freeCheckSettingVO object 自由打卡设置:
freeCheckType string 打卡类型:CYCLE(上下班交替)/ MAX_TIME_UPDATE(最大时间打卡)
freeWorkDayLackSwitch bool 工作日缺卡开关
freeOnDutyLackMinOffset number 上班缺卡分钟数偏移
freeOffDutyLackMinOffset number 下班缺卡分钟数偏移
delimitOffsetMinutesBetweenDays number 跨天切割分钟数偏移
freeCheckGapVO object 打卡间隔:
onOffCheckGapMinutes number 上班到下班最小间隔(分钟)
offOnCheckGapMinutes number 下班到上班最小间隔(分钟)
freeGroupSpecialDayVO object 特殊日期设置:
specialOnDutyDays []number 特殊上班日期
specialOffDutyDays []number 特殊休息日期
当使用 `--group-vo` 传入完整 JSON 时,`--name``--type``--owner` 仍可覆写 JSON 中的同名字段。由于保存考勤组耗时较久,建议加 `--timeout 10`
> **创建成功后的跳转链接**`group create` 调用成功后,CLI 会在标准输出之后额外打印一条钉钉 PC 端跳转链接(仅在响应中同时包含 `corpId` 与 `groupId`/`id` 时输出),格式为 `dingtalk://dingtalkclient/page/link?url=https%3A%2F%2Fhrmregister.dingtalk.com%2Fsubapp%2Fattend%2Findex%3Fcode%3Dattend%26corpId%3D{corpId}%26ddtab%3Dtrue%26from%3Dattend%23%2FgroupModify%3Fid%3D{groupId}`,用于用户在钉钉 PC 客户端一键打开该考勤组详情页验证创建结果。Agent 遇到该跳转链接时应原样呈现给用户,不要对链接进行二次编码或裁剪。
> **新建考勤组并同时添加成员的工作流**:`group create` 不支持在创建时直接传入成员列表。若用户需要在新建考勤组后立即添加成员,必须先执行 `group create` 创建考勤组,从返回结果中提取 `groupId`,再执行 `group update-members --group-id <GROUP_ID> --add-users ...` 完成成员添加。
### 查询某个人的考勤统计摘要
```
Usage:
dws attendance summary [flags]
Example:
dws attendance summary --user USER_ID --date "2026-03-12 15:00:00"
Flags:
--date string 工作日期, 格式 yyyy-MM-dd HH:mm:ss (必填)
--user string 钉钉用户 ID (必填)
```
### 查询考勤组与考勤规则
```
Usage:
dws attendance rules [flags]
Example:
dws attendance rules --date 2026-03-14
dws attendance rules --date "2026-03-14 09:00:00"
Flags:
--date string 考勤日期, 格式 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss (必填)
```
查询考勤组/考勤规则。例如:我属于哪个考勤组、打卡范围是什么、弹性工时怎么算。
### 查询个人规则设置
```
Usage:
dws attendance selfsetting get [flags]
Example:
dws attendance selfsetting get --setting-scene checkRemind --user <USER_ID> --format json
dws attendance selfsetting get --setting-scene fastCheck --user <USER_ID> --format json
Flags:
--setting-scene string 查询设置项: checkRemind/fastCheck/checkResultNotify/lackRemind/personalAttendStatNotify/bossAttendStatNotify (必填)
--user string 查询用户 ID (必填)
```
调用 MCP 工具 query_self_setting 查询个人规则设置,包括打卡提醒、极速打卡、打卡结果通知、缺卡提醒、个人考勤统计通知、团队考勤统计通知等设置项。MCP 入参 `userId` 必填;CLI 的 `--user` 也必填,必须显式传入目标用户 ID。认证信息 `corpId``opUserId` 由当前登录上下文自动注入,无需手动传入。
`--setting-scene` 枚举值:
- `checkRemind`: 打卡提醒
- `fastCheck`: 极速打卡
- `checkResultNotify`: 打卡结果通知
- `lackRemind`: 缺卡提醒
- `personalAttendStatNotify`: 个人考勤统计通知
- `bossAttendStatNotify`: 团队考勤统计通知
返回 `ServiceResult`,包含 `success``code``message``result``result` 可能根据 `--setting-scene` 仅返回对应设置项相关字段。常见字段包括:
- `checkRemind`: `checkRemindSetting``checkRemindUserOnDuty``checkRemindUserOffDuty``enableOndutyCheckRemindOfPc``enableOffdutyCheckRemindOfPc`
- `fastCheck`: `ondutyCheckType``offdutyCheckType``ondutyRemindStartMin``ondutyRemindEndMin``offdutyRemindStartMin``offdutyRemindEndMin``fastCheckLateNeedConfirm``canUpdateOffDuty``voiceRemindSwitch``vibrationRemindSwitch`
- `checkResultNotify`: `checkResultMsg`, 取值 0 表示关闭, 1 表示开启
- `lackRemind`: `lackSendTodoMsg``lackRemindUser`, 取值 0 表示关闭, `null` 或 1 表示开启
- `personalAttendStatNotify`: `personDailyReportSwitch``personWeekReportType``personMonthReportType`
- `bossAttendStatNotify`: `bossPushStartMin``bossWeekReportType``bossMonthReportType`
其中周报/月报通知渠道枚举值:0 表示全关闭,1 表示工作通知,2 表示钉邮,3 表示工作通知和钉邮。
### 更新保存个人规则设置 (写场景接口,必须走二次确认流程)
**强制执行流程**:此命令为写操作,Agent 调用时必须遵守以下流程:
1. 先向用户展示待执行操作的完整参数摘要,包括目标用户、设置场景、当前值、新值和最终命令参数
2. 使用 `ask_human` 或返回待确认状态,等待用户明确确认
3. 用户确认后,再传全局 `--yes` 执行命令
**禁止未经用户确认直接执行或自动添加 `--yes`。**
```
Usage:
dws attendance selfsetting save [flags]
Example:
# 开启打卡结果通知(Agent 调用时,必须先完成 ask_human 二次确认,确认后再追加 --yes 执行)
dws attendance selfsetting save --setting-scene checkResultNotify --user <USER_ID> --check-result-msg 1 --yes --format json
# 更新极速打卡设置(Agent 调用时,必须先完成 ask_human 二次确认,确认后再追加 --yes 执行)
dws attendance selfsetting save --setting-scene fastCheck --user <USER_ID> --onduty-check-type 3 --voice-remind-switch=true --yes --format json
# 更新打卡提醒设置(Agent 调用时,必须先完成 ask_human 二次确认,确认后再追加 --yes 执行)
dws attendance selfsetting save --setting-scene checkRemind --user <USER_ID> --check-remind-user-on-duty=false \
--check-remind-setting '{"onDutyRemind":{"openRemind":true,"remindMinutes":10}}' --yes --format json
Flags:
--setting-scene string 更新设置项: checkRemind/fastCheck/checkResultNotify/lackRemind/personalAttendStatNotify/bossAttendStatNotify (必填)
--user string 更新用户 ID (必填)
--check-remind-setting string 打卡提醒 DING 渠道设置 JSON
--check-remind-user-on-duty 打卡提醒工作通知渠道:用户个人上班打卡提醒开关
--check-remind-user-off-duty 打卡提醒工作通知渠道:用户个人下班打卡提醒开关
--enable-onduty-check-remind-of-pc PC 端弹窗渠道:上班打卡提醒开关
--enable-offduty-check-remind-of-pc PC 端弹窗渠道:下班打卡提醒开关
--onduty-check-type int 上班极速打卡方式:1 提醒打卡,2 不提醒且不自动打卡,3 自动打卡
--offduty-check-type int 下班极速打卡方式:1 提醒打卡,2 不提醒且不自动打卡,3 自动打卡
--onduty-remind-start-min int 上班打卡提醒开始时间,单位:分钟
--onduty-remind-end-min int 上班打卡提醒结束时间,单位:分钟
--offduty-remind-start-min int 下班打卡提醒开始时间,单位:分钟
--offduty-remind-end-min int 下班打卡提醒结束时间,单位:分钟
--fast-check-late-need-confirm 迟到时是否需要二次确认
--can-update-off-duty 是否允许用户更新下班打卡设置
--voice-remind-switch 极速打卡提示音开关
--vibration-remind-switch 极速打卡震动提醒开关
--check-result-msg int 打卡结果通知开关:0 关闭,1 开启
--lack-send-todo-msg int 缺卡提醒待办渠道:0 关闭,null 或 1 开启
--lack-remind-user int 缺卡提醒工作通知渠道:0 关闭,null 或 1 开启
--person-daily-report-switch int 个人考勤统计日报推送开关:0 关闭,1 开启
--person-week-report-type int 个人考勤统计周报通知渠道:0 全关闭,1 工作通知,2 钉邮,3 工作通知和钉邮
--person-month-report-type int 个人考勤统计月报通知渠道:0 全关闭,1 工作通知,2 钉邮,3 工作通知和钉邮
--boss-push-start-min int 团队考勤统计日报推送开始时间,单位:分钟;-1 表示关闭日报推送
--boss-week-report-type int 团队考勤统计周报通知渠道:0 全关闭,1 工作通知,2 钉邮,3 工作通知和钉邮
--boss-month-report-type int 团队考勤统计月报通知渠道:0 全关闭,1 工作通知,2 钉邮,3 工作通知和钉邮
--yes 用户已确认,跳过交互式确认提示
Agent 调用时传入前必须已完成 ask_human 二次确认
```
调用 MCP 工具 save_self_setting 更新保存个人规则设置,请求体封装在 `RuleMcpSaveSelfSettingRequest` 中。`settingScene` 必填;MCP 入参 `userId` 必填,CLI 的 `--user` 也必填,必须显式传入目标用户 ID。认证信息 `corpId``opUserId` 由当前登录上下文自动注入,无需手动传入。
`selfsetting save` 必须按 `--setting-scene` 传入对应场景的字段,且至少一个字段有值:
- `checkRemind`: `checkRemindSetting``checkRemindUserOnDuty``checkRemindUserOffDuty``enableOndutyCheckRemindOfPc``enableOffdutyCheckRemindOfPc`
- `fastCheck`: `ondutyCheckType``offdutyCheckType``ondutyRemindStartMin``ondutyRemindEndMin``offdutyRemindStartMin``offdutyRemindEndMin``fastCheckLateNeedConfirm``canUpdateOffDuty``voiceRemindSwitch``vibrationRemindSwitch`
- `checkResultNotify`: `checkResultMsg`
- `lackRemind`: `lackSendTodoMsg``lackRemindUser`
- `personalAttendStatNotify`: `personDailyReportSwitch``personWeekReportType``personMonthReportType`
- `bossAttendStatNotify`: `bossPushStartMin``bossWeekReportType``bossMonthReportType`
返回 `ServiceResult`,包含 `success``code``message``result`。其中 `result` 为 boolean,表示保存是否成功。
#### 强制执行流程:Agent 调用 `selfsetting save`
`selfsetting save` 是写操作,会修改用户个人规则设置。Agent 调用时 **必须按以下流程执行**,**禁止**在未确认的情况下直接提交:
1. **识别写操作**:用户表达“更新个人规则设置 / 保存打卡提醒 / 修改极速打卡 / 关闭缺卡提醒 / 开启打卡结果通知 / 设置个人考勤统计通知 / 设置团队考勤统计通知”等意图时,命中 `selfsetting save`
2. **收集必要参数**:必须明确 `--user``--setting-scene`,以及对应场景下将要修改的字段和值。
3. **前置查询当前设置**:执行 `dws attendance selfsetting get --setting-scene <SCENE> --user <USER_ID> --format json`,获取当前配置,用于确认目标用户和当前值。
4. **展示待写入数据并等待确认**:向用户展示目标用户、设置场景、要更新的字段、当前值、新值和最终命令参数摘要。必须调用 `ask_human` 或返回待确认状态,并等待用户明确确认。
5. **用户确认后再执行保存**:**只有用户明确确认后**,才可以追加全局 `--yes` 执行 `dws attendance selfsetting save ... --yes --format json`
确认话术示例:
```text
即将更新个人考勤规则设置,请确认:
- 用户 ID<USER_ID>
- 设置场景:checkResultNotify
- 修改内容:
- 打卡结果通知(checkResultMsg):关闭 → 开启
是否确认执行更新?
```
禁止在未获得用户明确确认前执行保存;禁止为了推进流程自动添加全局 `--yes`。即使用户在最初需求中表达“直接改/不用问”,Agent 也必须先通过 `ask_human` 或待确认状态展示完整参数摘要并获得明确确认后,才允许追加 `--yes` 执行。
### 查询全局规则设置(仅管理员)
```
Usage:
dws attendance globalsetting get [flags]
Example:
dws attendance globalsetting get --scope 企业 --setting-scene checkRemind --format json
dws attendance globalsetting get --scope 全公司 --setting-scene bossAttendStatNotify --format json
Flags:
--setting-scene string 查询设置项: checkRemind/fastCheck/checkResultNotify/lackRemind/personalAttendStatNotify/bossAttendStatNotify (必填)
--scope string 全局范围确认,必须明确输入:企业/全公司/所有人(必填)
```
调用 MCP 工具 `query_global_setting` 查询全局规则设置,请求体封装在 `RuleMcpQueryGlobalSettingRequest` 中。`settingScene` 必填;CLI 必须通过 `--scope` 明确输入 `企业``全公司``所有人`,用于确认查询的是全局范围。认证信息 `corpId``opUserId` 由当前登录上下文自动注入,无需手动传入。该接口仅管理员可以调用。
返回 `ServiceResult`,包含 `success``code``message``result``result` 常见字段包括:
- `checkRemindCorp`: 打卡提醒企业总开关
- `checkRemindPcCorp`: 打卡提醒 PC 端企业总开关
- `fastCheckCorp`: 极速打卡企业总开关
- `enableCheckCertPush`: 打卡结果通知企业总开关
- `lackRemindCorp`: 缺卡提醒企业总开关
- `enablePersonalDailyReport`: 个人考勤统计通知日报企业总开关
- `enablePersonalWeeklyReport`: 个人考勤统计通知周报企业开关,钉邮渠道
- `enablePersonalWeeklyReportCard`: 个人考勤统计通知周报企业开关,工作通知渠道
- `enablePersonalMonthlyReport`: 个人考勤统计通知月报企业总开关
- `bossDailyReportType`: 团队考勤统计通知日报发送渠道类型,0 全关闭,1 开启
- `bossWeeklyReportType`: 团队考勤统计通知周报发送渠道类型,0 全关闭,1 工作通知,2 钉邮,3 工作通知和钉邮
- `bossMonthlyReportType`: 团队考勤统计通知月报发送渠道类型,0 全关闭,1 工作通知,2 钉邮,3 工作通知和钉邮
### 更新保存全局规则设置(写场景接口,仅管理员,必须走二次确认流程)
**强制执行流程**:此命令为写操作,Agent 调用时必须先向用户展示待执行操作的完整参数摘要,等待用户明确确认后,才能追加 `--yes` 执行。
```
Usage:
dws attendance globalsetting save [flags]
Example:
dws attendance globalsetting save --scope 企业 --setting-scene checkRemind --check-remind-corp=true --yes --format json
dws attendance globalsetting save --scope 全公司 --setting-scene fastCheck --fast-check-corp=false --yes --format json
dws attendance globalsetting save --scope 所有人 --setting-scene bossAttendStatNotify --boss-daily-report-type 1 --boss-weekly-report-type 3 --yes --format json
Flags:
--setting-scene string 更新设置项: checkRemind/fastCheck/checkResultNotify/lackRemind/personalAttendStatNotify/bossAttendStatNotify (必填)
--scope string 全局范围确认,必须明确输入:企业/全公司/所有人(必填)
--check-remind-corp 打卡提醒企业总开关
--check-remind-pc-corp 打卡提醒 PC 端弹窗企业总开关
--fast-check-corp 极速打卡企业总开关
--enable-check-cert-push 打卡结果通知企业总开关
--lack-remind-corp 缺卡提醒企业总开关
--enable-personal-daily-report 个人考勤统计通知日报企业总开关
--enable-personal-weekly-report 个人考勤统计通知周报企业开关,钉邮渠道
--enable-personal-weekly-report-card 个人考勤统计通知周报企业开关,工作通知渠道
--enable-personal-monthly-report 个人考勤统计通知月报企业总开关
--boss-daily-report-type int 团队考勤统计通知日报发送渠道类型:0 全关闭,1 开启
--boss-weekly-report-type int 团队考勤统计通知周报发送渠道类型:0 全关闭,1 工作通知,2 钉邮,3 工作通知和钉邮
--boss-monthly-report-type int 团队考勤统计通知月报发送渠道类型:0 全关闭,1 工作通知,2 钉邮,3 工作通知和钉邮
--yes 用户已确认,跳过交互式确认提示
```
调用 MCP 工具 `save_global_setting` 更新保存全局规则设置,请求体封装在 `RuleMcpSaveGlobalSettingRequest` 中。`settingScene` 必填;CLI 必须通过 `--scope` 明确输入 `企业``全公司``所有人`,用于确认更新的是全局范围。认证信息 `corpId``opUserId` 由当前登录上下文自动注入,无需手动传入。该接口仅管理员可以调用。
`globalsetting save` 必须按 `--setting-scene` 传入对应场景的字段,且至少一个字段有值:
- `checkRemind`: `checkRemindCorp``checkRemindPcCorp`
- `fastCheck`: `fastCheckCorp`
- `checkResultNotify`: `enableCheckCertPush`
- `lackRemind`: `lackRemindCorp`
- `personalAttendStatNotify`: `enablePersonalDailyReport``enablePersonalWeeklyReport``enablePersonalWeeklyReportCard``enablePersonalMonthlyReport`
- `bossAttendStatNotify`: `bossDailyReportType``bossWeeklyReportType``bossMonthlyReportType`
返回 `ServiceResult`,其中 `result` 为 boolean,表示保存是否成功。
### 获取企业考勤字段列表(仅管理员)
```
Usage:
dws attendance report columns
Example:
dws attendance report columns
```
根据操作者的列权限,过滤并返回其有权查看的考勤字段列表。操作者必须是管理员,否则返回权限错误。
### 根据字段查询考勤数据(仅管理员)
```
Usage:
dws attendance report query-data [flags]
Example:
dws attendance report query-data \
--users userId1,userId2 --columns 1001,1002 --start "2026-03-01 00:00:00" --end "2026-03-31 23:59:59"
Flags:
--columns string 字段 ID 列表, 逗号分隔, 可通过 report columns 获取(必填)
--end string 结束日期, 格式 yyyy-MM-dd HH:mm:ss(必填)
--start string 开始日期, 格式 yyyy-MM-dd HH:mm:ss(必填)
--users string 目标用户 ID 列表, 逗号分隔, 最多 20 人(必填)
```
根据字段查询考勤数据,含列权限过滤和用户查看权限校验。--users 最多 20 人,--start 到 --end 不超过 32 天。
### 查询用户假期数据(仅管理员)
```
Usage:
dws attendance report query-leave [flags]
Example:
dws attendance report query-leave \
--users userId1,userId2 --leave-names 年假,病假 --start "2026-03-01 00:00:00" --end "2026-03-31 23:59:59"
Flags:
--end string 结束日期, 格式 yyyy-MM-dd HH:mm:ss(必填)
--leave-names string 假期类型名称列表, 逗号分隔, 不填则查询所有假期类型(选填)
--start string 开始日期, 格式 yyyy-MM-dd HH:mm:ss(必填)
--users string 目标用户 ID 列表, 逗号分隔, 最多 20 人(必填)
```
查询用户假期数据,含用户查看权限校验。--users 最多 20 人,--start 到 --end 不超过 32 天。
### 查询当前用户假期规则列表
```
Usage:
dws attendance vacation types
Example:
dws attendance vacation types
Flags:
```
调用 MCP 工具 get_leave_types 查询当前用户可用的假期规则列表。例如:年假、事假、病假等假期类型及对应规则。请求体封装在 McpLeaveTypeRequest 中,认证信息(corpId、opUserId)由系统自动注入,无需手动传入。
### 查询指定员工假期余额
```
Usage:
dws attendance vacation balance [flags]
Example:
dws attendance vacation balance --users userId1,userId2 --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890
Flags:
--users string 目标员工 ID 列表, 逗号分隔 (必填)
--leave-code string 假期规则 code (选填,不传则查询所有假期规则余额)
```
调用 MCP 工具 get_leave_balance_quota 查询指定员工的假期余额。例如:查询某员工年假还剩多少、病假额度等。`--leave-code` 可通过 `vacation types` 获取;不传 `--leave-code` 时查询所有假期规则余额。认证信息(corpId、opUserId)由系统自动注入。
如用户需要“所有假期规则余额 / 导出假期余额列表 / 所有假期规则余额 Excel / 按截图样式导出假期余额”,必须先读取 [attendance-vacation.md](./attendance-vacation.md),再按其中工作流调用脚本生成 Excel。
### 查询指定员工假期余额变更记录
```
Usage:
dws attendance vacation records [flags]
Example:
dws attendance vacation records --user USER_ID --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --start 2026-04-01 --end 2026-04-22
Flags:
--user string 指定查询员工 ID (必填)
--leave-code string 假期规则 code (必填, 不传则无法查询)
--start string 查询开始日期, 格式 YYYY-MM-DD (必填)
--end string 查询结束日期, 格式 YYYY-MM-DD (必填)
```
调用 MCP 工具 get_leave_balance_records 查询指定员工的假期余额变更记录。例如:查询某员工年假变更历史、请假扣减记录等。`--leave-code` 可通过 `vacation types` 获取。认证信息(corpId、opUserId)由系统自动注入。
### 更新假期规则(写场景接口,必须走二次确认流程)
**强制执行流程**:此命令为写操作,Agent 调用时必须遵守以下流程:
1. 先向用户展示待执行操作的完整参数摘要
2. 使用 `ask_human` 或返回待确认状态,等待用户明确确认
3. 用户确认后,再传 `--user-say-yes=true` 执行命令
**禁止未经用户确认直接执行或自动添加 `--user-say-yes=true`。**
```
Usage:
dws attendance vacation update-type [flags]
Example:
# 更新假期规则名称
dws attendance vacation update-type --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --name "事假(修改版)"
# 更新假期单位
dws attendance vacation update-type --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --unit hour --per-hours 8
# 改为指定部门可见
dws attendance vacation update-type --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --visibility-rules '[{"type":"dept","visible":["1","2","3"]}]'
# 改为全公司可见(哨兵约定:必须显式传 "-1",空数组 [] 不生效)
dws attendance vacation update-type --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --visibility-rules '[{"type":"dept","visible":["-1"]}]'
Flags:
--leave-code string 假期编码(必填)
--name string 假期名称(可选)
--unit string 假期单位:day/halfDay/hour(可选)
--paid bool 是否带薪假期(可选,默认 false)
--per-hours int 一天折算小时数(可选)
--when-can-leave string 新员工请假规则:entry/formal(可选)
--visibility-rules string 适用范围规则 JSON 数组(可选)
- 不传:不修改原有可见范围
- 改为指定范围:[{"type":"staff|dept|label","visible":["id1",...]}, ...]
- 改为全公司可见(哨兵):必须显式传 [{"type":"dept","visible":["-1"]}]
- 空数组 []、[{}]、visible 为空等 → CLI 报错(HSF 端会静默忽略)
--user-say-yes 用户已确认,跳过交互式确认提示
Agent 调用时传 true 前必须完成用户二次确认
```
调用 MCP 工具 save_leave_type 更新已有假期规则。`--leave-code` 必填,指定要更新的假期规则编码。其他字段均为可选,仅需传入要修改的字段。除 `--leave-code` 外,必须至少传入一个更新字段。
**`--visibility-rules` HSF 反序列化约定(必读)**
| 入参形态 | 业务语义 | CLI / 服务端处理 |
|---|---|---|
| 不传 | 不修改可见范围 | 服务端保留原有 `visibilityRules` |
| `[{"type":"dept","visible":["-1"]}]`(哨兵) | 改为全公司可见 | 服务端落库为空数组(全公司语义) |
| `[{"type":"staff","visible":["uid1"]}, ...]` 等有效规则 | 改为指定可见范围 | 覆盖原有 `visibilityRules` |
| 空数组 `[]` / `[{}]` / `visible` 为空 | — (反例) | **CLI 直接报错**,避免 HSF 端被静默忽略 |
- `type` 可取 `dept`(部门 ID`-1` 是根部门 = 全公司哨兵)、`staff`userId)、`label`(角色 ID)。
- 哨兵识别采用宽松匹配:传入列表中任意一条规则满足 `type=dept``visible` 包含 `"-1"`,即视为全公司可见,其它规则被忽略。
- 若意图是“改为全公司可见”,**必须**显式传哨兵值 `["-1"]`**不能**传空数组 `[]`
#### 强制执行流程:Agent 调用 `vacation update-type`
`vacation update-type` 是写操作,会修改假期规则配置。Agent 调用时 **必须按以下流程执行**,**禁止**在未确认的情况下直接提交:
1. **识别写操作**:用户表达"更新假期规则 / 修改假期类型 / 编辑假期规则"等意图时,命中 `vacation update-type`
2. **收集必要参数**:必须明确 `--leave-code`,以及至少一个更新字段(`--name``--unit``--paid``--per-hours``--when-can-leave``--visibility-rules`)。
3. **前置查询当前规则**:需先调用 `vacation types` 确认该规则是否存在及当前配置。
4. **展示待写入数据并等待确认**:向用户展示假期编码、要更新的字段及新值,并询问是否确认执行。**必须等待用户明确确认**。
5. **用户确认后再执行保存**:**只有用户明确确认后**,才可以传 `--user-say-yes=true` 执行 `dws attendance vacation update-type ... --format json`
确认话术示例:
```text
即将更新假期规则,请确认:
- 假期编码:a1b2c3d4-e5f6-7890-abcd-ef1234567890
- 更新内容:
- 名称:事假 → 事假(修改版)
是否确认执行更新?
```
如用户明确要求跳过确认,可传 `--user-say-yes=true`;否则默认必须等待确认。
#### 强制执行流程:Agent 调用 `vacation save-balance`
`vacation save-balance` 是写操作,会直接替换员工的假期余额(SET 接口,而非 ADD)。Agent 调用时 **必须按以下流程执行**,**禁止**在未确认的情况下直接提交:
1. **识别写操作**:用户表达"设置假期余额 / 调整假期额度 / 更新假期余额 / 增加假期余额 / 发放年假 / 给员工加年假"等意图时,命中 `vacation save-balance`
2. **前置查询当前余额**:必须先调用 `vacation balance --users <target> --leave-code <code>` 获取当前余额,因为这是 SET 接口,传入值会直接替换而非累加。
3. **收集必要参数**:必须明确 `--target`(目标员工)、`--leave-code`(假期编码)、`--num`(新余额数量)、`--reason`(变更原因),以及可选参数 `--start/--end`(有效期)。
4. **计算变更并展示确认**:向用户展示目标员工、假期类型、当前余额、新余额、差额(增加或减少)、变更原因、有效期等,并询问是否确认执行。**必须等待用户明确确认**。
5. **用户确认后再执行保存**:**只有用户明确确认后**,才可以传 `--user-say-yes=true` 执行 `dws attendance vacation save-balance ... --format json`
确认话术示例:
**设置余额场景**
```text
即将设置员工假期余额,请确认:
- 目标员工:张三(user001
- 假期类型:年假(leaveCode: a1b2c3d4-e5f6-7890-abcd-ef1234567890
- 当前余额:5 天
- 新余额:8 天
- 变更差额:+3 天(增加)
- 变更原因:年度发放
- 有效期:2024-01-01 至 2024-12-31
是否确认执行设置?
```
**减少余额场景**
```text
即将设置员工假期余额,请确认:
- 目标员工:李四(user002
- 假期类型:年假(leaveCode: a1b2c3d4-e5f6-7890-abcd-ef1234567890
- 当前余额:10 天
- 新余额:2 天
- 变更差额:-8 天(减少)
- 变更原因:请假扣减
注意:此操作将大幅减少余额,请确认是否继续?
是否确认执行设置?
```
如用户明确要求跳过确认,可传 `--user-say-yes=true`;否则默认必须等待确认。
### 设置员工假期余额
```
Usage:
dws attendance vacation save-balance [flags]
Example:
# 设置员工年假余额为8天
dws attendance vacation save-balance --target user001 \
--leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --num 8 --reason "年度发放"
# 设置带有效期的假期余额
dws attendance vacation save-balance --target user001 \
--leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --num 8 --reason "年度发放" \
--start 2024-01-01 --end 2024-12-31
Flags:
--target string 目标员工工号(必填)
--leave-code string 假期编码(必填)
--num string 余额数量,如8天传8,7.5天传7.5(必填)
--reason string 变更原因,最长100字符(必填)
--start string 有效期开始日期 YYYY-MM-DD(可选)
--end string 有效期结束日期 YYYY-MM-DD(可选)
--user-say-yes 用户已确认,跳过交互式确认提示
Agent 调用时传 true 前必须完成用户二次确认
```
**重要:这是设置(SET)接口,传入的值会替换当前余额,而非增加(ADD)。**余额数量在传递给 MCP 时会自动乘以 100(如 8 天传 800)。执行前会展示待写入数据,需用户确认后提交。
### 查询指定员工的签到记录
```
Usage:
dws attendance checkin records [flags]
Example:
dws attendance checkin records \
--operator-staff-id op001 --staff-ids user001,user002 --start "2026-04-01 00:00:00" --end "2026-04-07 00:00:00"
Flags:
--end string 结束时间, 格式 yyyy-MM-dd HH:mm:ss(必填)
--operator-corp-id string 操作者企业 ID(必填)
--operator-staff-id string 操作者员userID(必填)
--staff-ids string 目标员工userID 列表, 逗号分隔(必填),员工数最多100个人
--start string 开始时间, 格式 yyyy-MM-dd HH:mm:ss(必填),开始到结束时间限制在7天
```
调用 MCP 工具 get_checkin_record 查询指定员工在一段时间内的签到记录。权限说明:Boss/超级管理员可查看全公司员工,子管理员可查看管理范围内员工,部门主管可查看所管理部门员工,普通员工只能查询自己。接口单次最多返回100条签到记录。
返回结构:`result.list` 为签到记录数组,每条记录包含以下字段(按 sortedProps 顺序):
- `corpId`string):企业 ID
- `name`string):用户名称
- `userId`string):用户 ID
- `timestamp`number):签到时间
- `place`string):签到地点
- `detailPlace`string):签到详细地点
- `longitude`number):签到地点经度
- `latitude`number):签到地点纬度
- `remark`string):备注信息
- `imageList`string[]):图片列表
- `customers`string):拜访客户
- `checkinType`string):签到类型
- `mobileId`string):设备 ID
顶层还包含 `success`boolean)和 `arguments`object[])字段。
## 意图判断
用户说"签到记录/签到数据/签到明细/外勤签到/导出签到" → `checkin records`(查询签到记录)。如果用户意图是**导出签到报表/签到Excel**,则走下方的签到报表导出工作流。
- **优先级**:只要用户句中含"签到"二字,就走本条,不要走 `check record`。"签到" ≠ "打卡",签到是外勤场景的独立功能
用户说"打卡记录/出勤/考勤" → `check record`
用户说"指定用户打卡结果/考勤结果/迟到早退/缺卡异常" → `check result`
用户说"指定用户打卡流水/打卡详情/打卡时间地点/打卡记录详情" → `check record`
用户说"审批单/请假记录/加班记录/出差记录/补卡记录" → `approve list`
用户说"查询排班记录/获取排班详情/查看排班/排班表/导出排班/导出排班表/排班导出/XX考勤组的排班" → **必须先 `read_file` 读取 [attendance-schedule.md](./attendance-schedule.md) 后按其中的「排班查询导出工作流」执行**
- **优先级**:只要用户句中含"排班"二字且意图是查看/导出,就走本条,不要走 `attendance-report.md`。"导出排班表" ≠ "导出考勤报表"
- **严禁**绕过 `attendance-schedule.md` 直接调用 `dws attendance schedule get` 命令
- 脚本自动处理:分批查询(超 20 人自动分批)、userId→姓名转换、classId→班次名称转换、排班表格式 Excel 输出
用户说"排班/导入排班/安排排班/设置排班/安排班次/调班/换班/排休" → **必须先 `read_file` 读取 [attendance-schedule.md](./attendance-schedule.md) 后按其中的「排班导入工作流」执行**
- **严禁**绕过 `attendance-schedule.md` 直接调用 `dws attendance schedule import` 命令
- **严禁**仅凭命令 `--help` 或本文件中的命令参考自行组装排班命令
- 该文档定义了:考勤组类型校验(必须为 TURN)、班次校验(必须属于该考勤组)、排班回显确认、错误处理等约束,缺一不可
- 违反约束的后果:排错班次、排错人员、排班数据覆盖无法回退
用户说"班次定义/班次列表/有哪些班次/我负责的班次" → `class search`(返回结果已包含全量属性,无需再调 get)
用户说"班次详情/某个班次的具体信息" → `class search --name "..."`search 直出,直接返回详情)。`class get` 仅在需要按已知 classId 精确查询时使用
用户说"更新班次/修改班次/班次改名/修改上下班时间" → `class update`
用户说"补卡规则/补卡设置" → `adjustment search`(返回结果已包含全量属性,无需再调 get)
用户说"补卡规则详情/某条补卡规则的具体信息" → `adjustment search --name "..."`search 直出)。`adjustment get` 仅在需要按已知 adjustmentId 精确查询时使用
用户说"加班规则/加班设置/加班计算" → `overtime search`(返回结果已包含全量属性,无需再调 get)
用户说"加班规则详情/某条加班规则的具体信息" → `overtime search --name "..."`(search 直出)。如需查已删除/被覆盖的历史记录 → `overtime get`
用户说"考勤组列表/有哪些考勤组" → `group search`
用户说"考勤组详情/全量考勤组信息" → `group get`,若返回结果中含成员 userId 列表,则对每个 userId 调用 `dws contact user get --user-ids <userId>`(或等价通讯录查询),在最终输出中展示员工姓名而非裸 userId
用户说"考勤组成员/打卡地址/打卡wifi/打卡蓝牙" → `group filtered-get`(按需查询,节省成本),若返回结果中含成员 userId 列表,则对每个 userId 调用 `dws contact user get --user-ids <userId>`(或等价通讯录查询),在最终输出中展示员工姓名而非裸 userId
用户说"更新考勤组成员/添加考勤人员/删除考勤人员/添加考勤部门/删除考勤部门/加入考勤组/移出考勤组/设置无需考勤/取消无需考勤" → `group update-members`
用户说"修改考勤组/更新考勤组配置/考勤组改名/改变考勤组绑定的班次/修改打卡范围/设置考勤组负责人" → `group update`
用户说"创建考勤组/新建考勤组/添加考勤组" → `group create`
用户说"查询某人的考勤汇总/考勤统计/周统计/月统计" → `summary`
用户说"考勤组/考勤规则/打卡规则" → `rules`
用户说"查询个人规则设置/查看打卡提醒/查看极速打卡/查看缺卡提醒/查看打卡结果通知/查看个人考勤统计通知/查看团队考勤统计通知" → `selfsetting get`
用户说"更新个人规则设置/保存打卡提醒/修改极速打卡/关闭缺卡提醒/开启打卡结果通知/设置个人考勤统计通知/设置团队考勤统计通知" → `selfsetting save`
用户说"考勤字段/考勤列" → `report columns`
用户说"考勤数据/查询考勤报表数据" → `report query-data`(单次查询场景,非导出)
**导出签到记录/签到报表/签到数据导出/签到明细/外勤签到导出****必须先 `read_file` 读取 [attendance-report.md](./attendance-report.md) 后按其中的工作流执行(报表类型为"签到报表"**
- 触发关键词:签到记录导出、签到报表、签到数据、签到明细、外勤签到
- 数据来源为 `attendance checkin records`(签到接口),非 `report query-data`
- **严禁**绕过 `attendance-report.md` 直接调用 `python scripts/attendance_report_checkin.py`
**导出考勤/导出报表/生成考勤报表/出勤汇总导出/考勤明细导出/迟到早退统计导出/全员考勤数据导出/月度考勤报表/考勤表格/考勤 Excel****必须先 `read_file` 读取 [attendance-report.md](./attendance-report.md) 后按其中的工作流执行**
- **排除**:如果用户说的是"导出**排班**表"/"导出**排班**"/"**排班**导出",这属于**排班查询导出**,应路由到 [attendance-schedule.md](./attendance-schedule.md),而非本条。判断标准:句中含"排班"二字 → 走排班;不含"排班"或明确说"考勤报表/考勤数据/出勤统计" → 走报表。
- **严禁**绕过 `attendance-report.md` 直接调用 `python scripts/attendance_report_*.py` 任何脚本
- **严禁**仅凭脚本 `--help` 或本文件"自动化脚本"表格里的脚本路径就推断参数自行组装命令
- 该文档定义了:报表类型默认值、列选择策略(`--column-keywords`)、阶段 1 人员获取流程、错误处理、输出摘要规范,缺一不可
- 违反约束的后果:报表数据不全、列错位、人员遗漏、用户得到错误结果
**导出补卡记录/导出请假记录/导出出差记录/导出外出记录/补卡导出/请假导出/出差导出/外出导出/考勤审批记录导出/请假明细/补卡明细/出差明细/外出明细****必须先 `read_file` 读取 [attendance-report.md](./attendance-report.md) 后按其中的工作流执行(报表类型为"考勤记录"**
- 触发关键词:补卡记录、请假记录、出差记录、外出记录、审批记录导出、请假明细导出、补卡明细导出
- 判断标准:句中含"补卡/请假/出差/外出"且含"记录/导出/明细/报表" → 走 attendance-report.md 的"考勤记录"类型
- **严禁**绕过 `attendance-report.md` 直接调用 `python scripts/attendance_report_record.py`
- 该文档定义了:考勤记录子类型(leave/trip/out/patch)选择策略、阶段 1 人员获取流程、阶段 3 脚本调用规范
用户说"假期数据/年假/病假/请假记录" → `report query-leave`
用户说"假期/我的假期/假期规则" → `vacation types`
用户说"病假余额/年假余额/事假剩余假期"等查询指定假期规则的余额 → `vacation balance`
用户说"导出假期余额/假期余额列表/所有假期规则余额/假期余额 Excel/年假病假调休余额导出"等全部假期规则余额的查询 → **必须先 `read_file` 读取 [attendance-vacation.md](./attendance-vacation.md) 后按其中工作流执行**
用户说"假期变更/假期记录/请假扣减" → `vacation records`
用户说"更新假期规则/修改假期类型/编辑假期规则" → `vacation update-type --leave-code <LEAVE_CODE>`
用户说"设置假期余额/调整假期额度/更新假期余额" → 先调用 `vacation balance` 获取当前余额,计算修改后的值,再调用 `vacation save-balance`
用户说"增加假期余额/发放年假/给员工加年假" → 先调用 `vacation balance` 获取当前余额,加上要增加的天数,再调用 `vacation save-balance` 设置新总额度
用户说"签到/签到记录" → `checkin records`
## 核心工作流
```bash
# 导入排班记录
dws attendance schedule import --group-id 123456 \
--schedules '[{"userId":"user001","classId":123,"workDate":"2026-04-22","checkBeginTime":"09:00","checkEndTime":"18:00"}]' \
--yes --format json
# 获取排班记录 — 禁止直接调用,必须走 attendance-schedule.md 排班查询导出工作流
# python scripts/attendance_schedule_export.py --users user001,user002 --start 2026-04-01 --end 2026-04-30
# 查询可管理的班次列表
dws attendance class search --format json
dws attendance class search --query "早班" --filter-type MINE_OWN --format json
# 查询班次详情
dws attendance class get --class-id 1170996821 --format json
# 更新班次
dws attendance class update --class-id 1170996821 --name "新早班" --timeout 10 --format json
dws attendance class update --class-id 1170996821 --class-vo '{"sections":[{"times":[{"checkType":"OnDuty","checkTime":"08:30","across":0},{"checkType":"OffDuty","checkTime":"17:30","across":0}]}]}' --timeout 10 --format json
# 查询补卡规则
dws attendance adjustment search --page 1 --limit 20 --format json
dws attendance adjustment search --query "标准" --page 1 --limit 20 --format json
# 查询补卡规则详情
dws attendance adjustment get --adjustment-id 12345 --format json
# 查询加班规则
dws attendance overtime search --page 1 --limit 20 --format json
# 查询加班规则详情
dws attendance overtime get --overtime-id 12345 --format json
# 查询考勤组列表
dws attendance group search --query "研发" --page 1 --limit 20 --format json
dws attendance group search --type FIXED --page 1 --limit 20 --format json
# 查询考勤组全量信息
dws attendance group get --group-id 123456 --format json
# 按需查询考勤组成员/地址/蓝牙/Wifi
dws attendance group filtered-get --group-id 123456 --member --format json
dws attendance group filtered-get --group-id 123456 --position --wifi --format json
# 更新考勤组成员
dws attendance group update-members --group-id 123456 --add-users userId1,userId2 --timeout 10 --format json
dws attendance group update-members --group-id 123456 --remove-users userId1 --timeout 10 --format json
dws attendance group update-members --group-id 123456 --add-depts deptId1 --remove-users userId2 --timeout 10 --format json
# 更新考勤组配置
dws attendance group update --group-id 123456 --name "研发考勤组" --timeout 10 --format json
dws attendance group update --group-id 123456 --classIds '[1374234767]' --timeout 10 --format json
dws attendance group update --group-id 123456 --group-vo '{"positions":[{"title":"总部","address":"北京市","latitude":39.9,"longitude":116.4,"offset":200}]}' --timeout 10 --format json
# 创建考勤组
dws attendance group create --name "研发考勤组" --type FIXED --group-vo '{"defaultClassId":1170996821,"workDayClassList":[0,1170996821,0,0,0,0,0]}' --timeout 10 --format json
dws attendance group create --name "自由工时分组" --type NONE --timeout 10 --format json
# 查看考勤统计摘要
dws attendance summary --user <USER_ID> --date "2026-03-12 15:00:00" --format json
# 查看考勤组和规则
dws attendance rules --date 2026-03-14 --format json
# 查看指定用户的打卡提醒设置
dws attendance selfsetting get --setting-scene checkRemind --user <USER_ID> --format json
# 查看指定用户的极速打卡设置
dws attendance selfsetting get --setting-scene fastCheck --user <USER_ID> --format json
# 开启指定用户的打卡结果通知
dws attendance selfsetting save --setting-scene checkResultNotify --user <USER_ID> --check-result-msg 1 --format json
# 更新指定用户的极速打卡设置
dws attendance selfsetting save --setting-scene fastCheck --user <USER_ID> \
--onduty-check-type 3 --voice-remind-switch=true --format json
# 获取考勤字段列表(管理员)
dws attendance report columns --format json
# 根据字段查询考勤数据(管理员)
dws attendance report query-data --users userId1,userId2 \
--columns 1001,1002 --start "2026-03-01 00:00:00" --end "2026-03-31 23:59:59" --format json
# 查询用户假期数据(管理员)
dws attendance report query-leave --users userId1,userId2 \
--leave-names 年假,病假 --start "2026-03-01 00:00:00" --end "2026-03-31 23:59:59" --format json
# 查看假期规则列表
dws attendance vacation types --format json
# 查看指定员工假期余额
dws attendance vacation balance --users userId1,userId2 --format json
# 查看指定员工某类假期余额
dws attendance vacation balance --users userId1 --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --format json
# 查看指定员工假期余额变更记录
dws attendance vacation records --user USER_ID --start 2026-04-01 --end 2026-04-22 --format json
# 更新假期规则名称
dws attendance vacation update-type --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
--name "事假(修改版)" --format json
# 更新假期单位
dws attendance vacation update-type --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
--unit hour --per-hours 8 --format json
# 改为指定部门可见
dws attendance vacation update-type --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
--visibility-rules '[{"type":"dept","visible":["1","2","3"]}]' --format json
# 改为全公司可见(哨兵约定:必须显式传 "-1",不能传空数组 []
dws attendance vacation update-type --leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
--visibility-rules '[{"type":"dept","visible":["-1"]}]' --format json
# 设置员工假期余额完整流程
# 1. 查询当前余额
dws attendance vacation balance --users user001 \
--leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --format json
# 2. 根据查询结果计算新值(如当前5天,要设置为8天)
# 3. 执行设置(SET操作,会替换当前余额)
dws attendance vacation save-balance --target user001 \
--leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
--num 8 --reason "年度发放" --start 2024-01-01 --end 2024-12-31 --format json
# 增加员工假期余额完整流程(ADD场景)
# 1. 查询当前余额(假设返回5天)
dws attendance vacation balance --users user001 \
--leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 --format json
# 2. 计算增加后的新值(5 + 3 = 8天)
# 3. 设置新总额度
dws attendance vacation save-balance --target user001 \
--leave-code a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
--num 8 --reason "绩效奖励发放3天" --format json
# 查询签到记录
dws attendance checkin records --operator-staff-id op001 --staff-ids user001,user002 \
--start "2026-04-01 00:00:00" --end "2026-04-07 00:00:00" --format json
```
## 上下文传递表
| 操作 | 提取 | 用于 |
|------|------|------|
| `contact user get-self` | `userId` | summary 的 --user |
| `rules` | `groupId` | schedule import 的 --group-id |
| `schedule import` | `classId` | schedule import 的 schedules 中的 classId |
| `aisearch person` | `userId` | schedule import/get 的 userId |
| `contact user get-self` / `aisearch person` | `userId` | summary 的 --user, vacation records 的 --userselfsetting get/save 的 --user(必填) |
| 当前登录上下文 | `corpId`, `opUserId` | selfsetting get/save 自动补齐 MCP 入参, CLI 不需要传 `--corp-id` / `--op-user` |
| `vacation types` | `leaveCode` | vacation balance 的 --leave-code, vacation records 的 --leave-code |
## 注意事项
**Agent 使用引导**
- 执行 vacation 子命令前,**必须先调用** `dws attendance vacation --help` 查看完整子命令列表和参数说明
- 新增命令可能不在 Agent 缓存中,直接猜测命令会失败
- 正确流程:查看帮助 → 选择命令 → 查看命令详细参数(如 `dws attendance vacation update-type --help`)→ 执行
- `record get``--date` 格式: YYYY-MM-DD(如 `2026-03-08`),CLI 自动转换为毫秒时间戳
- `shift list` 查询班次信息,`--start/--end` 使用 YYYY-MM-DD 格式,间隔不超过 7 天
- `schedule import` 导入排班记录 — 必须通过 [attendance-schedule.md](./attendance-schedule.md) 排班导入工作流执行
- `schedule get` 查询排班记录 — 必须通过 [attendance-schedule.md](./attendance-schedule.md) 排班查询导出工作流执行(脚本自动分批、姓名转换、排班表格式导出)
- `schedule import` 是写操作,AI 调用时必须先展示导入摘要并引导用户二次确认;用户明确确认后才允许执行。用户明确要求跳过确认或命令包含全局 `--yes` 时,可跳过二次确认
- `class search` 所有参数均为可选,不填时返回全部可管理班次(默认第 1 页,每页 20 条)
- **概念区分**:班次是员工当天打卡安排;排班是为排班制考勤组导入的排班记录;班次定义是考勤管理员创建的工作时间规则
- `class get``--class-id` 必填,班次 ID 可从 `class search` 结果中提取
- `class search` 返回结果已包含全量属性,无需再调用 `class get``class get` 仅在需要按已知 classId 精确查询时使用
- `class update``--class-id` 必填,其余均可选,仅需对要修改的字段赋值,未传字段会自动从已有配置补充;由于保存班次耗时较久,建议加 `--timeout 10`
- `adjustment search` 返回结果已包含全量属性,无需再调用 `adjustment get``adjustment get` 仅在需要按已知 adjustmentId 精确查询时使用
- `overtime search` 返回结果已包含全量属性,无需再调用 `overtime get``overtime get` 仅在需要按已知 overtimeId 查询时使用(包括已删除/被覆盖的历史记录)
- `adjustment search` / `overtime search` 分页字段为 `--page``--limit`,不传时自动使用默认值 1 / 20
- `group search` 的分页字段为 `--page``--limit`,不传时自动使用默认值 1 / 20
- `group get``--group-id` 必填,返回考勤组全量字段;如仅需成员/地址/蓝牙/Wifi,优先使用 `group filtered-get` 节省成本。**返回结果中如含成员 userId 列表,必须调用 `dws contact user get --ids <userId1>,<userId2>,...`(支持逗号分隔传多个 ID),将 userId 转换为员工姓名后再输出;不得直接输出裸 userId。**
- `group update-members` 的 --group-id 必填,其余参数均可选,但至少需传一个变更项;各参数每次最多 20 个 ID;`--add-extra-users``--remove-extra-users` 操作的是"无需考勤"豁免名单,不影响考勤组主成员列表
- `group update` 的 --group-id 必填,其余均可选,至少需指定一个修改项;仅需对要修改的字段赋値,未传字段会从已有配置自动补充;修改打卡地址/wifi/蓝牙等复杂子对象时用 `--group-vo` 传入完整 JSON`--group-vo` 与单字段 flag 同时传入时单字段 flag 优先级更高
- `group create``--name``--type` 必填,`--type` 必须为 FIXED/TURN/NONE 之一;type=FIXED 时 `--group-vo` 必须包含 `workDayClassList`(非空)和 `defaultClassId`(非 null);由于保存考勤组耗时较久,建议加 `--timeout 10`
- `group filtered-get``--group-id` 必填,`--member/--position/--wifi/--bles` 均可选,默认 false。**返回结果中如含成员 userId 列表,必须调用 `dws contact user get --ids <userId1>,<userId2>,...`(支持逗号分隔传多个 ID),将 userId 转换为员工姓名后再输出;不得直接输出裸 userId。**
- `summary``--date` 格式: yyyy-MM-dd HH:mm:ss(如 `2026-03-12 15:00:00`
- `rules``--date` 支持 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss 两种格式
- `selfsetting get/save``--setting-scene` 必须是 `checkRemind``fastCheck``checkResultNotify``lackRemind``personalAttendStatNotify``bossAttendStatNotify` 之一
- `selfsetting get/save` 的 MCP 入参 `userId` 为必填;CLI 的 `--user` 也必填,必须显式传入目标用户 ID
- `selfsetting save` 必须传入与 `--setting-scene` 对应的至少一个设置字段;不同场景的字段不能混用
- `selfsetting save` 是敏感写操作,AI 调用时必须先执行 `selfsetting get` 查询当前值,并向用户展示目标用户、设置场景、修改字段、“当前值 → 新值”和最终命令参数摘要;必须调用 `ask_human` 或返回待确认状态等待用户明确确认;用户确认后才允许追加全局 `--yes` 执行保存。禁止未经确认直接执行或自动添加 `--yes`
- `selfsetting get/save` 不需要传 `--corp-id` / `--op-user``corpId``opUserId` 由当前登录上下文自动补齐
- `report columns` 无需额外参数,corpId 和 operatorId 由系统自动传入
- `report query-data``report query-leave``--start/--end` 格式: yyyy-MM-dd HH:mm:ss,间隔不超过 32 天,最多 20 人
- report 系列接口仅对管理员开放
- 用户 ID 需从 `contact user get-self``aisearch person` 获取
- 考勤组 ID 需从 `rules` 命令返回结果中获取
- `vacation types` 无需任何参数,认证信息自动注入
- `vacation balance``--users` 为目标员工 ID 列表,逗号分隔;`--leave-code` 选填,可通过 `vacation types` 获取
- `vacation records``--start/--end` 使用 YYYY-MM-DD 格式,CLI 自动转换为毫秒时间戳;`--leave-code` 选填
- `vacation balance``vacation records` 的认证参数(corpId、opUserId)由系统自动注入,无需手动传入
- `vacation update-type``--leave-code` 必填;其他字段均为可选,但至少需传一个更新字段
- `vacation update-type``--visibility-rules` 为 JSON 数组字符串,**HSF 反序列化无法区分「未传」与「空数组 `[]`」**,所以约定了哨兵语义:
- 不传 → 不修改可见范围
- `[{"type":"dept","visible":["-1"]}]`**哨兵**,改为全公司可见(服务端落库为空)
- `[{"type":"staff|dept|label|employee_type","visible":["id1",...]}, ...]` → 改为指定范围
- 空数组 `[]``[{}]``visible` 为空等无效写法 → **CLI 报错**(服务端会静默忽略,故在 CLI 提前拦截)
- **「清空可见范围」必须显式传哨兵值 `["-1"]`,不能用 `[]`**
- `vacation save-balance` 是 **SET 接口**而非 ADD 接口:传入值会直接替换当前余额,而非累加
- `vacation save-balance``--num` 输入为实际天数(如 8 或 7.5),内部会乘以 100 传给 MCP(如 800 或 750
- `vacation save-balance` 执行前需先调用 `vacation balance` 查询当前余额,再计算新值,避免误操作
- `vacation save-balance``--start/--end` 使用 YYYY-MM-DD 格式,CLI 自动转换为毫秒时间戳
- `vacation update-type``vacation save-balance` 执行前会展示待写入数据,需用户输入 yes/y 确认后提交
- 假期编码为 UUID 格式字符串,可通过 `vacation types` 命令查询获取
### 改签打卡记录
**命令**: `dws attendance boss-check`
**功能**: 改签打卡记录,管理员可修改员工的打卡时间、打卡结果等信息。
**强制执行流程**: 此命令为写操作,Agent 调用时必须遵守以下流程:
1. 先向用户展示待执行操作的完整参数摘要
2. 使用 `ask_human` 或返回待确认状态,等待用户明确确认
3. 用户确认后,再传 `--user-say-yes=true` 执行命令
4. **禁止**未经用户确认直接执行或自动添加 `--user-say-yes=true`
**参数**:
| 参数 | 必填 | 说明 | 来源 |
|------|------|------|------|
| --plan-id | y* | 排班ID(与 --result-id 二选一) | `dws attendance schedule get` 返回的 `id` 字段 |
| --result-id | y* | 打卡结果ID(与 --plan-id 二选一,优先使用) | **暂不支持**record get 未返回此字段) |
| --time | n | 新打卡时间,格式 yyyy-MM-dd HH:mm | - |
| --result | n | 打卡结果枚举值 | - |
| --absent-min | n | 缺勤时长(分钟) | - |
| --remark | n | 备注,最长500字符 | - |
| --user-say-yes | n | 用户已确认,跳过交互式确认提示 | - |
**获取 planId 步骤**:
1. 查询排班记录:`dws attendance schedule get --userIdList USER_ID --workDateBegin DATE --workDateEnd DATE`
2. 从返回结果中找到对应打卡类型(OnDuty=上班,OffDuty=下班)的记录
3. 使用该记录的 `id` 字段作为 `--plan-id` 参数
4. 示例返回:`{"id": 948964045503, "checkType": "OffDuty", ...}``--plan-id 948964045503`
**打卡结果枚举值**:
- Normal: 正常
- TimesResultA: 迟到
- TimesResultB: 早退
- TimesResultC: 缺卡
- TimesResultD: 迟到+早退
- TimesResultE: 缺卡+早退
- TimesResultF: 迟到+缺卡
**示例**:
```bash
# 步骤1:获取排班记录的 planId
dws attendance schedule get --userIdList 03642229451220076 --workDateBegin 2026-05-13 --workDateEnd 2026-05-13 -f json
# 步骤2:使用返回的 id 作为 --plan-id 改签
# 假设返回 id: 948964045503 (OffDuty 下班打卡)
dws attendance boss-check --plan-id 948964045503 --result Normal --user-say-yes
# 同时修改打卡时间
dws attendance boss-check --plan-id 948964045503 --time "2026-05-13 18:00" --result Normal --yes
```
## 自动化脚本
| 脚本 | 场景 | 用法 |
|------|------|------|
| [attendance_my_record.py](../scripts/attendance_my_record.py) | 查看我今天/指定日期的考勤记录 | `python attendance_my_record.py today` |
| [attendance_team_shift.py](../scripts/attendance_team_shift.py) | 查询团队成员本周排班 | `python attendance_team_shift.py --users userId1,userId2` |
| [attendance_report_common.py](../scripts/attendance_report_common.py) | 考勤报表导出公共模块(不可单独执行) | — |
| [attendance_vacation_balance.py](../scripts/attendance_vacation_balance.py) | 假期余额列表 Excel 导出 | **禁止直接调用**,必须先读 [attendance-vacation.md](./attendance-vacation.md) 按工作流执行 |
| attendance_report_detail.py | 考勤报表 — **明细粒度** | **禁止直接调用**,必须先读 [attendance-report.md](./attendance-report.md) 按工作流执行 |
| attendance_report_monthly.py | 考勤报表 — **月度汇总** | **禁止直接调用**,必须先读 [attendance-report.md](./attendance-report.md) 按工作流执行 |
| attendance_report_daily.py | 考勤报表 — **每日统计** | **禁止直接调用**,必须先读 [attendance-report.md](./attendance-report.md) 按工作流执行 |
| attendance_report_record.py | 考勤报表 — **考勤记录**(补卡/请假/出差/外出) | **禁止直接调用**,必须先读 [attendance-report.md](./attendance-report.md) 按工作流执行 |
| attendance_schedule_import.py | 排班导入(含校验、回显、执行) | **禁止直接调用**,必须先读 [attendance-schedule.md](./attendance-schedule.md) 按工作流执行 |
| attendance_schedule_export.py | 排班查询导出(分批查询、排班表 Excel) | **禁止直接调用**,必须先读 [attendance-schedule.md](./attendance-schedule.md) 按工作流执行 |
> 说明:
> - `attendance_report_*.py` 四个脚本由 [attendance-report.md](./attendance-report.md) 工作流编排使用:detail/monthly/daily 自动处理 `--users` 超过 20 人分批、`--start/--end` 超过 32 天按月切片;record 自包含数据查询+解析+Excel 生成(补卡/请假/出差/外出审批记录)
> - `attendance_schedule_import.py` 由 [attendance-schedule.md](./attendance-schedule.md) 排班导入工作流编排使用,自动处理考勤组校验、班次校验、排班回显确认
> - `attendance_schedule_export.py` 由 [attendance-schedule.md](./attendance-schedule.md) 排班查询导出工作流编排使用,自动处理分批查询(超 20 人自动分批)、userId→姓名转换、classId→班次名称转换、输出排班表格式 Excel
## 严格约束
- 不要凭历史记忆复用 userId / classId / leaveCode / groupId / instanceId 等任何 ID,每次必须从当次命令返回值中提取
- 不要猜测命令,先查询明确命令,不要使用记忆中未经证实(即不存在于本.md文件中的指令)或执行失败(指令传参有误或flag不正确)的的命令
- 制定 plan 并自我审查,严格按 plan 执行
- 涉及超过 3 条记录的聚合(求和、分组、计数、排序、跨字段计算)时必须落 Python 脚本处理,禁止用大模型口算或目测。脚本里如果用到 mcp,先提前看下 mcp 返回的结构,避免执行异常
- 遇到时长字段时,注意区分单位是秒、分钟还是小时
- 遇到意图不清晰的场景不要猜测,主动询问用户明确意图
- 如果查询结果很多时,不要自作主张省略,必须明确告知用户或者用表格或展示所有。
---
## SKILL 摘要(原 dingtalk-attendance/SKILL.md 正文)
<!-- VISIBLE_SHORTCUTS_START -->
## Shortcuts(无专用脚本/recipe 时优先)
以下 shortcut 同时进入公开 catalog 与 Runtime Schema。先按本 skill 的意图表、脚本和 recipe 路由:存在精确覆盖该场景的专用脚本/recipe 时按其执行;否则用户意图命中时,shortcut 优先于手写原子命令。命令已选中时直接执行;只在参数或安全语义不确定时读取 Agent leaf Schema(例如 `dws schema --cli-path "attendance +<shortcut>" --compact --format json`),在当前 Cobra flags 不确定时读取 `dws attendance <shortcut> --help`。只有参数映射、接口绑定或 provenance 审计才省略 `--compact`。仅当现有路由和 reference 都无法定位低频能力时,才用 `dws shortcut list --service attendance --format json` 批量发现。
| Shortcut | 风险 | 适用场景 |
|---|---|---|
| `dws attendance +check-record` | read | 查询用户打卡流水(打卡时间/地点/定位方式) |
| `dws attendance +check-result` | read | 查询用户打卡结果(迟到/早退/缺卡等) |
| `dws attendance +get-approve-template` | read | 查询补卡/请假/加班/外出/出差审批提交链接 |
| `dws attendance +get-overtime-rule` | read | 根据加班规则主键 ID 查询加班规则详情 |
| `dws attendance +list-approve` | read | 查询用户考勤审批单(补卡/加班/请假/出差外出) |
| `dws attendance +search-adjustment-rule` | read | 查询当前用户可管理的补卡规则列表 |
| `dws attendance +search-class` | read | 查询当前用户可管理的班次详情列表 |
| `dws attendance +search-overtime-rule` | read | 查询当前用户可管理的加班规则列表 |
<!-- VISIBLE_SHORTCUTS_END -->
## 意图表
| 用户说 | 命令 |
|--------|------|
| "查我自己的打卡 / 某天考勤" | `python scripts/attendance_my_record.py 2026-03-08``dws attendance record get --user <userId> --date <YYYY-MM-DD>` |
| "查团队排班" | `python scripts/attendance_team_shift.py --users <userId1,userId2> --from <YYYY-MM-DD> --to <YYYY-MM-DD>` |
| "导出考勤报表 / 月度汇总 / 考勤明细 / 每日统计" | **必须先读 [attendance-report.md](./attendance-report.md)** 强制门禁后选择 `attendance_report_{detail,monthly,daily}.py` |
| "创建班次 / 设置班次" | 先读 [attendance.md](./attendance.md) 的 `class create`,确认后执行 |
| "导入排班 / 安排排班" | 先读 [attendance.md](./attendance.md) 的 `schedule import`,确认后执行 |
| "加入/移出考勤组 / 更新考勤组成员" | `dws attendance group update-members ...`(需确认) |
## 高频硬约束
- 不要在读完 [attendance.md](./attendance.md) 前判断"CLI 不支持"。`class create``schedule import``group update-members``group update` 都是已支持写操作,但必须先展示摘要并等用户确认。
- 查询迟到/缺勤名单时,空打卡结果不等于"没人迟到"。必须结合排班、`NotSigned``Absenteeism`、无记录人员分别说明;数据缺失要标为"无记录/无法判断",不要归为正常。
- 做部门 Top N 排名时,用户要求前 N 名就必须输出 N 个部门;无打卡记录或无可计算数据的部门按 0 或"无数据"保留在排名中,不能只输出有数据的少数部门。
- 处理请假/补卡/加班审批时,先用考勤审批模板或 OA 查询确认可操作范围;没有直接提交接口时返回可点击提交链接并说明无法代填提交,不要假装已提交。
- 更新考勤组成员时必须实际调用 `group update-members`:先 `aisearch/contact` 解析 userId、`group search` 解析 groupId,确认后执行,再 `group filtered-get --member` 回查。
- 所有 dws 命令带 `--format json`,时间/日期按命令要求分别使用 `YYYY-MM-DD` 或 reference 指定格式。
## 跨产品协作
- 拿到 userId 前先用 `dingtalk-aisearch` 解析人名
- 报表导出涉及多人 / 多月 → 脚本内部自动分批 + 切片,输出 xlsx
## 局部意图与 Recipe
- [局部意图消歧](attendance-intent-guide.md)。