@dingtalk-real-ai/dingtalk-connector 0.8.21 → 0.8.22

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 (39) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/bin/dingtalk-connector.js +20 -3
  3. package/dist/entry-bundled.mjs +1 -1
  4. package/dist/{gateway-methods-BNuB2wXl.mjs → gateway-methods-C3nEHxL4.mjs} +2 -2
  5. package/dist/gateway-methods-COXVcCFs.mjs +2 -0
  6. package/dist/index.mjs +2 -2
  7. package/dist/{media-BRqGsKUB.mjs → media-BViJQGgb.mjs} +8 -8
  8. package/dist/{media-DD7Rlljd.mjs → media-CIO05hZn.mjs} +1 -1
  9. package/dist/{message-handler-CPGT1bgU.mjs → message-handler-0NLKAqHU.mjs} +7 -7
  10. package/dist/{messaging-DQwrrd68.mjs → messaging-C2zJ8O-o.mjs} +5 -5
  11. package/dist/{runtime-BphH7_vR.mjs → runtime-BCFW2-1B.mjs} +4 -4
  12. package/dist/{utils-QEvgZ2uM.mjs → utils-DgNm1Ek_.mjs} +7 -5
  13. package/dist/{utils-BqUoUOwd.mjs → utils-TpPdfqWr.mjs} +1 -1
  14. package/docs/RELEASE_NOTES_V0.8.22-beta.0.md +107 -0
  15. package/docs/RELEASE_NOTES_V0.8.22.md +95 -0
  16. package/openclaw.plugin.json +1 -1
  17. package/package.json +1 -1
  18. package/src/core/message-handler.ts +2 -1
  19. package/src/reply-dispatcher.ts +3 -2
  20. package/src/utils/empty-reply.ts +7 -5
  21. package/dist/gateway-methods-B0_tBGPn.mjs +0 -2
  22. package/skills/dingtalk-channel-rules/SKILL.md +0 -91
  23. package/skills/dingtalk-troubleshoot/SKILL.md +0 -93
  24. package/skills/dws-cli/SKILL.md +0 -129
  25. package/skills/dws-cli/references/error-codes.md +0 -95
  26. package/skills/dws-cli/references/field-rules.md +0 -105
  27. package/skills/dws-cli/references/global-reference.md +0 -104
  28. package/skills/dws-cli/references/intent-guide.md +0 -114
  29. package/skills/dws-cli/references/products/aitable.md +0 -452
  30. package/skills/dws-cli/references/products/attendance.md +0 -93
  31. package/skills/dws-cli/references/products/calendar.md +0 -217
  32. package/skills/dws-cli/references/products/chat.md +0 -292
  33. package/skills/dws-cli/references/products/contact.md +0 -108
  34. package/skills/dws-cli/references/products/ding.md +0 -57
  35. package/skills/dws-cli/references/products/report.md +0 -162
  36. package/skills/dws-cli/references/products/simple.md +0 -128
  37. package/skills/dws-cli/references/products/todo.md +0 -138
  38. package/skills/dws-cli/references/products/workbench.md +0 -39
  39. package/skills/dws-cli/references/recovery-guide.md +0 -94
