cloudcc-cli 2.3.1 → 2.3.2

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 +15 -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 +67 -0
  5. package/README.md +11 -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 +2 -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 +451 -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 +212 -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 +203 -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/doc.js +46 -0
  82. package/src/pagelayout/docs/devguide.md +295 -0
  83. package/src/pagelayout/docs/introduction.md +44 -0
  84. package/src/pagelayout/get.js +46 -0
  85. package/src/pagelayout/index.js +9 -0
  86. package/src/plugin/doc.js +43 -863
  87. package/src/plugin/docs/devguide.md +923 -0
  88. package/src/profile/create.js +108 -0
  89. package/src/profile/delete.js +59 -0
  90. package/src/profile/doc.js +46 -0
  91. package/src/profile/docs/devguide.md +332 -0
  92. package/src/profile/docs/introduction.md +123 -0
  93. package/src/profile/get.js +55 -0
  94. package/src/profile/index.js +14 -0
  95. package/src/project/doc.js +39 -372
  96. package/src/project/docs/devguide.md +359 -0
  97. package/src/project/docs/introduction.md +3 -0
  98. package/src/recordType/create.js +77 -0
  99. package/src/recordType/delete.js +52 -0
  100. package/src/recordType/doc.js +36 -0
  101. package/src/recordType/docs/devguide.md +160 -0
  102. package/src/recordType/docs/introduction.md +53 -0
  103. package/src/recordType/editInfo.js +39 -0
  104. package/src/recordType/editSave.js +47 -0
  105. package/src/recordType/getList.js +31 -0
  106. package/src/recordType/index.js +16 -3
  107. package/src/recordType/newInfo.js +39 -0
  108. package/src/recordType/validDelete.js +91 -0
  109. package/src/res.md +66 -0
  110. package/src/role/create.js +153 -0
  111. package/src/role/delete.js +59 -0
  112. package/src/role/doc.js +46 -0
  113. package/src/role/docs/devguide.md +387 -0
  114. package/src/role/docs/introduction.md +124 -0
  115. package/src/role/get.js +57 -0
  116. package/src/role/index.js +10 -0
  117. package/src/scheduleJob/doc.js +49 -0
  118. package/src/scheduleJob/docs/devguide.md +79 -0
  119. package/src/scheduleJob/docs/introduction.md +101 -0
  120. package/src/scheduleJob/index.js +5 -0
  121. package/src/script/delete.js +112 -0
  122. package/src/script/doc.js +31 -245
  123. package/src/script/docs/devguide.md +290 -0
  124. package/src/script/docs/introduction.md +48 -0
  125. package/src/script/index.js +1 -0
  126. package/src/staticResource/count.js +31 -10
  127. package/src/staticResource/create.js +97 -0
  128. package/src/staticResource/delete.js +30 -8
  129. package/src/staticResource/detail.js +32 -10
  130. package/src/staticResource/doc.js +21 -88
  131. package/src/staticResource/docs/devguide.md +157 -0
  132. package/src/staticResource/docs/introduction.md +3 -0
  133. package/src/staticResource/get.js +31 -8
  134. package/src/staticResource/index.js +2 -1
  135. package/src/timer/create.js +6 -1
  136. package/src/timer/delete.js +7 -1
  137. package/src/timer/detail.js +5 -5
  138. package/src/timer/doc.js +57 -0
  139. package/src/timer/get.js +7 -1
  140. package/src/timer/index.js +3 -1
  141. package/src/timer/publish.js +6 -1
  142. package/src/timer/pull.js +6 -1
  143. package/src/timer/pullList.js +5 -3
  144. package/src/triggers/detail.js +5 -5
  145. package/src/triggers/doc.js +49 -364
  146. package/src/triggers/docs/devguide.md +334 -0
  147. package/src/triggers/get.js +7 -3
  148. package/src/triggers/index.js +1 -4
  149. package/src/triggers/pullList.js +7 -7
  150. package/src/user/create.js +50 -0
  151. package/src/user/delete.js +59 -0
  152. package/src/user/doc.js +46 -0
  153. package/src/user/docs/devguide.md +634 -0
  154. package/src/user/docs/introduction.md +124 -0
  155. package/src/user/get.js +112 -0
  156. package/src/user/index.js +12 -0
  157. package/src/user/update.js +96 -0
  158. package/src/user/view.js +60 -0
  159. package/test/classes.cli.test.js +7 -4
  160. package/test/customPage.cli.test.js +96 -0
  161. package/test/globalSelectList.cli.test.js +94 -0
  162. package/test/menu-script.cli.test.js +147 -0
  163. package/test/menu.cli.test.js +8 -1
  164. package/test/plugin.cli.test.js +5 -3
  165. package/test/timer.cli.test.js +15 -8
  166. package/test/trigger.cli.test.js +5 -3
  167. package/tmp_customsetting_detail.json +1 -0
  168. package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +0 -111
  169. package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +0 -152
  170. package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +0 -150
  171. package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +0 -372
  172. package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +0 -62
  173. package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +0 -62
  174. package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +0 -214
  175. package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +0 -113
  176. package/.cursor/skills/cloudcc-cli-dev/SKILL.md +0 -66
  177. package/.cursor/skills/cloudcc-cli-dev/STATIC-RESOURCE-API.md +0 -60
  178. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_COMPONENT.md +0 -151
  179. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_PAGE.md +0 -216
  180. package/src/approval/approve.js +0 -105
  181. package/src/approval/get.js +0 -245
  182. package/src/approval/index.js +0 -11
  183. package/src/approval/reject.js +0 -105
  184. package/src/plugin/readme.md +0 -7
  185. /package/{src/mcp → mcp}/cliRunner.js +0 -0
  186. /package/{src/mcp → mcp}/index.js +0 -0
  187. /package/{src/mcp → mcp}/readme.md +0 -0
  188. /package/{src/mcp → mcp}/tools/Application Creator/handler.js +0 -0
  189. /package/{src/mcp → mcp}/tools/Approval/handler.js +0 -0
  190. /package/{src/mcp → mcp}/tools/Class Creator/handler.js +0 -0
  191. /package/{src/mcp → mcp}/tools/Class Detail Retriever/handler.js +0 -0
  192. /package/{src/mcp → mcp}/tools/Class List Retriever/handler.js +0 -0
  193. /package/{src/mcp → mcp}/tools/Class Publisher/handler.js +0 -0
  194. /package/{src/mcp → mcp}/tools/Class Puller/handler.js +0 -0
  195. /package/{src/mcp → mcp}/tools/Client Script Detail Retriever/handler.js +0 -0
  196. /package/{src/mcp → mcp}/tools/Client Script Editor Guide/handler.js +0 -0
  197. /package/{src/mcp → mcp}/tools/Client Script List Retriever/handler.js +0 -0
  198. /package/{src/mcp → mcp}/tools/Client Script Publisher/handler.js +0 -0
  199. /package/{src/mcp → mcp}/tools/Client Script Puller/handler.js +0 -0
  200. /package/{src/mcp → mcp}/tools/CloudCC Development Overview/handler.js +0 -0
  201. /package/{src/mcp → mcp}/tools/Component Creator/handler.js +0 -0
  202. /package/{src/mcp → mcp}/tools/Component Detail Retriever/handler.js +0 -0
  203. /package/{src/mcp → mcp}/tools/Component List Retriever/handler.js +0 -0
  204. /package/{src/mcp → mcp}/tools/Component Publisher/handler.js +0 -0
  205. /package/{src/mcp → mcp}/tools/Component Puller/handler.js +0 -0
  206. /package/{src/mcp → mcp}/tools/Dev Environment Creator/fetcher.js +0 -0
  207. /package/{src/mcp → mcp}/tools/Dev Environment Creator/handler.js +0 -0
  208. /package/{src/mcp → mcp}/tools/Dev Environment Validator/handler.js +0 -0
  209. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/fetcher.js +0 -0
  210. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/handler.js +0 -0
  211. /package/{src/mcp → mcp}/tools/JSP Migrator/handler.js +0 -0
  212. /package/{src/mcp → mcp}/tools/Menu Creator/handler.js +0 -0
  213. /package/{src/mcp → mcp}/tools/Object Creator/handler.js +0 -0
  214. /package/{src/mcp → mcp}/tools/Object Fields Creator/handler.js +0 -0
  215. /package/{src/mcp → mcp}/tools/Object Fields Retriever/handler.js +0 -0
  216. /package/{src/mcp → mcp}/tools/Object List Retriever/handler.js +0 -0
  217. /package/{src/mcp → mcp}/tools/Scheduled Class Creator/handler.js +0 -0
  218. /package/{src/mcp → mcp}/tools/Scheduled Class Detail Retriever/handler.js +0 -0
  219. /package/{src/mcp → mcp}/tools/Scheduled Class List Retriever/handler.js +0 -0
  220. /package/{src/mcp → mcp}/tools/Scheduled Class Publisher/handler.js +0 -0
  221. /package/{src/mcp → mcp}/tools/Scheduled Class Puller/handler.js +0 -0
  222. /package/{src/mcp → mcp}/tools/Trigger Creator/handler.js +0 -0
  223. /package/{src/mcp → mcp}/tools/Trigger Detail Retriever/handler.js +0 -0
  224. /package/{src/mcp → mcp}/tools/Trigger List Retriever/handler.js +0 -0
  225. /package/{src/mcp → mcp}/tools/Trigger Publisher/handler.js +0 -0
  226. /package/{src/mcp → mcp}/tools/Trigger Puller/handler.js +0 -0
  227. /package/{src/mcp → mcp}/tools/index.js +0 -0
  228. /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
  229. /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
  230. /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} +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
