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,81 @@
1
+ # CloudCC 应用模块介绍
2
+
3
+ ## 1. 模块定位
4
+
5
+ `application` 模块用于在 CloudCC 中创建和管理应用程序(Application)。
6
+
7
+ 应用是菜单与功能入口的承载容器。对象菜单、页面菜单、脚本菜单通常需要归属于某个应用,业务用户才会在对应导航中看到完整功能集合。
8
+
9
+ ---
10
+
11
+ ## 2. 应用能做什么
12
+
13
+ 通过 `application` 模块,你可以:
14
+
15
+ - 创建新应用并设置应用名称、代码
16
+ - 绑定菜单集合(支持多菜单 ID)
17
+ - 获取当前组织内应用列表
18
+ - 删除指定应用
19
+
20
+ ---
21
+
22
+ ## 3. 应用在平台中的作用
23
+
24
+ 应用解决的是“功能编排与入口组织”问题:
25
+
26
+ - 将零散菜单按业务域组织为统一导航体验
27
+ - 给不同业务线提供独立的应用入口
28
+ - 配合简档权限,控制不同角色可见的应用能力
29
+
30
+ ---
31
+
32
+ ## 4. 典型使用流程
33
+
34
+ 在 CloudCC 中,应用相关流程通常如下:
35
+
36
+ 1. 准备对象、页面、脚本等能力
37
+ 2. 创建或确认对应菜单入口
38
+ 3. 创建应用并绑定菜单
39
+ 4. 验证应用在目标角色下的可见性与可用性
40
+
41
+ `cloudcc-cli` 主要覆盖第 3 步(应用创建/查询/删除),建议结合菜单与权限配置一同验收。
42
+
43
+ ---
44
+
45
+ ## 5. 适用场景
46
+
47
+ 以下场景建议使用 `application` 模块:
48
+
49
+ - 新项目上线,需要快速搭建业务导航应用
50
+ - 多业务线并行,需要拆分不同应用入口
51
+ - 现有菜单较多,需要按业务域重新归类到应用
52
+ - 自动化脚本中需要批量创建和清理测试应用
53
+
54
+ ---
55
+
56
+ ## 6. 与其他模块的关系
57
+
58
+ `application` 常与以下模块协同:
59
+
60
+ - `menu`:应用通过菜单承载具体入口
61
+ - `object`:对象能力常通过对象菜单进入应用
62
+ - `customPage`:页面能力可通过页面菜单加入应用
63
+ - `script`:脚本能力可通过脚本菜单加入应用
64
+
65
+ ---
66
+
67
+ ## 7. 建议实践
68
+
69
+ - 应用命名与编码遵循统一规范(如业务域前缀)
70
+ - 创建前先梳理菜单清单,避免重复或遗漏入口
71
+ - 先在测试环境验证应用可见性,再推广到生产环境
72
+ - 变更应用菜单后,回归验证关键业务流程是否可达
73
+
74
+ ---
75
+
76
+ ## 8. 相关文档与命令
77
+
78
+ ```bash
79
+ cc doc application introduction
80
+ cc doc application devguide
81
+ ```
@@ -2,6 +2,7 @@ const cc = {}
2
2
  cc.get = require("./get")
3
3
  cc.create = require("./create")
4
4
  cc.delete = require("./delete")
5
+ cc.doc = require("./doc")
5
6
  function main(action, argvs) {
6
7
  cc[action](argvs)
7
8
  }
