cloudcc-cli 2.2.6 → 2.2.7

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 (117) hide show
  1. package/.cloudcc-cache.json +24 -20
  2. package/README.md +12 -0
  3. package/bin/cc.js +7 -0
  4. package/java/com/cloudcc/core/BaseException.java +100 -0
  5. package/java/com/cloudcc/core/BusiException.java +43 -0
  6. package/java/com/cloudcc/core/CCService.java +3 -1
  7. package/java/com/cloudcc/core/StringUtils.java +7 -0
  8. package/java/com/cloudcc/core/TimeUtil.java +33 -0
  9. package/java/com/cloudcc/core/UserInfo.java +9 -0
  10. package/package.json +7 -1
  11. package/pom.xml +1 -1
  12. package/skill/BACKEND_CODE.md +114 -0
  13. package/skill/CLI_CHEATSHEET.md +90 -0
  14. package/skill/INSTALL_AND_BOOTSTRAP.md +59 -0
  15. package/skill/OBJECTS_AND_FIELDS.md +120 -0
  16. package/skill/REQUIREMENTS_BREAKDOWN.md +98 -0
  17. package/skill/SKILL.md +33 -0
  18. package/skill/VUE_CUSTOM_COMPONENT.md +50 -0
  19. package/src/api/backend-sdk-java.md +427 -0
  20. package/src/api/ccdk-sdk.md +1039 -0
  21. package/src/classes/doc.js +486 -0
  22. package/src/classes/index.js +1 -0
  23. package/src/mcp/cliRunner.js +61 -0
  24. package/src/mcp/index.js +41 -3
  25. package/src/mcp/tools/Application Creator/handler.js +7 -9
  26. package/src/mcp/tools/Approval/handler.js +34 -151
  27. package/src/mcp/tools/Class Creator/handler.js +18 -15
  28. package/src/mcp/tools/Class Detail Retriever/handler.js +8 -9
  29. package/src/mcp/tools/Class Editor Guide/handler.js +5 -19
  30. package/src/mcp/tools/Class List Retriever/handler.js +8 -3
  31. package/src/mcp/tools/Class Publisher/handler.js +7 -9
  32. package/src/mcp/tools/Class Puller/handler.js +6 -65
  33. package/src/mcp/tools/Client Script Detail Retriever/handler.js +12 -18
  34. package/src/mcp/tools/Client Script Editor Guide/handler.js +9 -605
  35. package/src/mcp/tools/Client Script List Retriever/handler.js +30 -33
  36. package/src/mcp/tools/Client Script Publisher/handler.js +12 -11
  37. package/src/mcp/tools/Client Script Puller/handler.js +23 -30
  38. package/src/mcp/tools/CloudCC Development Overview/handler.js +11 -5
  39. package/src/mcp/tools/Component Creator/handler.js +12 -11
  40. package/src/mcp/tools/Component Detail Retriever/handler.js +12 -9
  41. package/src/mcp/tools/Component Editor Guide/handler.js +5 -22
  42. package/src/mcp/tools/Component List Retriever/handler.js +21 -18
  43. package/src/mcp/tools/Component Publisher/handler.js +25 -3
  44. package/src/mcp/tools/Component Puller/handler.js +13 -16
  45. package/src/mcp/tools/Dev Environment Creator/handler.js +5 -72
  46. package/src/mcp/tools/Dev Environment Validator/handler.js +5 -66
  47. package/src/mcp/tools/Developer Key Setup Guide/handler.js +11 -20
  48. package/src/mcp/tools/JSP Migrator/handler.js +842 -0
  49. package/src/mcp/tools/Menu Creator/handler.js +7 -30
  50. package/src/mcp/tools/Object Creator/handler.js +14 -6
  51. package/src/mcp/tools/Object Fields Creator/handler.js +9 -10
  52. package/src/mcp/tools/Object Fields Retriever/handler.js +6 -3
  53. package/src/mcp/tools/Object List Retriever/handler.js +10 -7
  54. package/src/mcp/tools/Scheduled Class Creator/handler.js +12 -16
  55. package/src/mcp/tools/Scheduled Class Detail Retriever/handler.js +7 -9
  56. package/src/mcp/tools/Scheduled Class List Retriever/handler.js +21 -23
  57. package/src/mcp/tools/Scheduled Class Publisher/handler.js +7 -9
  58. package/src/mcp/tools/Scheduled Class Puller/handler.js +6 -70
  59. package/src/mcp/tools/Trigger Creator/handler.js +12 -20
  60. package/src/mcp/tools/Trigger Detail Retriever/handler.js +7 -9
  61. package/src/mcp/tools/Trigger Editor Guide/handler.js +10 -35
  62. package/src/mcp/tools/Trigger List Retriever/handler.js +12 -4
  63. package/src/mcp/tools/Trigger Publisher/handler.js +8 -11
  64. package/src/mcp/tools/Trigger Puller/handler.js +12 -17
  65. package/src/plugin/doc.js +801 -0
  66. package/src/plugin/index.js +1 -0
  67. package/src/project/doc.js +378 -0
  68. package/src/project/index.js +1 -0
  69. package/src/script/doc.js +259 -0
  70. package/src/script/index.js +1 -0
  71. package/src/timer/index.js +1 -0
  72. package/src/triggers/doc.js +342 -0
  73. package/src/triggers/index.js +5 -0
  74. package/target/classes/com/cloudcc/core/BaseException.class +0 -0
  75. package/target/classes/com/cloudcc/core/BusiException.class +0 -0
  76. package/target/classes/com/cloudcc/core/CCService.class +0 -0
  77. package/target/classes/com/cloudcc/core/StringUtils.class +0 -0
  78. package/target/classes/com/cloudcc/core/TimeUtil.class +0 -0
  79. package/target/classes/com/cloudcc/core/UserInfo.class +0 -0
  80. package/template/lib/ccopenapi-0.0.4.jar +0 -0
  81. package/test/application.cli.test.js +30 -0
  82. package/test/classes.cli.test.js +121 -0
  83. package/test/fields.cli.test.js +69 -0
  84. package/test/mcp.cli.test.js +21 -0
  85. package/test/menu.cli.test.js +41 -0
  86. package/test/object.cli.test.js +64 -0
  87. package/test/plugin.cli.test.js +109 -0
  88. package/test/script.cli.test.js +101 -0
  89. package/test/timer.cli.test.js +107 -0
  90. package/test/trigger.cli.test.js +146 -0
  91. package/.vscode/settings.json +0 -3
  92. package/bin/mcp-svc.js +0 -13
  93. package/src/mcp/MCP/345/234/272/346/231/257/346/250/241/346/213/237.md +0 -8
  94. package/src/mcp/index-sse-svc.js +0 -126
  95. package/src/mcp/index-streamable-svc.js +0 -180
  96. package/src/mcp/tools/Class Detail Retriever/prompt.js +0 -37
  97. package/src/mcp/tools/Class Editor Guide/prompt.js +0 -468
  98. package/src/mcp/tools/Class Publisher/prompt.js +0 -40
  99. package/src/mcp/tools/Class Puller/prompt.js +0 -49
  100. package/src/mcp/tools/Client Script Creator/handler.js +0 -179
  101. package/src/mcp/tools/CloudCC Development Overview/prompt.js +0 -871
  102. package/src/mcp/tools/Component Editor Guide/prompt.js +0 -519
  103. package/src/mcp/tools/Component Publisher/prompt.js +0 -659
  104. package/src/mcp/tools/Dev Environment Creator/prompt.js +0 -273
  105. package/src/mcp/tools/Dev Environment Validator/prompt.js +0 -193
  106. package/src/mcp/tools/Developer Key Setup Guide/prompt.js +0 -71
  107. package/src/mcp/tools/Object Fields Retriever/prompt.js +0 -10
  108. package/src/mcp/tools/Object List Retriever/prompt.js +0 -10
  109. package/src/mcp/tools/ccdk/fetcher.js +0 -18
  110. package/src/mcp/tools/ccdk/handler.js +0 -98
  111. package/src/mcp/tools/ccdk/prompt.js +0 -453
  112. package/target/ccopenapi-0.0.3-classes.jar +0 -0
  113. package/target/ccopenapi-0.0.3.jar +0 -0
  114. package/target/maven-archiver/pom.properties +0 -3
  115. package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -18
  116. package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
  117. package/template/lib/ccopenapi-0.0.3.jar +0 -0
