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.
- package/.claude/settings.json +25 -0
- package/.cloudcc-cache.json +21 -4
- package/.cursor/skills/cloudcc-cli-dev.zip +0 -0
- package/.cursor/skills/cloudcc-cli-usage/SKILL.md +68 -0
- package/README.md +22 -0
- package/bin/cc.js +13 -8
- package/bin/index.js +9 -2
- package/bin/mcp.js +1 -1
- package/build/component-CCPlugin1774500425584.common.js +831 -0
- package/build/component-CCPlugin1774500425584.common.js.map +1 -0
- package/build/component-CCPlugin1774500425584.css +1 -0
- package/build/component-CCPlugin1774500425584.umd.js +874 -0
- package/build/component-CCPlugin1774500425584.umd.js.map +1 -0
- package/build/component-CCPlugin1774500425584.umd.min.js +8 -0
- package/build/component-CCPlugin1774500425584.umd.min.js.map +1 -0
- package/build/demo.html +1 -0
- package/{src/mcp → mcp}/tools/Class Editor Guide/handler.js +12 -4
- package/{src/mcp → mcp}/tools/Component Editor Guide/handler.js +15 -14
- package/{src/mcp → mcp}/tools/Trigger Editor Guide/handler.js +8 -2
- package/package.json +3 -2
- package/src/application/doc.js +46 -0
- package/src/application/docs/devguide.md +173 -0
- package/src/application/docs/introduction.md +81 -0
- package/src/application/index.js +1 -0
- package/src/brief/get.js +1 -1
- package/src/classes/create.js +6 -1
- package/src/classes/delete.js +7 -1
- package/src/classes/detail.js +8 -1
- package/src/classes/doc.js +49 -472
- package/src/classes/docs/devguide.md +541 -0
- package/src/classes/get.js +9 -2
- package/src/classes/index.js +2 -1
- package/src/classes/publish.js +6 -1
- package/src/classes/pull.js +6 -1
- package/src/classes/pullList.js +6 -3
- package/src/config/doc.js +31 -0
- package/src/config/docs/devguide.md +100 -0
- package/src/config/index.js +5 -0
- package/src/customPage/create.js +52 -19
- package/src/customPage/doc.js +46 -0
- package/src/customPage/docs/devguide.md +200 -0
- 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
- package/src/customPage/index.js +1 -0
- package/src/customSetting/create.js +9 -0
- package/src/customSetting/delete.js +10 -1
- package/src/customSetting/deleteCustomSettingField.js +43 -0
- package/src/customSetting/detail.js +10 -1
- package/src/customSetting/doc.js +22 -179
- package/src/customSetting/docs/devguide.md +181 -0
- package/src/customSetting/docs/introduction.md +3 -0
- package/src/customSetting/editCustomSettingField.js +34 -0
- package/src/customSetting/get.js +9 -0
- package/src/customSetting/index.js +6 -1
- package/src/customSetting/modify.js +30 -0
- package/src/customSetting/saveCustomSettingField.js +46 -0
- package/src/fields/doc.js +45 -0
- package/src/fields/docs/devguide.md +224 -0
- package/src/fields/docs/introduction.md +217 -0
- package/src/fields/index.js +1 -0
- package/src/globalSelectList/create.js +51 -0
- package/src/globalSelectList/delete.js +56 -0
- package/src/globalSelectList/detail.js +45 -0
- package/src/globalSelectList/doc.js +52 -0
- package/src/globalSelectList/docs/devguide.md +153 -0
- package/src/globalSelectList/docs/introduction.md +82 -0
- package/src/globalSelectList/get.js +31 -0
- package/src/globalSelectList/index.js +16 -0
- package/src/menu/create-page.js +43 -6
- package/src/menu/create-script.js +67 -19
- package/src/menu/doc.js +57 -0
- package/src/menu/docs/devguide.md +129 -0
- package/src/menu/docs/introduction.md +99 -0
- package/src/menu/index.js +1 -0
- package/src/menu/validator.js +80 -0
- package/src/object/doc.js +45 -0
- package/src/object/docs/devguide.md +112 -0
- package/src/object/docs/introduction.md +187 -0
- package/src/object/get.js +1 -23
- package/src/object/index.js +1 -0
- package/src/pagelayout/create.js +123 -0
- package/src/pagelayout/delete.js +57 -0
- package/src/pagelayout/doc.js +46 -0
- package/src/pagelayout/docs/devguide.md +83 -0
- package/src/pagelayout/docs/introduction.md +44 -0
- package/src/pagelayout/get.js +46 -0
- package/src/pagelayout/index.js +10 -0
- package/src/plugin/doc.js +43 -863
- package/src/plugin/docs/devguide.md +996 -0
- package/src/profile/create.js +108 -0
- package/src/profile/delete.js +59 -0
- package/src/profile/doc.js +46 -0
- package/src/profile/docs/devguide.md +77 -0
- package/src/profile/docs/introduction.md +123 -0
- package/src/profile/get.js +55 -0
- package/src/profile/index.js +14 -0
- package/src/project/doc.js +39 -372
- package/src/project/docs/devguide.md +359 -0
- package/src/project/docs/introduction.md +3 -0
- package/src/recordType/create.js +77 -0
- package/src/recordType/delete.js +52 -0
- package/src/recordType/doc.js +36 -0
- package/src/recordType/docs/devguide.md +160 -0
- package/src/recordType/docs/introduction.md +53 -0
- package/src/recordType/editInfo.js +39 -0
- package/src/recordType/editSave.js +47 -0
- package/src/recordType/getList.js +31 -0
- package/src/recordType/index.js +16 -3
- package/src/recordType/newInfo.js +39 -0
- package/src/recordType/validDelete.js +91 -0
- package/src/res.md +66 -0
- package/src/role/create.js +153 -0
- package/src/role/delete.js +59 -0
- package/src/role/doc.js +46 -0
- package/src/role/docs/devguide.md +81 -0
- package/src/role/docs/introduction.md +124 -0
- package/src/role/get.js +57 -0
- package/src/role/index.js +10 -0
- package/src/scheduleJob/doc.js +49 -0
- package/src/scheduleJob/docs/devguide.md +79 -0
- package/src/scheduleJob/docs/introduction.md +101 -0
- package/src/scheduleJob/index.js +5 -0
- package/src/script/delete.js +112 -0
- package/src/script/doc.js +31 -245
- package/src/script/docs/devguide.md +290 -0
- package/src/script/docs/introduction.md +48 -0
- package/src/script/index.js +1 -0
- package/src/staticResource/count.js +31 -10
- package/src/staticResource/create.js +97 -0
- package/src/staticResource/delete.js +30 -8
- package/src/staticResource/detail.js +32 -10
- package/src/staticResource/doc.js +21 -88
- package/src/staticResource/docs/devguide.md +157 -0
- package/src/staticResource/docs/introduction.md +3 -0
- package/src/staticResource/get.js +31 -8
- package/src/staticResource/index.js +2 -1
- package/src/timer/create.js +6 -1
- package/src/timer/delete.js +7 -1
- package/src/timer/detail.js +5 -5
- package/src/timer/doc.js +57 -0
- 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
- package/src/timer/get.js +7 -1
- package/src/timer/index.js +3 -1
- package/src/timer/publish.js +6 -1
- package/src/timer/pull.js +6 -1
- package/src/timer/pullList.js +5 -3
- package/src/triggers/detail.js +5 -5
- package/src/triggers/doc.js +49 -364
- package/src/triggers/docs/devguide.md +442 -0
- package/src/triggers/get.js +7 -3
- package/src/triggers/index.js +1 -4
- package/src/triggers/pullList.js +7 -7
- package/src/user/create.js +50 -0
- package/src/user/delete.js +59 -0
- package/src/user/doc.js +46 -0
- package/src/user/docs/devguide.md +122 -0
- package/src/user/docs/introduction.md +124 -0
- package/src/user/get.js +112 -0
- package/src/user/index.js +12 -0
- package/src/user/update.js +96 -0
- package/src/user/view.js +60 -0
- package/test/classes.cli.test.js +7 -4
- package/test/customPage.cli.test.js +96 -0
- package/test/globalSelectList.cli.test.js +94 -0
- package/test/menu-script.cli.test.js +147 -0
- package/test/menu.cli.test.js +8 -1
- package/test/plugin.cli.test.js +5 -3
- package/test/timer.cli.test.js +15 -8
- package/test/trigger.cli.test.js +5 -3
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +0 -111
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +0 -152
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +0 -150
- package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +0 -372
- package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +0 -62
- package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +0 -62
- package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +0 -214
- package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +0 -113
- package/.cursor/skills/cloudcc-cli-dev/SKILL.md +0 -66
- package/.cursor/skills/cloudcc-cli-dev/STATIC-RESOURCE-API.md +0 -60
- package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_COMPONENT.md +0 -151
- package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_PAGE.md +0 -216
- package/src/approval/approve.js +0 -105
- package/src/approval/get.js +0 -245
- package/src/approval/index.js +0 -11
- package/src/approval/reject.js +0 -105
- package/src/plugin/readme.md +0 -7
- /package/{src/mcp → mcp}/cliRunner.js +0 -0
- /package/{src/mcp → mcp}/index.js +0 -0
- /package/{src/mcp → mcp}/readme.md +0 -0
- /package/{src/mcp → mcp}/tools/Application Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Approval/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script Editor Guide/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/CloudCC Development Overview/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Dev Environment Creator/fetcher.js +0 -0
- /package/{src/mcp → mcp}/tools/Dev Environment Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Dev Environment Validator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/fetcher.js +0 -0
- /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/JSP Migrator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Menu Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Object Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Object Fields Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Object Fields Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Object List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/index.js +0 -0
- /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
- /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
- /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
- /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
package/src/timer/doc.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* timer(定时类)文档入口:正文均在 `docs/` 目录。
|
|
3
|
+
*/
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
|
|
7
|
+
const DOCS_DIR = path.join(__dirname, "docs");
|
|
8
|
+
const BACKEND_SDK_JAVA = path.join(__dirname, "..", "api", "backend-sdk-java.md");
|
|
9
|
+
|
|
10
|
+
function readDocFile(basename) {
|
|
11
|
+
return fs.readFileSync(path.join(DOCS_DIR, `${basename}.md`), "utf8");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** 介绍文档:定时类概念、能力与典型场景 */
|
|
15
|
+
function getIntroductionDoc() {
|
|
16
|
+
return readDocFile("introduction");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** 开发指导:定时作业/定时类实践;末尾拼接后端 Java SDK 速查 */
|
|
20
|
+
function getDevGuideDoc() {
|
|
21
|
+
const base = readDocFile("devguide").trimEnd();
|
|
22
|
+
let sdk = "";
|
|
23
|
+
try {
|
|
24
|
+
sdk = fs.readFileSync(BACKEND_SDK_JAVA, "utf8").trim();
|
|
25
|
+
} catch (e) {
|
|
26
|
+
sdk = "";
|
|
27
|
+
}
|
|
28
|
+
if (!sdk) {
|
|
29
|
+
return base;
|
|
30
|
+
}
|
|
31
|
+
return [base, "", "---", "", "## 附录:后端 SDK(Java)速查", "", sdk, ""].join("\n");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* cc doc timer <introduction|devguide>
|
|
36
|
+
* @param {string[]} argvs [doc, type, introduction|devguide, ...]
|
|
37
|
+
*/
|
|
38
|
+
function doc(argvs) {
|
|
39
|
+
const subType = argvs[2];
|
|
40
|
+
const key = String(subType || "").trim().toLowerCase();
|
|
41
|
+
if (!key) {
|
|
42
|
+
throw new Error("cc doc timer 需要子命令:introduction 或 devguide");
|
|
43
|
+
}
|
|
44
|
+
if (key === "introduction") {
|
|
45
|
+
const content = getIntroductionDoc();
|
|
46
|
+
console.log(content);
|
|
47
|
+
return content;
|
|
48
|
+
}
|
|
49
|
+
if (key === "devguide") {
|
|
50
|
+
const content = getDevGuideDoc();
|
|
51
|
+
console.log(content);
|
|
52
|
+
return content;
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`doc 不支持的子命令: ${subType},请使用 introduction 或 devguide`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
module.exports = doc;
|
|
@@ -4,6 +4,82 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## CLI 与本地文件(必读)
|
|
8
|
+
|
|
9
|
+
本仓库中的**定时类**(与定时作业绑定的 Java 类)通过 **cloudcc-cli** 与平台同步,本地目录为 **`schedule/<类名>/`**(内含 `*.java` 与 `config.json`),源码中的 `// @SOURCE_CONTENT_START` … `// @SOURCE_CONTENT_END` 与发布、拉取逻辑一致。**必须通过下列命令** 完成新建目录、发布、拉取与删除;不要手工新建 `schedule/` 子目录、不要整包复制其他项目的定时类、不要私自篡改 `config.json` 中的 `id` 或版本字段。
|
|
10
|
+
|
|
11
|
+
**允许的做法**:在 CLI 已生成的主类中,仅在上述 SOURCE 标记之间编写业务逻辑;与云端列表、详情、拉取、删除、发布相关的操作一律走命令。
|
|
12
|
+
|
|
13
|
+
执行命令前请确认:已完成 `cc doc project devguide` 中的环境初始化,项目根目录配置可用且包含 `accessToken`。
|
|
14
|
+
|
|
15
|
+
### 命令总览(以代码实现为准)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
cc create timer <name>
|
|
19
|
+
cc publish timer <name>
|
|
20
|
+
cc pull timer <name>
|
|
21
|
+
cc get timer [listQueryJson] [projectPath]
|
|
22
|
+
cc detail timer <name>
|
|
23
|
+
cc detail timer "" <id>
|
|
24
|
+
cc pullList timer <id> <projectPath>
|
|
25
|
+
cc delete timer <nameOrId> [projectPath]
|
|
26
|
+
cc doc timer <introduction|devguide>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
参数约定:
|
|
30
|
+
|
|
31
|
+
- `name`:定时类名,与 `schedule/<name>/` 目录名一致。
|
|
32
|
+
- `listQueryJson`:可选;列表查询 JSON 经 `encodeURI(JSON.stringify(...))` 编码后传入;不传则使用默认分页参数。
|
|
33
|
+
- `projectPath`:项目根路径,可选。
|
|
34
|
+
- `id`:线上定时类 ID。`detail` 仅查服务器时:`cc detail timer "" <id>`。`pullList` 必填。
|
|
35
|
+
- `nameOrId`:本地目录名或类 ID;若本地 `config.json` 含 `id`,删除时优先使用该 ID。
|
|
36
|
+
|
|
37
|
+
### 命令作用摘要
|
|
38
|
+
|
|
39
|
+
| 命令 | 作用 |
|
|
40
|
+
|------|------|
|
|
41
|
+
| `create` | 在 `schedule/<name>/` 生成继承 `CCSchedule` 的 Java 模板与 `config.json` |
|
|
42
|
+
| `publish` | 将 SOURCE 区域提交到服务器;首次成功后可写回 `config.json` 的 `id` |
|
|
43
|
+
| `pull` | 按本地 `id` 拉取远端源码,覆盖主类中 SOURCE 区域(需已发布) |
|
|
44
|
+
| `get` | 查询线上定时类列表(JSON 输出) |
|
|
45
|
+
| `detail` | 按类名优先读本地;或仅按 `id` 读服务器 |
|
|
46
|
+
| `pullList` | 按类 `id` 将线上定时类落到指定项目的 `schedule/<类名>/` |
|
|
47
|
+
| `delete` | 删除服务器上的定时类 |
|
|
48
|
+
| `doc` | 输出模块文档;`devguide` 含附录后端 Java SDK 速查 |
|
|
49
|
+
|
|
50
|
+
### 推荐操作顺序
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# 1) 查看线上已有定时类(可选)
|
|
54
|
+
cc get timer
|
|
55
|
+
|
|
56
|
+
# 2) 新建定时类(仅通过 create 生成目录与模板)
|
|
57
|
+
cc create timer MySchedule
|
|
58
|
+
|
|
59
|
+
# 3) 编辑 schedule/MySchedule/MySchedule.java 中 SOURCE 区域后发布
|
|
60
|
+
cc publish timer MySchedule
|
|
61
|
+
|
|
62
|
+
# 4) 与服务器对齐时拉取
|
|
63
|
+
cc pull timer MySchedule
|
|
64
|
+
|
|
65
|
+
# 5) 按已知线上 ID 拉到指定项目
|
|
66
|
+
cc pullList timer <线上类ID> <projectPath>
|
|
67
|
+
|
|
68
|
+
# 6) 删除
|
|
69
|
+
cc delete timer MySchedule
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 文档子命令
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
cc doc timer introduction
|
|
76
|
+
cc doc timer devguide
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
仅支持 `introduction` 与 `devguide`。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
7
83
|
## 📌 什么是定时作业?
|
|
8
84
|
|
|
9
85
|
定时作业是一种**自动化任务调度系统**,允许你:
|
|
@@ -416,7 +492,13 @@ function main($CCDK, obj) {
|
|
|
416
492
|
|
|
417
493
|
## 📋 管理操作
|
|
418
494
|
|
|
419
|
-
###
|
|
495
|
+
### 定时类:使用 CLI 管理本地 `schedule/`(推荐)
|
|
496
|
+
|
|
497
|
+
与**定时类源码**的创建、同步、删除,请优先使用上文「CLI 与本地文件(必读)」中的命令,避免绕过 CLI 直接改目录或 `config.json`。
|
|
498
|
+
|
|
499
|
+
以下接口面向**定时作业配置**(调度时间、启用状态等在设置中的作业),与 `schedule/` 下定时类源码管理是不同层面;具体以你环境的管理后台与 OpenAPI 为准。
|
|
500
|
+
|
|
501
|
+
### 查询定时作业(平台接口示例)
|
|
420
502
|
|
|
421
503
|
```bash
|
|
422
504
|
# 获取列表
|
package/src/timer/get.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
const { getPackageJson } = require("../../utils/config")
|
|
2
2
|
const { postClass } = require("../../utils/http")
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* cc get timer [listQueryJson] [projectPath]
|
|
6
|
+
* @param {string[]} argvs
|
|
7
|
+
*/
|
|
8
|
+
async function get(argvs, isMcp = false) {
|
|
9
|
+
const arg1 = argvs[2]
|
|
10
|
+
const arg2 = argvs[3]
|
|
5
11
|
let body = arg1 != null && arg1 != '' ? JSON.parse(decodeURI(arg1)) : { shownum: "2000", showpage: "1", fid: "", sname: '', rptcond: '', rptorder: '' }
|
|
6
12
|
let config = await getPackageJson(arg2);
|
|
7
13
|
let res = await postClass(config.setupSvc + "/api/ccPeak/list", body, config.accessToken)
|
package/src/timer/index.js
CHANGED
|
@@ -6,8 +6,10 @@ cc.get = require("./get")
|
|
|
6
6
|
cc.pullList = require("./pullList")
|
|
7
7
|
cc.detail = require("./detail")
|
|
8
8
|
cc.delete = require("./delete")
|
|
9
|
+
cc.doc = require("./doc")
|
|
10
|
+
|
|
9
11
|
function Timer(action, argvs) {
|
|
10
|
-
cc[action](argvs
|
|
12
|
+
cc[action](argvs)
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
module.exports = Timer;
|
package/src/timer/publish.js
CHANGED
|
@@ -7,7 +7,12 @@ const { javaContentRegular } = require("../../utils/utils")
|
|
|
7
7
|
|
|
8
8
|
const { getPackageJson } = require("../../utils/config")
|
|
9
9
|
const { postClass } = require("../../utils/http")
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* cc publish timer <name>
|
|
12
|
+
* @param {string[]} argvs
|
|
13
|
+
*/
|
|
14
|
+
async function publish(argvs) {
|
|
15
|
+
const name = argvs[2]
|
|
11
16
|
let res = await checkUpdate();
|
|
12
17
|
if (!res) {
|
|
13
18
|
console.error();
|
package/src/timer/pull.js
CHANGED
|
@@ -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
|
-
|
|
11
|
+
/**
|
|
12
|
+
* cc pull timer <name>
|
|
13
|
+
* @param {string[]} argvs
|
|
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();
|
package/src/timer/pullList.js
CHANGED
|
@@ -4,10 +4,12 @@ const { getPackageJson } = require("../../utils/config");
|
|
|
4
4
|
const { postClass } = require("../../utils/http");
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
* @param
|
|
7
|
+
* cc pullList timer <id> <projectPath>
|
|
8
|
+
* @param {string[]} argvs
|
|
9
9
|
*/
|
|
10
|
-
async function pullList(
|
|
10
|
+
async function pullList(argvs, isMcp = false) {
|
|
11
|
+
const arg1 = argvs[2]
|
|
12
|
+
const arg2 = argvs[3]
|
|
11
13
|
const body = { id: arg1 };
|
|
12
14
|
let config = await getPackageJson(arg2);
|
|
13
15
|
const res = await postClass(config.setupSvc + "/api/ccPeak/detail", body, config.accessToken);
|
package/src/triggers/detail.js
CHANGED
|
@@ -5,12 +5,12 @@ const { getPackageJson } = require("../../utils/config")
|
|
|
5
5
|
const { postClass } = require("../../utils/http")
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
* @param {string}
|
|
10
|
-
* @param {string} id - 触发器ID(当没有namePath时从服务器查询)
|
|
11
|
-
* @returns {Object} 触发器详细信息
|
|
8
|
+
* cc detail triggers <namePath> <id>
|
|
9
|
+
* @param {string[]} argvs [detail, type, namePath?, id?]
|
|
12
10
|
*/
|
|
13
|
-
async function detail(
|
|
11
|
+
async function detail(argvs) {
|
|
12
|
+
const namePath = argvs[2]
|
|
13
|
+
const id = argvs[3]
|
|
14
14
|
// 如果有 namePath,优先查询本地
|
|
15
15
|
if (namePath && namePath !== '') {
|
|
16
16
|
const triggerPath = path.join(process.cwd(), `triggers/${namePath}/`);
|
package/src/triggers/doc.js
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
-
|
|
30
|
+
sdk = fs.readFileSync(BACKEND_SDK_JAVA, "utf8").trim();
|
|
351
31
|
} catch (e) {
|
|
352
|
-
|
|
32
|
+
sdk = "";
|
|
353
33
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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;
|