cloudcc-cli 2.4.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,6 +71,24 @@ Resolve the script path on macOS/Linux with:
71
71
  echo "$(npm root -g)/cloudcc-cli/bin/mcp.js"
72
72
  ```
73
73
 
74
+ # ReleaseV2.4.1
75
+
76
+ #### Release Date: 2026-4-9
77
+
78
+ #### Release Scope: Full
79
+
80
+ #### Release Content
81
+
82
+ - Docs alignment
83
+ - Refined `devguide` structure for `classes`, `timer`, and `triggers` to focus on implementation rules and avoid duplicated concept sections covered by `introduction`
84
+ - Added complete CLI command and argument sections in `classes` and `triggers` devguides, aligned with actual module handlers
85
+ - Expanded `timer` devguide command/argument coverage for all supported actions (`create`, `publish`, `pull`, `get`, `detail`, `pullList`, `delete`, `doc`)
86
+ - Query parameter documentation
87
+ - Added trigger list query field documentation in trigger devguide, including `fid`/`objId` semantics
88
+ - Clarified script list query docs: `condition.objName` is the query field and its value should be object **label** (not API name)
89
+ - MCP consistency
90
+ - Extended trigger list MCP schema and handler parameters (`objId`, paging, filter, sort) and aligned descriptions with CLI query body usage
91
+
74
92
  # ReleaseV2.4.0
75
93
 
76
94
  #### Release Date: 2026-4-8
package/mcp/index.js CHANGED
@@ -394,10 +394,15 @@ mcpServer.registerTool(
394
394
  mcpServer.registerTool(
395
395
  'get_trigger_list',
396
396
  {
397
- description: '获取 CloudCC CRM 服务器上的触发器列表,可选筛选条件',
398
- inputSchema: z.object({
399
- triggerName: z.string().optional().describe('可选,触发器名称(用于筛选)'),
400
- targetObjectId: z.string().optional().describe('可选,目标对象ID(用于筛选)'),
397
+ description: '获取 CloudCC CRM 服务器上的触发器列表。支持按触发器名称、对象ID筛选,并支持分页/扩展过滤/排序参数。',
398
+ inputSchema: z.object({
399
+ triggerName: z.string().optional().describe('可选,触发器名称(映射到查询字段 sname)'),
400
+ targetObjectId: z.string().optional().describe('可选,目标对象ID(映射到查询字段 fid)'),
401
+ objId: z.string().optional().describe('可选,目标对象ID语义化别名(会映射到 fid)'),
402
+ shownum: z.union([z.string(), z.number()]).optional().describe('可选,每页条数(默认 2000)'),
403
+ showpage: z.union([z.string(), z.number()]).optional().describe('可选,页码(默认 1)'),
404
+ rptcond: z.string().optional().describe('可选,扩展过滤条件(默认空字符串)'),
405
+ rptorder: z.string().optional().describe('可选,排序条件(默认空字符串)'),
401
406
  projectPath: z.string().describe('项目根目录路径,默认为当前工作目录')
402
407
  })
403
408
  },
@@ -9,20 +9,36 @@ const { runCcJsonCommand } = require('../../cliRunner');
9
9
  /**
10
10
  * 获取触发器列表
11
11
  * @param {Object} params - 参数对象
12
- * @param {string} params.triggerName - 可选,触发器名称(用于筛选)
13
- * @param {string} params.targetObjectId - 可选,目标对象ID(用于筛选)
12
+ * @param {string} params.triggerName - 可选,触发器名称(映射到 sname)
13
+ * @param {string} params.targetObjectId - 可选,目标对象ID(映射到 fid)
14
+ * @param {string} params.objId - 可选,目标对象ID(语义化别名,映射到 fid)
15
+ * @param {string|number} params.shownum - 可选,每页条数,默认 2000
16
+ * @param {string|number} params.showpage - 可选,页码,默认 1
17
+ * @param {string} params.rptcond - 可选,扩展过滤条件
18
+ * @param {string} params.rptorder - 可选,排序条件
14
19
  * @param {string} params.projectPath - 项目路径(可选,默认为当前工作目录)
15
20
  */
16
- async function listTriggers({ triggerName = '', targetObjectId = '', projectPath = process.cwd() }) {
21
+ async function listTriggers({
22
+ triggerName = '',
23
+ targetObjectId = '',
24
+ objId = '',
25
+ shownum = '2000',
26
+ showpage = '1',
27
+ rptcond = '',
28
+ rptorder = '',
29
+ projectPath = process.cwd()
30
+ }) {
17
31
  try {
18
32
  // 构造查询条件
33
+ const objectId = targetObjectId || objId || "";
19
34
  const queryBody = {
20
- shownum: "2000",
21
- showpage: "1",
22
- fid: targetObjectId || "",
35
+ shownum: String(shownum),
36
+ showpage: String(showpage),
37
+ fid: objectId,
23
38
  sname: triggerName || "",
24
- rptcond: '',
25
- rptorder: ''
39
+ rptcond: rptcond || '',
40
+ rptorder: rptorder || '',
41
+ objId: objectId
26
42
  };
27
43
 
28
44
  const resolvedPath = path.resolve(projectPath);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloudcc-cli",
3
- "version": "2.4.0",
3
+ "version": "2.4.1",
4
4
  "description": "cloudcc-cli",
5
5
  "author": "cloudcc",
6
6
  "license": "ISC",
@@ -25,39 +25,152 @@
25
25
 
26
26
  - CloudCC 官方后端 SDK 参考:`CCObject`、`UserInfo`、`CCService`、`SendEmail`、`DevLogger`、`TimeUtil`
27
27
 
28
- ## 3. AI 的总体职责
28
+ ## 3. introduction 的分工(避免重复)
29
29
 
30
- AI 在编写 CloudCC 自定义类时,应把自己视为“服务端业务能力设计者”,而不是“只补一段能跑代码的脚本工具”。
30
+ 为避免与 `classes introduction` 内容重复,本 `devguide` 只保留“开发落地规范”:
31
31
 
32
- AI 需要同时满足以下目标:
32
+ - 命令与入参(可直接执行)
33
+ - 目录与文件约束(可直接检查)
34
+ - SDK 用法与边界(可直接编码)
35
+ - 代码结构、禁止事项与自检清单(可直接评审)
33
36
 
34
- - 功能正确
35
- - 结构清晰
36
- - 可复用
37
- - 易排错
38
- - 易发布
37
+ “自定义类是什么、适用/不适用场景、能力边界、与其他实现方式差异”等概念说明,统一以 `cloudcc doc classes introduction` 为准。
39
38
 
40
- ## 4. 什么时候应该使用自定义类
39
+ ## 4. classes 模块支持的 CLI 命令总览(重点:入参)
41
40
 
42
- 满足以下任一情况时,AI 应优先选择自定义类实现:
41
+ 说明:
43
42
 
44
- - 逻辑需要在服务端执行
45
- - 一个动作会影响多个对象
46
- - 逻辑会被多个入口复用
47
- - 需要复杂规则计算
48
- - 需要流程状态推进
49
- - 需要调用外部系统
50
- - 需要处理附件、文件、目录
51
- - 需要统一日志、异常、时间处理
52
- - 需要自动通知、提醒、待办协同
53
- - 需要接入 AI 或分析能力
43
+ - 下文命令中的资源名使用 `classes`。
44
+ - `projectPath` 未传时,默认使用当前工作目录。
54
45
 
55
- 以下场景不要优先上自定义类:
46
+ #### 1) 创建自定义类
56
47
 
57
- - 只是简单展示
58
- - 只是轻量页面交互
59
- - 只是简单字段联动
60
- - 标准配置即可完成
48
+ 命令:
49
+
50
+ ```bash
51
+ cloudcc create classes <name>
52
+ ```
53
+
54
+ 参数:
55
+
56
+ | 参数 | 必填 | 类型 | 说明 |
57
+ | --- | --- | --- | --- |
58
+ | `name` | 是 | `string` | 类名(同时作为目录名、Java 主类名) |
59
+
60
+ #### 2) 发布自定义类
61
+
62
+ 命令:
63
+
64
+ ```bash
65
+ cloudcc publish classes <name>
66
+ ```
67
+
68
+ 参数:
69
+
70
+ | 参数 | 必填 | 类型 | 说明 |
71
+ | --- | --- | --- | --- |
72
+ | `name` | 是 | `string` | 本地 `classes/<name>/` 目录名 |
73
+
74
+ #### 3) 拉取自定义类(按本地名称)
75
+
76
+ 命令:
77
+
78
+ ```bash
79
+ cloudcc pull classes <name>
80
+ ```
81
+
82
+ 参数:
83
+
84
+ | 参数 | 必填 | 类型 | 说明 |
85
+ | --- | --- | --- | --- |
86
+ | `name` | 是 | `string` | 本地 `classes/<name>/` 目录名;会读取该目录 `config.json` 中的 `id` 拉取 |
87
+
88
+ #### 4) 查询自定义类列表(支持条件查询)
89
+
90
+ 命令:
91
+
92
+ ```bash
93
+ cloudcc get classes [listQueryJson] [projectPath]
94
+ ```
95
+
96
+ `listQueryJson` 推荐结构:
97
+
98
+ ```json
99
+ {
100
+ "shownum": 2000,
101
+ "showpage": 1,
102
+ "sname": ""
103
+ }
104
+ ```
105
+
106
+ 字段说明:
107
+
108
+ | 字段 | 类型 | 必填 | 说明 |
109
+ | --- | --- | --- | --- |
110
+ | `shownum` | `number|string` | 否 | 每页条数,默认 `2000` |
111
+ | `showpage` | `number|string` | 否 | 页码,默认 `1` |
112
+ | `sname` | `string` | 否 | 名称筛选关键字,模糊查询 |
113
+
114
+ #### 5) 查看自定义类详情
115
+
116
+ 命令:
117
+
118
+ ```bash
119
+ cloudcc detail classes <name> <id>
120
+ ```
121
+
122
+ 参数规则(实现口径):
123
+
124
+ | 参数 | 必填 | 类型 | 说明 |
125
+ | --- | --- | --- | --- |
126
+ | `name` | 条件必填 | `string` | 传 `name` 时优先查本地;本地不完整时再走线上 |
127
+ | `id` | 条件必填 | `string` | 当 `name` 为空时,必须传 `id` 走线上查询 |
128
+
129
+ 等价理解:`name` 与 `id` 至少传一个,优先使用 `name` 路径。
130
+
131
+ #### 6) 按 ID 拉取并落地到本地目录
132
+
133
+ 命令:
134
+
135
+ ```bash
136
+ cloudcc pullList classes <id> <projectPath>
137
+ ```
138
+
139
+ 参数:
140
+
141
+ | 参数 | 必填 | 类型 | 说明 |
142
+ | --- | --- | --- | --- |
143
+ | `id` | 是 | `string` | 线上自定义类 ID |
144
+ | `projectPath` | 是 | `string` | 项目根目录;会写入到 `<projectPath>/classes/<name>/` |
145
+
146
+ #### 7) 删除自定义类
147
+
148
+ 命令:
149
+
150
+ ```bash
151
+ cloudcc delete classes <nameOrId> [projectPath]
152
+ ```
153
+
154
+ 参数规则:
155
+
156
+ | 参数 | 必填 | 类型 | 说明 |
157
+ | --- | --- | --- | --- |
158
+ | `nameOrId` | 是 | `string` | 可传本地目录名或线上 ID;若本地 `classes/<nameOrId>/config.json` 存在且带 `id`,优先使用其中 `id` 删除 |
159
+ | `projectPath` | 否 | `string` | 项目根目录,默认当前目录 |
160
+
161
+ #### 8) 文档命令
162
+
163
+ 命令:
164
+
165
+ ```bash
166
+ cloudcc doc classes <introduction|devguide>
167
+ ```
168
+
169
+ 参数:
170
+
171
+ | 参数 | 必填 | 类型 | 说明 |
172
+ | --- | --- | --- | --- |
173
+ | `introduction|devguide` | 是 | `string` | `introduction` 返回概念文档;`devguide` 返回开发规范(并附 SDK 速查) |
61
174
 
62
175
  ## 5. AI 必须遵守的硬规则
63
176
 
@@ -55,9 +55,12 @@ cloudcc get script <encodedCondJson> <projectPath>
55
55
  | condition | object | 非必须 | `{}` | 查询条件 |
56
56
  | condition.scriptName | string | 非必须 | `""` | 脚本名称筛选 |
57
57
  | condition.pageLabel | string | 非必须 | `""` | 页面标签筛选 |
58
- | condition.objName | string | 非必须 | `""` | 对象名称筛选 |
58
+ | condition.objName | string | 非必须 | `""` | 对象名称label筛选(例如你说“客户对象”,就传 `客户`;不要让 AI 自动映射成 `account`) |
59
59
 
60
- 输出:简化列表(每条包含 `name` / `id` / `apiname`)。
60
+
61
+ > 注意:`objName` 直接按你要查询的对象名称来传,并按实际值原样传入。
62
+ > 例如对象名称是 `客户`、`客户004`,就直接传 `客户`、`客户004`;**不要**按语义自动换成 `account`。
63
+ > 如果返回为空,通常意味着目标环境里的对象名称不是你传的这个值(可以去对象管理里看一下该对象的名称/标识)。
61
64
 
62
65
  ---
63
66
 
@@ -177,6 +180,23 @@ cloudcc get script "$(node -e "console.log(encodeURI(JSON.stringify({pageSize:50
177
180
  cloudcc get script "$(node -e "console.log(encodeURI(JSON.stringify({pageSize:50,pageNo:1,condition:{scriptName:'test',pageLabel:'',objName:''}})))")" .
178
181
  ```