@@ -0,0 +1,427 @@
1
+ # CloudCC 后端 SDK(Java)使用指南
2
+
3
+ > 本文档参考 CloudCC 官方「后端 SDK 参考」整理而成:[后端SDK参考](https://help.cloudcc.cn/product03/fu-wu-duan-sdkcan-kao-java/)。
4
+ > 目标:为自定义类、触发器、定时类中的 Java 开发,提供 `CCObject`、`UserInfo`、`CCService`、`SendEmail`、`DevLogger`、`TimeUtil` 等核心 API 的速查说明。
5
+
6
+ ---
7
+
8
+ ## 1. CCObject:CloudCC 对象封装
9
+
10
+ ### 1.1 类说明
11
+
12
+ - 继承自 `java.util.HashMap`:`com.g3cloud.platform.publik.CCObject`
13
+ - 用于承载某个对象(如 `Account`、`Contact`)的一条记录或共享表记录。
14
+
15
+ ### 1.2 构造函数
16
+
17
+ ```java
18
+ public CCObject() {}
19
+ ```
20
+
21
+ ```java
22
+ public CCObject(String ccobj)
23
+ ```
24
+
25
+ | 参数 | 类型 | 是否必填 | 说明 |
26
+ | --------- | -------- | -------- | ------------ |
27
+ | `ccobj` | `String` | 是 | 对象 API 名称 |
28
+
29
+ ```java
30
+ public CCObject(String ccobj, String isShared)
31
+ ```
32
+
33
+ | 参数 | 类型 | 是否必填 | 说明 |
34
+ | ----------- | -------- | -------- | ----------------------------------------- |
35
+ | `ccobj` | `String` | 是 | 对象 API 名称 |
36
+ | `isShared` | `String` | 是 | 共享标识,建议使用 `CCObject.IS_SHARED` |
37
+
38
+ ### 1.3 常量字段
39
+
40
+ | 修饰符和类型 | 字段 | 默认值 | 说明 |
41
+ | ---------------------------- | -------------- | -------------- | --------- |
42
+ | `public static final String` | `OBJECT_API` | `CCObjectAPI` | 对象 API |
43
+ | `public static final String` | `IS_SHARED` | `isShared` | 共享对象标识 |
44
+
45
+ ### 1.4 常用方法
46
+
47
+ #### `getObjectApiName()`
48
+
49
+ ```java
50
+ public String getObjectApiName()
51
+ ```
52
+
53
+ 返回当前 `CCObject` 对应的对象 API 名称。
54
+
55
+ #### `put(String apiName, String value)`
56
+
57
+ ```java
58
+ public String put(String apiName, String value)
59
+ ```
60
+
61
+ | 参数 | 类型 | 是否必填 | 说明 |
62
+ | ----------- | -------- | -------- | ----------------- |
63
+ | `apiName` | `String` | 是 | 字段 API 名称 |
64
+ | `value` | `String` | 是 | 字段值(字符串形式) |
65
+
66
+ 示例:
67
+
68
+ ```java
69
+ CCObject contact = new CCObject("Contact");
70
+ contact.put("email", "hello@cloudcc.com");
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 2. UserInfo:当前用户信息
76
+
77
+ 类:`com.g3cloud.common.UserInfo`(实现 `java.io.Serializable`)
78
+
79
+ ### 2.1 常用方法
80
+
81
+ ```java
82
+ public String getUserId()
83
+ public String getOrgId()
84
+ public String getRoleId()
85
+ ```
86
+
87
+ - `getUserId()`:当前用户 ID
88
+ - `getOrgId()`:当前组织 ID
89
+ - `getRoleId()`:当前角色 ID
90
+
91
+ 在自定义类构造函数或方法中通常作为参数传入,用于实例化 `CCService`、`DevLogger` 等。
92
+
93
+ ---
94
+
95
+ ## 3. CCService:对象操作核心工具类
96
+
97
+ 类:`com.g3cloud.platform.publik.CCService`
98
+
99
+ ### 3.1 构造函数
100
+
101
+ ```java
102
+ public CCService(UserInfo userInfo)
103
+ ```
104
+
105
+ | 参数 | 类型 | 是否必填 | 说明 |
106
+ | ----------- | ---------- | -------- | -------- |
107
+ | `userInfo` | `UserInfo` | 是 | 当前用户对象 |
108
+
109
+ 在自定义类中常见用法:
110
+
111
+ ```java
112
+ private CCService cs;
113
+ private UserInfo userInfo;
114
+
115
+ public MyClass(UserInfo userInfo) {
116
+ this.userInfo = userInfo;
117
+ this.cs = new CCService(userInfo);
118
+ }
119
+ ```
120
+
121
+ ### 3.2 新增记录:`insert`
122
+
123
+ ```java
124
+ public ServiceResult insert(CCObject ccobj) throws BusiException
125
+ ```
126
+
127
+ | 参数 | 类型 | 是否必填 | 说明 |
128
+ | -------- | ----------- | -------- | ------- |
129
+ | `ccobj` | `CCObject` | 是 | CC 对象 |
130
+
131
+ 示例:
132
+
133
+ ```java
134
+ CCObject contact = new CCObject("Contact");
135
+ contact.put("email", "hello@cloudcc.com");
136
+ cs.insert(contact);
137
+ ```
138
+
139
+ ### 3.3 查询记录:`cquery`
140
+
141
+ ```java
142
+ public List<CCObject> cquery(String apiName, String condition, String order) throws Exception
143
+ ```
144
+
145
+ | 参数 | 类型 | 是否必填 | 说明 |
146
+ | ------------ | -------- | -------- | -------------------------------------------------------------------- |
147
+ | `apiName` | `String` | 是 | 对象 API 名称 |
148
+ | `condition` | `String` | 否 | 使用字段 apiname 查询,自定义字段 API 后需加 `__c`,为空则查询所有 |
149
+ | `order` | `String` | 否 | 排序条件,字段 API 后需加 `__c` |
150
+
151
+ 示例:
152
+
153
+ ```java
154
+ List<CCObject> opps = cs.cquery(
155
+ "Opportunity",
156
+ "khmc__c = '123'",
157
+ "jine__c desc"
158
+ );
159
+ ```
160
+
161
+ #### 查询共享数据
162
+
163
+ ```java
164
+ public List<CCObject> cquery(String apiName, String condition, boolean isDataObject) throws Exception
165
+ ```
166
+
167
+ | 参数 | 类型 | 是否必填 | 说明 |
168
+ | -------------- | --------- | -------- | -------------------------------------------- |
169
+ | `apiName` | `String` | 是 | 对象 API 名称 |
170
+ | `condition` | `String` | 否 | 同上 |
171
+ | `isDataObject` | `Boolean` | 否 | `true` 查询普通数据,`false` 查询共享数据 |
172
+
173
+ 示例:
174
+
175
+ ```java
176
+ List<CCObject> opps = cs.cquery(
177
+ "Opportunity",
178
+ "khmc__c = '123'",
179
+ false
180
+ );
181
+ ```
182
+
183
+ ### 3.4 SQL 查询:`cqlQuery`
184
+
185
+ ```java
186
+ public List<CCObject> cqlQuery(String apiName, String cql) throws Exception
187
+ ```
188
+
189
+ | 参数 | 类型 | 是否必填 | 说明 |
190
+ | --------- | -------- | -------- | -------------------------------------- |
191
+ | `apiName` | `String` | 是 | 对象 API 名称 |
192
+ | `cql` | `String` | 否 | CQL/SQL 语句,支持常用 where 条件 |
193
+
194
+ 示例:
195
+
196
+ ```java
197
+ List<CCObject> list = cs.cqlQuery(
198
+ "test_object_a",
199
+ "select * from test_object_a where text_field = 'hello002'"
200
+ );
201
+ ```
202
+
203
+ ### 3.5 修改记录:`update`
204
+
205
+ ```java
206
+ public ServiceResult update(CCObject ccobj) throws Exception
207
+ ```
208
+
209
+ 示例:
210
+
211
+ ```java
212
+ CCObject obj = new CCObject("test_object_a");
213
+ obj.put("id", "a252025B79C1B99R62Nf");
214
+ obj.put("text_field", "hello003");
215
+ cs.update(obj);
216
+ ```
217
+
218
+ ### 3.6 删除记录:`delete`
219
+
220
+ ```java
221
+ public ServiceResult delete(CCObject ccobj) throws Exception
222
+ ```
223
+
224
+ 示例:
225
+
226
+ ```java
227
+ CCObject obj = new CCObject("test_object_a");
228
+ obj.put("id", "a252025B79C1B99R62Nf");
229
+ cs.delete(obj);
230
+ ```
231
+
232
+ ### 3.7 删除共享表记录:`deleteShareObjectBySql`
233
+
234
+ ```java
235
+ public void deleteShareObjectBySql(String objectApiName, String expression) throws Exception
236
+ ```
237
+
238
+ | 参数 | 类型 | 是否必填 | 说明 |
239
+ | ---------------- | -------- | -------- | ---------------------------------- |
240
+ | `objectApiName` | `String` | 是 | 对象 API 名称 |
241
+ | `expression` | `String` | 是 | SQL 表达式,字段 **不需要** 加 `__c` |
242
+
243
+ ---
244
+
245
+ ## 4. 自定义设置(CustomSetting)
246
+
247
+ ### 4.1 列表类型:`getListCustomSetting`
248
+
249
+ ```java
250
+ public Map getListCustomSetting(String objectApiName)
251
+ ```
252
+
253
+ | 参数 | 类型 | 是否必填 | 说明 |
254
+ | ---------------- | -------- | -------- | ------------- |
255
+ | `objectApiName` | `String` | 是 | 自定义设置 API |
256
+
257
+ 返回指定 API 下的全部列表类型自定义设置。
258
+
259
+ ### 4.2 列表类型单条:`getListCustomSetting(String apiName, String name)`
260
+
261
+ ```java
262
+ Map map = cs.getListCustomSetting(String apiName, String name);
263
+ ```
264
+
265
+ | 参数 | 类型 | 是否必填 | 说明 |
266
+ | ----------- | -------- | -------- | -------------- |
267
+ | `apiName` | `String` | 是 | 自定义设置 API |
268
+ | `name` | `String` | 是 | 自定义设置记录名称 |
269
+
270
+ ### 4.3 层次结构类型:`getCustomSetting`
271
+
272
+ ```java
273
+ public Map getCustomSetting(String objectApiName, String id)
274
+ ```
275
+
276
+ | 参数 | 类型 | 是否必填 | 说明 |
277
+ | ---------------- | -------- | -------- | ------------------------ |
278
+ | `objectApiName` | `String` | 是 | 自定义设置 API |
279
+ | `id` | `String` | 是 | 简档 ID 或用户 ID |
280
+
281
+ ---
282
+
283
+ ## 5. SendEmail:发送邮件
284
+
285
+ 类:`com.g3cloud.platform.common.service.emailservice.SendEmail`
286
+
287
+ ### 5.1 构造函数
288
+
289
+ ```java
290
+ public SendEmail(UserInfo userInfo)
291
+ ```
292
+
293
+ | 参数 | 类型 | 是否必填 | 说明 |
294
+ | ----------- | ---------- | -------- | -------- |
295
+ | `userInfo` | `UserInfo` | 是 | 用户对象 |
296
+
297
+ ### 5.2 直接发送邮件:`sendMailFromSystem`
298
+
299
+ ```java
300
+ public boolean sendMailFromSystem(
301
+ String[] toAddress,
302
+ String[] ccAddress,
303
+ String[] bccAddress,
304
+ String subject,
305
+ String content,
306
+ boolean isText)
307
+ ```
308
+
309
+ | 参数 | 类型 | 是否必填 | 说明 |
310
+ | ------------ | ---------- | -------- | ----------------------------------------- |
311
+ | `toAddress` | `String[]` | 是 | 收件人数组 |
312
+ | `ccAddress` | `String[]` | 是 | 抄送人数组(可为空数组) |
313
+ | `bccAddress` | `String[]` | 是 | 密送人数组(可为空数组) |
314
+ | `subject` | `String` | 是 | 邮件标题 |
315
+ | `content` | `String` | 是 | 邮件内容(支持 HTML) |
316
+ | `isText` | `boolean` | 是 | `true` 纯文本;`false` HTML 格式邮件 |
317
+
318
+ ### 5.3 使用模板发送:`sendEmailNew`
319
+
320
+ ```java
321
+ public ServiceResult sendEmailNew(
322
+ String emailtemplateid,
323
+ String[] toaddress,
324
+ String[] ccaddress,
325
+ String[] bcaddress,
326
+ String id) throws Exception
327
+ ```
328
+
329
+ | 参数 | 类型 | 是否必填 | 说明 |
330
+ | ----------------- | ---------- | -------- | ------------- |
331
+ | `emailtemplateid` | `String` | 是 | 邮件模板 ID |
332
+ | `toaddress` | `String[]` | 是 | 收件人 |
333
+ | `ccaddress` | `String[]` | 是 | 抄送人 |
334
+ | `bcaddress` | `String[]` | 是 | 密送人 |
335
+ | `id` | `String` | 是 | 关联记录 ID |
336
+
337
+ ---
338
+
339
+ ## 6. DevLogger:运行日志采集
340
+
341
+ 类:`com.g3cloud.platform.common.service.devlogger.DevLogger`(示例名,具体包以实际项目为准)
342
+
343
+ ### 6.1 构造函数
344
+
345
+ ```java
346
+ public DevLogger(UserInfo userInfo)
347
+ ```
348
+
349
+ | 参数 | 类型 | 是否必填 | 说明 |
350
+ | ----------- | ---------- | -------- | -------- |
351
+ | `userInfo` | `UserInfo` | 是 | 用户对象 |
352
+
353
+ ### 6.2 info 日志:`devLogInfo`
354
+
355
+ ```java
356
+ public void devLogInfo(String info)
357
+ ```
358
+
359
+ | 参数 | 类型 | 是否必填 | 说明 |
360
+ | ------- | -------- | -------- | -------- |
361
+ | `info` | `String` | 是 | 日志信息 |
362
+
363
+ ### 6.3 error 日志:`devLogError`
364
+
365
+ ```java
366
+ public void devLogError(String error, Throwable throwable)
367
+ ```
368
+
369
+ | 参数 | 类型 | 是否必填 | 说明 |
370
+ | ------------ | ----------- | -------- | ---------- |
371
+ | `error` | `String` | 是 | 错误信息 |
372
+ | `throwable` | `Throwable` | 否 | 异常对象 |
373
+
374
+ ---
375
+
376
+ ## 7. TimeUtil:多时区时间工具
377
+
378
+ 说明:`TimeUtil` 用于在多时区环境下安全处理时间,避免直接使用 `new Date()` / `Calendar.getInstance()` 带来的偏差。
379
+
380
+ ### 7.1 获取当前时间:`getNowDate`
381
+
382
+ ```java
383
+ TpSysTask task = new TpSysTask();
384
+ task.setBeginTime(TimeUtil.getNowDate(userInfo));
385
+ ```
386
+
387
+ | 参数 | 类型 | 是否必填 | 说明 |
388
+ | ----------- | ---------- | -------- | -------- |
389
+ | `userInfo` | `UserInfo` | 是 | 用户对象 |
390
+
391
+ ### 7.2 获取用户时区:`getUserTimeZone`
392
+
393
+ ```java
394
+ TimeZone tz = TimeUtil.getUserTimeZone(userInfo);
395
+ ```
396
+
397
+ ### 7.3 获取带时区的 `SimpleDateFormat`:`getSimpleDateFormat`
398
+
399
+ ```java
400
+ SimpleDateFormat myDateFormat =
401
+ TimeUtil.getSimpleDateFormat("yyyy-MM-dd", userInfo);
402
+ ```
403
+
404
+ | 参数 | 类型 | 是否必填 | 说明 |
405
+ | ----------- | ---------- | -------- | -------------- |
406
+ | `format` | `String` | 是 | 日期格式化模式 |
407
+ | `userInfo` | `UserInfo` | 是 | 用户对象 |
408
+
409
+ ### 7.4 获取带时区的 `Calendar`
410
+
411
+ ```java
412
+ Calendar cal = Calendar.getInstance(TimeUtil.getUserTimeZone(userInfo));
413
+ // 或
414
+ Calendar cal2 = TimeUtil.getCalendar(userInfo);
415
+ ```
416
+
417
+ ---
418
+
419
+ ## 8. 后端 SDK 使用建议 Checklist
420
+
421
+ - [ ] 在自定义类/触发器/定时类中统一使用 `CCService` 操作对象,不直接写 JDBC。
422
+ - [ ] 查询条件和排序中,自定义字段使用 API 名称并加 `__c` 后缀(共享表表达式除外)。
423
+ - [ ] 涉及时区的所有时间写入/比较统一使用 `TimeUtil`。
424
+ - [ ] 需要发邮件时首选 `SendEmail`,避免自己拼 SMTP。
425
+ - [ ] 关键业务流程和异常通过 `DevLogger` 记录,便于问题排查。
426
+ - [ ] 自定义设置使用 `getListCustomSetting` / `getCustomSetting` 统一读取。
427
+