package/src/brief/get.js CHANGED
@@ -6,7 +6,7 @@ async function get(argvs) {
6
6
  let path = argvs[2]
7
7
  let config = await getPackageJson(path);
8
8
 
9
- // 调用接口获取自定义对象页面信息
9
+ // 获取简档列表
10
10
  let response = await postClass(
11
11
  config.setupSvc + "/api/customObject/newPage",
12
12
  {
@@ -4,7 +4,12 @@ const path = require("path")
4
4
  const chalk = require("chalk")
5
5
  const { getPackageJson } = require("../../utils/config.js")
6
6
 
7
- async function create(name) {
7
+ /**
8
+ * cc create classes <name>
9
+ * @param {string[]} argvs [action, type, name, ...]
10
+ */
11
+ async function create(argvs) {
12
+ const name = argvs[2]
8
13
  let res = await checkUpdate();
9
14
  if (!res) {
10
15
  let config = await getPackageJson();
@@ -4,7 +4,13 @@ const chalk = require("chalk");
4
4
  const { getPackageJson } = require("../../utils/config");
5
5
  const { postClass } = require("../../utils/http");
6
6
 
7
- async function remove(nameOrId, projectPath = process.cwd()) {
7
+ /**
8
+ * cc delete classes <nameOrId> [projectPath]
9
+ * @param {string[]} argvs [action, type, nameOrId, projectPath?]
10
+ */
11
+ async function remove(argvs) {
12
+ const nameOrId = argvs[2]
13
+ const projectPath = argvs[3] != null && argvs[3] !== '' ? argvs[3] : process.cwd()
8
14
  let classId = nameOrId;
9
15
  const classPath = path.join(projectPath, `classes/${nameOrId}/`);
10
16
  const configPath = path.join(classPath, "config.json");
@@ -11,7 +11,14 @@ function outputResult(result, isMcp) {
11
11
  return result;
12
12
  }
13
13
 
14
- async function detail(name, id, isMcp = false) {
14
+ /**
15
+ * cc detail classes <name> <id>
16
+ * @param {string[]} argvs [action, type, name?, id?, isMcp?]
17
+ */
18
+ async function detail(argvs) {
19
+ const name = argvs[2]
20
+ const id = argvs[3]
21
+ const isMcp = Boolean(argvs[4])
15
22
  // 如果有 name,优先查询本地
16
23
  if (name && name !== '') {
17
24
  const classPath = path.join(process.cwd(), `classes/${name}/`);
@@ -1,486 +1,63 @@
1
1
  /**
2
- * classes 文档统一入口(合并自 prompt.js + classEditor.js)
2
+ * classes 文档入口:正文均在 `docs/` 目录,本文件只负责按子命令读取并输出。
3
3
  */
4
4
  const fs = require("fs");
5
5
  const path = require("path");
6
6
 
7
- function generateFullMarkdownDoc() {
8
- const lines = [
9
- '# CloudCC 自定义类开发指南',
10
- '',
11
- '> 本文档参考 CloudCC 官方「自定义类」文档整理而成:[自定义类](https://help.cloudcc.cn/product03/zi-ding-yi-lei/)。 ',
12
- '> 目标:指导开发者在 CloudCC 平台上编写 Java 自定义类,熟练使用 `CCService`、`CCObject`、`SendEmail`、`DevLogger`、`TimeUtil` 等工具类,并理解类在触发器、定时作业、自定义组件中的调用方式。',
13
- '',
14
- '---',
15
- '',
16
- '## 1. 概念与使用场景',
17
- '',
18
- '### 1.1 什么是自定义类',
19
- '',
20
- '- 自定义类本质上是运行在 CloudCC 平台上的 Java 类。 ',
21
- '- 可被以下模块调用:',
22
- ' - 自定义按钮',
23
- ' - 触发器',
24
- ' - 定时类 / 定时作业',
25
- ' - 自定义组件(通过 CCDK 请求自定义类)',
26
- '- 典型用途:',
27
- ' - 封装复杂业务逻辑',
28
- ' - 查询 / 写入对象数据',
29
- ' - 调用自定义设置、发送邮件、记录开发日志',
30
- '',
31
- '**注意**:调用 `CCService` 的方法时,需要对异常进行显式抛出或捕获。',
32
- '',
33
- '### 1.2 入口:进入类开发页面',
34
- '',
35
- '1. 登录 CloudCC 系统 ',
36
- '2. 点击右上角头像,选择「开发者平台」(仅对管理员简档用户开放) ',
37
- '3. 左侧菜单:`扩展 → 类`,进入类开发页面',
38
- '',
39
- '---',
40
- '',
41
- '## 2. 示例:查询客户对象数据(AccountClass)',
42
- '',
43
- '下面是一个官方示例类:查询客户对象数据并返回 JSON。',
44
- '',
45
- '```java',
46
- 'import net.sf.json.JSONObject;',
47
- 'import net.sf.json.JSONArray;',
48
- 'import net.sf.json.JSON;',
49
- '',
50
- '/**',
51
- ' * author:*** on 2022-10-12',
52
- ' * 客户类',
53
- ' */',
54
- 'public class AccountClass {',
55
- ' private CCService cs;',
56
- ' private UserInfo userInfo;',
57
- '',
58
- ' public AccountClass(UserInfo userInfo) {',
59
- ' this.userInfo = userInfo;',
60
- ' cs = new CCService(userInfo);',
61
- ' }',
62
- '',
63
- ' public JSONObject selectAccount() throws Exception {',
64
- ' JSONObject rtninfo = new JSONObject(); // 返回结果',
65
- ' JSONArray dataList = new JSONArray(); // 数据列表',
66
- ' boolean flag = false;',
67
- ' try {',
68
- ' // 查询客户对象数据',
69
- ' String sql = "select name, leixing, fenji, hangye from Account where is_deleted=\'0\' ";',
70
- ' List<CCObject> accountList = cs.cqlQuery("Account", sql);',
71
- '',
72
- ' for (int i = 0; i < accountList.size(); i++) {',
73
- ' String name = accountList.get(i).get("name") == null ? "" : accountList.get(i).get("name").toString();',
74
- ' String type = accountList.get(i).get("leixing") == null ? "" : accountList.get(i).get("leixing").toString();',
75
- ' String grade = accountList.get(i).get("fenji") == null ? "0" : accountList.get(i).get("fenji").toString();',
76
- ' String industry = accountList.get(i).get("hangye") == null ? "0" : accountList.get(i).get("hangye").toString();',
77
- '',
78
- ' JSONObject data = new JSONObject();',
79
- ' data.put("name", name);',
80
- ' data.put("type", type);',
81
- ' data.put("grade", grade);',
82
- ' data.put("industry", industry);',
83
- ' data.put("no", (i + 1) + ""); // 序号',
84
- ' dataList.add(data);',
85
- ' }',
86
- ' flag = true;',
87
- ' } catch (Exception e) {',
88
- ' throw e;',
89
- ' }',
90
- ' rtninfo.put("status", flag);',
91
- ' rtninfo.put("data", dataList.toString());',
92
- ' return rtninfo;',
93
- ' }',
94
- '}',
95
- '```',
96
- '',
97
- '要点:',
98
- '- 构造函数接收 `UserInfo`,通过它实例化 `CCService`。 ',
99
- '- 查询结果使用 `CCObject` 列表封装,再转为 `JSONObject`/`JSONArray` 返回。 ',
100
- '- 方法签名抛出 `Exception`,调用方需要处理。',
101
- '',
102
- '---',
103
- '',
104
- '## 3. CCService:对象数据读写核心',
105
- '',
106
- '> `CCService` 是操作 CloudCC 对象(类似 ORM)的核心服务类,支持增删改查、自定义设置等。',
107
- '',
108
- '### 3.1 在类中实例化 CCService',
109
- '',
110
- '通用写法:',
111
- '',
112
- '```java',
113
- 'public class DemoClass {',
114
- ' private CCService cs;',
115
- ' private UserInfo userInfo;',
116
- '',
117
- ' public DemoClass(UserInfo userInfo) {',
118
- ' this.userInfo = userInfo;',
119
- ' this.cs = new CCService(userInfo);',
120
- ' }',
121
- '}',
122
- '```',
123
- '',
124
- '在触发器中则通常不需要手动实例化,可直接使用平台提供的 `cs`(见触发器指南)。',
125
- '',
126
- '### 3.2 新增记录:insert',
127
- '',
128
- '1. 通过 `CCObject` 构造要插入的记录 ',
129
- '2. 调用 `cs.insert(对象)` 持久化到数据库',
130
- '',
131
- '```java',
132
- '// 构造一个数据对象,传入对象 API 名称',
133
- 'CCObject opp = new CCObject("Opportunity");',
134
- '',
135
- '// 给 CCObject 赋值,key 为字段 API 名称',
136
- 'opp.put("name", "新建机会");',
137
- 'opp.put("jine__c", 10000); // 示例:金额字段',
138
- '',
139
- '// 插入数据库',
140
- 'cs.insert(opp);',
141
- '```',
142
- '',
143
- '**注意**:ID、自动编号、创建人、创建时间等系统字段不需要也不应该手动赋值。',
144
- '',
145
- '### 3.3 查询记录:cquery',
146
- '',
147
- '`cquery` 提供多种重载,用于按条件和排序查询数据。',
148
- '',
149
- '- 返回对象全部记录:',
150
- '',
151
- '```java',
152
- 'List<CCObject> opps = cs.cquery("Opportunity");',
153
- '```',
154
- '',
155
- '- 按条件查询(where 表达式):',
156
- '',
157
- '```java',
158
- 'List<CCObject> opps = cs.cquery(',
159
- ' "Opportunity",',
160
- ' "khmc__c = \'" + record_new.get("id") + "\'"',
161
- ');',
162
- '```',
163
- '',
164
- '- 按条件 + 排序:',
165
- '',
166
- '```java',
167
- 'List<CCObject> opps = cs.cquery(',
168
- ' "Opportunity",',
169
- ' "khmc__c = \'" + record_new.get("id") + "\'",',
170
- ' "jine__c desc"',
171
- ');',
172
- '```',
173
- '',
174
- '**注意**:条件与排序中的自定义字段 API 名称要加 `__c` 后缀。',
175
- '',
176
- '### 3.4 修改记录:update',
177
- '',
178
- '```java',
179
- '// 先查询到目标记录',
180
- 'List<CCObject> list = cs.cquery("Opportunity", "id = \'" + record_id + "\'");',
181
- 'if (!list.isEmpty()) {',
182
- ' CCObject opp = list.get(0);',
183
- ' opp.put("name", "修改后的机会名称");',
184
- ' cs.update(opp);',
185
- '}',
186
- '```',
187
- '',
188
- '### 3.5 删除记录:delete',
189
- '',
190
- '```java',
191
- 'List<CCObject> list = cs.cquery("Opportunity", "id = \'" + record_id + "\'");',
192
- 'if (!list.isEmpty()) {',
193
- ' CCObject opp = list.get(0);',
194
- ' cs.delete(opp);',
195
- '}',
196
- '```',
197
- '',
198
- '### 3.6 操作共享表',
199
- '',
200
- '#### 查询共享表',
201
- '',
202
- '```java',
203
- '// isDataObject 传 false,表示查询共享表',
204
- 'List<CCObject> shares = cs.cquery(',
205
- ' "Opportunity",',
206
- ' "userid = \'" + userId + "\'",',
207
- ' false',
208
- ');',
209
- '```',
210
- '',
211
- '#### 删除共享表记录',
212
- '',
213
- '```java',
214
- 'cs.deleteShareObjectBySql("Opportunity", "userid = \'" + userId + "\'");',
215
- '```',
216
- '',
217
- '**注意**:共享表中表达式里的字段 **不需要加 `__c` 后缀**。',
218
- '',
219
- '### 3.7 自定义设置(CustomSetting)',
220
- '',
221
- '#### 列表类型自定义设置(List)',
222
- '',
223
- '- 返回某个 API 名称下的全部数据:',
224
- '',
225
- '```java',
226
- 'Map listSettings = cs.getListCustomSetting("MyListSettingApiName");',
227
- '```',
228
- '',
229
- '- 返回指定 `Name` 的单条数据:',
230
- '',
231
- '```java',
232
- 'Map singleSetting = cs.getListCustomSetting("MyListSettingApiName", "SomeName");',
233
- '```',
234
- '',
235
- '#### 层次结构类型自定义设置(Hierarchy)',
236
- '',
237
- '```java',
238
- '// id 为简档 ID 或用户 ID',
239
- 'Map hiSetting = cs.getCustomSetting("MyHierarchySettingApiName", profileOrUserId);',
240
- '```',
241
- '',
242
- '---',
243
- '',
244
- '## 4. 常用工具类',
245
- '',
246
- '### 4.1 SendEmail:发送邮件',
247
- '',
248
- '```java',
249
- 'SendEmail sendEmail = new SendEmail(userInfo);',
250
- 'sendEmail.sendMailFromSystem(',
251
- ' new String[]{"to@example.com"}, // 收件人',
252
- ' new String[]{"cc@example.com"}, // 抄送',
253
- ' new String[]{"bcc@example.com"}, // 密送',
254
- ' "邮件主题",',
255
- ' "邮件内容",',
256
- ' true // 是否纯文本',
257
- ');',
258
- '```',
259
- '',
260
- '### 4.2 DevLogger:开发日志',
261
- '',
262
- '> 用于在自定义类中记录开发日志,便于排查问题。',
263
- '',
264
- '```java',
265
- '// 初始化日志类',
266
- 'DevLogger cclogger = new DevLogger(userInfo);',
267
- '',
268
- '// 打印 info 级别日志',
269
- 'cclogger.devLogInfo("这是 info 日志");',
270
- '',
271
- '// 打印 error 级别日志',
272
- 'cclogger.devLogError("这是 error 日志");',
273
- '',
274
- '// 打印异常堆栈',
275
- 'try {',
276
- ' // 业务逻辑',
277
- '} catch (Exception e) {',
278
- ' cclogger.devLogError("发生异常", e);',
279
- ' throw e;',
280
- '}',
281
- '```',
282
- '',
283
- '### 4.3 TimeUtil:多时区日期时间',
284
- '',
285
- '> 为保证跨时区时间的准确性,推荐使用 `TimeUtil` 获取当前时间与时间格式化工具。',
286
- '',
287
- '- 获取当前时间(根据用户时区):',
288
- '',
289
- '```java',
290
- 'TpSysTask task = new TpSysTask();',
291
- 'task.setBeginTime(TimeUtil.getNowDate(userInfo));',
292
- '```',
293
- '',
294
- '- 使用 `SimpleDateFormat` 时设置时区:',
295
- '',
296
- '```java',
297
- 'SimpleDateFormat myDateFormat = new SimpleDateFormat("yyyy-MM-dd");',
298
- 'myDateFormat.setTimeZone(TimeUtil.getUserTimeZone(userInfo));',
299
- '```',
300
- '',
301
- '- 使用工具方法直接获取带时区的 `SimpleDateFormat`:',
302
- '',
303
- '```java',
304
- 'SimpleDateFormat myDateFormat =',
305
- ' TimeUtil.getSimpleDateFormat("yyyy-MM-dd", userInfo);',
306
- '```',
307
- '',
308
- '- 使用 `Calendar` 时设置时区:',
309
- '',
310
- '```java',
311
- '// 方式一',
312
- 'Calendar cal = Calendar.getInstance(TimeUtil.getUserTimeZone(userInfo));',
313
- '',
314
- '// 方式二(推荐使用工具方法)',
315
- 'Calendar cal2 = TimeUtil.getCalendar(userInfo);',
316
- '```',
317
- '',
318
- '### 4.4 CCObject:数据载体',
319
- '',
320
- '```java',
321
- '// 构造一个数据对象,传入对象 API 名称',
322
- 'CCObject opp = new CCObject("Opportunity");',
323
- '',
324
- '// 构造一个共享表对象',
325
- 'CCObject oppshare = new CCObject("Opportunity", CCObject.IS_SHARED);',
326
- '',
327
- '// 赋值',
328
- 'opp.put("name", "value");',
329
- '```',
330
- '',
331
- '---',
332
- '',
333
- '## 5. 自定义类与其他模块的配合',
334
- '',
335
- '### 5.1 触发器中使用类',
336
- '',
337
- '- 触发器可以直接调用自定义类中的方法,也可以直接使用 `CCService`。 ',
338
- '- 触发器由 CloudCC 平台动态编译,调用写法与普通 Java 方法调用类似。',
339
- '- 典型模式:',
340
- ' - 在触发器中只做入口和参数准备',
341
- ' - 将复杂逻辑委托给自定义类方法',
342
- '',
343
- '(触发器具体语法与最佳实践详见 `custom-trigger-dev.md`。)',
344
- '',
345
- '### 5.2 自定义类调用其他自定义类(PageClsInvoker)',
346
- '',
347
- '> 当需要在一个自定义类中调用另一个自定义类的方法时,可使用 `PageClsInvoker` 的 `invoker` 方法。',
348
- '',
349
- '`invoker` 有两个常用重载:',
350
- '',
351
- '```java',
352
- 'Object invoker(String className, String method, List<Map> conlist, List<Map> arglist);',
353
- 'Object invoker(String className, String method, List<Map> conlist, Map map);',
354
- '```',
355
- '',
356
- '参数说明:',
357
- '- `className`:目标自定义类名称',
358
- '- `method`:要调用的方法名',
359
- '- `conlist`:构造器参数列表(可为 `null`)',
360
- ' - 每个 Map 包含:',
361
- ' - `argType`:参数类型',
362
- ' - `argValue`:参数值',
363
- '- `arglist` / `map`:方法参数',
364
- ' - 同样包含 `argType` 和 `argValue`',
365
- '',
366
- '#### 5.2.1 使用 Map 作为方法参数',
367
- '',
368
- '目标类:',
369
- '',
370
- '```java',
371
- 'public class Hello {',
372
- '',
373
- ' public Hello() {}',
374
- '',
375
- ' public Hello(UserInfo userInfo) {',
376
- ' System.out.print("测试");',
377
- ' }',
378
- '',
379
- ' public void test5(Map map) throws Exception {',
380
- ' System.out.print("获取 map 中的值" + map.get("name"));',
381
- ' }',
382
- '}',
383
- '```',
384
- '',
385
- '调用方:',
386
- '',
387
- '```java',
388
- 'List<Map> conlist = new ArrayList<Map>();',
389
- '',
390
- 'Map c = new HashMap();',
391
- 'c.put("argType", UserInfo.class);',
392
- 'c.put("argValue", userInfo);',
393
- 'conlist.add(c);',
394
- '',
395
- 'Map m = new HashMap();',
396
- 'm.put("name", "Alex");',
397
- '',
398
- 'new PageClsInvoker(userInfo).invoker("Hello", "test5", conlist, m);',
399
- '```',
400
- '',
401
- '#### 5.2.2 使用 List<Map> 作为方法参数列表',
402
- '',
403
- '目标类:',
404
- '',
405
- '```java',
406
- 'public class Hello {',
407
- '',
408
- ' public Hello() {}',
409
- '',
410
- ' public ServiceResult test3(UserInfo userInfo, String leadName) throws Exception {',
411
- ' CCService cs = new CCService((UserInfo) userInfo);',
412
- ' CCObject co = new CCObject("Lead");',
413
- ' co.put("name", leadName);',
414
- ' ServiceResult sr = cs.insert(co);',
415
- ' return sr;',
416
- ' }',
417
- '}',
418
- '```',
419
- '',
420
- '调用方:',
421
- '',
422
- '```java',
423
- 'List<Map> arglist = new ArrayList<Map>();',
424
- '',
425
- 'Map u = new HashMap();',
426
- 'u.put("argType", UserInfo.class);',
427
- 'u.put("argValue", userInfo);',
428
- 'arglist.add(u);',
429
- '',
430
- 'Map n = new HashMap();',
431
- 'n.put("argType", String.class);',
432
- 'n.put("argValue", "Alex");',
433
- 'arglist.add(n);',
434
- '',
435
- 'new PageClsInvoker(userInfo).invoker("Hello", "test3", null, arglist);',
436
- '```',
437
- '',
438
- '---',
439
- '',
440
- '## 6. 自定义类开发 Checklist',
441
- '',
442
- '- [ ] 类名、方法名与调用方(按钮/触发器/组件/定时作业)约定一致 ',
443
- '- [ ] 构造函数正确接收 `UserInfo` 并实例化 `CCService` 等依赖 ',
444
- '- [ ] 所有 `CCService` 操作(`insert`/`update`/`delete`/`cquery`)使用正确的对象 API 名称和字段 API 名称(自定义字段加 `__c`) ',
445
- '- [ ] 访问共享表时,表达式中的字段未错误地添加 `__c` 后缀 ',
446
- '- [ ] 涉及时间处理的逻辑统一使用 `TimeUtil`,避免时区问题 ',
447
- '- [ ] 异常统一捕获并按需抛出,同时使用 `DevLogger` 记录关键错误信息 ',
448
- '- [ ] 使用 `SendEmail` 时确认收件地址与内容来源安全可靠 ',
449
- '- [ ] 使用 `PageClsInvoker` 跨类调用时,`argType` 与 `argValue` 类型匹配 ',
450
- '- [ ] 对外暴露的方法返回结构(如 `JSONObject`)与前端/调用方约定一致,字段清晰、语义明确 ',
451
- ];
7
+ const DOCS_DIR = path.join(__dirname, "docs");
8
+ const BACKEND_SDK_JAVA = path.join(__dirname, "..", "api", "backend-sdk-java.md");
452
9
 
453
- const base = lines.join("\n");
454
- const sdkPath = path.join(__dirname, "..", "api", "backend-sdk-java.md");
455
- let sdkContent = "";
10
+ function readDocFile(basename) {
11
+ return fs.readFileSync(path.join(DOCS_DIR, `${basename}.md`), "utf8");
12
+ }
13
+
14
+ /**
15
+ * 介绍文档(introduction.md)
16
+ * 用于了解 CloudCC 自定义类的概念、定位、价值与适用场景。
17
+ */
18
+ function getIntroductionDoc() {
19
+ return readDocFile("introduction");
20
+ }
21
+
22
+ /**
23
+ * 开发指导文档(devguide.md + backend-sdk-java.md)
24
+ * 用于在 CloudCC 平台上进行自定义类的开发、调试与调用;末尾拼接后端 SDK 速查。
25
+ */
26
+ function getDevGuideDoc() {
27
+ const base = readDocFile("devguide").trimEnd();
28
+ let sdk = "";
456
29
  try {
457
- sdkContent = fs.readFileSync(sdkPath, "utf8");
30
+ sdk = fs.readFileSync(BACKEND_SDK_JAVA, "utf8").trim();
458
31
  } catch (e) {
459
- sdkContent = `# CloudCC 后端 SDK(Java)使用指南\n\n(未找到文件:${sdkPath})\n`;
32
+ sdk = "";
460
33
  }
461
-
462
- return [
463
- base,
464
- "",
465
- "---",
466
- "",
467
- "## 附录:后端 SDK(Java)速查",
468
- "",
469
- "> 来源:`src/api/backend-sdk-java.md`",
470
- "",
471
- sdkContent.trim(),
472
- "",
473
- ].join("\n");
34
+ if (!sdk) {
35
+ return base;
36
+ }
37
+ return [base, "", "---", "", "## 附录:后端 SDK(Java)速查", "", sdk, ""].join("\n");
474
38
  }
475
39
 
476
- function doc() {
477
- const content = generateFullMarkdownDoc();
478
- console.log(content);
479
- return content;
40
+ /**
41
+ * cc doc classes <introduction|devguide>
42
+ * @param {string[]} argvs [doc, type, introduction|devguide, ...]
43
+ */
44
+ function doc(argvs) {
45
+ const subType = argvs[2]
46
+ const key = String(subType || "").trim().toLowerCase();
47
+ if (!key) {
48
+ throw new Error("cc doc classes 需要子命令:introduction 或 devguide");
49
+ }
50
+ if (key === "introduction") {
51
+ const content = getIntroductionDoc();
52
+ console.log(content);
53
+ return content;
54
+ }
55
+ if (key === "devguide") {
56
+ const content = getDevGuideDoc();
57
+ console.log(content);
58
+ return content;
59
+ }
60
+ throw new Error(`doc 不支持的子命令: ${subType},请使用 introduction 或 devguide`);
480
61
  }
481
62
 
482
- // 兼容旧调用方:统一指向同一个方法(仍返回全量文档)
483
- doc.getClassEditorDoc = doc;
484
- doc.getEditGuide = doc;
485
-
486
63
  module.exports = doc;