179
182
 
183
+ ### 按对象名称筛选(示例:`客户` / `客户004`)
184
+
185
+ ```bash
186
+ # 对象名称为“客户”
187
+ cloudcc get script "$(node -e "console.log(encodeURI(JSON.stringify({pageSize:50,pageNo:1,condition:{scriptName:'',pageLabel:'',objName:'客户'}})))")" .
188
+
189
+ # 对象名称为“客户004”
190
+ cloudcc get script "$(node -e "console.log(encodeURI(JSON.stringify({pageSize:50,pageNo:1,condition:{scriptName:'',pageLabel:'',objName:'客户004'}})))")" .
191
+ ```
192
+
193
+ 错误示例(不要这样传):
194
+
195
+ ```bash
196
+ # 业务上说“客户”,就不要自作主张写成 account
197
+ cloudcc get script "$(node -e "console.log(encodeURI(JSON.stringify({pageSize:50,pageNo:1,condition:{scriptName:'',pageLabel:'',objName:'account'}})))")" .
198
+ ```
199
+
180
200
  ### 新建脚本(本地)
181
201
 
182
202
  ```bash
@@ -18,38 +18,16 @@
18
18
  - `2-timer-classes-analysis.md` 提供当前项目定时器使用场景和共性模式
19
19
  - `timer devguide` 提供本地目录、CLI、发布和 SOURCE 区域约束
20
20
 
21
- ## 3. 先判断:是不是应该写成定时器类
21
+ ## 3. 与 introduction 的分工(避免重复)
22
22
 
23
- AI 在动手写代码前,必须先判断需求是否真的适合用定时器类。
23
+ 为避免与 `timer introduction` 内容重复,本 `devguide` 只保留“开发落地规范”:
24
24
 
25
- ### 3.1 适合定时器类的情况
25
+ - 命令与入参(可直接执行)
26
+ - 目录与文件约束(可直接检查)
27
+ - SDK 用法与边界(可直接编码)
28
+ - 代码模板与禁止事项(可直接评审)
26
29
 
27
- - 任务按时间触发,而不是按单条记录实时触发
28
- - 需要每天、每周、每月、月初、月末执行
29
- - 需要批量扫描一批记录并统一处理
30
- - 需要失败补偿、周期重试或后台巡检
31
- - 需要构建底表、看板、台账、报表支撑数据
32
- - 需要在满足条件后自动提醒、自动推进、自动同步
33
-
34
- ### 3.2 不适合定时器类的情况
35
-
36
- - 记录保存时必须立刻校验或立刻拦截
37
- - 单笔数据变化后必须在同一事务里马上联动
38
- - 高度依赖前端交互、人工确认、页面反馈
39
- - 只是一次性临时数据处理,不需要长期调度
40
-
41
- ### 3.3 当前项目中定时器的六大主类型
42
-
43
- 根据现有项目总结,AI 应优先将需求归入以下类型之一:
44
-
45
- - 提醒通知类
46
- - 同步推送集成类
47
- - 刷新更新修正类
48
- - 报表底表支撑类
49
- - 自动生成派生类
50
- - 权限共享治理类
51
-
52
- 如果需求明显不属于上述类型,AI 应重新评估是否真的应该落到定时器类。
30
+ “定时器是什么、能解决什么、与触发器差异、适用/不适用场景”等概念说明,统一以 `cloudcc doc timer introduction` 为准。
53
31
 
54
32
  ## 4. 文件与交付规范
55
33
 
@@ -75,6 +53,217 @@ AI 在动手写代码前,必须先判断需求是否真的适合用定时器
75
53
  - 让类继承 `CCSchedule`
76
54
  - 构造方法名与类名一致
77
55
 
56
+ ### 4.4 timer 模块支持的 CLI 命令总览(重点:入参)
57
+
58
+ 说明:
59
+
60
+ - 下文命令中的资源名使用 `timer`,也可使用别名 `schedule`(两者路由到同一模块)。
61
+ - `projectPath` 未传时,默认使用当前工作目录。
62
+
63
+ #### 1) 创建定时类
64
+
65
+ 命令:
66
+
67
+ ```bash
68
+ cloudcc create timer <name>
69
+ ```
70
+
71
+ 参数:
72
+
73
+ | 参数 | 必填 | 类型 | 说明 |
74
+ | --- | --- | --- | --- |
75
+ | `name` | 是 | `string` | 定时类名称(同时作为目录名、Java 类名) |
76
+
77
+ 示例:
78
+
79
+ ```bash
80
+ cloudcc create timer DailySyncJob
81
+ ```
82
+
83
+ ---
84
+
85
+ #### 2) 发布定时类
86
+
87
+ 命令:
88
+
89
+ ```bash
90
+ cloudcc publish timer <name>
91
+ ```
92
+
93
+ 参数:
94
+
95
+ | 参数 | 必填 | 类型 | 说明 |
96
+ | --- | --- | --- | --- |
97
+ | `name` | 是 | `string` | 本地 `schedule/<name>/` 目录名 |
98
+
99
+ 示例:
100
+
101
+ ```bash
102
+ cloudcc publish timer DailySyncJob
103
+ ```
104
+
105
+ ---
106
+
107
+ #### 3) 拉取定时类(按本地名称)
108
+
109
+ 命令:
110
+
111
+ ```bash
112
+ cloudcc pull timer <name>
113
+ ```
114
+
115
+ 参数:
116
+
117
+ | 参数 | 必填 | 类型 | 说明 |
118
+ | --- | --- | --- | --- |
119
+ | `name` | 是 | `string` | 本地 `schedule/<name>/` 目录名;会读取该目录 `config.json` 中的 `id` 到线上拉取 |
120
+
121
+ 示例:
122
+
123
+ ```bash
124
+ cloudcc pull timer DailySyncJob
125
+ ```
126
+
127
+ ---
128
+
129
+ #### 4) 查询定时类列表(支持条件查询)
130
+
131
+ 命令:
132
+
133
+ ```bash
134
+ cloudcc get timer [listQueryJson] [projectPath]
135
+ ```
136
+
137
+ `listQueryJson` 推荐结构:
138
+
139
+ ```json
140
+ {
141
+ "shownum": 2000,
142
+ "showpage": 1,
143
+ "sname": "",
144
+ }
145
+ ```
146
+
147
+ 字段说明:
148
+
149
+ | 字段 | 类型 | 必填 | 说明 |
150
+ | --- | --- | --- | --- |
151
+ | `shownum` | `number|string` | 否 | 每页条数,默认 `2000` |
152
+ | `showpage` | `number|string` | 否 | 页码,默认 `1` |
153
+ | `sname` | `string` | 否 | 名称筛选关键字,模糊查询 |
154
+
155
+ 示例:
156
+
157
+ ```bash
158
+ cloudcc get timer "$(node -e 'console.log(encodeURI(JSON.stringify({shownum:2000,showpage:1,fid:\"\",sname:\"Daily\",rptcond:\"\",rptorder:\"\"})))')"
159
+ ```
160
+
161
+ ---
162
+
163
+ #### 5) 查看定时类详情
164
+
165
+ 命令:
166
+
167
+ ```bash
168
+ cloudcc detail timer <name> <id>
169
+ ```
170
+
171
+ 参数规则(实现口径):
172
+
173
+ | 参数 | 必填 | 类型 | 说明 |
174
+ | --- | --- | --- | --- |
175
+ | `name` | 条件必填 | `string` | 传 `name` 时优先查本地;本地不完整时再走线上 |
176
+ | `id` | 条件必填 | `string` | 当 `name` 为空时,必须传 `id` 走线上查询 |
177
+
178
+ 等价理解:`name` 与 `id` 至少传一个,优先使用 `name` 路径。
179
+
180
+ 示例(按本地名):
181
+
182
+ ```bash
183
+ cloudcc detail timer DailySyncJob
184
+ ```
185
+
186
+ 示例(按线上 id):
187
+
188
+ ```bash
189
+ cloudcc detail timer "" a0Bxxxxxxxxxxxx
190
+ ```
191
+
192
+ ---
193
+
194
+ #### 6) 按 ID 拉取并落地到本地目录
195
+
196
+ 命令:
197
+
198
+ ```bash
199
+ cloudcc pullList timer <id> <projectPath>
200
+ ```
201
+
202
+ 参数:
203
+
204
+ | 参数 | 必填 | 类型 | 说明 |
205
+ | --- | --- | --- | --- |
206
+ | `id` | 是 | `string` | 线上定时类 ID |
207
+ | `projectPath` | 是 | `string` | 项目根目录;会写入到 `<projectPath>/schedule/<name>/` |
208
+
209
+ 示例:
210
+
211
+ ```bash
212
+ cloudcc pullList timer a0Bxxxxxxxxxxxx /path/to/project
213
+ ```
214
+
215
+ ---
216
+
217
+ #### 7) 删除定时类
218
+
219
+ 命令:
220
+
221
+ ```bash
222
+ cloudcc delete timer <nameOrId> [projectPath]
223
+ ```
224
+
225
+ 参数规则:
226
+
227
+ | 参数 | 必填 | 类型 | 说明 |
228
+ | --- | --- | --- | --- |
229
+ | `nameOrId` | 是 | `string` | 可传本地目录名或线上 ID;若本地 `schedule/<nameOrId>/config.json` 存在且带 `id`,优先使用其中 `id` 删除 |
230
+ | `projectPath` | 否 | `string` | 项目根目录,默认当前目录 |
231
+
232
+ 示例(按名称):
233
+
234
+ ```bash
235
+ cloudcc delete timer DailySyncJob
236
+ ```
237
+
238
+ 示例(按 id):
239
+
240
+ ```bash
241
+ cloudcc delete timer a0Bxxxxxxxxxxxx
242
+ ```
243
+
244
+ ---
245
+
246
+ #### 8) 文档命令
247
+
248
+ 命令:
249
+
250
+ ```bash
251
+ cloudcc doc timer <introduction|devguide>
252
+ ```
253
+
254
+ 参数:
255
+
256
+ | 参数 | 必填 | 类型 | 说明 |
257
+ | --- | --- | --- | --- |
258
+ | `introduction|devguide` | 是 | `string` | `introduction` 返回概念文档;`devguide` 返回开发规范(并附 SDK 速查) |
259
+
260
+ 示例:
261
+
262
+ ```bash
263
+ cloudcc doc timer introduction
264
+ cloudcc doc timer devguide
265
+ ```
266
+
78
267
  ## 5. AI 编写定时器类的核心原则
79
268
 
80
269
  ### 5.1 先分析,再编码
@@ -25,50 +25,168 @@
25
25
 
26
26
  ## 2. 编写依据
27
27
 
28
- - 官方 SDK 文档负责定义 `CCObject`、`UserInfo`、`CCService`、`SendEmail`、`DevLogger`、`TimeUtil`、自定义设置、共享对象相关能力
29
- - `triggers devguide` 负责定义 CLI、目录结构、创建发布拉取删除方式和触发器模块约束
28
+ - 官方 SDK 文档负责定义
29
+ `CCObject`、`UserInfo`、`CCService`、`SendEmail`、`DevLogger`、`TimeUtil`、自定义设置、共享对象相关能力
30
+ - `triggers devguide` 负责定义
31
+ CLI、目录结构、创建发布拉取删除方式和触发器模块约束
30
32
  - 当前项目触发器样例负责补充“本项目常见写法”和“本项目容易踩坑的地方”
31
33
 
32
- ## 3. AI 的总体职责
34
+ ## 3. introduction 的分工(避免重复)
33
35
 
34
- AI 在编写触发器时,应把自己视为“对象生命周期规则设计者”,而不是“在构造函数里临时塞一段业务代码的人”。
36
+ 为避免与 `triggers introduction` 内容重复,本 `devguide` 只保留“开发落地规范”:
35
37
 
36
- AI 需要同时做到:
38
+ - 命令与入参(可直接执行)
39
+ - 目录与文件约束(可直接检查)
40
+ - SDK 用法与边界(可直接编码)
41
+ - 代码结构、性能/递归/幂等与交付要求(可直接评审)
37
42
 
38
- - 判断需求是否真的适合触发器
39
- - 选择合适的触发时机
40
- - 控制触发器体量,不把复杂逻辑全部堆在入口里
41
- - 正确调用 SDK 完成查、增、改、删、通知、日志、时间处理
42
- - 主动规避递归触发、重复生成、全表扫描、时区错误、共享误删等风险
43
+ “触发器是什么、适用/不适用场景、能力边界、与其他实现方式差异”等概念说明,统一以
44
+ `cloudcc doc triggers introduction` 为准。
43
45
 
44
- ## 4. 先判断:是不是应该写成触发器
46
+ ## 4. triggers 模块支持的 CLI 命令总览(重点:入参)
45
47
 
46
- AI 在动手前,必须先判断需求是否属于“对象事件驱动”。
48
+ 说明:
47
49
 
48
- ### 4.1 适合触发器的情况
50
+ - 下文命令中的资源名使用 `triggers`。
51
+ - `projectPath` 未传时,默认使用当前工作目录。
49
52
 
50
- - 某条记录新增时必须立即执行
51
- - 某条记录修改时必须立即校验或联动
52
- - 某条记录删除前必须阻止或删除后必须补偿
53
- - 提交审批、审批通过、审批撤回时必须执行规则
54
- - 当前规则必须平台层统一执行,不能依赖前端页面
55
- - 当前动作如果不在这一刻做,会造成数据错误、状态错误或流程错误
53
+ #### 1) 创建触发器
56
54
 
57
- ### 4.2 不适合优先使用触发器的情况
55
+ 命令:
58
56
 
59
- - 需要按天、按周、按月跑批
60
- - 需要扫描大量历史数据做修复
61
- - 需要复杂重试或长链路集成补偿
62
- - 逻辑更像一个可复用服务,不只被一个触发器调用
63
- - 更偏页面交互、输入反馈、展示控制
64
- - 只是一个手动动作,不需要记录事件自动触发
57
+ ```bash
58
+ cloudcc create triggers <encodedCreateJson>
59
+ ```
60
+
61
+ `encodedCreateJson`(先 JSON.stringify,再 encodeURI)推荐字段:
62
+
63
+ | 字段 | 必填 | 类型 | 说明 |
64
+ | ----------------- | ---- | -------- | ------------------------------------------------------ |
65
+ | `schemetableName` | 是 | `string` | 目标对象 API 名(目录中会转小写) |
66
+ | `targetObjectId` | 是 | `string` | 目标对象 ID |
67
+ | `triggerTime` | 是 | `string` | 触发时机,如 `beforeInsert`、`afterUpdate`、`approval` |
68
+ | `name` | 是 | `string` | 触发器名称 |
69
+ | `apiname` | 建议 | `string` | 触发器 API 名 |
70
+
71
+ #### 2) 发布触发器
72
+
73
+ 命令:
74
+
75
+ ```bash
76
+ cloudcc publish triggers <namePath>
77
+ ```
78
+
79
+ 参数:
80
+
81
+ | 参数 | 必填 | 类型 | 说明 |
82
+ | ---------- | ---- | -------- | --------------------------------------- |
83
+ | `namePath` | 是 | `string` | 触发器路径,格式:`对象小写名/触发器名` |
84
+
85
+ #### 3) 拉取触发器(按本地路径)
86
+
87
+ 命令:
88
+
89
+ ```bash
90
+ cloudcc pull triggers <namePath>
91
+ ```
92
+
93
+ 参数:
94
+
95
+ | 参数 | 必填 | 类型 | 说明 |
96
+ | ---------- | ---- | -------- | -------------------------------------------------------------------------------- |
97
+ | `namePath` | 是 | `string` | 触发器路径,格式:`对象小写名/触发器名`;会读取该目录 `config.json` 的 `id` 拉取 |
98
+
99
+ #### 4) 查询触发器列表(支持条件查询)
100
+
101
+ 命令:
102
+
103
+ ```bash
104
+ cloudcc get triggers <listQueryJson> [projectPath]
105
+ ```
106
+
107
+ `listQueryJson` 推荐结构:
108
+
109
+ ```json
110
+ {
111
+ "shownum": 2000,
112
+ "showpage": 1,
113
+ "fid": "",
114
+ "sname": "",
115
+ "rptcond": "",
116
+ "rptorder": "",
117
+ "objId": ""
118
+ }
119
+ ```
120
+
121
+ 字段语义:
122
+
123
+ | 字段 | 含义 | 类型 | 是否推荐 | 说明 |
124
+ | ---------- | ----------------- | -------- | -------- | ------------------------ |
125
+ | `shownum` | 每页条数 | `number | string` | 推荐 |
126
+ | `showpage` | 页码 | `number | string` | 推荐 |
127
+ | `sname` | 触发器名字 | `string` | 可选 | 按名称模糊筛选,模糊查询 |
128
+ | `objId` | 触发器作用对象 ID | `string` | 可选 | 对象id |
129
+
130
+ #### 5) 查看触发器详情
131
+
132
+ 命令:
133
+
134
+ ```bash
135
+ cloudcc detail triggers <namePath> <id>
136
+ ```
137
+
138
+ 参数规则(实现口径):
139
+
140
+ | 参数 | 必填 | 类型 | 说明 |
141
+ | ---------- | -------- | -------- | ------------------------------------------------ |
142
+ | `namePath` | 条件必填 | `string` | 传 `namePath` 时优先查本地;本地不完整时再走线上 |
143
+ | `id` | 条件必填 | `string` | 当 `namePath` 为空时,必须传 `id` 走线上查询 |
144
+
145
+ 等价理解:`namePath` 与 `id` 至少传一个,优先使用 `namePath` 路径。
146
+
147
+ #### 6) 按 ID 拉取并落地到本地目录
148
+
149
+ 命令:
150
+
151
+ ```bash
152
+ cloudcc pullList triggers <id> <projectPath>
153
+ ```
154
+
155
+ 参数:
156
+
157
+ | 参数 | 必填 | 类型 | 说明 |
158
+ | ------------- | ---- | -------- | ----------------------------------------------------------- |
159
+ | `id` | 是 | `string` | 线上触发器 ID |
160
+ | `projectPath` | 是 | `string` | 项目根目录;会写入到 `<projectPath>/triggers/<obj>/<name>/` |
161
+
162
+ #### 7) 删除触发器
163
+
164
+ 命令:
165
+
166
+ ```bash
167
+ cloudcc delete triggers <namePathOrId> [projectPath]
168
+ ```
169
+
170
+ 参数规则:
171
+
172
+ | 参数 | 必填 | 类型 | 说明 |
173
+ | -------------- | ---- | -------- | ------------------------------------------------------------------------------------- |
174
+ | `namePathOrId` | 是 | `string` | 可传触发器路径或线上 ID;若本地路径存在且 `config.json` 含 `id`,优先使用该 `id` 删除 |
175
+ | `projectPath` | 否 | `string` | 项目根目录,默认当前目录 |
176
+
177
+ #### 8) 文档命令
178
+
179
+ 命令:
180
+
181
+ ```bash
182
+ cloudcc doc triggers <introduction|devguide>
183
+ ```
65
184
 
66
- ### 4.3 AI 的默认选型规则
185
+ 参数:
67
186
 
68
- - 单条记录实时事件,用触发器
69
- - 可复用核心逻辑,下沉到自定义类
70
- - 周期批处理,用定时器
71
- - 页面交互,用页面脚本或组件
187
+ | 参数 | 必填 | 类型 | 说明 |
188
+ | ------------- | --------- | ---- | -------- |
189
+ | `introduction | devguide` | 是 | `string` |
72
190
 
73
191
  ## 5. 当前项目中触发器的真实约束
74
192
 
@@ -230,7 +348,8 @@ AI 不能默认“更新一下没事”。
230
348
 
231
349
  ## 8. SDK 使用规范
232
350
 
233
- 本节是本文的核心。以下 API 说明基于官方 SDK 页面整理,并专门补成“AI 可直接使用”的格式。
351
+ 本节是本文的核心。以下 API 说明基于官方 SDK 页面整理,并专门补成“AI
352
+ 可直接使用”的格式。
234
353
 
235
354
  写法原则:
236
355
 
@@ -258,18 +377,18 @@ public CCObject(String ccobj, String isShared)
258
377
 
259
378
  参数说明:
260
379
 
261
- | 方法 | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
262
- | --- | --- | --- | --- | --- | --- |
263
- | `CCObject(String ccobj)` | `ccobj` | `String` | 是 | 对象 API | 传对象 API 名,如 `Account`、`Opportunity` |
264
- | `CCObject(String ccobj, String isShared)` | `ccobj` | `String` | 是 | 对象 API | 用于共享对象 |
265
- | `CCObject(String ccobj, String isShared)` | `isShared` | `String` | 是 | 共享标识,建议使用 `CCObject.IS_SHARED` | 不要手写魔法值,优先常量 |
380
+ | 方法 | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
381
+ | ----------------------------------------- | ---------- | -------- | -------- | --------------------------------------- | ------------------------------------------ |
382
+ | `CCObject(String ccobj)` | `ccobj` | `String` | 是 | 对象 API | 传对象 API 名,如 `Account`、`Opportunity` |
383
+ | `CCObject(String ccobj, String isShared)` | `ccobj` | `String` | 是 | 对象 API | 用于共享对象 |
384
+ | `CCObject(String ccobj, String isShared)` | `isShared` | `String` | 是 | 共享标识,建议使用 `CCObject.IS_SHARED` | 不要手写魔法值,优先常量 |
266
385
 
267
386
  常量字段:
268
387
 
269
- | 字段 | 类型 | 默认值 | 说明 |
270
- | --- | --- | --- | --- |
388
+ | 字段 | 类型 | 默认值 | 说明 |
389
+ | ------------ | -------- | ------------- | ------------- |
271
390
  | `OBJECT_API` | `String` | `CCObjectAPI` | 对象 API 常量 |
272
- | `IS_SHARED` | `String` | `isShared` | 共享对象常量 |
391
+ | `IS_SHARED` | `String` | `isShared` | 共享对象常量 |
273
392
 
274
393
  #### 8.1.2 常用方法
275
394
 
@@ -282,17 +401,17 @@ public String put(String apiName, String value)
282
401
 
283
402
  参数说明:
284
403
 
285
- | 方法 | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
286
- | --- | --- | --- | --- | --- | --- |
287
- | `put` | `apiName` | `String` | 是 | 字段 APIName | 必须传字段 API 名,不要传字段显示名 |
288
- | `put` | `value` | `String` | 是 | 字段值 | 官方示例按字符串传;AI 应按当前项目已有写法与 SDK 能力处理值类型 |
404
+ | 方法 | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
405
+ | ----- | --------- | -------- | -------- | ------------ | ---------------------------------------------------------------- |
406
+ | `put` | `apiName` | `String` | 是 | 字段 APIName | 必须传字段 API 名,不要传字段显示名 |
407
+ | `put` | `value` | `String` | 是 | 字段值 | 官方示例按字符串传;AI 应按当前项目已有写法与 SDK 能力处理值类型 |
289
408
 
290
409
  返回值说明:
291
410
 
292
- | 方法 | 返回类型 | 含义 |
293
- | --- | --- | --- |
294
- | `getObjectApiName` | `String` | 当前对象 API 名 |
295
- | `put` | `String` | `HashMap` 风格返回值;在触发器里通常不依赖其返回值 |
411
+ | 方法 | 返回类型 | 含义 |
412
+ | ------------------ | -------- | -------------------------------------------------- |
413
+ | `getObjectApiName` | `String` | 当前对象 API 名 |
414
+ | `put` | `String` | `HashMap` 风格返回值;在触发器里通常不依赖其返回值 |
296
415
 
297
416
  AI 使用规则:
298
417
 
@@ -324,15 +443,16 @@ public String getRoleId()
324
443
 
325
444
  返回值说明:
326
445
 
327
- | 方法 | 返回类型 | 官方说明 | AI 使用说明 |
328
- | --- | --- | --- | --- |
446
+ | 方法 | 返回类型 | 官方说明 | AI 使用说明 |
447
+ | ----------- | -------- | ------------------------------ | -------------------- |
329
448
  | `getUserId` | `String` | 当前用户 ID,未设置返回 `null` | 适合做当前操作人识别 |
330
- | `getOrgId` | `String` | 当前组织 ID,未设置返回 `null` | 适合做组织级逻辑判断 |
331
- | `getRoleId` | `String` | 当前角色 ID,未设置返回 `null` | 适合做角色权限判断 |
449
+ | `getOrgId` | `String` | 当前组织 ID,未设置返回 `null` | 适合做组织级逻辑判断 |
450
+ | `getRoleId` | `String` | 当前角色 ID,未设置返回 `null` | 适合做角色权限判断 |
332
451
 
333
452
  AI 使用规则:
334
453
 
335
- - `CCService`、`SendEmail`、`DevLogger`、`TimeUtil` 都应围绕 `userInfo` 构造或调用
454
+ - `CCService`、`SendEmail`、`DevLogger`、`TimeUtil` 都应围绕 `userInfo`
455
+ 构造或调用
336
456
  - 不要硬编码用户、组织、角色信息替代 `userInfo`
337
457
 
338
458
  ### 8.3 `CCService` 详细说明
@@ -352,9 +472,9 @@ public CCService(UserInfo userInfo)
352
472
 
353
473
  参数说明:
354
474
 
355
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
356
- | --- | --- | --- | --- | --- |
357
- | `userInfo` | `UserInfo` | 是 | 用户对象 | 必须传当前上下文用户 |
475
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
476
+ | ---------- | ---------- | -------- | -------- | -------------------- |
477
+ | `userInfo` | `UserInfo` | 是 | 用户对象 | 必须传当前上下文用户 |
358
478
 
359
479
  #### 8.3.2 `insert`
360
480
 
@@ -366,9 +486,9 @@ public ServiceResult insert(CCObject ccobj) throws BusiException
366
486
 
367
487
  参数说明:
368
488
 
369
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
370
- | --- | --- | --- | --- | --- |
371
- | `ccobj` | `CCObject` | 是 | CC 对象 | 用于新增单条记录 |
489
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
490
+ | ------- | ---------- | -------- | -------- | ---------------- |
491
+ | `ccobj` | `CCObject` | 是 | CC 对象 | 用于新增单条记录 |
372
492
 
373
493
  返回值:
374
494
 
@@ -397,14 +517,14 @@ public List<CCObject> cquery(String apiName, String condtion, boolean isDataObje
397
517
 
398
518
  参数说明:
399
519
 
400
- | 方法 | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
401
- | --- | --- | --- | --- | --- | --- |
402
- | `cquery(apiName, condtion, order)` | `apiName` | `String` | 是 | 对象 APIName | 必传对象 API |
403
- | `cquery(apiName, condtion, order)` | `condition` | `String` | 否 | 使用字段 APIName 查询,自定义字段一定要加 `__c`;无条件则查全部 | 必须收窄条件,避免全表查 |
404
- | `cquery(apiName, condtion, order)` | `order` | `String` | 否 | 使用字段 APIName 排序,自定义字段一定要加 `__c` | 只在确实需要排序时传 |
405
- | `cquery(apiName, condtion, isDataObject)` | `apiName` | `String` | 是 | 对象 APIName | 必传对象 API |
406
- | `cquery(apiName, condtion, isDataObject)` | `condtion` | `String` | 否 | 同上 | 自定义字段记得 `__c` |
407
- | `cquery(apiName, condtion, isDataObject)` | `isDataObject` | `Boolean` | 否 | `true` 查普通数据,`false` 查共享数据 | 不要混淆普通对象和共享对象口径 |
520
+ | 方法 | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
521
+ | ----------------------------------------- | -------------- | --------- | -------- | --------------------------------------------------------------- | ------------------------------ |
522
+ | `cquery(apiName, condtion, order)` | `apiName` | `String` | 是 | 对象 APIName | 必传对象 API |
523
+ | `cquery(apiName, condtion, order)` | `condition` | `String` | 否 | 使用字段 APIName 查询,自定义字段一定要加 `__c`;无条件则查全部 | 必须收窄条件,避免全表查 |
524
+ | `cquery(apiName, condtion, order)` | `order` | `String` | 否 | 使用字段 APIName 排序,自定义字段一定要加 `__c` | 只在确实需要排序时传 |
525
+ | `cquery(apiName, condtion, isDataObject)` | `apiName` | `String` | 是 | 对象 APIName | 必传对象 API |
526
+ | `cquery(apiName, condtion, isDataObject)` | `condtion` | `String` | 否 | 同上 | 自定义字段记得 `__c` |
527
+ | `cquery(apiName, condtion, isDataObject)` | `isDataObject` | `Boolean` | 否 | `true` 查普通数据,`false` 查共享数据 | 不要混淆普通对象和共享对象口径 |
408
528
 
409
529
  返回值:
410
530
 
@@ -432,10 +552,10 @@ public List<CCObject> cqlQuery(String apiName, String cql) throws Exception
432
552
 
433
553
  参数说明:
434
554
 
435
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
436
- | --- | --- | --- | --- | --- |
437
- | `apiName` | `String` | 是 | 对象 APIName | 必传主对象 API |
438
- | `cql` | `String` | 否 | SQL 语句,支持常用 `where` 条件 | 适用于聚合、复杂过滤;避免无边界 `select *` |
555
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
556
+ | --------- | -------- | -------- | ------------------------------- | ------------------------------------------- |
557
+ | `apiName` | `String` | 是 | 对象 APIName | 必传主对象 API |
558
+ | `cql` | `String` | 否 | SQL 语句,支持常用 `where` 条件 | 适用于聚合、复杂过滤;避免无边界 `select *` |
439
559
 
440
560
  返回值:
441
561
 
@@ -463,9 +583,9 @@ public ServiceResult update(CCObject ccobj) throws Exception
463
583
 
464
584
  参数说明:
465
585
 
466
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
467
- | --- | --- | --- | --- | --- |
468
- | `ccobj` | `CCObject` | 是 | CC 对象 | 修改记录时必须带 `id` |
586
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
587
+ | ------- | ---------- | -------- | -------- | --------------------- |
588
+ | `ccobj` | `CCObject` | 是 | CC 对象 | 修改记录时必须带 `id` |
469
589
 
470
590
  返回值:
471
591
 
@@ -493,9 +613,9 @@ public ServiceResult delete(CCObject ccobj) throws Exception
493
613
 
494
614
  参数说明:
495
615
 
496
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
497
- | --- | --- | --- | --- | --- |
498
- | `ccobj` | `CCObject` | 是 | CC 对象 | 删除记录时通常必须带 `id` |
616
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
617
+ | ------- | ---------- | -------- | -------- | ------------------------- |
618
+ | `ccobj` | `CCObject` | 是 | CC 对象 | 删除记录时通常必须带 `id` |
499
619
 
500
620
  返回值:
501
621
 
@@ -523,10 +643,10 @@ public void deleteShareObjectBySql(String objectApiName, String expression) thro
523
643
 
524
644
  参数说明:
525
645
 
526
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
527
- | --- | --- | --- | --- | --- |
528
- | `objectApiName` | `String` | 是 | 对象 APIName | 共享对象 API |
529
- | `expression` | `String` | 是 | SQL 表达式,字段不需要加 `__c` | 这是共享删除的关键差异点 |
646
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
647
+ | --------------- | -------- | -------- | ------------------------------ | ------------------------ |
648
+ | `objectApiName` | `String` | 是 | 对象 APIName | 共享对象 API |
649
+ | `expression` | `String` | 是 | SQL 表达式,字段不需要加 `__c` | 这是共享删除的关键差异点 |
530
650
 
531
651
  返回值:
532
652
 
@@ -555,13 +675,13 @@ public Map getCustomSetting(String objectApiName, String id)
555
675
 
556
676
  参数说明:
557
677
 
558
- | 方法 | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
559
- | --- | --- | --- | --- | --- | --- |
560
- | `getListCustomSetting(String objectApiName)` | `objectApiName` | `String` | 是 | 对象 APIName | 返回某个列表型自定义设置的全部数据 |
561
- | `getListCustomSetting(String apiName, String name)` | `apiName` | `String` | 是 | 对象 APIName | 取列表型自定义设置中的单条 |
562
- | `getListCustomSetting(String apiName, String name)` | `name` | `String` | 是 | 自定义设置属性名称 | 通过名称定位单条配置 |
563
- | `getCustomSetting(String objectApiName, String id)` | `objectApiName` | `String` | 是 | 对象 APIName | 用于层次结构型自定义设置 |
564
- | `getCustomSetting(String objectApiName, String id)` | `id` | `String` | 是 | 简档 id 或用户 id | 按权限上下文取配置 |
678
+ | 方法 | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
679
+ | --------------------------------------------------- | --------------- | -------- | -------- | ------------------ | ---------------------------------- |
680
+ | `getListCustomSetting(String objectApiName)` | `objectApiName` | `String` | 是 | 对象 APIName | 返回某个列表型自定义设置的全部数据 |
681
+ | `getListCustomSetting(String apiName, String name)` | `apiName` | `String` | 是 | 对象 APIName | 取列表型自定义设置中的单条 |
682
+ | `getListCustomSetting(String apiName, String name)` | `name` | `String` | 是 | 自定义设置属性名称 | 通过名称定位单条配置 |
683
+ | `getCustomSetting(String objectApiName, String id)` | `objectApiName` | `String` | 是 | 对象 APIName | 用于层次结构型自定义设置 |
684
+ | `getCustomSetting(String objectApiName, String id)` | `id` | `String` | 是 | 简档 id 或用户 id | 按权限上下文取配置 |
565
685
 
566
686
  返回值:
567
687
 
@@ -597,9 +717,9 @@ public SendEmail(UserInfo userInfo)
597
717
 
598
718
  参数说明:
599
719
 
600
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
601
- | --- | --- | --- | --- | --- |
602
- | `userInfo` | `UserInfo` | 是 | 用户对象 | 用当前上下文发送邮件 |
720
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
721
+ | ---------- | ---------- | -------- | -------- | -------------------- |
722
+ | `userInfo` | `UserInfo` | 是 | 用户对象 | 用当前上下文发送邮件 |
603
723
 
604
724
  #### 8.4.2 `sendMailFromSystem`
605
725
 
@@ -617,14 +737,14 @@ public boolean sendMailFromSystem(
617
737
 
618
738
  参数说明:
619
739
 
620
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
621
- | --- | --- | --- | --- | --- |
622
- | `toAddress` | `String[]` | 是 | 收件箱 | 没有收件人不要发送 |
623
- | `ccAddress` | `String[]` | 是 | 抄送人 | 没有可传空数组 |
624
- | `bccAddress` | `String[]` | 是 | 密送人 | 没有可传空数组 |
625
- | `subject` | `String` | 是 | 邮件标题 | 标题要能表达业务动作 |
626
- | `content` | `String` | 是 | 邮件内容 | HTML 内容要控制复杂度 |
627
- | `isText` | `boolean` | 是 | 是否采用 TXT 方式发送;`false` 为 HTML | HTML 邮件常用 `false` |
740
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
741
+ | ------------ | ---------- | -------- | -------------------------------------- | --------------------- |
742
+ | `toAddress` | `String[]` | 是 | 收件箱 | 没有收件人不要发送 |
743
+ | `ccAddress` | `String[]` | 是 | 抄送人 | 没有可传空数组 |
744
+ | `bccAddress` | `String[]` | 是 | 密送人 | 没有可传空数组 |
745
+ | `subject` | `String` | 是 | 邮件标题 | 标题要能表达业务动作 |
746
+ | `content` | `String` | 是 | 邮件内容 | HTML 内容要控制复杂度 |
747
+ | `isText` | `boolean` | 是 | 是否采用 TXT 方式发送;`false` 为 HTML | HTML 邮件常用 `false` |
628
748
 
629
749
  返回值:
630
750
 
@@ -651,13 +771,13 @@ public ServiceResult sendEmailNew(
651
771
 
652
772
  参数说明:
653
773
 
654
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
655
- | --- | --- | --- | --- | --- |
656
- | `emailtemplateid` | `String` | 是 | 邮件模版 id | 优先模板化发送 |
657
- | `toaddress` | `String[]` | 是 | 收件箱 | 传收件人数组 |
658
- | `ccaddress` | `String[]` | 是 | 抄送人 | 没有可传空数组 |
659
- | `bcaddress` | `String[]` | 是 | 密送人 | 官方签名为 `bcaddress`,按签名使用 |
660
- | `id` | `String` | 是 | 官方文档仅给出 `id` | 结合方法语义,AI 应将其视为模板填充关联记录 ID;此处为基于官方方法名与示例的推断 |
774
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
775
+ | ----------------- | ---------- | -------- | ------------------- | -------------------------------------------------------------------------------- |
776
+ | `emailtemplateid` | `String` | 是 | 邮件模版 id | 优先模板化发送 |
777
+ | `toaddress` | `String[]` | 是 | 收件箱 | 传收件人数组 |
778
+ | `ccaddress` | `String[]` | 是 | 抄送人 | 没有可传空数组 |
779
+ | `bcaddress` | `String[]` | 是 | 密送人 | 官方签名为 `bcaddress`,按签名使用 |
780
+ | `id` | `String` | 是 | 官方文档仅给出 `id` | 结合方法语义,AI 应将其视为模板填充关联记录 ID;此处为基于官方方法名与示例的推断 |
661
781
 
662
782
  返回值:
663
783
 
@@ -684,9 +804,9 @@ public DevLogger(UserInfo userInfo)
684
804
 
685
805
  参数说明:
686
806
 
687
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
688
- | --- | --- | --- | --- | --- |
689
- | `userInfo` | `UserInfo` | 是 | 用户对象 | 用当前上下文记录日志 |
807
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
808
+ | ---------- | ---------- | -------- | -------- | -------------------- |
809
+ | `userInfo` | `UserInfo` | 是 | 用户对象 | 用当前上下文记录日志 |
690
810
 
691
811
  #### 8.5.2 `devLogInfo`
692
812
 
@@ -698,9 +818,9 @@ public void devLogInfo(String info)
698
818
 
699
819
  参数说明:
700
820
 
701
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
702
- | --- | --- | --- | --- | --- |
703
- | `info` | `String` | 是 | 日志信息 | 记录关键主键、关键分支、关键动作 |
821
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
822
+ | ------ | -------- | -------- | -------- | -------------------------------- |
823
+ | `info` | `String` | 是 | 日志信息 | 记录关键主键、关键分支、关键动作 |
704
824
 
705
825
  返回值:
706
826
 
@@ -716,10 +836,10 @@ public void devLogError(String error, Throwable throwable)
716
836
 
717
837
  参数说明:
718
838
 
719
- | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
720
- | --- | --- | --- | --- | --- |
721
- | `error` | `String` | 是 | 日志信息 | 错误信息必须包含业务上下文 |
722
- | `throwable` | `Throwable` | 否 | 异常对象 | 有异常时尽量带上 |
839
+ | 参数 | 类型 | 是否必填 | 官方说明 | AI 使用说明 |
840
+ | ----------- | ----------- | -------- | -------- | -------------------------- |
841
+ | `error` | `String` | 是 | 日志信息 | 错误信息必须包含业务上下文 |
842
+ | `throwable` | `Throwable` | 否 | 异常对象 | 有异常时尽量带上 |
723
843
 
724
844
  返回值:
725
845
 
@@ -737,7 +857,8 @@ AI 使用规则:
737
857
  类说明:
738
858
 
739
859
  - 官方说明:`Date` 和 `Calendar` 默认基于本地时区,跨时区处理容易出错
740
- - 作用:所有和当前时间、用户时区、格式化、Calendar 相关的逻辑,都应优先走 `TimeUtil`
860
+ - 作用:所有和当前时间、用户时区、格式化、Calendar 相关的逻辑,都应优先走
861
+ `TimeUtil`
741
862
 
742
863
  #### 8.6.1 `getNowDate`
743
864
 
@@ -750,9 +871,9 @@ task.setBeginTime(TimeUtil.getNowDate(userInfo));
750
871
 
751
872
  参数说明:
752
873
 
753
- | 参数 | 类型 | 是否必填 | 官方说明 |
754
- | --- | --- | --- | --- |
755
- | `userInfo` | `UserInfo` | 是 | 用户对象 |
874
+ | 参数 | 类型 | 是否必填 | 官方说明 |
875
+ | ---------- | ---------- | -------- | -------- |
876
+ | `userInfo` | `UserInfo` | 是 | 用户对象 |
756
877
 
757
878
  AI 使用规则:
758
879
 
@@ -768,9 +889,9 @@ TimeUtil.getUserTimeZone(userInfo)
768
889
 
769
890
  参数说明:
770
891
 
771
- | 参数 | 类型 | 是否必填 | 官方说明 |
772
- | --- | --- | --- | --- |
773
- | `userInfo` | `UserInfo` | 是 | 用户对象 |
892
+ | 参数 | 类型 | 是否必填 | 官方说明 |
893
+ | ---------- | ---------- | -------- | -------- |
894
+ | `userInfo` | `UserInfo` | 是 | 用户对象 |
774
895
 
775
896
  AI 使用规则:
776
897
 
@@ -786,10 +907,10 @@ SimpleDateFormat myDateFormat = TimeUtil.getSimpleDateFormat(format, userInfo);
786
907
 
787
908
  参数说明:
788
909
 
789
- | 参数 | 类型 | 是否必填 | 默认值 | 官方说明 | AI 使用说明 |
790
- | --- | --- | --- | --- | --- | --- |
791
- | `format` | `String` | 是 | `"yyyy-MM-dd"` | 格式化 | 显式传格式串 |
792
- | `userInfo` | `UserInfo` | 是 | - | 用户对象 | 用用户时区创建格式化器 |
910
+ | 参数 | 类型 | 是否必填 | 默认值 | 官方说明 | AI 使用说明 |
911
+ | ---------- | ---------- | -------- | -------------- | -------- | ---------------------- |
912
+ | `format` | `String` | 是 | `"yyyy-MM-dd"` | 格式化 | 显式传格式串 |
913
+ | `userInfo` | `UserInfo` | 是 | - | 用户对象 | 用用户时区创建格式化器 |
793
914
 
794
915
  #### 8.6.4 `getCalendar`
795
916
 
@@ -3,6 +3,14 @@ const { postClass } = require("../../utils/http")
3
3
 
4
4
  /**
5
5
  * cloudcc get triggers <listQueryJson> [projectPath]
6
+ * listQueryJson 字段说明:
7
+ * - shownum: 每页条数
8
+ * - showpage: 页码
9
+ * - sname: 触发器名字
10
+ * - fid: 触发器作用对象 ID(兼容字段)
11
+ * - objId: 触发器作用对象 ID(会自动映射到 fid)
12
+ * - rptcond: 额外筛选条件
13
+ * - rptorder: 排序条件
6
14
  * @param {string[]} argvs
7
15
  */
8
16
  async function get(argvs, isMcp = false) {