cloudcc-cli 2.3.1 → 2.3.3

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 (232) hide show
  1. package/.claude/settings.json +25 -0
  2. package/.cloudcc-cache.json +21 -4
  3. package/.cursor/skills/cloudcc-cli-dev.zip +0 -0
  4. package/.cursor/skills/cloudcc-cli-usage/SKILL.md +68 -0
  5. package/README.md +22 -0
  6. package/bin/cc.js +13 -8
  7. package/bin/index.js +9 -2
  8. package/bin/mcp.js +1 -1
  9. package/build/component-CCPlugin1774500425584.common.js +831 -0
  10. package/build/component-CCPlugin1774500425584.common.js.map +1 -0
  11. package/build/component-CCPlugin1774500425584.css +1 -0
  12. package/build/component-CCPlugin1774500425584.umd.js +874 -0
  13. package/build/component-CCPlugin1774500425584.umd.js.map +1 -0
  14. package/build/component-CCPlugin1774500425584.umd.min.js +8 -0
  15. package/build/component-CCPlugin1774500425584.umd.min.js.map +1 -0
  16. package/build/demo.html +1 -0
  17. package/{src/mcp → mcp}/tools/Class Editor Guide/handler.js +12 -4
  18. package/{src/mcp → mcp}/tools/Component Editor Guide/handler.js +15 -14
  19. package/{src/mcp → mcp}/tools/Trigger Editor Guide/handler.js +8 -2
  20. package/package.json +3 -2
  21. package/src/application/doc.js +46 -0
  22. package/src/application/docs/devguide.md +173 -0
  23. package/src/application/docs/introduction.md +81 -0
  24. package/src/application/index.js +1 -0
  25. package/src/brief/get.js +1 -1
  26. package/src/classes/create.js +6 -1
  27. package/src/classes/delete.js +7 -1
  28. package/src/classes/detail.js +8 -1
  29. package/src/classes/doc.js +49 -472
  30. package/src/classes/docs/devguide.md +541 -0
  31. package/src/classes/get.js +9 -2
  32. package/src/classes/index.js +2 -1
  33. package/src/classes/publish.js +6 -1
  34. package/src/classes/pull.js +6 -1
  35. package/src/classes/pullList.js +6 -3
  36. package/src/config/doc.js +31 -0
  37. package/src/config/docs/devguide.md +100 -0
  38. package/src/config/index.js +5 -0
  39. package/src/customPage/create.js +52 -19
  40. package/src/customPage/doc.js +46 -0
  41. package/src/customPage/docs/devguide.md +200 -0
  42. package/{.cursor/skills/cloudcc-cli-dev/docs//350/207/252/345/256/232/344/271/211/351/241/265/351/235/242.md → src/customPage/docs/introduction.md} +1 -5
  43. package/src/customPage/index.js +1 -0
  44. package/src/customSetting/create.js +9 -0
  45. package/src/customSetting/delete.js +10 -1
  46. package/src/customSetting/deleteCustomSettingField.js +43 -0
  47. package/src/customSetting/detail.js +10 -1
  48. package/src/customSetting/doc.js +22 -179
  49. package/src/customSetting/docs/devguide.md +181 -0
  50. package/src/customSetting/docs/introduction.md +3 -0
  51. package/src/customSetting/editCustomSettingField.js +34 -0
  52. package/src/customSetting/get.js +9 -0
  53. package/src/customSetting/index.js +6 -1
  54. package/src/customSetting/modify.js +30 -0
  55. package/src/customSetting/saveCustomSettingField.js +46 -0
  56. package/src/fields/doc.js +45 -0
  57. package/src/fields/docs/devguide.md +224 -0
  58. package/src/fields/docs/introduction.md +217 -0
  59. package/src/fields/index.js +1 -0
  60. package/src/globalSelectList/create.js +51 -0
  61. package/src/globalSelectList/delete.js +56 -0
  62. package/src/globalSelectList/detail.js +45 -0
  63. package/src/globalSelectList/doc.js +52 -0
  64. package/src/globalSelectList/docs/devguide.md +153 -0
  65. package/src/globalSelectList/docs/introduction.md +82 -0
  66. package/src/globalSelectList/get.js +31 -0
  67. package/src/globalSelectList/index.js +16 -0
  68. package/src/menu/create-page.js +43 -6
  69. package/src/menu/create-script.js +67 -19
  70. package/src/menu/doc.js +57 -0
  71. package/src/menu/docs/devguide.md +129 -0
  72. package/src/menu/docs/introduction.md +99 -0
  73. package/src/menu/index.js +1 -0
  74. package/src/menu/validator.js +80 -0
  75. package/src/object/doc.js +45 -0
  76. package/src/object/docs/devguide.md +112 -0
  77. package/src/object/docs/introduction.md +187 -0
  78. package/src/object/get.js +1 -23
  79. package/src/object/index.js +1 -0
  80. package/src/pagelayout/create.js +123 -0
  81. package/src/pagelayout/delete.js +57 -0
  82. package/src/pagelayout/doc.js +46 -0
  83. package/src/pagelayout/docs/devguide.md +83 -0
  84. package/src/pagelayout/docs/introduction.md +44 -0
  85. package/src/pagelayout/get.js +46 -0
  86. package/src/pagelayout/index.js +10 -0
  87. package/src/plugin/doc.js +43 -863
  88. package/src/plugin/docs/devguide.md +996 -0
  89. package/src/profile/create.js +108 -0
  90. package/src/profile/delete.js +59 -0
  91. package/src/profile/doc.js +46 -0
  92. package/src/profile/docs/devguide.md +77 -0
  93. package/src/profile/docs/introduction.md +123 -0
  94. package/src/profile/get.js +55 -0
  95. package/src/profile/index.js +14 -0
  96. package/src/project/doc.js +39 -372
  97. package/src/project/docs/devguide.md +359 -0
  98. package/src/project/docs/introduction.md +3 -0
  99. package/src/recordType/create.js +77 -0
  100. package/src/recordType/delete.js +52 -0
  101. package/src/recordType/doc.js +36 -0
  102. package/src/recordType/docs/devguide.md +160 -0
  103. package/src/recordType/docs/introduction.md +53 -0
  104. package/src/recordType/editInfo.js +39 -0
  105. package/src/recordType/editSave.js +47 -0
  106. package/src/recordType/getList.js +31 -0
  107. package/src/recordType/index.js +16 -3
  108. package/src/recordType/newInfo.js +39 -0
  109. package/src/recordType/validDelete.js +91 -0
  110. package/src/res.md +66 -0
  111. package/src/role/create.js +153 -0
  112. package/src/role/delete.js +59 -0
  113. package/src/role/doc.js +46 -0
  114. package/src/role/docs/devguide.md +81 -0
  115. package/src/role/docs/introduction.md +124 -0
  116. package/src/role/get.js +57 -0
  117. package/src/role/index.js +10 -0
  118. package/src/scheduleJob/doc.js +49 -0
  119. package/src/scheduleJob/docs/devguide.md +79 -0
  120. package/src/scheduleJob/docs/introduction.md +101 -0
  121. package/src/scheduleJob/index.js +5 -0
  122. package/src/script/delete.js +112 -0
  123. package/src/script/doc.js +31 -245
  124. package/src/script/docs/devguide.md +290 -0
  125. package/src/script/docs/introduction.md +48 -0
  126. package/src/script/index.js +1 -0
  127. package/src/staticResource/count.js +31 -10
  128. package/src/staticResource/create.js +97 -0
  129. package/src/staticResource/delete.js +30 -8
  130. package/src/staticResource/detail.js +32 -10
  131. package/src/staticResource/doc.js +21 -88
  132. package/src/staticResource/docs/devguide.md +157 -0
  133. package/src/staticResource/docs/introduction.md +3 -0
  134. package/src/staticResource/get.js +31 -8
  135. package/src/staticResource/index.js +2 -1
  136. package/src/timer/create.js +6 -1
  137. package/src/timer/delete.js +7 -1
  138. package/src/timer/detail.js +5 -5
  139. package/src/timer/doc.js +57 -0
  140. package/{.cursor/skills/cloudcc-cli-dev/docs/cloudcc/345/256/232/346/227/266/344/275/234/344/270/232.md → src/timer/docs/devguide.md} +83 -1
  141. package/src/timer/get.js +7 -1
  142. package/src/timer/index.js +3 -1
  143. package/src/timer/publish.js +6 -1
  144. package/src/timer/pull.js +6 -1
  145. package/src/timer/pullList.js +5 -3
  146. package/src/triggers/detail.js +5 -5
  147. package/src/triggers/doc.js +49 -364
  148. package/src/triggers/docs/devguide.md +442 -0
  149. package/src/triggers/get.js +7 -3
  150. package/src/triggers/index.js +1 -4
  151. package/src/triggers/pullList.js +7 -7
  152. package/src/user/create.js +50 -0
  153. package/src/user/delete.js +59 -0
  154. package/src/user/doc.js +46 -0
  155. package/src/user/docs/devguide.md +122 -0
  156. package/src/user/docs/introduction.md +124 -0
  157. package/src/user/get.js +112 -0
  158. package/src/user/index.js +12 -0
  159. package/src/user/update.js +96 -0
  160. package/src/user/view.js +60 -0
  161. package/test/classes.cli.test.js +7 -4
  162. package/test/customPage.cli.test.js +96 -0
  163. package/test/globalSelectList.cli.test.js +94 -0
  164. package/test/menu-script.cli.test.js +147 -0
  165. package/test/menu.cli.test.js +8 -1
  166. package/test/plugin.cli.test.js +5 -3
  167. package/test/timer.cli.test.js +15 -8
  168. package/test/trigger.cli.test.js +5 -3
  169. package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +0 -111
  170. package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +0 -152
  171. package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +0 -150
  172. package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +0 -372
  173. package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +0 -62
  174. package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +0 -62
  175. package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +0 -214
  176. package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +0 -113
  177. package/.cursor/skills/cloudcc-cli-dev/SKILL.md +0 -66
  178. package/.cursor/skills/cloudcc-cli-dev/STATIC-RESOURCE-API.md +0 -60
  179. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_COMPONENT.md +0 -151
  180. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_PAGE.md +0 -216
  181. package/src/approval/approve.js +0 -105
  182. package/src/approval/get.js +0 -245
  183. package/src/approval/index.js +0 -11
  184. package/src/approval/reject.js +0 -105
  185. package/src/plugin/readme.md +0 -7
  186. /package/{src/mcp → mcp}/cliRunner.js +0 -0
  187. /package/{src/mcp → mcp}/index.js +0 -0
  188. /package/{src/mcp → mcp}/readme.md +0 -0
  189. /package/{src/mcp → mcp}/tools/Application Creator/handler.js +0 -0
  190. /package/{src/mcp → mcp}/tools/Approval/handler.js +0 -0
  191. /package/{src/mcp → mcp}/tools/Class Creator/handler.js +0 -0
  192. /package/{src/mcp → mcp}/tools/Class Detail Retriever/handler.js +0 -0
  193. /package/{src/mcp → mcp}/tools/Class List Retriever/handler.js +0 -0
  194. /package/{src/mcp → mcp}/tools/Class Publisher/handler.js +0 -0
  195. /package/{src/mcp → mcp}/tools/Class Puller/handler.js +0 -0
  196. /package/{src/mcp → mcp}/tools/Client Script Detail Retriever/handler.js +0 -0
  197. /package/{src/mcp → mcp}/tools/Client Script Editor Guide/handler.js +0 -0
  198. /package/{src/mcp → mcp}/tools/Client Script List Retriever/handler.js +0 -0
  199. /package/{src/mcp → mcp}/tools/Client Script Publisher/handler.js +0 -0
  200. /package/{src/mcp → mcp}/tools/Client Script Puller/handler.js +0 -0
  201. /package/{src/mcp → mcp}/tools/CloudCC Development Overview/handler.js +0 -0
  202. /package/{src/mcp → mcp}/tools/Component Creator/handler.js +0 -0
  203. /package/{src/mcp → mcp}/tools/Component Detail Retriever/handler.js +0 -0
  204. /package/{src/mcp → mcp}/tools/Component List Retriever/handler.js +0 -0
  205. /package/{src/mcp → mcp}/tools/Component Publisher/handler.js +0 -0
  206. /package/{src/mcp → mcp}/tools/Component Puller/handler.js +0 -0
  207. /package/{src/mcp → mcp}/tools/Dev Environment Creator/fetcher.js +0 -0
  208. /package/{src/mcp → mcp}/tools/Dev Environment Creator/handler.js +0 -0
  209. /package/{src/mcp → mcp}/tools/Dev Environment Validator/handler.js +0 -0
  210. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/fetcher.js +0 -0
  211. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/handler.js +0 -0
  212. /package/{src/mcp → mcp}/tools/JSP Migrator/handler.js +0 -0
  213. /package/{src/mcp → mcp}/tools/Menu Creator/handler.js +0 -0
  214. /package/{src/mcp → mcp}/tools/Object Creator/handler.js +0 -0
  215. /package/{src/mcp → mcp}/tools/Object Fields Creator/handler.js +0 -0
  216. /package/{src/mcp → mcp}/tools/Object Fields Retriever/handler.js +0 -0
  217. /package/{src/mcp → mcp}/tools/Object List Retriever/handler.js +0 -0
  218. /package/{src/mcp → mcp}/tools/Scheduled Class Creator/handler.js +0 -0
  219. /package/{src/mcp → mcp}/tools/Scheduled Class Detail Retriever/handler.js +0 -0
  220. /package/{src/mcp → mcp}/tools/Scheduled Class List Retriever/handler.js +0 -0
  221. /package/{src/mcp → mcp}/tools/Scheduled Class Publisher/handler.js +0 -0
  222. /package/{src/mcp → mcp}/tools/Scheduled Class Puller/handler.js +0 -0
  223. /package/{src/mcp → mcp}/tools/Trigger Creator/handler.js +0 -0
  224. /package/{src/mcp → mcp}/tools/Trigger Detail Retriever/handler.js +0 -0
  225. /package/{src/mcp → mcp}/tools/Trigger List Retriever/handler.js +0 -0
  226. /package/{src/mcp → mcp}/tools/Trigger Publisher/handler.js +0 -0
  227. /package/{src/mcp → mcp}/tools/Trigger Puller/handler.js +0 -0
  228. /package/{src/mcp → mcp}/tools/index.js +0 -0
  229. /package/{.cursor/skills/cloudcc-cli-dev/docs//350/207/252/345/256/232/344/271/211/347/261/273.md" → src/classes/docs/introduction.md} +0 -0
  230. /package/{.cursor/skills/cloudcc-cli-dev/docs/CloudCC/350/207/252/345/256/232/344/271/211/347/273/204/344/273/266/344/275/277/347/224/250/350/257/264/346/230/216.md" → src/plugin/docs/introduction.md} +0 -0
  231. /package/{.cursor/skills/cloudcc-cli-dev/docs/cloudcc/345/256/232/346/227/266/347/261/273.md" → src/timer/docs/introduction.md} +0 -0
  232. /package/{.cursor/skills/cloudcc-cli-dev/docs//350/247/246/345/217/221/345/231/250/347/261/273.md" → src/triggers/docs/introduction.md} +0 -0
@@ -0,0 +1,541 @@
1
+ # CloudCC 自定义类开发指南
2
+
3
+ > 本文档参考 CloudCC
4
+ > 官方「自定义类」文档整理而成:[自定义类](https://help.cloudcc.cn/product03/zi-ding-yi-lei/)。\
5
+ > 目标:指导开发者在 CloudCC 平台上编写 Java 自定义类,熟练使用
6
+ > `CCService`、`CCObject`、`SendEmail`、`DevLogger`、`TimeUtil`
7
+ > 等工具类,并理解类在触发器、定时作业、自定义组件中的调用方式。
8
+
9
+ ---
10
+
11
+ ## 0. 必须使用 CLI 管理本地类文件
12
+
13
+ 自定义类在本项目中的目录结构、`config.json`、主类中的 `// @SOURCE_CONTENT_START`
14
+ … `// @SOURCE_CONTENT_END` 区域,均与 **cloudcc-cli**
15
+ 的创建、发布、拉取逻辑绑定。**必须通过下列命令**
16
+ 完成新建目录、与服务器同步、发布与删除;不要手工新建
17
+ `classes/<类名>/`、不要复制粘贴整套类文件夹、不要私自篡改 `config.json` 里的
18
+ `id` 或破坏版本字段,否则容易导致发布失败、拉取覆盖异常或与线上一致性不一致。
19
+
20
+ **允许的做法**:在 CLI 已生成的主类 `*.java` 中,仅在上述 SOURCE
21
+ 标记之间编写与修改业务代码;其余与平台同步相关的操作一律走命令。
22
+
23
+ 执行命令前请确认:已完成 `cc doc project devguide`
24
+ 中的环境初始化,项目根目录配置可用且包含 `accessToken`。
25
+
26
+ ### 0.1 命令总览(以代码实现为准)
27
+
28
+ ```bash
29
+ cc create classes <name>
30
+ cc publish classes <name>
31
+ cc pull classes <name>
32
+ cc get classes [listQueryJson] [projectPath]
33
+ cc detail classes <name>
34
+ cc detail classes "" <id>
35
+ cc pullList classes <id> <projectPath>
36
+ cc delete classes <nameOrId> [projectPath]
37
+ cc doc classes <introduction|devguide>
38
+ ```
39
+
40
+ 参数约定:
41
+
42
+ - `name`:Java 类名,与 `classes/<name>/` 目录名一致。
43
+ - `listQueryJson`:可选;列表查询条件的 JSON 经 `encodeURI(JSON.stringify(...))`
44
+ 编码后传入。不传时使用默认分页参数。
45
+ - `projectPath`:项目根路径,可选;不传则使用当前工作目录。
46
+ - `id`:线上类 ID。`detail`
47
+ 在仅查服务器时可将类名置空:`cc detail classes "" <id>`。`pullList` 用 ID
48
+ 将线上类落到指定项目的 `classes/` 下。
49
+ - `nameOrId`:本地目录名,或类 ID。若本地存在 `config.json` 且含
50
+ `id`,删除时会优先用其中的服务器 ID。
51
+
52
+ ### 0.2 命令说明摘要
53
+
54
+ | 命令 | 作用 |
55
+ | ---------- | ----------------------------------------------------------------------------------- |
56
+ | `create` | 在 `classes/<name>/` 生成主类、测试类、`config.json` 模板 |
57
+ | `publish` | 将本地 SOURCE 区域源码提交到服务器;首次成功后会写回 `config.json` 的 `id` |
58
+ | `pull` | 按本地 `config.json` 的 `id` 从服务器拉取源码,覆盖主类中 SOURCE 区域(需已发布过) |
59
+ | `get` | 查询线上类列表(JSON 输出) |
60
+ | `detail` | 按类名优先读本地;或仅按 `id` 读服务器详情 |
61
+ | `pullList` | 按类 `id` 将线上类拉取到指定 `projectPath` 下的 `classes/<类名>/` |
62
+ | `delete` | 调用接口删除服务器上的类;参数可为本地类名或类 ID |
63
+ | `doc` | 输出 `introduction` 或 `devguide`(`devguide` 含附录 SDK 速查) |
64
+
65
+ ### 0.3 推荐操作顺序
66
+
67
+ ```bash
68
+ # 1) 查看线上已有类(可选,避免重名或确认 ID)
69
+ cc get classes
70
+
71
+ # 2) 新建类(仅通过 create 生成目录与文件)
72
+ cc create classes MyClass
73
+
74
+ # 3) 编辑 classes/MyClass/MyClass.java 中 SOURCE 区域后发布
75
+ cc publish classes MyClass
76
+
77
+ # 4) 需要与服务器对齐时,拉取覆盖本地 SOURCE 区域
78
+ cc pull classes MyClass
79
+
80
+ # 5) 按已知线上类 ID 拉到指定项目(迁移、批量)
81
+ cc pullList classes <线上类ID> <projectPath>
82
+
83
+ # 6) 不再使用时删除线上类
84
+ cc delete classes MyClass
85
+ ```
86
+
87
+ ### 0.4 文档子命令
88
+
89
+ ```bash
90
+ cc doc classes introduction
91
+ cc doc classes devguide
92
+ ```
93
+
94
+ 仅支持 `introduction` 与 `devguide`,其他子命令会报错。
95
+
96
+ ---
97
+
98
+ ## 1. 概念与使用场景
99
+
100
+ ### 1.1 什么是自定义类
101
+
102
+ - 自定义类本质上是运行在 CloudCC 平台上的 Java 类。
103
+ - 可被以下模块调用:
104
+ - 自定义按钮
105
+ - 触发器
106
+ - 定时类 / 定时作业
107
+ - 自定义组件(通过 CCDK 请求自定义类)
108
+ - 典型用途:
109
+ - 封装复杂业务逻辑
110
+ - 查询 / 写入对象数据
111
+ - 调用自定义设置、发送邮件、记录开发日志
112
+
113
+ **注意**:调用 `CCService` 的方法时,需要对异常进行显式抛出或捕获。
114
+
115
+ ### 1.2 入口:进入类开发页面
116
+
117
+ 1. 登录 CloudCC 系统
118
+ 2. 点击右上角头像,选择「开发者平台」(仅对管理员简档用户开放)
119
+ 3. 左侧菜单:`扩展 → 类`,进入类开发页面
120
+
121
+ ---
122
+
123
+ ## 2. 示例:查询客户对象数据(AccountClass)
124
+
125
+ 下面是一个官方示例类:查询客户对象数据并返回 JSON。
126
+
127
+ ```java
128
+ import net.sf.json.JSONObject;
129
+ import net.sf.json.JSONArray;
130
+ import net.sf.json.JSON;
131
+
132
+ /**
133
+ * author:*** on 2022-10-12
134
+ * 客户类
135
+ */
136
+ public class AccountClass {
137
+ private CCService cs;
138
+ private UserInfo userInfo;
139
+
140
+ public AccountClass(UserInfo userInfo) {
141
+ this.userInfo = userInfo;
142
+ cs = new CCService(userInfo);
143
+ }
144
+
145
+ public JSONObject selectAccount() throws Exception {
146
+ JSONObject rtninfo = new JSONObject(); // 返回结果
147
+ JSONArray dataList = new JSONArray(); // 数据列表
148
+ boolean flag = false;
149
+ try {
150
+ // 查询客户对象数据
151
+ String sql = "select name, leixing, fenji, hangye from Account where is_deleted='0' ";
152
+ List<CCObject> accountList = cs.cqlQuery("Account", sql);
153
+
154
+ for (int i = 0; i < accountList.size(); i++) {
155
+ String name = accountList.get(i).get("name") == null ? "" : accountList.get(i).get("name").toString();
156
+ String type = accountList.get(i).get("leixing") == null ? "" : accountList.get(i).get("leixing").toString();
157
+ String grade = accountList.get(i).get("fenji") == null ? "0" : accountList.get(i).get("fenji").toString();
158
+ String industry = accountList.get(i).get("hangye") == null ? "0" : accountList.get(i).get("hangye").toString();
159
+
160
+ JSONObject data = new JSONObject();
161
+ data.put("name", name);
162
+ data.put("type", type);
163
+ data.put("grade", grade);
164
+ data.put("industry", industry);
165
+ data.put("no", (i + 1) + ""); // 序号
166
+ dataList.add(data);
167
+ }
168
+ flag = true;
169
+ } catch (Exception e) {
170
+ throw e;
171
+ }
172
+ rtninfo.put("status", flag);
173
+ rtninfo.put("data", dataList.toString());
174
+ return rtninfo;
175
+ }
176
+ }
177
+ ```
178
+
179
+ 要点:
180
+
181
+ - 构造函数接收 `UserInfo`,通过它实例化 `CCService`。
182
+ - 查询结果使用 `CCObject` 列表封装,再转为 `JSONObject`/`JSONArray` 返回。
183
+ - 方法签名抛出 `Exception`,调用方需要处理。
184
+
185
+ ---
186
+
187
+ ## 3. CCService:对象数据读写核心
188
+
189
+ > `CCService` 是操作 CloudCC 对象(类似
190
+ > ORM)的核心服务类,支持增删改查、自定义设置等。
191
+
192
+ ### 3.1 在类中实例化 CCService
193
+
194
+ 通用写法:
195
+
196
+ ```java
197
+ public class DemoClass {
198
+ private CCService cs;
199
+ private UserInfo userInfo;
200
+
201
+ public DemoClass(UserInfo userInfo) {
202
+ this.userInfo = userInfo;
203
+ this.cs = new CCService(userInfo);
204
+ }
205
+ }
206
+ ```
207
+
208
+ 在触发器中则通常不需要手动实例化,可直接使用平台提供的 `cs`(见触发器指南)。
209
+
210
+ ### 3.2 新增记录:insert
211
+
212
+ 1. 通过 `CCObject` 构造要插入的记录
213
+ 2. 调用 `cs.insert(对象)` 持久化到数据库
214
+
215
+ ```java
216
+ // 构造一个数据对象,传入对象 API 名称
217
+ CCObject opp = new CCObject("Opportunity");
218
+
219
+ // 给 CCObject 赋值,key 为字段 API 名称
220
+ opp.put("name", "新建机会");
221
+ opp.put("jine__c", 10000); // 示例:金额字段
222
+
223
+ // 插入数据库
224
+ cs.insert(opp);
225
+ ```
226
+
227
+ **注意**:ID、自动编号、创建人、创建时间等系统字段不需要也不应该手动赋值。
228
+
229
+ ### 3.3 查询记录:cquery
230
+
231
+ `cquery` 提供多种重载,用于按条件和排序查询数据。
232
+
233
+ - 返回对象全部记录:
234
+
235
+ ```java
236
+ List<CCObject> opps = cs.cquery("Opportunity");
237
+ ```
238
+
239
+ - 按条件查询(where 表达式):
240
+
241
+ ```java
242
+ List<CCObject> opps = cs.cquery(
243
+ "Opportunity",
244
+ "khmc__c = '" + record_new.get("id") + "'"
245
+ );
246
+ ```
247
+
248
+ - 按条件 + 排序:
249
+
250
+ ```java
251
+ List<CCObject> opps = cs.cquery(
252
+ "Opportunity",
253
+ "khmc__c = '" + record_new.get("id") + "'",
254
+ "jine__c desc"
255
+ );
256
+ ```
257
+
258
+ **注意**:条件与排序中的自定义字段 API 名称要加 `__c` 后缀。
259
+
260
+ ### 3.4 修改记录:update
261
+
262
+ ```java
263
+ // 先查询到目标记录
264
+ List<CCObject> list = cs.cquery("Opportunity", "id = '" + record_id + "'");
265
+ if (!list.isEmpty()) {
266
+ CCObject opp = list.get(0);
267
+ opp.put("name", "修改后的机会名称");
268
+ cs.update(opp);
269
+ }
270
+ ```
271
+
272
+ ### 3.5 删除记录:delete
273
+
274
+ ```java
275
+ List<CCObject> list = cs.cquery("Opportunity", "id = '" + record_id + "'");
276
+ if (!list.isEmpty()) {
277
+ CCObject opp = list.get(0);
278
+ cs.delete(opp);
279
+ }
280
+ ```
281
+
282
+ ### 3.6 操作共享表
283
+
284
+ #### 查询共享表
285
+
286
+ ```java
287
+ // isDataObject 传 false,表示查询共享表
288
+ List<CCObject> shares = cs.cquery(
289
+ "Opportunity",
290
+ "userid = '" + userId + "'",
291
+ false
292
+ );
293
+ ```
294
+
295
+ #### 删除共享表记录
296
+
297
+ ```java
298
+ cs.deleteShareObjectBySql("Opportunity", "userid = '" + userId + "'");
299
+ ```
300
+
301
+ **注意**:共享表中表达式里的字段 **不需要加 `__c` 后缀**。
302
+
303
+ ### 3.7 自定义设置(CustomSetting)
304
+
305
+ #### 列表类型自定义设置(List)
306
+
307
+ - 返回某个 API 名称下的全部数据:
308
+
309
+ ```java
310
+ Map listSettings = cs.getListCustomSetting("MyListSettingApiName");
311
+ ```
312
+
313
+ - 返回指定 `Name` 的单条数据:
314
+
315
+ ```java
316
+ Map singleSetting = cs.getListCustomSetting("MyListSettingApiName", "SomeName");
317
+ ```
318
+
319
+ #### 层次结构类型自定义设置(Hierarchy)
320
+
321
+ ```java
322
+ // id 为简档 ID 或用户 ID
323
+ Map hiSetting = cs.getCustomSetting("MyHierarchySettingApiName", profileOrUserId);
324
+ ```
325
+
326
+ ---
327
+
328
+ ## 4. 常用工具类
329
+
330
+ ### 4.1 SendEmail:发送邮件
331
+
332
+ ```java
333
+ SendEmail sendEmail = new SendEmail(userInfo);
334
+ sendEmail.sendMailFromSystem(
335
+ new String[]{"to@example.com"}, // 收件人
336
+ new String[]{"cc@example.com"}, // 抄送
337
+ new String[]{"bcc@example.com"}, // 密送
338
+ "邮件主题",
339
+ "邮件内容",
340
+ true // 是否纯文本
341
+ );
342
+ ```
343
+
344
+ ### 4.2 DevLogger:开发日志
345
+
346
+ > 用于在自定义类中记录开发日志,便于排查问题。
347
+
348
+ ```java
349
+ // 初始化日志类
350
+ DevLogger cclogger = new DevLogger(userInfo);
351
+
352
+ // 打印 info 级别日志
353
+ cclogger.devLogInfo("这是 info 日志");
354
+
355
+ // 打印 error 级别日志
356
+ cclogger.devLogError("这是 error 日志");
357
+
358
+ // 打印异常堆栈
359
+ try {
360
+ // 业务逻辑
361
+ } catch (Exception e) {
362
+ cclogger.devLogError("发生异常", e);
363
+ throw e;
364
+ }
365
+ ```
366
+
367
+ ### 4.3 TimeUtil:多时区日期时间
368
+
369
+ > 为保证跨时区时间的准确性,推荐使用 `TimeUtil` 获取当前时间与时间格式化工具。
370
+
371
+ - 获取当前时间(根据用户时区):
372
+
373
+ ```java
374
+ TpSysTask task = new TpSysTask();
375
+ task.setBeginTime(TimeUtil.getNowDate(userInfo));
376
+ ```
377
+
378
+ - 使用 `SimpleDateFormat` 时设置时区:
379
+
380
+ ```java
381
+ SimpleDateFormat myDateFormat = new SimpleDateFormat("yyyy-MM-dd");
382
+ myDateFormat.setTimeZone(TimeUtil.getUserTimeZone(userInfo));
383
+ ```
384
+
385
+ - 使用工具方法直接获取带时区的 `SimpleDateFormat`:
386
+
387
+ ```java
388
+ SimpleDateFormat myDateFormat =
389
+ TimeUtil.getSimpleDateFormat("yyyy-MM-dd", userInfo);
390
+ ```
391
+
392
+ - 使用 `Calendar` 时设置时区:
393
+
394
+ ```java
395
+ // 方式一
396
+ Calendar cal = Calendar.getInstance(TimeUtil.getUserTimeZone(userInfo));
397
+
398
+ // 方式二(推荐使用工具方法)
399
+ Calendar cal2 = TimeUtil.getCalendar(userInfo);
400
+ ```
401
+
402
+ ### 4.4 CCObject:数据载体
403
+
404
+ ```java
405
+ // 构造一个数据对象,传入对象 API 名称
406
+ CCObject opp = new CCObject("Opportunity");
407
+
408
+ // 构造一个共享表对象
409
+ CCObject oppshare = new CCObject("Opportunity", CCObject.IS_SHARED);
410
+
411
+ // 赋值
412
+ opp.put("name", "value");
413
+ ```
414
+
415
+ ---
416
+
417
+ ## 5. 自定义类与其他模块的配合
418
+
419
+ ### 5.1 触发器中使用类
420
+
421
+ - 触发器可以直接调用自定义类中的方法,也可以直接使用 `CCService`。
422
+ - 触发器由 CloudCC 平台动态编译,调用写法与普通 Java 方法调用类似。
423
+ - 典型模式:
424
+ - 在触发器中只做入口和参数准备
425
+ - 将复杂逻辑委托给自定义类方法
426
+
427
+ (触发器具体语法与最佳实践详见 `custom-trigger-dev.md`。)
428
+
429
+ ### 5.2 自定义类调用其他自定义类(PageClsInvoker)
430
+
431
+ > 当需要在一个自定义类中调用另一个自定义类的方法时,可使用 `PageClsInvoker` 的
432
+ > `invoker` 方法。
433
+
434
+ `invoker` 有两个常用重载:
435
+
436
+ ```java
437
+ Object invoker(String className, String method, List<Map> conlist, List<Map> arglist);
438
+ Object invoker(String className, String method, List<Map> conlist, Map map);
439
+ ```
440
+
441
+ 参数说明:
442
+
443
+ - `className`:目标自定义类名称
444
+ - `method`:要调用的方法名
445
+ - `conlist`:构造器参数列表(可为 `null`)
446
+ - 每个 Map 包含:
447
+ - `argType`:参数类型
448
+ - `argValue`:参数值
449
+ - `arglist` / `map`:方法参数
450
+ - 同样包含 `argType` 和 `argValue`
451
+
452
+ #### 5.2.1 使用 Map 作为方法参数
453
+
454
+ 目标类:
455
+
456
+ ```java
457
+ public class Hello {
458
+
459
+ public Hello() {}
460
+
461
+ public Hello(UserInfo userInfo) {
462
+ System.out.print("测试");
463
+ }
464
+
465
+ public void test5(Map map) throws Exception {
466
+ System.out.print("获取 map 中的值" + map.get("name"));
467
+ }
468
+ }
469
+ ```
470
+
471
+ 调用方:
472
+
473
+ ```java
474
+ List<Map> conlist = new ArrayList<Map>();
475
+
476
+ Map c = new HashMap();
477
+ c.put("argType", UserInfo.class);
478
+ c.put("argValue", userInfo);
479
+ conlist.add(c);
480
+
481
+ Map m = new HashMap();
482
+ m.put("name", "Alex");
483
+
484
+ new PageClsInvoker(userInfo).invoker("Hello", "test5", conlist, m);
485
+ ```
486
+
487
+ #### 5.2.2 使用 List<Map> 作为方法参数列表
488
+
489
+ 目标类:
490
+
491
+ ```java
492
+ public class Hello {
493
+
494
+ public Hello() {}
495
+
496
+ public ServiceResult test3(UserInfo userInfo, String leadName) throws Exception {
497
+ CCService cs = new CCService((UserInfo) userInfo);
498
+ CCObject co = new CCObject("Lead");
499
+ co.put("name", leadName);
500
+ ServiceResult sr = cs.insert(co);
501
+ return sr;
502
+ }
503
+ }
504
+ ```
505
+
506
+ 调用方:
507
+
508
+ ```java
509
+ List<Map> arglist = new ArrayList<Map>();
510
+
511
+ Map u = new HashMap();
512
+ u.put("argType", UserInfo.class);
513
+ u.put("argValue", userInfo);
514
+ arglist.add(u);
515
+
516
+ Map n = new HashMap();
517
+ n.put("argType", String.class);
518
+ n.put("argValue", "Alex");
519
+ arglist.add(n);
520
+
521
+ new PageClsInvoker(userInfo).invoker("Hello", "test3", null, arglist);
522
+ ```
523
+
524
+ ---
525
+
526
+ ## 6. 自定义类开发 Checklist
527
+
528
+ - [ ] 类目录与平台同步仅通过 `cc create` / `cc pull` / `cc pullList` /
529
+ `cc publish` / `cc delete` 等命令操作,不手工造目录或改 `config.json` 的
530
+ `id`
531
+ - [ ] 类名、方法名与调用方(按钮/触发器/组件/定时作业)约定一致
532
+ - [ ] 构造函数正确接收 `UserInfo` 并实例化 `CCService` 等依赖
533
+ - [ ] 所有 `CCService` 操作(`insert`/`update`/`delete`/`cquery`)使用正确的对象
534
+ API 名称和字段 API 名称(自定义字段加 `__c`)
535
+ - [ ] 访问共享表时,表达式中的字段未错误地添加 `__c` 后缀
536
+ - [ ] 涉及时间处理的逻辑统一使用 `TimeUtil`,避免时区问题
537
+ - [ ] 异常统一捕获并按需抛出,同时使用 `DevLogger` 记录关键错误信息
538
+ - [ ] 使用 `SendEmail` 时确认收件地址与内容来源安全可靠
539
+ - [ ] 使用 `PageClsInvoker` 跨类调用时,`argType` 与 `argValue` 类型匹配
540
+ - [ ] 对外暴露的方法返回结构(如
541
+ `JSONObject`)与前端/调用方约定一致,字段清晰、语义明确
@@ -1,9 +1,16 @@
1
1
  const { getPackageJson } = require("../../utils/config")
2
2
  const { postClass } = require("../../utils/http")
3
3
 
4
- async function get(arg, path, isMcp = false) {
4
+ /**
5
+ * cc get classes [listQueryJson] [projectPath]
6
+ * @param {string[]} argvs [action, type, listQuery?, projectPath?, isMcp?]
7
+ */
8
+ async function get(argvs) {
9
+ const arg = argvs[2]
10
+ const projectPath = argvs[3]
11
+ const isMcp = Boolean(argvs[4])
5
12
  let body = arg != null && arg != '' ? JSON.parse(decodeURI(arg)) : { shownum: "2000", showpage: "1", fid: "", sname: '', rptcond: '', rptorder: '' }
6
- let config = await getPackageJson(path);
13
+ let config = await getPackageJson(projectPath);
7
14
  let res = await postClass(config.setupSvc + "/api/ccfag/list", body, config.accessToken)
8
15
  if (res.result) {
9
16
  const simpleList = (res.data.list || []).map(item => ({
@@ -7,8 +7,9 @@ cc.pullList = require("./pullList")
7
7
  cc.detail = require("./detail")
8
8
  cc.doc = require("./doc")
9
9
  cc.delete = require("./delete")
10
+
10
11
  function Classes(action, argvs) {
11
- cc[action](argvs[2], argvs[3])
12
+ cc[action](argvs)
12
13
  }
13
14
 
14
15
  module.exports = Classes;
@@ -9,7 +9,12 @@ const { javaContentRegular } = require("../../utils/utils")
9
9
 
10
10
  const { getPackageJson } = require("../../utils/config")
11
11
 
12
- async function publish(name) {
12
+ /**
13
+ * cc publish classes <name>
14
+ * @param {string[]} argvs [action, type, name, ...]
15
+ */
16
+ async function publish(argvs) {
17
+ const name = argvs[2]
13
18
  let res = await checkUpdate();
14
19
  if (!res) {
15
20
  console.error();
@@ -8,7 +8,12 @@ const { javaContentRegular } = require("../../utils/utils")
8
8
  const { getPackageJson } = require("../../utils/config")
9
9
  const { postClass } = require("../../utils/http")
10
10
 
11
- async function pull(name) {
11
+ /**
12
+ * cc pull classes <name>
13
+ * @param {string[]} argvs [action, type, name, ...]
14
+ */
15
+ async function pull(argvs) {
16
+ const name = argvs[2]
12
17
  let res = await checkUpdate();
13
18
  if (!res) {
14
19
  console.error();
@@ -4,10 +4,13 @@ const { getPackageJson } = require("../../utils/config");
4
4
  const { postClass } = require("../../utils/http");
5
5
 
6
6
  /**
7
- * Batch pull class details and generate local files
8
- * @param class id
7
+ * cc pullList classes <id> <projectPath>
8
+ * @param {string[]} argvs [action, type, id, projectPath?, isMcp?]
9
9
  */
10
- async function pullList(id, url, isMcp = false) {
10
+ async function pullList(argvs) {
11
+ const id = argvs[2]
12
+ const url = argvs[3]
13
+ const isMcp = Boolean(argvs[4])
11
14
  let config = await getPackageJson(url);
12
15
  const body = { id };
13
16
  const res = await postClass(config.setupSvc + "/api/ccfag/detail", body, config.accessToken);
@@ -0,0 +1,31 @@
1
+ /**
2
+ * config 文档入口:正文在 `docs/` 目录。
3
+ */
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+
7
+ const DOCS_DIR = path.join(__dirname, "docs");
8
+
9
+ function getDevGuideDoc() {
10
+ return fs.readFileSync(path.join(DOCS_DIR, "devguide.md"), "utf8");
11
+ }
12
+
13
+ /**
14
+ * cc doc config devguide
15
+ * @param {string[]} argvs [doc, config, devguide, ...]
16
+ */
17
+ function doc(argvs) {
18
+ const subType = argvs[2];
19
+ const key = String(subType || "").trim().toLowerCase();
20
+ if (!key) {
21
+ throw new Error("cc doc config 需要子命令:devguide");
22
+ }
23
+ if (key === "devguide") {
24
+ const content = getDevGuideDoc();
25
+ console.log(content);
26
+ return content;
27
+ }
28
+ throw new Error(`doc 不支持的子命令: ${subType},请使用 devguide`);
29
+ }
30
+
31
+ module.exports = doc;