@@ -1,378 +1,63 @@
1
1
  /**
2
- * triggers 文档统一入口(全量一次性输出)
2
+ * triggers 文档入口:正文均在 `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
- "> 基于 25 个生产环境触发器实例分析。",
12
- "> 文档版本:v1.0",
13
- "> 更新时间:2026-03-24",
14
- "",
15
- "---",
16
- "",
17
- "## 一、什么是触发器",
18
- "",
19
- "CloudCC 触发器是完全符合 Java 语法规范的代码,在特定业务事件发生时自动执行,实现业务逻辑自动化处理。",
20
- "",
21
- "触发器本质:",
22
- "- 一段 Java 代码,运行在 CloudCC 平台沙箱环境中",
23
- "- 使用 CCService、CCObject 等平台提供的 API 类",
24
- "- 在数据变更的特定时刻(前/后)自动触发执行",
25
- "",
26
- "## 二、触发器能干什么",
27
- "",
28
- "### 2.1 核心能力",
29
- "",
30
- "| 能力 | 说明 | 示例 |",
31
- "|------|------|------|",
32
- "| 自动赋值 | 在记录保存前自动计算并填充字段 | 个人业绩/部门业绩自动赋值 |",
33
- "| 数据校验 | 阻止不符合业务规则的数据保存 | 预算金额校验、审批金额验证 |",
34
- "| 关联更新 | 修改一条记录时自动更新关联记录 | 回款明细汇总到收款计划 |",
35
- "| 自动生成 | 根据业务规则自动创建新记录 | 审批通过后自动生成回款记录 |",
36
- "| 权限控制 | 自动设置数据共享权限 | 按部门/人员自动共享 |",
37
- "| 状态同步 | 审批状态变更后同步更新相关字段 | 预算审批状态回写 |",
38
- "| 汇总计算 | 实时汇总明细数据到主记录 | 部门业绩字段汇总 |",
39
- "",
40
- "### 2.2 技术能力(基于 CCService API)",
41
- "",
42
- "```java",
43
- "// 1. 新增记录",
44
- "CCObject opp = new CCObject(\"Opportunity\");",
45
- "opp.put(\"name\", \"value\");",
46
- "cs.insert(opp);",
47
- "",
48
- "// 2. 查询记录(指定字段)",
49
- "List<CCObject> opps1 = cs.cqueryByFields(",
50
- " \"Opportunity\",",
51
- " \"khmc__c='\" + record_new.get(\"id\") + \"'\",",
52
- " \"id,name,createdate\"",
53
- ");",
54
- "",
55
- "// 3. 查询记录(全部字段)",
56
- "List<CCObject> opps2 = cs.cquery(",
57
- " \"Opportunity\",",
58
- " \"khmc__c='\" + record_new.get(\"id\") + \"'\"",
59
- ");",
60
- "",
61
- "// 4. 复杂查询",
62
- "List<CCObject> ccobjs = cs.cqlQuery(",
63
- " \"Opportunity\",",
64
- " \"select sum(amount) as sumAmount from Opportunity where khmc='0012001238ytwuiw'\"",
65
- ");",
66
- "",
67
- "// 5. 修改/删除",
68
- "cs.update(opp);",
69
- "cs.delete(opp);",
70
- "",
71
- "// 6. 发送邮件通知",
72
- "SendEmail sendEmail = new SendEmail(userInfo);",
73
- "sendEmail.sendMailFromSystem(toAddress, ccAddress, bccAddress, subject, content, isText);",
74
- "```",
75
- "",
76
- "---",
77
- "",
78
- "## 三、触发器的触发时机详解",
79
- "",
80
- "### 3.1 beforeUpsert(创建或更新前)",
81
- "- 执行时机:记录保存之前,数据尚未写入数据库",
82
- "- 典型用途:自动计算字段、数据格式校验、阻止非法数据保存、自动填充默认值",
83
- "- 生产实例:个人业绩/部门业绩赋值、计算产研成本/净业绩、生成部门/个人业绩",
84
- "",
85
- "```java",
86
- "// beforeUpsert 示例",
87
- "CCObject record = (CCObject) data.get(\"record\");",
88
- "BigDecimal income = record.getBigDecimal(\"ysr\");",
89
- "BigDecimal cost = record.getBigDecimal(\"cycb\");",
90
- "BigDecimal net = income.subtract(cost);",
91
- "record.put(\"jyj\", net);",
92
- "if (net.compareTo(BigDecimal.ZERO) < 0) {",
93
- " throw new Exception(\"毛利不能为负数!\");",
94
- "}",
95
- "```",
96
- "",
97
- "### 3.2 afterInsert(创建后)",
98
- "- 执行时机:记录创建成功后(可获取 ID)",
99
- "- 典型用途:基于新记录 ID 创建关联记录、发送创建通知、初始化关联数据",
100
- "- 生产实例:根据净业绩拆分生成净业绩拆分回款",
101
- "",
102
- "```java",
103
- "// afterInsert 示例",
104
- "CCObject newRecord = (CCObject) data.get(\"record\");",
105
- "String recordId = newRecord.getString(\"id\");",
106
- "CCObject hkRecord = new CCObject(\"Huikuan\");",
107
- "hkRecord.put(\"mingxi__c\", recordId);",
108
- "hkRecord.put(\"je\", newRecord.get(\"je\"));",
109
- "cs.insert(hkRecord);",
110
- "```",
111
- "",
112
- "### 3.3 afterUpsert(创建或更新后)",
113
- "- 执行时机:记录保存成功后(新增或修改)",
114
- "- 典型用途:汇总数据到父记录、触发下游流程、更新关联记录状态",
115
- "- 生产实例:金额汇总到收款计划、更新部门业绩字段、更新回款明细",
116
- "",
117
- "```java",
118
- "// afterUpsert 示例 - 汇总金额到父记录",
119
- "CCObject detail = (CCObject) data.get(\"record\");",
120
- "String planId = detail.getString(\"skjh__c\");",
121
- "List<CCObject> plans = cs.cqueryByFields(",
122
- " \"ShoukuanJihua\",",
123
- " \"id='\" + planId + \"'\",",
124
- " \"id,shyjje,yishouje\"",
125
- ");",
126
- "if (!plans.isEmpty()) {",
127
- " CCObject plan = plans.get(0);",
128
- " BigDecimal current = plan.getBigDecimal(\"yishouje\");",
129
- " BigDecimal detailAmount = detail.getBigDecimal(\"je\");",
130
- " plan.put(\"yishouje\", current.add(detailAmount));",
131
- " cs.update(plan);",
132
- "}",
133
- "```",
134
- "",
135
- "### 3.4 afterDelete(删除后)",
136
- "- 执行时机:记录删除成功后",
137
- "- 典型用途:清理关联数据、反向汇总更新",
138
- "- 生产实例:回款明细删除后重新计算回款金额",
139
- "",
140
- "### 3.5 approval(审批时)",
141
- "- 执行时机:记录提交审批或审批通过时",
142
- "- 典型用途:审批前校验、审批通过后执行业务操作",
143
- "- 生产实例:更新拆分审批状态、订单审批判断、审批通过计算剩余欠款",
144
- "",
145
- "---",
146
- "",
147
- "## 四、为什么要用触发器",
148
- "",
149
- "### 4.1 解决的核心问题",
150
- "",
151
- "| 问题 | 传统方案 | 触发器方案 |",
152
- "|------|----------|------------|",
153
- "| 数据一致性 | 依赖用户手动操作,容易遗漏 | 自动执行,保证数据准确 |",
154
- "| 业务规则执行 | 前端校验可绕过 | 统一在平台层执行,无法绕过 |",
155
- "| 跨对象联动 | 需要多次手动操作 | 自动关联更新 |",
156
- "| 审批复杂逻辑 | 审批流配置难以承载 | Java 代码可实现复杂逻辑 |",
157
- "| 实时性要求 | 定时任务有延迟 | 实时触发,立即执行 |",
158
- "",
159
- "### 4.2 与其他方案对比",
160
- "",
161
- "| 方案 | 优点 | 缺点 | 适用场景 |",
162
- "|------|------|------|----------|",
163
- "| 触发器 | 实时、自动、无法绕过 | 需要 Java 开发能力 | 核心业务逻辑 |",
164
- "| 审批流 | 配置简单、可视化 | 逻辑能力有限 | 简单审批流程 |",
165
- "| 工作流 | 可视化编排 | 复杂逻辑实现困难 | 跨系统流程编排 |",
166
- "| 定时任务 | 适合批量处理 | 有延迟 | 数据同步、报表生成 |",
167
- "",
168
- "---",
169
- "",
170
- "## 五、典型业务场景",
171
- "",
172
- "### 5.1 财务业绩管理(核心场景)",
173
- "",
174
- "```text",
175
- "订单 (Order)",
176
- " └─ approval:审批判断",
177
- "预算 (Budget)",
178
- " ├─ beforeUpsert:计算产研成本/净业绩",
179
- " └─ afterUpsert:自动拆分/生成回款",
180
- "净业绩拆分 (jyjcf)",
181
- " ├─ beforeUpsert:生成部门/个人业绩",
182
- " └─ afterUpsert:校验金额累计是否超预算",
183
- "部门业绩 (bmyj)",
184
- " ├─ afterUpsert:更新部门业绩字段",
185
- " └─ afterUpdate:汇总部门资金池",
186
- "回款明细 (cloudccproceeddetail)",
187
- " ├─ afterInsert:生成净业绩拆分回款",
188
- " ├─ afterUpsert:金额汇总到收款计划",
189
- " ├─ afterUpsert:更新回款明细",
190
- " └─ afterDelete:回款明细删除",
191
- "```",
192
- "",
193
- "### 5.2 费用报销管理",
194
- "",
195
- "```text",
196
- "费用报销提交",
197
- " -> approval 触发器:验证审批时校验预算(报销金额 <= 预算余额)",
198
- "审批通过",
199
- " -> approval 触发器:计算剩余欠款(借款 - 报销)",
200
- "```",
201
- "",
202
- "### 5.3 借款还款管理",
203
- "",
204
- "| 触发器 | 对象 | 时机 | 作用 |",
205
- "|--------|------|------|------|",
206
- "| 借款单触发器 | 借款单 | beforeUpsert | 借款前校验、自动计算 |",
207
- "| 还款记录审批通过更新借款单 | 还款记录 | approval | 审批后回写借款单 |",
208
- "",
209
- "---",
210
- "",
211
- "## 六、触发器开发最佳实践",
212
- "",
213
- "### 6.1 代码规范",
214
- "",
215
- "```java",
216
- "try {",
217
- " CCObject record = (CCObject) data.get(\"record\");",
218
- " cs.update(record);",
219
- "} catch (Exception e) {",
220
- " System.out.println(\"触发器执行失败:\" + e.getMessage());",
221
- " throw new Exception(\"业务校验失败:\" + e.getMessage());",
222
- "}",
223
- "```",
224
- "",
225
- "### 6.2 性能优化",
226
- "",
227
- "```java",
228
- "// 推荐:字段过滤,只查询需要的字段",
229
- "List<CCObject> records = cs.cqueryByFields(",
230
- " \"Object__c\",",
231
- " \"status__c='active'\",",
232
- " \"id,name,amount__c\"",
233
- ");",
234
- "",
235
- "// 推荐:批量更新,降低递归风险",
236
- "cs.updateLt(records);",
237
- "```",
238
- "",
239
- "### 6.3 避免递归触发",
240
- "",
241
- "```java",
242
- "// 方法 1:使用 updateLt",
243
- "cs.updateLt(records);",
244
- "",
245
- "// 方法 2:增加标志位(示例)",
246
- "if (\"true\".equals(System.getProperty(\"trigger.running\"))) {",
247
- " return;",
248
- "}",
249
- "System.setProperty(\"trigger.running\", \"true\");",
250
- "cs.update(record);",
251
- "System.setProperty(\"trigger.running\", \"false\");",
252
- "```",
253
- "",
254
- "---",
255
- "",
256
- "## 七、触发器调试与监控",
257
- "",
258
- "### 7.1 日志记录",
259
- "",
260
- "```java",
261
- "System.out.println(\"=== 触发器开始执行 ===\");",
262
- "System.out.println(\"对象:\" + record.getSObjectName());",
263
- "System.out.println(\"操作:\" + data.get(\"action\"));",
264
- "System.out.println(\"记录 ID:\" + record.get(\"id\"));",
265
- "```",
266
- "",
267
- "### 7.2 常见问题排查",
268
- "",
269
- "| 问题 | 可能原因 | 解决方案 |",
270
- "|------|----------|----------|",
271
- "| 触发器不执行 | 未激活、触发时机不对 | 检查状态与配置 |",
272
- "| 递归触发 | 更新操作再次触发触发器 | 使用 `updateLt` 或增加条件判断 |",
273
- "| 性能问题 | 查询数据量过大 | 增加查询条件、字段过滤 |",
274
- "| 数据不一致 | 触发器执行失败 | 增加异常处理与关键日志 |",
275
- "",
276
- "---",
277
- "",
278
- "## 八、总结",
279
- "",
280
- "### 8.1 触发器价值",
281
- "1. 自动化:减少人工操作,降低出错率",
282
- "2. 一致性:保证数据准确与规则统一执行",
283
- "3. 实时性:业务变更立即响应",
284
- "4. 灵活性:Java 代码可承载复杂逻辑",
285
- "",
286
- "### 8.2 适用与不适用场景",
287
- "",
288
- "**适合使用触发器:**",
289
- "- 需要实时数据联动",
290
- "- 核心业务规则校验",
291
- "- 跨对象数据同步",
292
- "- 审批流程复杂逻辑",
293
- "- 自动创建或更新关联记录",
294
- "",
295
- "**不适合使用触发器:**",
296
- "- 简单字段默认值(优先配置化能力)",
297
- "- 大批量离线数据处理",
298
- "- 跨系统集成调用",
299
- "- 强交互型前端界面逻辑",
300
- "",
301
- "### 8.3 触发器开发 Checklist",
302
- "",
303
- "- [ ] 明确触发时机(before/after/approval)",
304
- "- [ ] 评估并规避递归触发风险",
305
- "- [ ] 添加异常处理与关键日志",
306
- "- [ ] 覆盖边界条件测试",
307
- "- [ ] 完成大数据量场景性能测试",
308
- "",
309
- "---",
310
- "",
311
- "## 附录:25 个生产触发器清单",
312
- "",
313
- "| # | 名称 | 对象 | 时机 | 状态 |",
314
- "|---|------|------|------|------|",
315
- "| 1 | 个人业绩/部门业绩赋值 | 对外付款 | beforeUpsert | ✅ |",
316
- "| 2 | 个人业绩/部门业绩赋值 | 费用报销 | beforeUpsert | ❌ |",
317
- "| 3 | 本部业绩统计 | 本部业绩统计 | beforeUpsert | ✅ |",
318
- "| 4 | 更新拆分审批状态 | 预算 | approval | ✅ |",
319
- "| 5 | 订单审批判断 | 订单 | approval | ✅ |",
320
- "| 6 | 根据净业绩拆分生成净业绩拆分回款 | 回款明细 | afterInsert | ✅ |",
321
- "| 7 | 金额汇总到收款计划 | 回款明细 | afterUpsert | ✅ |",
322
- "| 8 | 回款明细删除 | 回款明细 | afterDelete | ❌ |",
323
- "| 9 | 计算产研成本/净业绩 | 预算 | beforeUpsert | ✅ |",
324
- "| 10 | 保证金回款记录 | 概算 | afterUpdate | ✅ |",
325
- "| 11 | 校验金额累计是否超预算 | 净业绩拆分 | afterUpsert | ✅ |",
326
- "| 12 | 更新部门业绩字段 | 部门业绩 | afterUpsert | ✅ |",
327
- "| 13 | 汇总部门资金池 | 部门业绩 | afterUpdate | ✅ |",
328
- "| 14 | 编辑更新部门业绩 | 净业绩拆分回款 | beforeUpsert | ✅ |",
329
- "| 15 | 生成部门/个人业绩 | 净业绩拆分 | beforeUpsert | ✅ |",
330
- "| 16 | 更新回款明细 | 回款明细 | afterUpsert | ✅ |",
331
- "| 17 | 新建自动拆分/审批通过自动生成回款 | 预算 | afterUpsert | ✅ |",
332
- "| 18 | 提交审批验证金额 | 对外付款 | approval | ❌ |",
333
- "| 19 | 还款记录审批通过更新借款单 | 还款记录 | approval | ✅ |",
334
- "| 20 | 审批通过计算剩余欠款 | 费用报销 | approval | ✅ |",
335
- "| 21 | 借款单触发器 | 借款单 | beforeUpsert | ✅ |",
336
- "| 22 | 创建编辑项目任务时判断 | 项目任务 | beforeUpsert | ✅ |",
337
- "| 23 | 任务派工工时限制 | 项目任务 | afterUpsert | ✅ |",
338
- "| 24 | 测试 AI 代码生成 | 客户 | beforeInsert | ❌ |",
339
- "| 25 | 验证审批时校验预算 | 费用报销 | approval | ❌ |",
340
- "",
341
- "文档生成时间:2026-03-24",
342
- "基于 CloudCC 生产环境 25 个触发器实例分析",
343
- "",
344
- ];
7
+ const DOCS_DIR = path.join(__dirname, "docs");
8
+ const BACKEND_SDK_JAVA = path.join(__dirname, "..", "api", "backend-sdk-java.md");
345
9
 
346
- const base = lines.join("\n");
347
- const sdkPath = path.join(__dirname, "..", "api", "backend-sdk-java.md");
348
- 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
+ * 用于触发器开发实践:触发时机、常见模式、性能与递归风险等;末尾拼接后端 SDK 速查。
25
+ */
26
+ function getDevGuideDoc() {
27
+ const base = readDocFile("devguide").trimEnd();
28
+ let sdk = "";
349
29
  try {
350
- sdkContent = fs.readFileSync(sdkPath, "utf8");
30
+ sdk = fs.readFileSync(BACKEND_SDK_JAVA, "utf8").trim();
351
31
  } catch (e) {
352
- sdkContent = `# CloudCC 后端 SDK(Java)使用指南\n\n(未找到文件:${sdkPath})\n`;
32
+ sdk = "";
353
33
  }
354
-
355
- return [
356
- base,
357
- "",
358
- "---",
359
- "",
360
- "## 附录:后端 SDK(Java)速查",
361
- "",
362
- "> 来源:`src/api/backend-sdk-java.md`",
363
- "",
364
- sdkContent.trim(),
365
- "",
366
- ].join("\n");
34
+ if (!sdk) {
35
+ return base;
36
+ }
37
+ return [base, "", "---", "", "## 附录:后端 SDK(Java)速查", "", sdk, ""].join("\n");
367
38
  }
368
39
 
369
- function doc() {
370
- const content = generateFullMarkdownDoc();
371
- console.log(content);
372
- return content;
40
+ /**
41
+ * cc doc triggers <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 triggers 需要子命令: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`);
373
61
  }
374
62
 
375
- // 兼容旧调用方:统一返回全量文档
376
- doc.getEditGuide = doc;
377
-
378
63
  module.exports = doc;