cloudcc-cli 2.2.3 → 2.2.4
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/.vscode/settings.json +3 -0
- package/README.md +35 -0
- package/bin/cc.js +11 -36
- package/bin/index.js +33 -0
- package/bin/mcp-svc.js +13 -0
- package/java/com/cloudcc/core/TriggerInvoker.java +17 -1
- package/package.json +3 -2
- package/pom.xml +1 -0
- package/prompt/DevelopmentEnvironmentConstruction.ts +133 -0
- package/prompt/ccdk.ts +1190 -0
- package/prompt/ccprompt.ts +8 -0
- package/prompt/cloudccdev.ts +109 -0
- package/prompt/index.ts +52 -0
- package/prompt/objectInfo.ts +94 -0
- package/prompt/objectList.ts +25 -0
- package/prompt/openapi.ts +310 -0
- package/prompt/system.ts +14 -0
- package/prompt/vscodeExtension.ts +27 -0
- package/src/approval/approve.js +105 -0
- package/src/approval/get.js +245 -0
- package/src/approval/index.js +11 -0
- package/src/approval/reject.js +105 -0
- package/src/brief/get.js +51 -0
- package/src/brief/index.js +7 -0
- package/src/config/get.js +1 -1
- package/src/fields/create.js +204 -0
- package/src/fields/fields/A.js +23 -0
- package/src/fields/fields/AD.js +25 -0
- package/src/fields/fields/B.js +28 -0
- package/src/fields/fields/C.js +28 -0
- package/src/fields/fields/D.js +27 -0
- package/src/fields/fields/E.js +28 -0
- package/src/fields/fields/ENC.js +28 -0
- package/src/fields/fields/ENCD.js +28 -0
- package/src/fields/fields/F.js +27 -0
- package/src/fields/fields/FL.js +25 -0
- package/src/fields/fields/H.js +27 -0
- package/src/fields/fields/IMG.js +27 -0
- package/src/fields/fields/J.js +26 -0
- package/src/fields/fields/L.js +32 -0
- package/src/fields/fields/LT.js +28 -0
- package/src/fields/fields/M.js +29 -0
- package/src/fields/fields/MR.js +24 -0
- package/src/fields/fields/N.js +30 -0
- package/src/fields/fields/P.js +28 -0
- package/src/fields/fields/Q.js +35 -0
- package/src/fields/fields/S.js +30 -0
- package/src/fields/fields/SCORE.js +24 -0
- package/src/fields/fields/T.js +27 -0
- package/src/fields/fields/U.js +28 -0
- package/src/fields/fields/X.js +28 -0
- package/src/fields/fields/Y.js +33 -0
- package/src/fields/get.js +36 -0
- package/src/fields/index.js +9 -0
- package/src/mcp/MCP/345/234/272/346/231/257/346/250/241/346/213/237.md +8 -0
- package/src/mcp/index-sse-svc.js +126 -0
- package/src/mcp/index-streamable-svc.js +180 -0
- package/src/mcp/index.js +519 -115
- package/src/mcp/readme.md +75 -70
- package/src/mcp/tools/Approval/handler.js +349 -0
- package/src/mcp/tools/Class Creator/handler.js +37 -0
- package/src/mcp/tools/Class Detail Retriever/handler.js +33 -0
- package/src/mcp/tools/Class Detail Retriever/prompt.js +37 -0
- package/src/mcp/tools/Class Editor Guide/handler.js +72 -0
- package/src/mcp/tools/Class Editor Guide/prompt.js +468 -0
- package/src/mcp/tools/Class List Retriever/handler.js +36 -0
- package/src/mcp/tools/Class Publisher/handler.js +29 -0
- package/src/mcp/tools/Class Publisher/prompt.js +40 -0
- package/src/mcp/tools/Class Puller/handler.js +86 -0
- package/src/mcp/tools/Class Puller/prompt.js +49 -0
- package/src/mcp/tools/Client Script Creator/handler.js +179 -0
- package/src/mcp/tools/Client Script Detail Retriever/handler.js +53 -0
- package/src/mcp/tools/Client Script Editor Guide/handler.js +633 -0
- package/src/mcp/tools/Client Script List Retriever/handler.js +68 -0
- package/src/mcp/tools/Client Script Publisher/handler.js +54 -0
- package/src/mcp/tools/Client Script Puller/handler.js +73 -0
- package/src/mcp/tools/CloudCC Development Overview/handler.js +48 -0
- package/src/mcp/tools/CloudCC Development Overview/prompt.js +870 -0
- package/src/mcp/tools/Component Creator/handler.js +44 -0
- package/src/mcp/tools/Component Detail Retriever/handler.js +38 -0
- package/src/mcp/tools/Component Editor Guide/handler.js +76 -0
- package/src/mcp/tools/Component Editor Guide/prompt.js +519 -0
- package/src/mcp/tools/Component List Retriever/handler.js +43 -0
- package/src/mcp/tools/Component Publisher/handler.js +18 -0
- package/src/mcp/tools/Component Puller/handler.js +63 -0
- package/src/mcp/tools/{dev-env/fetcher.js → Dev Environment Creator/fetcher.js } +8 -8
- package/src/mcp/tools/{dev-env/prompt.js → Dev Environment Creator/prompt.js } +19 -2
- package/src/mcp/tools/Dev Environment Validator/handler.js +88 -0
- package/src/mcp/tools/Dev Environment Validator/prompt.js +193 -0
- package/src/mcp/tools/{key-guide/fetcher.js → Developer Key Setup Guide/fetcher.js } +7 -7
- package/src/mcp/tools/{key-guide/prompt.js → Developer Key Setup Guide/prompt.js } +3 -3
- package/src/mcp/tools/Object Creator/handler.js +34 -0
- package/src/mcp/tools/Object Fields Creator/handler.js +64 -0
- package/src/mcp/tools/Object Fields Retriever/handler.js +37 -0
- package/src/mcp/tools/Object Fields Retriever/prompt.js +10 -0
- package/src/mcp/tools/Object List Retriever/handler.js +43 -0
- package/src/mcp/tools/Object List Retriever/prompt.js +10 -0
- package/src/mcp/tools/Scheduled Class Creator/handler.js +37 -0
- package/src/mcp/tools/Scheduled Class Detail Retriever/handler.js +34 -0
- package/src/mcp/tools/Scheduled Class List Retriever/handler.js +52 -0
- package/src/mcp/tools/Scheduled Class Publisher/handler.js +30 -0
- package/src/mcp/tools/Scheduled Class Puller/handler.js +92 -0
- package/src/mcp/tools/Trigger Creator/handler.js +53 -0
- package/src/mcp/tools/Trigger Detail Retriever/handler.js +33 -0
- package/src/mcp/tools/Trigger Editor Guide/handler.js +58 -0
- package/src/mcp/tools/Trigger List Retriever/handler.js +49 -0
- package/src/mcp/tools/Trigger Publisher/handler.js +34 -0
- package/src/mcp/tools/Trigger Puller/handler.js +40 -0
- package/src/mcp/tools/ccdk/fetcher.js +3 -3
- package/src/mcp/tools/ccdk/prompt.js +2 -2
- package/src/mcp/tools/index.js +23 -0
- package/src/object/create.js +105 -0
- package/src/object/get.js +43 -4
- package/src/object/index.js +2 -1
- package/src/plugin/create1.js +8 -7
- package/src/plugin/detail.js +91 -0
- package/src/plugin/get.js +79 -0
- package/src/plugin/index.js +4 -1
- package/src/plugin/publish.js +13 -13
- package/src/plugin/publish1.js +30 -22
- package/src/plugin/pull.js +173 -0
- package/src/project/create.js +9 -9
- package/src/project/create1.js +31 -17
- package/src/recordType/get.js +4 -2
- package/src/script/create.js +7 -7
- package/src/script/detail.js +95 -0
- package/src/script/get.js +4 -2
- package/src/script/index.js +1 -0
- package/src/script/publish.js +14 -14
- package/src/script/pull.js +12 -12
- package/src/script/pullList.js +5 -3
- package/src/timer/create.js +7 -7
- package/src/timer/detail.js +84 -0
- package/src/timer/get.js +6 -3
- package/src/timer/publish.js +7 -7
- package/src/timer/pull.js +8 -8
- package/src/timer/pullList.js +5 -3
- package/src/token/get.js +1 -1
- package/src/triggers/create.js +7 -7
- package/src/triggers/detail.js +90 -0
- package/src/triggers/get.js +4 -2
- package/src/triggers/index.js +1 -0
- package/src/triggers/publish.js +7 -7
- package/src/triggers/pull.js +8 -8
- package/src/triggers/pullList.js +5 -3
- package/src/version/get.js +3 -3
- package/target/ccopenapi-0.0.3-classes.jar +0 -0
- package/target/ccopenapi-0.0.3.jar +0 -0
- package/target/maven-archiver/pom.properties +3 -0
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +18 -0
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +19 -0
- package/template/Appvue +2 -2
- package/template/index.js +30 -19
- package/tool/branch/index.js +1 -1
- package/tool/checkLange/checkLang.js +6 -6
- package/tool/checkLange/clearLang.js +1 -1
- package/utils/accessClass.js +23 -0
- package/utils/checkVersion.js +22 -20
- package/utils/config.js +18 -3
- package/utils/http.js +10 -10
- package/utils/utils.js +97 -32
- package/java/com/cloudcc/core/CCTriggerDemo.java +0 -25
- package/src/classes/create.js +0 -66
- package/src/classes/get.js +0 -22
- package/src/classes/index.js +0 -11
- package/src/classes/publish.js +0 -51
- package/src/classes/pull.js +0 -55
- package/src/classes/pullList.js +0 -44
- package/src/mcp/tools/classes/handler.js +0 -358
- package/src/mcp/tools/classes/prompt.js +0 -1261
- package/src/mcp/tools/plugin/handler.js +0 -92
- /package/src/mcp/tools/{plugin → Component Publisher}/prompt.js +0 -0
- /package/src/mcp/tools/{dev-env → Dev Environment Creator}/handler.js +0 -0
- /package/src/mcp/tools/{key-guide → Developer Key Setup Guide}/handler.js +0 -0
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client Script Editor Guide 工具处理器
|
|
3
|
+
* 提供客户端脚本编辑时的指导和知识库
|
|
4
|
+
*
|
|
5
|
+
* 设计理念:
|
|
6
|
+
* 1. 默认返回规范、最佳实践、强制要求和API概要
|
|
7
|
+
* 2. 需要详细信息时再查询具体主题
|
|
8
|
+
* 3. 使用 CCDK 知识库提供 API 参考
|
|
9
|
+
*/
|
|
10
|
+
const { ccdkApiTree } = require('../ccdk/prompt');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 获取编辑指南
|
|
14
|
+
* @param {Object} options - 参数对象
|
|
15
|
+
* @param {string} options.topic - 指南主题(可选,默认为 'overview')
|
|
16
|
+
* @returns {Object} MCP 格式的响应对象
|
|
17
|
+
*
|
|
18
|
+
* 主题说明:
|
|
19
|
+
* - overview (默认): 📋 规范、最佳实践、强制要求、API概要 - 智能体首先应该阅读
|
|
20
|
+
* - structure: 脚本结构说明
|
|
21
|
+
* - config: 配置文件详解
|
|
22
|
+
* - ccdk-api: CCDK API 参考文档
|
|
23
|
+
* - bestpractices: 最佳实践
|
|
24
|
+
* - faq: 常见问题
|
|
25
|
+
*/
|
|
26
|
+
async function editClientScript({ topic = 'overview' } = {}) {
|
|
27
|
+
try {
|
|
28
|
+
// 验证 topic 参数
|
|
29
|
+
const validTopics = [
|
|
30
|
+
'overview',
|
|
31
|
+
'structure',
|
|
32
|
+
'config',
|
|
33
|
+
'ccdk-api',
|
|
34
|
+
'bestpractices',
|
|
35
|
+
'faq'
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
if (topic && !validTopics.includes(topic)) {
|
|
39
|
+
return {
|
|
40
|
+
content: [{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: `✗ 无效的主题: "${topic}"\n\n支持的主题:\n${validTopics.map(t => `- ${t}`).join('\n')}`
|
|
43
|
+
}]
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 获取指定主题的编辑指南
|
|
48
|
+
const result = getEditGuide(topic);
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
content: [{
|
|
52
|
+
type: 'text',
|
|
53
|
+
text: result
|
|
54
|
+
}]
|
|
55
|
+
};
|
|
56
|
+
} catch (error) {
|
|
57
|
+
return {
|
|
58
|
+
content: [{
|
|
59
|
+
type: 'text',
|
|
60
|
+
text: `✗ 获取编辑指南失败: ${error.message}\n\n错误堆栈:\n${error.stack}`
|
|
61
|
+
}]
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 获取编辑指南内容
|
|
68
|
+
*/
|
|
69
|
+
function getEditGuide(topic) {
|
|
70
|
+
switch (topic) {
|
|
71
|
+
case 'overview':
|
|
72
|
+
return getOverviewGuide();
|
|
73
|
+
case 'structure':
|
|
74
|
+
return getStructureGuide();
|
|
75
|
+
case 'config':
|
|
76
|
+
return getConfigGuide();
|
|
77
|
+
case 'ccdk-api':
|
|
78
|
+
return getCcdkApiGuide();
|
|
79
|
+
case 'bestpractices':
|
|
80
|
+
return getBestPracticesGuide();
|
|
81
|
+
case 'faq':
|
|
82
|
+
return getFaqGuide();
|
|
83
|
+
default:
|
|
84
|
+
return getOverviewGuide();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 概览指南
|
|
90
|
+
*/
|
|
91
|
+
function getOverviewGuide() {
|
|
92
|
+
return `# CloudCC 客户端脚本编辑指南 - 概览
|
|
93
|
+
|
|
94
|
+
## 📋 规范与强制要求
|
|
95
|
+
|
|
96
|
+
### 1. 脚本结构规范
|
|
97
|
+
- **必须**包含 \`function main($CCDK, obj)\` 函数
|
|
98
|
+
- 函数签名必须完全匹配:\`function main($CCDK, obj)\`
|
|
99
|
+
- 脚本内容会被提取并上传到服务器(只提取函数体内容)
|
|
100
|
+
|
|
101
|
+
### 2. 文件结构
|
|
102
|
+
\`\`\`
|
|
103
|
+
script/
|
|
104
|
+
{objName}/
|
|
105
|
+
{scriptName}/
|
|
106
|
+
{scriptName}.js # 脚本文件
|
|
107
|
+
config.json # 配置文件
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
### 3. 配置文件要求
|
|
111
|
+
- \`config.json\` 必须包含以下字段:
|
|
112
|
+
- \`scriptName\`: 脚本名称
|
|
113
|
+
- \`objName\`: 对象名称
|
|
114
|
+
- \`id\`: 脚本ID(发布后自动生成)
|
|
115
|
+
- 其他配置字段根据使用场景设置
|
|
116
|
+
|
|
117
|
+
## 🎯 最佳实践
|
|
118
|
+
|
|
119
|
+
### 1. 脚本编写
|
|
120
|
+
- 使用 \`$CCDK\` 对象访问 CloudCC API
|
|
121
|
+
- 使用 \`obj\` 参数获取上下文信息
|
|
122
|
+
- 添加适当的错误处理
|
|
123
|
+
- 使用 \`console.error\` 进行调试(开发环境)
|
|
124
|
+
|
|
125
|
+
### 2. 代码组织
|
|
126
|
+
- 保持函数简洁,单一职责
|
|
127
|
+
- 使用有意义的变量名
|
|
128
|
+
- 添加必要的注释
|
|
129
|
+
|
|
130
|
+
### 3. 性能优化
|
|
131
|
+
- 避免在循环中进行大量操作
|
|
132
|
+
- 合理使用异步操作
|
|
133
|
+
- 避免不必要的 DOM 操作
|
|
134
|
+
|
|
135
|
+
## 📖 API 概要
|
|
136
|
+
|
|
137
|
+
### $CCDK 对象
|
|
138
|
+
CloudCC 提供的全局对象,包含以下主要模块:
|
|
139
|
+
|
|
140
|
+
${Object.keys(ccdkApiTree).map(module => {
|
|
141
|
+
const moduleInfo = ccdkApiTree[module];
|
|
142
|
+
const apiCount = Object.keys(moduleInfo.apis).length;
|
|
143
|
+
return `- **${module}** (${moduleInfo.name}): ${moduleInfo.description} - ${apiCount} 个 API`;
|
|
144
|
+
}).join('\n')}
|
|
145
|
+
|
|
146
|
+
### obj 参数
|
|
147
|
+
客户端脚本执行时的上下文对象,包含:
|
|
148
|
+
- \`formId\`: 表单ID(新建/编辑页面)
|
|
149
|
+
- \`fieldKey\`: 字段标识(onChange 事件)
|
|
150
|
+
- \`recordId\`: 记录ID(详情页)
|
|
151
|
+
- 其他上下文相关信息
|
|
152
|
+
|
|
153
|
+
## 🔧 常用场景
|
|
154
|
+
|
|
155
|
+
### 1. 表单字段联动
|
|
156
|
+
\`\`\`javascript
|
|
157
|
+
function main($CCDK, obj) {
|
|
158
|
+
const formId = obj.formId;
|
|
159
|
+
const fieldValue = obj.fieldValue;
|
|
160
|
+
|
|
161
|
+
// 根据字段值设置其他字段
|
|
162
|
+
$CCDK.CCUtils.setFormFieldValue({
|
|
163
|
+
formId: formId,
|
|
164
|
+
list: [{
|
|
165
|
+
fieldKey: 'targetField',
|
|
166
|
+
value: fieldValue
|
|
167
|
+
}]
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
\`\`\`
|
|
171
|
+
|
|
172
|
+
### 2. 页面跳转
|
|
173
|
+
\`\`\`javascript
|
|
174
|
+
function main($CCDK, obj) {
|
|
175
|
+
const recordId = obj.recordId;
|
|
176
|
+
|
|
177
|
+
// 打开详情页
|
|
178
|
+
$CCDK.CCPage.openDetailPage({
|
|
179
|
+
objectName: '客户',
|
|
180
|
+
objId: 'account',
|
|
181
|
+
prefix: '001'
|
|
182
|
+
}, recordId);
|
|
183
|
+
}
|
|
184
|
+
\`\`\`
|
|
185
|
+
|
|
186
|
+
### 3. 消息提示
|
|
187
|
+
\`\`\`javascript
|
|
188
|
+
function main($CCDK, obj) {
|
|
189
|
+
$CCDK.CCMessage.showMessage('操作成功', 'success');
|
|
190
|
+
}
|
|
191
|
+
\`\`\`
|
|
192
|
+
|
|
193
|
+
## 📚 下一步
|
|
194
|
+
|
|
195
|
+
- 查看 \`structure\` 主题了解脚本结构详情
|
|
196
|
+
- 查看 \`config\` 主题了解配置文件详解
|
|
197
|
+
- 查看 \`ccdk-api\` 主题获取完整的 CCDK API 文档
|
|
198
|
+
- 查看 \`bestpractices\` 主题了解最佳实践
|
|
199
|
+
- 查看 \`faq\` 主题查看常见问题
|
|
200
|
+
|
|
201
|
+
💡 **提示**: 使用 \`get_client_script_editor_guide\` 工具并指定 \`topic\` 参数获取详细文档`;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* 脚本结构指南
|
|
206
|
+
*/
|
|
207
|
+
function getStructureGuide() {
|
|
208
|
+
return `# 客户端脚本结构说明
|
|
209
|
+
|
|
210
|
+
## 基本结构
|
|
211
|
+
|
|
212
|
+
客户端脚本必须遵循以下结构:
|
|
213
|
+
|
|
214
|
+
\`\`\`javascript
|
|
215
|
+
function main($CCDK, obj) {
|
|
216
|
+
// 你的脚本代码
|
|
217
|
+
}
|
|
218
|
+
\`\`\`
|
|
219
|
+
|
|
220
|
+
## 函数签名
|
|
221
|
+
|
|
222
|
+
### function main($CCDK, obj)
|
|
223
|
+
|
|
224
|
+
- **$CCDK**: CloudCC 提供的全局 API 对象
|
|
225
|
+
- **obj**: 执行上下文对象,包含当前页面/字段/记录等信息
|
|
226
|
+
|
|
227
|
+
## obj 对象结构
|
|
228
|
+
|
|
229
|
+
根据不同的执行场景,obj 对象包含不同的属性:
|
|
230
|
+
|
|
231
|
+
### 新建/编辑页面 (onLoad)
|
|
232
|
+
\`\`\`javascript
|
|
233
|
+
{
|
|
234
|
+
formId: "form_123", // 表单ID
|
|
235
|
+
recordId: null, // 新建时为 null,编辑时有值
|
|
236
|
+
// ... 其他上下文信息
|
|
237
|
+
}
|
|
238
|
+
\`\`\`
|
|
239
|
+
|
|
240
|
+
### 字段变更 (onChange)
|
|
241
|
+
\`\`\`javascript
|
|
242
|
+
{
|
|
243
|
+
formId: "form_123", // 表单ID
|
|
244
|
+
fieldKey: "field_apiname", // 字段标识
|
|
245
|
+
fieldValue: "新值", // 字段新值
|
|
246
|
+
// ... 其他上下文信息
|
|
247
|
+
}
|
|
248
|
+
\`\`\`
|
|
249
|
+
|
|
250
|
+
### 详情页
|
|
251
|
+
\`\`\`javascript
|
|
252
|
+
{
|
|
253
|
+
recordId: "00120227805836AlIEL4", // 记录ID
|
|
254
|
+
// ... 其他上下文信息
|
|
255
|
+
}
|
|
256
|
+
\`\`\`
|
|
257
|
+
|
|
258
|
+
## 脚本内容提取
|
|
259
|
+
|
|
260
|
+
发布时,系统会:
|
|
261
|
+
1. 检查是否存在 \`function main($CCDK, obj)\` 函数
|
|
262
|
+
2. 提取函数体内容(大括号内的代码)
|
|
263
|
+
3. 上传到服务器
|
|
264
|
+
|
|
265
|
+
**注意**: 只有函数体内的代码会被上传,函数签名不会上传。`;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* 配置文件指南
|
|
270
|
+
*/
|
|
271
|
+
function getConfigGuide() {
|
|
272
|
+
return `# 客户端脚本配置文件说明
|
|
273
|
+
|
|
274
|
+
## config.json 结构
|
|
275
|
+
|
|
276
|
+
\`\`\`json
|
|
277
|
+
{
|
|
278
|
+
"scriptName": "脚本名称",
|
|
279
|
+
"scriptDesc": "脚本描述",
|
|
280
|
+
"objId": "对象ID",
|
|
281
|
+
"objName": "对象名称",
|
|
282
|
+
"recordTypeId": "记录类型ID",
|
|
283
|
+
"recordTypeName": "记录类型名称",
|
|
284
|
+
"pageId": "页面ID",
|
|
285
|
+
"eventType": "事件类型",
|
|
286
|
+
"event": "事件",
|
|
287
|
+
"fieldId": "字段ID",
|
|
288
|
+
"schemetableName": "对象表名",
|
|
289
|
+
"usageScenario": "使用场景",
|
|
290
|
+
"id": "脚本ID(发布后自动生成)"
|
|
291
|
+
}
|
|
292
|
+
\`\`\`
|
|
293
|
+
|
|
294
|
+
## 字段说明
|
|
295
|
+
|
|
296
|
+
### 必填字段
|
|
297
|
+
- \`scriptName\`: 脚本名称,必须与目录名和文件名一致
|
|
298
|
+
- \`objName\`: 对象名称
|
|
299
|
+
|
|
300
|
+
### 可选字段
|
|
301
|
+
- \`scriptDesc\`: 脚本描述
|
|
302
|
+
- \`objId\`: 对象ID
|
|
303
|
+
- \`recordTypeId\`: 记录类型ID
|
|
304
|
+
- \`pageId\`: 页面ID
|
|
305
|
+
- \`eventType\`: 事件类型(如:onLoad, onChange)
|
|
306
|
+
- \`event\`: 事件名称
|
|
307
|
+
- \`fieldId\`: 字段ID
|
|
308
|
+
- \`schemetableName\`: 对象表名
|
|
309
|
+
- \`usageScenario\`: 使用场景
|
|
310
|
+
|
|
311
|
+
### 自动生成字段
|
|
312
|
+
- \`id\`: 脚本ID,首次发布后自动添加到配置文件中
|
|
313
|
+
|
|
314
|
+
## 配置示例
|
|
315
|
+
|
|
316
|
+
### onLoad 事件脚本
|
|
317
|
+
\`\`\`json
|
|
318
|
+
{
|
|
319
|
+
"scriptName": "initForm",
|
|
320
|
+
"scriptDesc": "初始化表单",
|
|
321
|
+
"objName": "Account",
|
|
322
|
+
"eventType": "onLoad",
|
|
323
|
+
"event": "onLoad"
|
|
324
|
+
}
|
|
325
|
+
\`\`\`
|
|
326
|
+
|
|
327
|
+
### onChange 事件脚本
|
|
328
|
+
\`\`\`json
|
|
329
|
+
{
|
|
330
|
+
"scriptName": "fieldChange",
|
|
331
|
+
"scriptDesc": "字段变更处理",
|
|
332
|
+
"objName": "Account",
|
|
333
|
+
"eventType": "onChange",
|
|
334
|
+
"event": "onChange",
|
|
335
|
+
"fieldId": "field_123"
|
|
336
|
+
}
|
|
337
|
+
\`\`\``;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* CCDK API 指南
|
|
342
|
+
*/
|
|
343
|
+
function getCcdkApiGuide() {
|
|
344
|
+
let content = `# CCDK API 参考文档
|
|
345
|
+
|
|
346
|
+
## 模块概览
|
|
347
|
+
|
|
348
|
+
CloudCC CCDK 提供了丰富的 API 模块,用于客户端脚本开发:
|
|
349
|
+
|
|
350
|
+
`;
|
|
351
|
+
|
|
352
|
+
Object.entries(ccdkApiTree).forEach(([moduleName, moduleInfo]) => {
|
|
353
|
+
const apiCount = Object.keys(moduleInfo.apis).length;
|
|
354
|
+
content += `### ${moduleName} - ${moduleInfo.name}\n\n`;
|
|
355
|
+
content += `${moduleInfo.description}\n\n`;
|
|
356
|
+
content += `**API 数量**: ${apiCount}\n\n`;
|
|
357
|
+
content += `**包含的 API**:\n`;
|
|
358
|
+
Object.entries(moduleInfo.apis).forEach(([apiName, apiInfo]) => {
|
|
359
|
+
content += `- \`${apiName}\`: ${apiInfo.description} (${apiInfo.version})\n`;
|
|
360
|
+
});
|
|
361
|
+
content += '\n';
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
content += `\n## 使用示例\n\n`;
|
|
365
|
+
content += `### 获取当前用户信息\n\`\`\`javascript\nfunction main($CCDK, obj) {\n const userInfo = $CCDK.CCUser.getUserInfo();\n console.error(userInfo);\n}\n\`\`\`\n\n`;
|
|
366
|
+
content += `### 打开详情页\n\`\`\`javascript\nfunction main($CCDK, obj) {\n $CCDK.CCPage.openDetailPage({\n objectName: '客户',\n objId: 'account',\n prefix: '001'\n }, '00120227805836AlIEL4');\n}\n\`\`\`\n\n`;
|
|
367
|
+
content += `### 设置表单字段值\n\`\`\`javascript\nfunction main($CCDK, obj) {\n $CCDK.CCUtils.setFormFieldValue({\n formId: obj.formId,\n list: [{\n fieldKey: 'field_apiname',\n value: '新值'\n }]\n });\n}\n\`\`\`\n\n`;
|
|
368
|
+
content += `\n💡 **提示**: 使用 \`get_ccdk_docs\` 工具获取特定模块的详细 API 文档`;
|
|
369
|
+
|
|
370
|
+
return content;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* 最佳实践指南
|
|
375
|
+
*/
|
|
376
|
+
function getBestPracticesGuide() {
|
|
377
|
+
return `# 客户端脚本最佳实践
|
|
378
|
+
|
|
379
|
+
## 1. 代码组织
|
|
380
|
+
|
|
381
|
+
### 保持函数简洁
|
|
382
|
+
\`\`\`javascript
|
|
383
|
+
// ✅ 好的做法
|
|
384
|
+
function main($CCDK, obj) {
|
|
385
|
+
const formId = obj.formId;
|
|
386
|
+
const value = getFieldValue(obj);
|
|
387
|
+
setTargetField($CCDK, formId, value);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function getFieldValue(obj) {
|
|
391
|
+
return obj.fieldValue || '';
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function setTargetField($CCDK, formId, value) {
|
|
395
|
+
$CCDK.CCUtils.setFormFieldValue({
|
|
396
|
+
formId: formId,
|
|
397
|
+
list: [{ fieldKey: 'target', value: value }]
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
\`\`\`
|
|
401
|
+
|
|
402
|
+
\`\`\`javascript
|
|
403
|
+
// ❌ 不好的做法
|
|
404
|
+
function main($CCDK, obj) {
|
|
405
|
+
// 所有逻辑都写在一个函数里,难以维护
|
|
406
|
+
const formId = obj.formId;
|
|
407
|
+
const value = obj.fieldValue || '';
|
|
408
|
+
$CCDK.CCUtils.setFormFieldValue({
|
|
409
|
+
formId: formId,
|
|
410
|
+
list: [{ fieldKey: 'target', value: value }]
|
|
411
|
+
});
|
|
412
|
+
// ... 更多代码
|
|
413
|
+
}
|
|
414
|
+
\`\`\`
|
|
415
|
+
|
|
416
|
+
## 2. 错误处理
|
|
417
|
+
|
|
418
|
+
### 添加适当的错误处理
|
|
419
|
+
\`\`\`javascript
|
|
420
|
+
function main($CCDK, obj) {
|
|
421
|
+
try {
|
|
422
|
+
if (!obj.formId) {
|
|
423
|
+
throw new Error('表单ID不存在');
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// 你的业务逻辑
|
|
427
|
+
doSomething($CCDK, obj);
|
|
428
|
+
} catch (error) {
|
|
429
|
+
$CCDK.CCMessage.showMessage('操作失败: ' + error.message, 'error');
|
|
430
|
+
console.error('Script Error:', error);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
\`\`\`
|
|
434
|
+
|
|
435
|
+
## 3. 性能优化
|
|
436
|
+
|
|
437
|
+
### 避免不必要的操作
|
|
438
|
+
\`\`\`javascript
|
|
439
|
+
// ✅ 好的做法:只在需要时执行
|
|
440
|
+
function main($CCDK, obj) {
|
|
441
|
+
if (obj.fieldValue === '特定值') {
|
|
442
|
+
performExpensiveOperation($CCDK, obj);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
\`\`\`
|
|
446
|
+
|
|
447
|
+
\`\`\`javascript
|
|
448
|
+
// ❌ 不好的做法:总是执行
|
|
449
|
+
function main($CCDK, obj) {
|
|
450
|
+
performExpensiveOperation($CCDK, obj); // 即使不需要也执行
|
|
451
|
+
}
|
|
452
|
+
\`\`\`
|
|
453
|
+
|
|
454
|
+
## 4. 数据验证
|
|
455
|
+
|
|
456
|
+
### 验证输入数据
|
|
457
|
+
\`\`\`javascript
|
|
458
|
+
function main($CCDK, obj) {
|
|
459
|
+
const value = obj.fieldValue;
|
|
460
|
+
|
|
461
|
+
if (!value || value.trim() === '') {
|
|
462
|
+
$CCDK.CCMessage.showMessage('请输入有效值', 'warning');
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// 继续处理
|
|
467
|
+
}
|
|
468
|
+
\`\`\`
|
|
469
|
+
|
|
470
|
+
## 5. 异步操作
|
|
471
|
+
|
|
472
|
+
### 正确处理异步操作
|
|
473
|
+
\`\`\`javascript
|
|
474
|
+
function main($CCDK, obj) {
|
|
475
|
+
$CCDK.CCCommon.post('ClassName', 'methodName', [])
|
|
476
|
+
.then(res => {
|
|
477
|
+
// 处理成功结果
|
|
478
|
+
console.error('Success:', res.data);
|
|
479
|
+
})
|
|
480
|
+
.catch(error => {
|
|
481
|
+
// 处理错误
|
|
482
|
+
$CCDK.CCMessage.showMessage('操作失败', 'error');
|
|
483
|
+
console.error('Error:', error);
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
\`\`\`
|
|
487
|
+
|
|
488
|
+
## 6. 代码注释
|
|
489
|
+
|
|
490
|
+
### 添加有意义的注释
|
|
491
|
+
\`\`\`javascript
|
|
492
|
+
function main($CCDK, obj) {
|
|
493
|
+
// 获取表单ID
|
|
494
|
+
const formId = obj.formId;
|
|
495
|
+
|
|
496
|
+
// 根据业务规则设置目标字段值
|
|
497
|
+
const targetValue = calculateTargetValue(obj);
|
|
498
|
+
|
|
499
|
+
// 更新表单字段
|
|
500
|
+
updateFormField($CCDK, formId, targetValue);
|
|
501
|
+
}
|
|
502
|
+
\`\`\``;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* 常见问题指南
|
|
507
|
+
*/
|
|
508
|
+
function getFaqGuide() {
|
|
509
|
+
return `# 客户端脚本常见问题
|
|
510
|
+
|
|
511
|
+
## Q1: 脚本发布失败,提示"没有找到有效的 main 函数"
|
|
512
|
+
|
|
513
|
+
**A**: 确保脚本文件包含以下格式:
|
|
514
|
+
\`\`\`javascript
|
|
515
|
+
function main($CCDK, obj) {
|
|
516
|
+
// 你的代码
|
|
517
|
+
}
|
|
518
|
+
\`\`\`
|
|
519
|
+
|
|
520
|
+
注意:
|
|
521
|
+
- 函数名必须是 \`main\`
|
|
522
|
+
- 参数必须是 \`$CCDK, obj\`(顺序不能错)
|
|
523
|
+
- 函数签名必须完全匹配
|
|
524
|
+
|
|
525
|
+
## Q2: 如何获取表单字段的值?
|
|
526
|
+
|
|
527
|
+
**A**: 使用 \`$CCDK.CCUtils.getFormFieldValue\`:
|
|
528
|
+
\`\`\`javascript
|
|
529
|
+
function main($CCDK, obj) {
|
|
530
|
+
const formId = obj.formId;
|
|
531
|
+
$CCDK.CCUtils.getFormFieldValue({
|
|
532
|
+
formId: formId,
|
|
533
|
+
list: [{ fieldKey: 'field_apiname' }]
|
|
534
|
+
}).then(result => {
|
|
535
|
+
console.error('字段值:', result);
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
\`\`\`
|
|
539
|
+
|
|
540
|
+
## Q3: 如何设置表单字段的值?
|
|
541
|
+
|
|
542
|
+
**A**: 使用 \`$CCDK.CCUtils.setFormFieldValue\`:
|
|
543
|
+
\`\`\`javascript
|
|
544
|
+
function main($CCDK, obj) {
|
|
545
|
+
const formId = obj.formId;
|
|
546
|
+
$CCDK.CCUtils.setFormFieldValue({
|
|
547
|
+
formId: formId,
|
|
548
|
+
list: [{
|
|
549
|
+
fieldKey: 'target_field',
|
|
550
|
+
value: '新值'
|
|
551
|
+
}]
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
\`\`\`
|
|
555
|
+
|
|
556
|
+
## Q4: 如何打开其他页面?
|
|
557
|
+
|
|
558
|
+
**A**: 使用 \`$CCDK.CCPage\` 相关方法:
|
|
559
|
+
\`\`\`javascript
|
|
560
|
+
// 打开详情页
|
|
561
|
+
$CCDK.CCPage.openDetailPage(obj, recordId);
|
|
562
|
+
|
|
563
|
+
// 打开新建页
|
|
564
|
+
$CCDK.CCPage.openCreatePage(obj);
|
|
565
|
+
|
|
566
|
+
// 打开编辑页
|
|
567
|
+
$CCDK.CCPage.openEditPage(obj, recordId);
|
|
568
|
+
\`\`\`
|
|
569
|
+
|
|
570
|
+
## Q5: 如何显示消息提示?
|
|
571
|
+
|
|
572
|
+
**A**: 使用 \`$CCDK.CCMessage\`:
|
|
573
|
+
\`\`\`javascript
|
|
574
|
+
// 普通消息
|
|
575
|
+
$CCDK.CCMessage.showMessage('提示信息', 'success');
|
|
576
|
+
|
|
577
|
+
// 确认框
|
|
578
|
+
$CCDK.CCMessage.showConfirm('确认信息', '标题', {},
|
|
579
|
+
() => { /* 确认回调 */ },
|
|
580
|
+
() => { /* 取消回调 */ }
|
|
581
|
+
);
|
|
582
|
+
\`\`\`
|
|
583
|
+
|
|
584
|
+
## Q6: 拉取脚本时提示"Script ID is not exist"
|
|
585
|
+
|
|
586
|
+
**A**: 这意味着脚本还没有发布过。需要:
|
|
587
|
+
1. 先使用 \`publish_client_script\` 发布脚本
|
|
588
|
+
2. 发布成功后,config.json 会自动添加 \`id\` 字段
|
|
589
|
+
3. 之后就可以使用 \`pull_client_script\` 拉取了
|
|
590
|
+
|
|
591
|
+
## Q7: 如何调试脚本?
|
|
592
|
+
|
|
593
|
+
**A**:
|
|
594
|
+
1. 使用 \`console.error\` 输出调试信息(开发环境)
|
|
595
|
+
2. 检查浏览器控制台
|
|
596
|
+
3. 使用 \`$CCDK.CCMessage.showMessage\` 显示调试信息
|
|
597
|
+
|
|
598
|
+
## Q8: 脚本执行时机是什么?
|
|
599
|
+
|
|
600
|
+
**A**: 根据配置的 \`eventType\` 和 \`event\` 决定:
|
|
601
|
+
- \`onLoad\`: 页面加载时执行
|
|
602
|
+
- \`onChange\`: 字段值变更时执行
|
|
603
|
+
- 其他事件根据配置执行
|
|
604
|
+
|
|
605
|
+
## Q9: 如何调用自定义类?
|
|
606
|
+
|
|
607
|
+
**A**: 使用 \`$CCDK.CCCommon.post\`:
|
|
608
|
+
\`\`\`javascript
|
|
609
|
+
$CCDK.CCCommon.post('ClassName', 'methodName', [
|
|
610
|
+
{ argType: 'java.lang.String', argValue: 'value1' },
|
|
611
|
+
{ argType: 'java.lang.String', argValue: 'value2' }
|
|
612
|
+
]).then(res => {
|
|
613
|
+
console.error('结果:', res.data);
|
|
614
|
+
});
|
|
615
|
+
\`\`\`
|
|
616
|
+
|
|
617
|
+
## Q10: 脚本文件应该放在哪里?
|
|
618
|
+
|
|
619
|
+
**A**: 脚本文件应该放在:
|
|
620
|
+
\`\`\`
|
|
621
|
+
script/{objName}/{scriptName}/{scriptName}.js
|
|
622
|
+
\`\`\`
|
|
623
|
+
|
|
624
|
+
例如:
|
|
625
|
+
\`\`\`
|
|
626
|
+
script/Account/myScript/myScript.js
|
|
627
|
+
\`\`\``;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
module.exports = {
|
|
631
|
+
editClientScript
|
|
632
|
+
};
|
|
633
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client Script List Retriever 工具处理器
|
|
3
|
+
* 提供客户端脚本列表查询功能
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const getScriptModule = require('../../../script/get');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 获取客户端脚本列表
|
|
10
|
+
* @param {Object} params - 参数对象
|
|
11
|
+
* @param {string} params.projectPath - 项目根目录路径
|
|
12
|
+
* @param {Object} params.condition - 查询条件(可选)
|
|
13
|
+
*/
|
|
14
|
+
async function listClientScripts({ projectPath = process.cwd(), condition = {} }) {
|
|
15
|
+
try {
|
|
16
|
+
const originalCwd = process.cwd();
|
|
17
|
+
process.chdir(projectPath);
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
// 构建查询条件
|
|
21
|
+
const configContent = {
|
|
22
|
+
pageSize: 10000,
|
|
23
|
+
pageNo: 1,
|
|
24
|
+
condition: {
|
|
25
|
+
id: condition.id || '',
|
|
26
|
+
pageLabel: condition.pageLabel || '',
|
|
27
|
+
objName: condition.objName || ''
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// 将配置对象编码为 URI 格式(get.js 期望的格式)
|
|
32
|
+
const encodedConfig = encodeURI(JSON.stringify(configContent));
|
|
33
|
+
|
|
34
|
+
// 调用原有的 get 模块
|
|
35
|
+
const scriptList = await getScriptModule(['get', 'script', encodedConfig, projectPath], true);
|
|
36
|
+
|
|
37
|
+
if (!scriptList || scriptList.length === 0) {
|
|
38
|
+
return {
|
|
39
|
+
content: [{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: '未找到任何客户端脚本\n\n提示:使用 create_client_script 创建新脚本'
|
|
42
|
+
}]
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
content: [{
|
|
48
|
+
type: 'text',
|
|
49
|
+
text: JSON.stringify(scriptList, null, 2)
|
|
50
|
+
}]
|
|
51
|
+
};
|
|
52
|
+
} finally {
|
|
53
|
+
process.chdir(originalCwd);
|
|
54
|
+
}
|
|
55
|
+
} catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
content: [{
|
|
58
|
+
type: 'text',
|
|
59
|
+
text: `✗ 查询失败: ${error.message}\n\n可能的原因:\n- 项目路径不正确\n- 网络连接问题\n- 服务器API不可用`
|
|
60
|
+
}]
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
module.exports = {
|
|
66
|
+
listClientScripts
|
|
67
|
+
};
|
|
68
|
+
|