@@ -1,114 +0,0 @@
1
- # 意图路由指南
2
-
3
- 当用户请求难以判断归属哪个产品时,参考本指南。
4
-
5
- ## 易混淆场景快速对照表
6
-
7
- | 用户说... | 真实意图 | 应该用 | 不要用 | 理由 |
8
- |-----------|----------|--------|--------|------|
9
- | "搜一下 OAuth2 接入文档" | 搜索开发文档 | `devdoc` | — | 搜索开放平台技术文档,不是钉钉内部内容 |
10
- | "帮我建一个项目跟踪表" | 创建数据表格 | `aitable` | `todo` | 涉及结构化数据/行列操作,不是个人待办 |
11
- | "帮我记一下明天要做的事" | 创建个人待办 | `todo` | `aitable` | 个人待办提醒,非数据表 |
12
- | "帮我建一个明天下午的日程" | 日历日程 | `calendar` | — | 日历日程管理(可含参与者/会议室)|
13
- | "帮我看看收到的日报" | 日志收件箱 | `report` | `todo` | 钉钉日志系统(日报/周报),不是待办 |
14
- | "帮我创建一个待办提醒" | 个人待办 | `todo` | `report` | 个人任务提醒,不是日志汇报 |
15
- | "帮我提交请假审批" | 发起审批 | `oa` | — | 审批流程,不是待办或日志 |
16
- | "帮我建一个项目群" | 创建群聊 | `chat group create` | — | 群聊管理,不是日历日程 |
17
- | "把张三拉进群" | 添加群成员 | `chat group members add` | — | 先查 userId,再添加 |
18
- | "让机器人在群里发个通知" | 机器人群发 | `chat message send-by-bot` | `chat message send-by-webhook` | 企业内部机器人发消息,需 robotCode |
19
- | "通过 Webhook 发告警到群里" | Webhook 告警 | `chat message send-by-webhook` | `chat message send-by-bot` | 自定义机器人 Webhook,需 token |
20
- | "给张三发一条机器人单聊消息" | 机器人单聊 | `chat message send-by-bot --users` | — | 机器人批量单聊,先查 userId |
21
-
22
- ---
23
-
24
- ## 典型场景详解
25
-
26
- ### 1. aitable vs todo — 表格数据 vs 待办任务
27
-
28
- **用 `aitable` 的场景**:
29
- - "创建一个表格记录团队成员信息" — 结构化数据,有行列
30
- - "在表格里加一列'状态'字段" — 字段/列操作
31
- - "查一下表格里所有优先级为高的记录" — 数据筛选和查询
32
- - "用项目管理模板建一个表" — 模板创建
33
- - 用户提到"多维表"、"Base"、"数据表"、"记录"
34
-
35
- **用 `todo` 的场景**:
36
- - "帮我记一下这周要做的事" — 个人任务管理
37
- - "创建一个待办提醒" — 任务提醒
38
-
39
- **判断关键**:有没有行列/字段/记录概念?有→ `aitable`;个人任务清单 → `todo`
40
-
41
- ---
42
-
43
- ### 2. devdoc — 开发文档搜索
44
-
45
- **用 `devdoc` 的场景**:
46
- - "API 调用报错 403 怎么解决" — 开发调试问题
47
- - "搜一下 OAuth2 接入文档" — 开放平台技术文档
48
- - "CLI 命令出错了怎么办" — CLI 使用错误
49
- - 用户提到"开发"、"API"、"调用错误"
50
-
51
- ---
52
-
53
- ### 3. report vs todo — 日志 vs 待办
54
-
55
- **用 `report` 的场景**:
56
- - "帮我看看收到的日报" — 日志收件箱
57
- - "帮我写/提交今天的日报(钉钉日志模版)" — 先 `report template list` / `template detail`,再 `report create`
58
- - "有什么日志模版" — 查看模版
59
- - "看看这个日志的已读统计" — 阅读状态
60
- - "我发过的日志有哪些" — 已发送列表 (`report sent`)
61
- - 用户提到"日报"、"周报"、"日志"
62
-
63
- **用 `todo` 的场景**:
64
- - "记一下这周要做的事" — 个人任务管理
65
-
66
- **判断关键**:钉钉日志系统(日报/周报模版,含按模版创建汇报)→ `report`;任务清单→ `todo`
67
-
68
- ---
69
-
70
- ### 4. chat 内部 — 两种消息发送方式
71
-
72
- **用 `chat message send-by-bot` 的场景**:
73
- - "让机器人在群里发一条通知" — **机器人身份**发群消息
74
- - "给张三发一条机器人单聊消息" — 机器人批量单聊
75
-
76
- **用 `chat message send-by-webhook` 的场景**:
77
- - "通过 Webhook 发告警到群里" — 自定义机器人 Webhook
78
- - 用户有 Webhook Token
79
-
80
- **判断关键**:企业内部机器人→ `send-by-bot`(需 robotCode);有 Webhook Token→ `send-by-webhook`
81
-
82
- ---
83
-
84
- ## 跨产品工作流路由
85
-
86
- 以下场景需要多个产品配合完成,注意上下文传递顺序。
87
-
88
- ### 创建日程并邀请同事(contact → calendar)
89
-
90
- 用户说"约张三明天下午开会":
91
-
92
- ```bash
93
- # 1. 搜索同事 userId
94
- dws contact user search --keyword "张三" --format json
95
-
96
- # 2. 创建日程
97
- dws calendar event create --title "会议" \
98
- --start "2026-03-15T14:00:00+08:00" --end "2026-03-15T15:00:00+08:00" --format json
99
-
100
- # 3. 添加参与者
101
- dws calendar participant add --event <EVENT_ID> --users <USER_ID> --format json
102
- ```
103
-
104
- ### 创建待办并指派(contact → todo)
105
-
106
- 用户说"给张三建个待办":
107
-
108
- ```bash
109
- # 1. 搜索同事 userId
110
- dws contact user search --keyword "张三" --format json
111
-
112
- # 2. 创建待办
113
- dws todo task create --title "任务内容" --executors <USER_ID> --format json
114
- ```
@@ -1,452 +0,0 @@
1
- # AI表格 (aitable) 命令参考
2
-
3
- ## 文档地址 (URI)
4
-
5
- 所有 AI 表格操作完成后,可通过以下 URI 直接访问对应文档:
6
-
7
- | 资源 | URI 格式 |
8
- |------|----------|
9
- | Base 文档 | `https://alidocs.dingtalk.com/i/nodes/{baseId}` |
10
- | 模板预览 | `https://docs.dingtalk.com/table/template/{templateId}` |
11
-
12
- > 💡 **操作后请返回文档 URI**:每次执行 base list/search/create/get 操作后,从返回数据中提取 `baseId`,拼接为 `https://alidocs.dingtalk.com/i/nodes/{baseId}` 返回给用户,方便直接点击打开。
13
-
14
- ## 命令总览
15
-
16
- ### base (Base 管理)
17
-
18
- #### 获取 AI 表格列表
19
- ```
20
- Usage:
21
- dws aitable base list [flags]
22
- Example:
23
- dws aitable base list
24
- dws aitable base list --limit 5 --cursor NEXT_CURSOR
25
- Flags:
26
- --cursor string 分页游标,首次不传
27
- --limit int 每页数量,默认 10,最大 10
28
- ```
29
-
30
- 返回 baseId 与 baseName。
31
-
32
- > 📎 **操作后返回文档链接**:遍历返回的每个 base,拼接 `https://alidocs.dingtalk.com/i/nodes/{baseId}` 返回给用户。
33
-
34
- > ⚠️ **注意**:`base list` 仅返回**最近访问过**的 Base,不是全部 Base。
35
- > 新创建的 Base 如果尚未在钉钉前端打开过,可能不会出现在此列表中。
36
- > 如需查找特定 Base,请使用 `base search`;如果刚创建完,直接使用 `create` 返回的 `baseId` 即可。
37
-
38
- #### 搜索 AI 表格
39
- ```
40
- Usage:
41
- dws aitable base search [flags]
42
- Example:
43
- dws aitable base search --query "项目管理"
44
- Flags:
45
- --cursor string 分页游标,首次不传
46
- --query string Base 名称关键词,建议至少 2 个字符 (必填)
47
- ```
48
-
49
- #### 获取 AI 表格信息
50
- ```
51
- Usage:
52
- dws aitable base get [flags]
53
- Example:
54
- dws aitable base get --base-id <BASE_ID>
55
- Flags:
56
- --base-id string Base 唯一标识 (必填)
57
- ```
58
-
59
- 返回 baseName、tables、dashboards 的 summary 信息(不含字段与记录详情)。
60
- 后续如需 tableId,优先从这里读取。
61
-
62
- > 📎 **文档地址**:`https://alidocs.dingtalk.com/i/nodes/{baseId}`
63
-
64
- #### 创建 AI 表格
65
- ```
66
- Usage:
67
- dws aitable base create [flags]
68
- Example:
69
- dws aitable base create --name "项目跟踪"
70
- Flags:
71
- --name string Base 名称,1-50 字符 (必填)
72
- --template-id string 模板 ID (可选,可通过 template search 获取)
73
- ```
74
-
75
- > 💡 **创建后直接使用返回的 `baseId`**,无需再调用 `base list` 或 `base search` 查找。
76
- > 后续可直接 `base get --base-id <返回的baseId>` 获取 tableId,或 `table create --base-id <返回的baseId>` 创建数据表。
77
- >
78
- > 📎 **文档地址**:`https://alidocs.dingtalk.com/i/nodes/{返回的baseId}`
79
-
80
- #### 更新 AI 表格
81
- ```
82
- Usage:
83
- dws aitable base update [flags]
84
- Example:
85
- dws aitable base update --base-id <BASE_ID> --name "新名称"
86
- Flags:
87
- --base-id string 目标 Base ID (必填)
88
- --desc string 备注文本
89
- --name string 新名称,1-50 字符 (必填)
90
- ```
91
-
92
- #### 删除 AI 表格
93
- ```
94
- Usage:
95
- dws aitable base delete [flags]
96
- Example:
97
- dws aitable base delete --base-id <BASE_ID> --yes
98
- Flags:
99
- --base-id string 待删除 Base ID (必填)
100
- --reason string 删除原因
101
- ```
102
-
103
- 高风险操作,不可逆。
104
-
105
- ### table (数据表管理)
106
-
107
- #### 获取数据表
108
- ```
109
- Usage:
110
- dws aitable table get [flags]
111
- Example:
112
- dws aitable table get --base-id <BASE_ID>
113
- dws aitable table get --base-id <BASE_ID> --table-ids tbl1,tbl2
114
- Flags:
115
- --base-id string 所属 Base ID (必填)
116
- --table-ids string Table ID 列表,逗号分隔,单次最多 10 个
117
- ```
118
-
119
- 返回 tableId、tableName、description、fields 目录、views 目录。不传 table-ids 返回全部表。
120
-
121
- > 📎 **文档地址**:`https://alidocs.dingtalk.com/i/nodes/{baseId}`
122
-
123
- #### 创建数据表
124
- ```
125
- Usage:
126
- dws aitable table create [flags]
127
- Example:
128
- dws aitable table create --base-id <BASE_ID> --name "任务表" \
129
- --fields '[{"fieldName":"任务名称","type":"text"},{"fieldName":"优先级","type":"singleSelect","config":{"options":[{"name":"高"},{"name":"中"},{"name":"低"}]}}]'
130
- Flags:
131
- --base-id string 目标 Base ID (必填)
132
- --fields string 初始字段 JSON 数组,至少 1 个,单次最多 15 个 (必填)
133
- --name string 表格名称,1-100 字符 (必填)
134
- ```
135
-
136
- > 💡 **创建后直接使用返回的 `tableId`**,无需再调 `table get` 查找。
137
- > 后续可直接 `field create --table-id <返回的tableId>` 补充字段,或 `record create` 写入数据。
138
- >
139
- > 📎 **文档地址**:`https://alidocs.dingtalk.com/i/nodes/{baseId}`
140
-
141
- #### 更新数据表
142
- ```
143
- Usage:
144
- dws aitable table update [flags]
145
- Example:
146
- dws aitable table update --base-id <BASE_ID> --table-id <TABLE_ID> --name "新表名"
147
- Flags:
148
- --base-id string 所属 Base ID (必填)
149
- --name string 新表名 (必填)
150
- --table-id string 目标 Table ID (必填)
151
- ```
152
-
153
- #### 删除数据表
154
- ```
155
- Usage:
156
- dws aitable table delete [flags]
157
- Example:
158
- dws aitable table delete --base-id <BASE_ID> --table-id <TABLE_ID> --yes
159
- Flags:
160
- --base-id string 目标 Base ID (必填)
161
- --reason string 删除原因
162
- --table-id string 将被删除的 Table ID (必填)
163
- ```
164
-
165
- 不可逆。若为 Base 中最后一张表,删除会失败。
166
-
167
- ### field (字段管理)
168
-
169
- #### 获取字段详情
170
- ```
171
- Usage:
172
- dws aitable field get [flags]
173
- Example:
174
- dws aitable field get --base-id <BASE_ID> --table-id <TABLE_ID>
175
- dws aitable field get --base-id <BASE_ID> --table-id <TABLE_ID> --field-ids fld1,fld2
176
- Flags:
177
- --base-id string Base ID (必填)
178
- --field-ids string 字段 ID 列表,逗号分隔,单次最多 10 个
179
- --table-id string Table ID (必填)
180
- ```
181
-
182
- 返回字段的完整配置(含 options 等)。在 table get 拿到字段目录后,按需展开少量字段的完整配置。
183
-
184
- #### 创建字段
185
- ```
186
- Usage:
187
- dws aitable field create [flags]
188
- Example:
189
- dws aitable field create --base-id <BASE_ID> --table-id <TABLE_ID> \
190
- --fields '[{"fieldName":"状态","type":"singleSelect","config":{"options":[{"name":"待办"},{"name":"进行中"},{"name":"已完成"}]}}]'
191
- Flags:
192
- --base-id string Base ID (必填)
193
- --fields string 待新增字段 JSON 数组,至少 1 个,单次最多 15 个 (必填)
194
- --table-id string Table ID (必填)
195
- ```
196
-
197
- 允许部分成功,返回结果逐项标明成功/失败状态。
198
-
199
- #### 更新字段
200
- ```
201
- Usage:
202
- dws aitable field update [flags]
203
- Example:
204
- dws aitable field update --base-id <BASE_ID> --table-id <TABLE_ID> --field-id <FIELD_ID> --name "新字段名"
205
- dws aitable field update --base-id <BASE_ID> --table-id <TABLE_ID> --field-id <FIELD_ID> --config '{"options":[{"name":"A"},{"name":"B"}]}'
206
- Flags:
207
- --base-id string Base ID (必填)
208
- --config string 字段配置 JSON (不修改时省略)
209
- --field-id string Field ID (必填)
210
- --name string 新字段名称 (不修改时省略)
211
- --table-id string Table ID (必填)
212
- ```
213
-
214
- 不可变更字段类型。更新 singleSelect/multipleSelect 的 options 时需传入完整列表,已有选项应回传原 id。
215
-
216
- #### 删除字段
217
- ```
218
- Usage:
219
- dws aitable field delete [flags]
220
- Example:
221
- dws aitable field delete --base-id <BASE_ID> --table-id <TABLE_ID> --field-id <FIELD_ID> --yes
222
- Flags:
223
- --base-id string Base ID (必填)
224
- --field-id string 待删除字段 ID (必填)
225
- --table-id string Table ID (必填)
226
- ```
227
-
228
- 不可逆。禁止删除主字段和最后一个字段。
229
-
230
- ### record (记录管理)
231
-
232
- #### 查询记录
233
- ```
234
- Usage:
235
- dws aitable record query [flags]
236
- Example:
237
- dws aitable record query --base-id <BASE_ID> --table-id <TABLE_ID>
238
- dws aitable record query --base-id <BASE_ID> --table-id <TABLE_ID> --record-ids rec1,rec2
239
- dws aitable record query --base-id <BASE_ID> --table-id <TABLE_ID> --keyword "关键词" --limit 50
240
- Flags:
241
- --base-id string Base ID (必填)
242
- --cursor string 分页游标,首次不传
243
- --field-ids string 返回字段 ID 列表,逗号分隔,单次最多 100 个
244
- --filters string 结构化过滤条件 JSON
245
- --keyword string 全文关键词搜索
246
- --limit int 单次最大记录数,默认 100,最大 100
247
- --record-ids string 指定记录 ID 列表,逗号分隔,单次最多 100 个
248
- --sort string 排序条件 JSON 数组
249
- --table-id string Table ID (必填)
250
- ```
251
-
252
- 两种模式: 按 ID 取(传 record-ids,忽略 filters/sort)或条件查(filters+sort+cursor 分页)。
253
-
254
- filters 结构:`{"operator":"and|or","operands":[{"operator":"<op>","operands":["<fieldId>","<value>"]}]}`
255
-
256
- > 💡 **singleSelect/multipleSelect 过滤**:filters 中可传 option id 或 option name,但建议优先用 **option id**(通过 `field get` 获取),更可靠。
257
- > 写入时(record create/update)可直接传 option name。
258
-
259
- > 💡 **减少响应体积**:字段较多时,用 `--field-ids` 仅返回需要的字段,可显著减少返回数据量。
260
-
261
- #### 新增记录
262
- ```
263
- Usage:
264
- dws aitable record create [flags]
265
- Example:
266
- dws aitable record create --base-id <BASE_ID> --table-id <TABLE_ID> \
267
- --records '[{"cells":{"fldTextId":"文本内容","fldNumId":123}}]'
268
- Flags:
269
- --base-id string Base ID (必填)
270
- --records string 记录列表 JSON 数组,单次最多 100 条 (必填)
271
- --table-id string Table ID (必填)
272
- ```
273
-
274
- > ⚠️ **常见错误(严格避免)**:
275
- > - **参数名是 `--records`**,不是 `--data`
276
- > - **cells 的 key 必须是 fieldId**(如 `fldXXX`),**不是字段名称**(如 `"课程名称"`)
277
- > - 必须先 `table get` 获取 fieldId,再写入记录
278
-
279
- ```bash
280
- # 正确流程:先获取 fieldId
281
- dws aitable table get --base-id <BASE_ID> --table-id <TABLE_ID> --format json
282
- # 从返回中提取 fieldId(如 fldABC123)
283
-
284
- # 再用 fieldId 写入记录
285
- dws aitable record create --base-id <BASE_ID> --table-id <TABLE_ID> \
286
- --records '[{"cells":{"fldABC123":"Python入门"}}]' --format json
287
- ```
288
-
289
- #### 更新记录
290
- ```
291
- Usage:
292
- dws aitable record update [flags]
293
- Example:
294
- dws aitable record update --base-id <BASE_ID> --table-id <TABLE_ID> \
295
- --records '[{"recordId":"recXXX","cells":{"fldStatusId":"已完成"}}]'
296
- Flags:
297
- --base-id string Base ID (必填)
298
- --records string 待更新记录 JSON 数组,单次最多 100 条 (必填)
299
- --table-id string Table ID (必填)
300
- ```
301
-
302
- 只需传入需修改的字段,未传入的保持原值。每条记录必须含 recordId 和 cells。
303
-
304
- #### 删除记录
305
- ```
306
- Usage:
307
- dws aitable record delete [flags]
308
- Example:
309
- dws aitable record delete --base-id <BASE_ID> --table-id <TABLE_ID> --record-ids rec1,rec2 --yes
310
- Flags:
311
- --base-id string Base ID (必填)
312
- --record-ids string 待删除记录 ID 列表,逗号分隔,最多 100 条 (必填)
313
- --table-id string Table ID (必填)
314
- ```
315
-
316
- 不可逆。调用前建议先 record query 确认目标记录。
317
-
318
- ### attachment (附件管理)
319
-
320
- > 🛑 **STOP — 不要使用钉盘 (drive) 上传!** 钉盘 fileId 无法写入 attachment 字段。必须使用以下流程。
321
-
322
- #### 准备附件上传
323
- ```
324
- Usage:
325
- dws aitable attachment upload [flags]
326
- Example:
327
- dws aitable attachment upload --base-id <BASE_ID> --file-name report.xlsx --size 204800
328
- dws aitable attachment upload --base-id <BASE_ID> --file-name photo.png --size 1024 --mime-type image/png
329
- Flags:
330
- --base-id string Base ID (必填)
331
- --file-name string 文件名,必须含扩展名 (必填)
332
- --size int 文件大小(字节),>0 (必填)
333
- --mime-type string MIME type(不传时根据扩展名推断)
334
- ```
335
-
336
- #### 附件上传完整流程(推荐:使用脚本,2 步完成)
337
-
338
- ```bash
339
- # 步骤 1: 使用脚本一键上传(内部自动完成 prepare + PUT)
340
- python3 scripts/upload_attachment.py <BASE_ID> /path/to/report.pdf
341
- # 输出: { "fileToken": "ft_xxx", "fileName": "report.pdf", "size": 204800 }
342
-
343
- # 步骤 2: 在 record create/update 中使用 fileToken 写入
344
- dws aitable record create --base-id <BASE_ID> --table-id <TABLE_ID> \
345
- --records '[{"cells":{"fldAttachId":[{"fileToken":"ft_xxx"}]}}]' --format json
346
- ```
347
-
348
- > ⚠️ `uploadUrl` 有时效性(`expiresAt`),脚本会自动在获取后立即上传。
349
-
350
- ### template (模板搜索)
351
-
352
- #### 搜索模板
353
- ```
354
- Usage:
355
- dws aitable template search [flags]
356
- Example:
357
- dws aitable template search --query "项目管理"
358
- Flags:
359
- --cursor string 分页游标,首次不传
360
- --limit int 每页返回数量,默认 10,最大 30
361
- --query string 模板名称关键词 (必填)
362
- ```
363
-
364
- 返回 templateId 可用于 `base create --template-id`。
365
-
366
- > 📎 **模板预览地址**:`https://docs.dingtalk.com/table/template/{templateId}`
367
-
368
- ## 意图判断
369
-
370
- 用户说"表格/多维表/AI表格":
371
- - 查看/列表 → `base list`
372
- - 搜索 → `base search`
373
- - 详情 → `base get`
374
- - 创建 → `base create`
375
- - 修改 → `base update`
376
- - 删除 → `base delete` [危险]
377
-
378
- 用户说"数据表/子表/table":
379
- - 查看 → `table get`
380
- - 创建 → `table create`
381
- - 重命名 → `table update`
382
- - 删除 → `table delete` [危险]
383
-
384
- 用户说"字段/列/column":
385
- - 查看 → `field get`
386
- - 添加 → `field create`
387
- - 修改 → `field update`
388
- - 删除 → `field delete` [危险]
389
-
390
- 用户说"记录/行/数据/row":
391
- - 查看/搜索 → `record query`(先 `table get` 获取 fieldId)
392
- - 添加/写入 → `record create`(先 `table get` 必须!)
393
- - 修改/更新 → `record update`(需 recordId,先 `record query`)
394
- - 删除 → `record delete` [危险](需 recordId)
395
-
396
- 用户说"模板" → `template search`
397
-
398
- 关键区分: base=表格文件, table=数据表, field=列, record=行
399
-
400
- ## 核心工作流
401
-
402
- ```bash
403
- # 1. 搜索/列出 Base — 提取 baseId
404
- dws aitable base search --query "项目" --format json
405
-
406
- # 2. 获取 Base 信息 — 提取 tableId
407
- dws aitable base get --base-id <BASE_ID> --format json
408
-
409
- # 3. 获取表结构 — 提取 fieldId
410
- dws aitable table get --base-id <BASE_ID> --table-id <TABLE_ID> --format json
411
-
412
- # 4. 查询记录
413
- dws aitable record query --base-id <BASE_ID> --table-id <TABLE_ID> --format json
414
-
415
- # 5. 新增记录 (cells 用 fieldId 作 key)
416
- dws aitable record create --base-id <BASE_ID> --table-id <TABLE_ID> \
417
- --records '[{"cells":{"fldXXX":"值"}}]' --format json
418
- ```
419
-
420
- ## 上下文传递表
421
-
422
- | 操作 | 从返回中提取 | 用于 |
423
- |------|-------------|------|
424
- | `base list/search` | `baseId` | 所有后续命令的 --base-id,拼接文档 URI |
425
- | `base create` | `baseId` | 后续命令 + 文档 URI |
426
- | `base get` | `tables[].tableId` | --table-id |
427
- | `table get` | `fields[].fieldId` | record 操作的 cells key, field get/update/delete |
428
- | `record query` | `recordId` | record update/delete |
429
- | `template search` | `templateId` | base create --template-id,拼接模板预览 URI |
430
-
431
- ## 注意事项
432
-
433
- - 所有操作使用 ID(baseId/tableId/fieldId/recordId),不使用名称
434
- - records 的 cells key 是 fieldId,不是字段名称
435
-
436
- ### cells 写入/读取格式速查
437
-
438
- | 字段类型 | 写入格式 | 读取返回格式 |
439
- |---------|---------|------------|
440
- | text | `"字符串"` | `"字符串"` |
441
- | number | `123` | `"123"` |
442
- | singleSelect | `"选项名"` 或 `{"id":"xxx"}` | `{"id":"xxx","name":"选项名"}` |
443
- | multipleSelect | `["选项A","选项B"]` | `[{"id":"x","name":"选项A"},...]` |
444
- | date | `"2026-03-13"` 或时间戳 | ISO 日期字符串 |
445
- | checkbox | `true`/`false` | `true`/`false` |
446
- | user | `[{"userId":"xxx"}]` | `[{"corpId":"xxx","userId":"xxx"}]` |
447
- | attachment | `[{"fileToken":"ft_xxx"}]` ⚠️需先走 attachment upload 3步流程 | `[{"url":"...","filename":"...","size":N}]` |
448
- | url | `{"text":"显示文本","link":"https://..."}` | 同写入 |
449
- | richText | `{"markdown":"**加粗**"}` | `{"markdown":"..."}` |
450
- | group | `[{"cid":"xxx"}]` (注意: key 是 cid,不是 openConversationId) | 同写入 |
451
-
452
- - 详见 [field-rules.md](../field-rules.md) 和 [error-codes.md](../error-codes.md)
@@ -1,93 +0,0 @@
1
- # 考勤 (attendance) 命令参考
2
-
3
- ## 命令总览
4
-
5
- ### 查询个人考勤详情
6
- ```
7
- Usage:
8
- dws attendance record get [flags]
9
- Example:
10
- dws attendance record get --user <USER_ID> --date 2026-03-08
11
- Flags:
12
- --date string 查询日期, 格式 YYYY-MM-DD (必填)
13
- --user string 钉钉用户 ID (必填)
14
- ```
15
-
16
- ### 批量查询员工班次信息
17
- ```
18
- Usage:
19
- dws attendance shift list [flags]
20
- Example:
21
- dws attendance shift list --users userId1,userId2 --start 2026-03-03 --end 2026-03-07
22
- Flags:
23
- --end string 结束日期, 格式 YYYY-MM-DD (必填)
24
- --start string 开始日期, 格式 YYYY-MM-DD (必填)
25
- --users string 用户 ID 列表, 逗号分隔, 最多 50 个 (必填)
26
- ```
27
-
28
- 返回每条记录含:用户 ID、工作日期、打卡类型(OnDuty/OffDuty)、计划打卡时间、是否休息日。间隔不超过 7 天,最多 50 人。
29
-
30
- ### 查询某个人的考勤统计摘要
31
- ```
32
- Usage:
33
- dws attendance summary [flags]
34
- Example:
35
- dws attendance summary --user USER_ID --date "2026-03-12 15:00:00"
36
- Flags:
37
- --date string 工作日期, 格式 yyyy-MM-dd HH:mm:ss (必填)
38
- --user string 钉钉用户 ID (必填)
39
- ```
40
-
41
- ### 查询考勤组与考勤规则
42
- ```
43
- Usage:
44
- dws attendance rules [flags]
45
- Example:
46
- dws attendance rules --date 2026-03-14
47
- dws attendance rules --date "2026-03-14 09:00:00"
48
- Flags:
49
- --date string 考勤日期, 格式 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss (必填)
50
- ```
51
-
52
- 查询考勤组/考勤规则。例如:我属于哪个考勤组、打卡范围是什么、弹性工时怎么算。
53
-
54
- ## 意图判断
55
-
56
- 用户说"打卡记录/出勤/考勤" → `record get`
57
- 用户说"排班/班次/当班" → `shift list`
58
- 用户说"考勤汇总/统计" → `summary`
59
- 用户说"考勤组/考勤规则/打卡规则" → `rules`
60
-
61
- ## 核心工作流
62
-
63
- ```bash
64
- # 查看某人考勤
65
- dws attendance record get --user <USER_ID> --date 2026-03-08 --format json
66
-
67
- # 批量查排班
68
- dws attendance shift list --users userId1,userId2 \
69
- --start 2026-03-03 --end 2026-03-07 --format json
70
-
71
- # 查看考勤统计摘要
72
- dws attendance summary --user <USER_ID> --date "2026-03-12 15:00:00" --format json
73
-
74
- # 查看考勤组和规则
75
- dws attendance rules --date 2026-03-14 --format json
76
- ```
77
- ## 上下文传递表
78
- | 操作 | 提取 | 用于 |
79
- |------|------|------|
80
- | `contact user get-self` | `userId` | record get 的 --user, shift list 的 --users, summary 的 --user |
81
- ## 注意事项
82
- - `record get` 的 `--date` 格式: YYYY-MM-DD(如 `2026-03-08`),CLI 自动转换为毫秒时间戳
83
- - `shift list` 的 `--start/--end` 同样使用 YYYY-MM-DD 格式,间隔不超过 7 天
84
- - `summary` 的 `--date` 格式: yyyy-MM-dd HH:mm:ss(如 `2026-03-12 15:00:00`)
85
- - `rules` 的 `--date` 支持 YYYY-MM-DD 或 yyyy-MM-dd HH:mm:ss 两种格式
86
- - 用户 ID 需从 `contact user get-self` 或 `contact user search` 获取
87
-
88
- ## 自动化脚本
89
-
90
- | 脚本 | 场景 | 用法 |
91
- |------|------|------|
92
- | [attendance_my_record.py](../../scripts/attendance_my_record.py) | 查看我今天/指定日期的考勤记录 | `python attendance_my_record.py today` |
93
- | [attendance_team_shift.py](../../scripts/attendance_team_shift.py) | 查询团队成员本周排班 | `python attendance_team_shift.py --users userId1,userId2` |