cloudcc-cli 2.2.5 → 2.2.7
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/.cloudcc-cache.json +38 -0
- package/README.md +1435 -522
- package/bin/cc.js +7 -2
- package/bin/index.js +4 -0
- package/java/com/cloudcc/core/BaseException.java +100 -0
- package/java/com/cloudcc/core/BusiException.java +43 -0
- package/java/com/cloudcc/core/CCService.java +3 -1
- package/java/com/cloudcc/core/StringUtils.java +7 -0
- package/java/com/cloudcc/core/TimeUtil.java +33 -0
- package/java/com/cloudcc/core/UserInfo.java +9 -0
- package/package.json +7 -1
- package/pom.xml +1 -1
- package/skill/BACKEND_CODE.md +114 -0
- package/skill/CLI_CHEATSHEET.md +90 -0
- package/skill/INSTALL_AND_BOOTSTRAP.md +59 -0
- package/skill/OBJECTS_AND_FIELDS.md +120 -0
- package/skill/REQUIREMENTS_BREAKDOWN.md +98 -0
- package/skill/SKILL.md +33 -0
- package/skill/VUE_CUSTOM_COMPONENT.md +50 -0
- package/src/api/backend-sdk-java.md +427 -0
- package/src/api/ccdk-sdk.md +1039 -0
- package/src/application/create.js +114 -0
- package/src/application/get.js +13 -0
- package/src/application/index.js +8 -0
- package/src/classes/doc.js +486 -0
- package/src/classes/index.js +1 -0
- package/src/mcp/cliRunner.js +61 -0
- package/src/mcp/index.js +84 -12
- package/src/mcp/readme.md +6 -3
- package/src/mcp/tools/Application Creator/handler.js +78 -0
- package/src/mcp/tools/Approval/handler.js +34 -151
- package/src/mcp/tools/Class Creator/handler.js +18 -15
- package/src/mcp/tools/Class Detail Retriever/handler.js +8 -9
- package/src/mcp/tools/Class Editor Guide/handler.js +5 -19
- package/src/mcp/tools/Class List Retriever/handler.js +8 -3
- package/src/mcp/tools/Class Publisher/handler.js +7 -9
- package/src/mcp/tools/Class Puller/handler.js +6 -65
- package/src/mcp/tools/Client Script Detail Retriever/handler.js +12 -18
- package/src/mcp/tools/Client Script Editor Guide/handler.js +9 -605
- package/src/mcp/tools/Client Script List Retriever/handler.js +30 -33
- package/src/mcp/tools/Client Script Publisher/handler.js +12 -11
- package/src/mcp/tools/Client Script Puller/handler.js +23 -30
- package/src/mcp/tools/CloudCC Development Overview/handler.js +11 -5
- package/src/mcp/tools/Component Creator/handler.js +12 -11
- package/src/mcp/tools/Component Detail Retriever/handler.js +12 -9
- package/src/mcp/tools/Component Editor Guide/handler.js +5 -22
- package/src/mcp/tools/Component List Retriever/handler.js +21 -18
- package/src/mcp/tools/Component Publisher/handler.js +25 -3
- package/src/mcp/tools/Component Puller/handler.js +13 -16
- package/src/mcp/tools/Dev Environment Creator/handler.js +5 -72
- package/src/mcp/tools/Dev Environment Validator/handler.js +5 -66
- package/src/mcp/tools/Developer Key Setup Guide/handler.js +11 -20
- package/src/mcp/tools/JSP Migrator/handler.js +842 -0
- package/src/mcp/tools/Menu Creator/handler.js +86 -0
- package/src/mcp/tools/Object Creator/handler.js +14 -6
- package/src/mcp/tools/Object Fields Creator/handler.js +9 -10
- package/src/mcp/tools/Object Fields Retriever/handler.js +6 -3
- package/src/mcp/tools/Object List Retriever/handler.js +10 -7
- package/src/mcp/tools/Scheduled Class Creator/handler.js +12 -16
- package/src/mcp/tools/Scheduled Class Detail Retriever/handler.js +7 -9
- package/src/mcp/tools/Scheduled Class List Retriever/handler.js +21 -23
- package/src/mcp/tools/Scheduled Class Publisher/handler.js +7 -9
- package/src/mcp/tools/Scheduled Class Puller/handler.js +6 -70
- package/src/mcp/tools/Trigger Creator/handler.js +12 -20
- package/src/mcp/tools/Trigger Detail Retriever/handler.js +7 -9
- package/src/mcp/tools/Trigger Editor Guide/handler.js +10 -35
- package/src/mcp/tools/Trigger List Retriever/handler.js +12 -4
- package/src/mcp/tools/Trigger Publisher/handler.js +8 -11
- package/src/mcp/tools/Trigger Puller/handler.js +12 -17
- package/src/menu/common.js +16 -0
- package/src/menu/create-object.js +94 -0
- package/src/menu/create-page.js +108 -0
- package/src/menu/create-script.js +108 -0
- package/src/menu/create-site.js +108 -0
- package/src/menu/create.js +54 -0
- package/src/menu/index.js +7 -0
- package/src/plugin/doc.js +801 -0
- package/src/plugin/index.js +1 -0
- package/src/plugin/pull.js +3 -0
- package/src/project/doc.js +378 -0
- package/src/project/index.js +1 -0
- package/src/script/doc.js +259 -0
- package/src/script/index.js +1 -0
- package/src/timer/index.js +1 -0
- package/src/triggers/doc.js +342 -0
- package/src/triggers/index.js +5 -0
- package/target/classes/com/cloudcc/core/BaseException.class +0 -0
- package/target/classes/com/cloudcc/core/BusiException.class +0 -0
- package/target/classes/com/cloudcc/core/CCService.class +0 -0
- package/target/classes/com/cloudcc/core/StringUtils.class +0 -0
- package/target/classes/com/cloudcc/core/TimeUtil.class +0 -0
- package/target/classes/com/cloudcc/core/UserInfo.class +0 -0
- package/template/lib/ccopenapi-0.0.4.jar +0 -0
- package/test/application.cli.test.js +30 -0
- package/test/classes.cli.test.js +121 -0
- package/test/fields.cli.test.js +69 -0
- package/test/mcp.cli.test.js +21 -0
- package/test/menu.cli.test.js +41 -0
- package/test/object.cli.test.js +64 -0
- package/test/plugin.cli.test.js +109 -0
- package/test/script.cli.test.js +101 -0
- package/test/timer.cli.test.js +107 -0
- package/test/trigger.cli.test.js +146 -0
- package/.vscode/settings.json +0 -3
- package/bin/mcp-svc.js +0 -13
- package/src/mcp/MCP/345/234/272/346/231/257/346/250/241/346/213/237.md +0 -8
- package/src/mcp/index-sse-svc.js +0 -126
- package/src/mcp/index-streamable-svc.js +0 -180
- package/src/mcp/tools/Class Detail Retriever/prompt.js +0 -37
- package/src/mcp/tools/Class Editor Guide/prompt.js +0 -468
- package/src/mcp/tools/Class Publisher/prompt.js +0 -40
- package/src/mcp/tools/Class Puller/prompt.js +0 -49
- package/src/mcp/tools/Client Script Creator/handler.js +0 -179
- package/src/mcp/tools/CloudCC Development Overview/prompt.js +0 -870
- package/src/mcp/tools/Component Editor Guide/prompt.js +0 -519
- package/src/mcp/tools/Component Publisher/prompt.js +0 -659
- package/src/mcp/tools/Dev Environment Creator/prompt.js +0 -273
- package/src/mcp/tools/Dev Environment Validator/prompt.js +0 -193
- package/src/mcp/tools/Developer Key Setup Guide/prompt.js +0 -71
- package/src/mcp/tools/Object Fields Retriever/prompt.js +0 -10
- package/src/mcp/tools/Object List Retriever/prompt.js +0 -10
- package/src/mcp/tools/ccdk/fetcher.js +0 -18
- package/src/mcp/tools/ccdk/handler.js +0 -98
- package/src/mcp/tools/ccdk/prompt.js +0 -453
- 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 +0 -3
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -18
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
- package/template/lib/ccopenapi-0.0.3.jar +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
## 目标
|
|
2
|
+
|
|
3
|
+
把业务需求翻译成 CloudCC CRM 二开落地项,并选择“应该做什么组件”:自定义对象/字段/菜单/应用/自定义类/定时器/触发器/自定义组件/客户端脚本。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 需求拆解模板(AI 必须输出)
|
|
8
|
+
|
|
9
|
+
拿到需求后,先输出以下结构(缺信息则显式标注“待确认”):
|
|
10
|
+
|
|
11
|
+
- **背景与目标**:要解决什么问题,成功标准是什么。
|
|
12
|
+
- **角色与权限**:涉及哪些用户/简档/权限集,是否需要后台权限调整。
|
|
13
|
+
- **对象与数据模型**:
|
|
14
|
+
- 需要哪些**自定义对象**(表)?
|
|
15
|
+
- 需要哪些**字段**(类型、必填/唯一、默认值、选项、查找/主详关系)?
|
|
16
|
+
- 是否涉及**记录类型**、**布局**、**验证规则**(若 CLI 不覆盖,需在 CRM 配置)?
|
|
17
|
+
- **业务流程**:
|
|
18
|
+
- 触发时机:保存前/保存后/提交审批/批处理/定时等
|
|
19
|
+
- 需要哪些自动化:校验、自动赋值、联动更新、异步任务、定时任务
|
|
20
|
+
- **界面与交互**:
|
|
21
|
+
- 是否需要自定义页面或嵌入式 UI?
|
|
22
|
+
- 是否需要列表/详情/编辑页的前端交互(客户端脚本 / 自定义组件)?
|
|
23
|
+
- **集成与外部依赖**:第三方接口、鉴权方式、重试/限流、日志与审计。
|
|
24
|
+
- **风险与回滚**:数据迁移、权限影响、性能与批量场景、灰度与回滚方案。
|
|
25
|
+
- **交付物清单**:最终要产出哪些 CloudCC 资产(对象/字段/菜单/应用/类/触发器/定时器/组件/脚本)。
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 方案选型决策表(怎么判断用什么)
|
|
30
|
+
|
|
31
|
+
### 自定义对象(Custom Object)
|
|
32
|
+
|
|
33
|
+
当出现以下需求时,优先考虑创建自定义对象:
|
|
34
|
+
|
|
35
|
+
- 需要一个新的业务实体(类似新表),有独立的字段、权限、页面与列表
|
|
36
|
+
- 需要与现有对象建立查找/主详关系
|
|
37
|
+
- 需要支持审批、报表、共享规则等平台能力(通常都围绕对象展开)
|
|
38
|
+
|
|
39
|
+
### 自定义字段(Field)
|
|
40
|
+
|
|
41
|
+
当需求是“给已有对象补充数据结构”时:
|
|
42
|
+
|
|
43
|
+
- 新增文本/数值/日期/选项/查找关系等字段
|
|
44
|
+
- 需要字段级校验、默认值、必填等(部分能力可能需在 CRM 配置完成)
|
|
45
|
+
|
|
46
|
+
### 触发器(Trigger)
|
|
47
|
+
|
|
48
|
+
当需求是“数据写入前后做强一致业务逻辑”时:
|
|
49
|
+
|
|
50
|
+
- 保存前校验/自动赋值/阻止不合法写入(before*)
|
|
51
|
+
- 保存后联动更新、写日志、创建子记录(after*)
|
|
52
|
+
- 批量/审批/提交后回调等特定时机(approval/batch/commitBatch 等)
|
|
53
|
+
|
|
54
|
+
> 注意:触发器要考虑**批量**、幂等、递归、性能与异常处理。
|
|
55
|
+
|
|
56
|
+
### 自定义类(Class)
|
|
57
|
+
|
|
58
|
+
当需求是“可复用的服务逻辑/复杂计算/对外接口封装”时:
|
|
59
|
+
|
|
60
|
+
- 作为触发器/定时器/页面调用的后端服务类
|
|
61
|
+
- 抽取通用能力(查询封装、校验器、集成适配器)
|
|
62
|
+
|
|
63
|
+
### 定时类(Scheduled Class / Timer)
|
|
64
|
+
|
|
65
|
+
当需求是“按时间周期跑任务”时:
|
|
66
|
+
|
|
67
|
+
- 夜间同步、定时报表、到期提醒、批量修复数据
|
|
68
|
+
- 需要可控的调度表达式与运行日志
|
|
69
|
+
|
|
70
|
+
### 自定义组件(Vue Custom Component)
|
|
71
|
+
|
|
72
|
+
当需求是“在 CloudCC UI 中提供复杂交互 UI”时:
|
|
73
|
+
|
|
74
|
+
- 自定义表单、复杂联动、可视化、批量操作 UI
|
|
75
|
+
- 需要前端框架能力(Vue2.x)与更强的用户体验
|
|
76
|
+
|
|
77
|
+
### 客户端脚本(Client Script)
|
|
78
|
+
|
|
79
|
+
当需求是“页面级轻量交互/字段联动/保存前校验”时:
|
|
80
|
+
|
|
81
|
+
- 列表/详情/编辑/新建页生命周期钩子
|
|
82
|
+
- 字段变更联动、提示、轻量校验
|
|
83
|
+
|
|
84
|
+
> 客户端脚本更轻量;交互复杂或需要组件化复用,建议升级为自定义组件。
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 推荐落地流程(AI 执行顺序)
|
|
89
|
+
|
|
90
|
+
一般建议按以下顺序落地(从“数据结构”到“业务逻辑”再到“界面”):
|
|
91
|
+
|
|
92
|
+
1. **对象与字段**:先把数据模型搭好(对象、字段、关系)
|
|
93
|
+
2. **菜单与应用**:让用户能访问(菜单/应用)
|
|
94
|
+
3. **后端逻辑**:自定义类 / 触发器 / 定时器
|
|
95
|
+
4. **前端交互**:客户端脚本 / 自定义组件
|
|
96
|
+
5. **联调与回归**:核心路径 + 批量场景 + 权限场景
|
|
97
|
+
6. **发布与回滚准备**:版本记录、灰度、回滚策略
|
|
98
|
+
|
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cloudcc-cli-dev
|
|
3
|
+
description: CloudCC CRM 二次开发 CLI 助手。用于需求拆解与方案选型,并通过 cloudcc-cli(cc 命令)创建/拉取/发布自定义对象、字段、菜单/应用、自定义类、定时器、触发器与 Vue 自定义组件等资产。用户提到 CloudCC、cloudcc-cli、cc 命令、对象/字段/触发器/定时器/自定义组件 时应优先使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CloudCC CLI Development Skill
|
|
7
|
+
|
|
8
|
+
## 使用方式(AI 必须遵循)
|
|
9
|
+
|
|
10
|
+
- 先阅读 `REQUIREMENTS_BREAKDOWN.md`,输出需求拆解与交付物清单,再进入落地步骤。
|
|
11
|
+
- 需要环境/密钥 配置时,阅读 `INSTALL_AND_BOOTSTRAP.md`。
|
|
12
|
+
- 需要建模时(对象/字段/菜单/应用),阅读 `OBJECTS_AND_FIELDS.md`。
|
|
13
|
+
- 需要后端逻辑时(类/定时器/触发器),阅读 `BACKEND_CODE.md`。
|
|
14
|
+
- 需要自定义组件时,阅读 `VUE_CUSTOM_COMPONENT.md`。
|
|
15
|
+
- 需要快速对照命令与参数时,阅读 `CLI_CHEATSHEET.md`。
|
|
16
|
+
|
|
17
|
+
## 强制安全边界
|
|
18
|
+
|
|
19
|
+
- 不要在输出/代码/提交中包含真实密钥(`CloudCCDev`、`safetyMark`、`secretKey`、`openSecretKey`、token
|
|
20
|
+
等)。
|
|
21
|
+
- 后端类/触发器/定时器遵守片段同步:仅在
|
|
22
|
+
`@SOURCE_CONTENT_START`~`@SOURCE_CONTENT_END` 内编写可发布逻辑。
|
|
23
|
+
- 客户端脚本遵守片段同步:仅在 `function main($CCDK, obj) { ... }`
|
|
24
|
+
的函数体内编写可发布逻辑。
|
|
25
|
+
|
|
26
|
+
## 快速入口
|
|
27
|
+
|
|
28
|
+
- 安装与初始化:`INSTALL_AND_BOOTSTRAP.md`
|
|
29
|
+
- 需求拆解与方案选择:`REQUIREMENTS_BREAKDOWN.md`
|
|
30
|
+
- 自定义对象与字段:`OBJECTS_AND_FIELDS.md`
|
|
31
|
+
- 自定义类/定时器/触发器:`BACKEND_CODE.md`
|
|
32
|
+
- Vue 自定义组件:`VUE_CUSTOM_COMPONENT.md`
|
|
33
|
+
- CLI 速查:`CLI_CHEATSHEET.md`
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
## 覆盖范围
|
|
2
|
+
|
|
3
|
+
本篇聚焦 CloudCC Vue2.x 自定义组件(Custom Component):
|
|
4
|
+
|
|
5
|
+
- 创建组件骨架
|
|
6
|
+
- 编辑与最佳实践入口
|
|
7
|
+
- 编译与发布到服务器
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 创建自定义组件
|
|
12
|
+
|
|
13
|
+
### CLI 命令
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 在项目根目录执行(会生成到 plugins/<pluginName>/)
|
|
17
|
+
cc create plugin <pluginName>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
创建后会生成组件主文件、子组件目录与配置文件(以项目模板为准)。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 发布组件
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cc publish plugin <pluginName>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
> 发布会执行编译/打包/上传;如果组件依赖复杂,注意依赖收集与发布策略。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 编辑要点(CLI 项目约束)
|
|
35
|
+
|
|
36
|
+
- 组件目录通常为 `plugins/<pluginName>/`
|
|
37
|
+
- 确保所有 `<style>` 标签带 `scoped`,避免全局样式污染
|
|
38
|
+
- 发布通过 `cc publish plugin <pluginName>` 执行编译与上传
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 选型建议(组件 vs 客户端脚本)
|
|
43
|
+
|
|
44
|
+
- **自定义组件**:复杂交互、强 UI、可复用组件化、需要更完整工程化能力。
|
|
45
|
+
- **客户端脚本**:轻量联动、页面钩子逻辑、少量 UI 提示与校验。
|
|
46
|
+
|
|
47
|
+
一般建议:
|
|
48
|
+
|
|
49
|
+
- 先用脚本满足基础联动;当逻辑与 UI 复杂度上升时,再升级为组件方案。
|
|
50
|
+
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
# CloudCC 后端 SDK(Java)使用指南
|
|
2
|
+
|
|
3
|
+
> 本文档参考 CloudCC 官方「后端 SDK 参考」整理而成:[后端SDK参考](https://help.cloudcc.cn/product03/fu-wu-duan-sdkcan-kao-java/)。
|
|
4
|
+
> 目标:为自定义类、触发器、定时类中的 Java 开发,提供 `CCObject`、`UserInfo`、`CCService`、`SendEmail`、`DevLogger`、`TimeUtil` 等核心 API 的速查说明。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. CCObject:CloudCC 对象封装
|
|
9
|
+
|
|
10
|
+
### 1.1 类说明
|
|
11
|
+
|
|
12
|
+
- 继承自 `java.util.HashMap`:`com.g3cloud.platform.publik.CCObject`
|
|
13
|
+
- 用于承载某个对象(如 `Account`、`Contact`)的一条记录或共享表记录。
|
|
14
|
+
|
|
15
|
+
### 1.2 构造函数
|
|
16
|
+
|
|
17
|
+
```java
|
|
18
|
+
public CCObject() {}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```java
|
|
22
|
+
public CCObject(String ccobj)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
26
|
+
| --------- | -------- | -------- | ------------ |
|
|
27
|
+
| `ccobj` | `String` | 是 | 对象 API 名称 |
|
|
28
|
+
|
|
29
|
+
```java
|
|
30
|
+
public CCObject(String ccobj, String isShared)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
34
|
+
| ----------- | -------- | -------- | ----------------------------------------- |
|
|
35
|
+
| `ccobj` | `String` | 是 | 对象 API 名称 |
|
|
36
|
+
| `isShared` | `String` | 是 | 共享标识,建议使用 `CCObject.IS_SHARED` |
|
|
37
|
+
|
|
38
|
+
### 1.3 常量字段
|
|
39
|
+
|
|
40
|
+
| 修饰符和类型 | 字段 | 默认值 | 说明 |
|
|
41
|
+
| ---------------------------- | -------------- | -------------- | --------- |
|
|
42
|
+
| `public static final String` | `OBJECT_API` | `CCObjectAPI` | 对象 API |
|
|
43
|
+
| `public static final String` | `IS_SHARED` | `isShared` | 共享对象标识 |
|
|
44
|
+
|
|
45
|
+
### 1.4 常用方法
|
|
46
|
+
|
|
47
|
+
#### `getObjectApiName()`
|
|
48
|
+
|
|
49
|
+
```java
|
|
50
|
+
public String getObjectApiName()
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
返回当前 `CCObject` 对应的对象 API 名称。
|
|
54
|
+
|
|
55
|
+
#### `put(String apiName, String value)`
|
|
56
|
+
|
|
57
|
+
```java
|
|
58
|
+
public String put(String apiName, String value)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
62
|
+
| ----------- | -------- | -------- | ----------------- |
|
|
63
|
+
| `apiName` | `String` | 是 | 字段 API 名称 |
|
|
64
|
+
| `value` | `String` | 是 | 字段值(字符串形式) |
|
|
65
|
+
|
|
66
|
+
示例:
|
|
67
|
+
|
|
68
|
+
```java
|
|
69
|
+
CCObject contact = new CCObject("Contact");
|
|
70
|
+
contact.put("email", "hello@cloudcc.com");
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 2. UserInfo:当前用户信息
|
|
76
|
+
|
|
77
|
+
类:`com.g3cloud.common.UserInfo`(实现 `java.io.Serializable`)
|
|
78
|
+
|
|
79
|
+
### 2.1 常用方法
|
|
80
|
+
|
|
81
|
+
```java
|
|
82
|
+
public String getUserId()
|
|
83
|
+
public String getOrgId()
|
|
84
|
+
public String getRoleId()
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
- `getUserId()`:当前用户 ID
|
|
88
|
+
- `getOrgId()`:当前组织 ID
|
|
89
|
+
- `getRoleId()`:当前角色 ID
|
|
90
|
+
|
|
91
|
+
在自定义类构造函数或方法中通常作为参数传入,用于实例化 `CCService`、`DevLogger` 等。
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 3. CCService:对象操作核心工具类
|
|
96
|
+
|
|
97
|
+
类:`com.g3cloud.platform.publik.CCService`
|
|
98
|
+
|
|
99
|
+
### 3.1 构造函数
|
|
100
|
+
|
|
101
|
+
```java
|
|
102
|
+
public CCService(UserInfo userInfo)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
106
|
+
| ----------- | ---------- | -------- | -------- |
|
|
107
|
+
| `userInfo` | `UserInfo` | 是 | 当前用户对象 |
|
|
108
|
+
|
|
109
|
+
在自定义类中常见用法:
|
|
110
|
+
|
|
111
|
+
```java
|
|
112
|
+
private CCService cs;
|
|
113
|
+
private UserInfo userInfo;
|
|
114
|
+
|
|
115
|
+
public MyClass(UserInfo userInfo) {
|
|
116
|
+
this.userInfo = userInfo;
|
|
117
|
+
this.cs = new CCService(userInfo);
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 3.2 新增记录:`insert`
|
|
122
|
+
|
|
123
|
+
```java
|
|
124
|
+
public ServiceResult insert(CCObject ccobj) throws BusiException
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
128
|
+
| -------- | ----------- | -------- | ------- |
|
|
129
|
+
| `ccobj` | `CCObject` | 是 | CC 对象 |
|
|
130
|
+
|
|
131
|
+
示例:
|
|
132
|
+
|
|
133
|
+
```java
|
|
134
|
+
CCObject contact = new CCObject("Contact");
|
|
135
|
+
contact.put("email", "hello@cloudcc.com");
|
|
136
|
+
cs.insert(contact);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 3.3 查询记录:`cquery`
|
|
140
|
+
|
|
141
|
+
```java
|
|
142
|
+
public List<CCObject> cquery(String apiName, String condition, String order) throws Exception
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
146
|
+
| ------------ | -------- | -------- | -------------------------------------------------------------------- |
|
|
147
|
+
| `apiName` | `String` | 是 | 对象 API 名称 |
|
|
148
|
+
| `condition` | `String` | 否 | 使用字段 apiname 查询,自定义字段 API 后需加 `__c`,为空则查询所有 |
|
|
149
|
+
| `order` | `String` | 否 | 排序条件,字段 API 后需加 `__c` |
|
|
150
|
+
|
|
151
|
+
示例:
|
|
152
|
+
|
|
153
|
+
```java
|
|
154
|
+
List<CCObject> opps = cs.cquery(
|
|
155
|
+
"Opportunity",
|
|
156
|
+
"khmc__c = '123'",
|
|
157
|
+
"jine__c desc"
|
|
158
|
+
);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
#### 查询共享数据
|
|
162
|
+
|
|
163
|
+
```java
|
|
164
|
+
public List<CCObject> cquery(String apiName, String condition, boolean isDataObject) throws Exception
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
168
|
+
| -------------- | --------- | -------- | -------------------------------------------- |
|
|
169
|
+
| `apiName` | `String` | 是 | 对象 API 名称 |
|
|
170
|
+
| `condition` | `String` | 否 | 同上 |
|
|
171
|
+
| `isDataObject` | `Boolean` | 否 | `true` 查询普通数据,`false` 查询共享数据 |
|
|
172
|
+
|
|
173
|
+
示例:
|
|
174
|
+
|
|
175
|
+
```java
|
|
176
|
+
List<CCObject> opps = cs.cquery(
|
|
177
|
+
"Opportunity",
|
|
178
|
+
"khmc__c = '123'",
|
|
179
|
+
false
|
|
180
|
+
);
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 3.4 SQL 查询:`cqlQuery`
|
|
184
|
+
|
|
185
|
+
```java
|
|
186
|
+
public List<CCObject> cqlQuery(String apiName, String cql) throws Exception
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
190
|
+
| --------- | -------- | -------- | -------------------------------------- |
|
|
191
|
+
| `apiName` | `String` | 是 | 对象 API 名称 |
|
|
192
|
+
| `cql` | `String` | 否 | CQL/SQL 语句,支持常用 where 条件 |
|
|
193
|
+
|
|
194
|
+
示例:
|
|
195
|
+
|
|
196
|
+
```java
|
|
197
|
+
List<CCObject> list = cs.cqlQuery(
|
|
198
|
+
"test_object_a",
|
|
199
|
+
"select * from test_object_a where text_field = 'hello002'"
|
|
200
|
+
);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### 3.5 修改记录:`update`
|
|
204
|
+
|
|
205
|
+
```java
|
|
206
|
+
public ServiceResult update(CCObject ccobj) throws Exception
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
示例:
|
|
210
|
+
|
|
211
|
+
```java
|
|
212
|
+
CCObject obj = new CCObject("test_object_a");
|
|
213
|
+
obj.put("id", "a252025B79C1B99R62Nf");
|
|
214
|
+
obj.put("text_field", "hello003");
|
|
215
|
+
cs.update(obj);
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### 3.6 删除记录:`delete`
|
|
219
|
+
|
|
220
|
+
```java
|
|
221
|
+
public ServiceResult delete(CCObject ccobj) throws Exception
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
示例:
|
|
225
|
+
|
|
226
|
+
```java
|
|
227
|
+
CCObject obj = new CCObject("test_object_a");
|
|
228
|
+
obj.put("id", "a252025B79C1B99R62Nf");
|
|
229
|
+
cs.delete(obj);
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 3.7 删除共享表记录:`deleteShareObjectBySql`
|
|
233
|
+
|
|
234
|
+
```java
|
|
235
|
+
public void deleteShareObjectBySql(String objectApiName, String expression) throws Exception
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
239
|
+
| ---------------- | -------- | -------- | ---------------------------------- |
|
|
240
|
+
| `objectApiName` | `String` | 是 | 对象 API 名称 |
|
|
241
|
+
| `expression` | `String` | 是 | SQL 表达式,字段 **不需要** 加 `__c` |
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 4. 自定义设置(CustomSetting)
|
|
246
|
+
|
|
247
|
+
### 4.1 列表类型:`getListCustomSetting`
|
|
248
|
+
|
|
249
|
+
```java
|
|
250
|
+
public Map getListCustomSetting(String objectApiName)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
254
|
+
| ---------------- | -------- | -------- | ------------- |
|
|
255
|
+
| `objectApiName` | `String` | 是 | 自定义设置 API |
|
|
256
|
+
|
|
257
|
+
返回指定 API 下的全部列表类型自定义设置。
|
|
258
|
+
|
|
259
|
+
### 4.2 列表类型单条:`getListCustomSetting(String apiName, String name)`
|
|
260
|
+
|
|
261
|
+
```java
|
|
262
|
+
Map map = cs.getListCustomSetting(String apiName, String name);
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
266
|
+
| ----------- | -------- | -------- | -------------- |
|
|
267
|
+
| `apiName` | `String` | 是 | 自定义设置 API |
|
|
268
|
+
| `name` | `String` | 是 | 自定义设置记录名称 |
|
|
269
|
+
|
|
270
|
+
### 4.3 层次结构类型:`getCustomSetting`
|
|
271
|
+
|
|
272
|
+
```java
|
|
273
|
+
public Map getCustomSetting(String objectApiName, String id)
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
277
|
+
| ---------------- | -------- | -------- | ------------------------ |
|
|
278
|
+
| `objectApiName` | `String` | 是 | 自定义设置 API |
|
|
279
|
+
| `id` | `String` | 是 | 简档 ID 或用户 ID |
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## 5. SendEmail:发送邮件
|
|
284
|
+
|
|
285
|
+
类:`com.g3cloud.platform.common.service.emailservice.SendEmail`
|
|
286
|
+
|
|
287
|
+
### 5.1 构造函数
|
|
288
|
+
|
|
289
|
+
```java
|
|
290
|
+
public SendEmail(UserInfo userInfo)
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
294
|
+
| ----------- | ---------- | -------- | -------- |
|
|
295
|
+
| `userInfo` | `UserInfo` | 是 | 用户对象 |
|
|
296
|
+
|
|
297
|
+
### 5.2 直接发送邮件:`sendMailFromSystem`
|
|
298
|
+
|
|
299
|
+
```java
|
|
300
|
+
public boolean sendMailFromSystem(
|
|
301
|
+
String[] toAddress,
|
|
302
|
+
String[] ccAddress,
|
|
303
|
+
String[] bccAddress,
|
|
304
|
+
String subject,
|
|
305
|
+
String content,
|
|
306
|
+
boolean isText)
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
310
|
+
| ------------ | ---------- | -------- | ----------------------------------------- |
|
|
311
|
+
| `toAddress` | `String[]` | 是 | 收件人数组 |
|
|
312
|
+
| `ccAddress` | `String[]` | 是 | 抄送人数组(可为空数组) |
|
|
313
|
+
| `bccAddress` | `String[]` | 是 | 密送人数组(可为空数组) |
|
|
314
|
+
| `subject` | `String` | 是 | 邮件标题 |
|
|
315
|
+
| `content` | `String` | 是 | 邮件内容(支持 HTML) |
|
|
316
|
+
| `isText` | `boolean` | 是 | `true` 纯文本;`false` HTML 格式邮件 |
|
|
317
|
+
|
|
318
|
+
### 5.3 使用模板发送:`sendEmailNew`
|
|
319
|
+
|
|
320
|
+
```java
|
|
321
|
+
public ServiceResult sendEmailNew(
|
|
322
|
+
String emailtemplateid,
|
|
323
|
+
String[] toaddress,
|
|
324
|
+
String[] ccaddress,
|
|
325
|
+
String[] bcaddress,
|
|
326
|
+
String id) throws Exception
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
330
|
+
| ----------------- | ---------- | -------- | ------------- |
|
|
331
|
+
| `emailtemplateid` | `String` | 是 | 邮件模板 ID |
|
|
332
|
+
| `toaddress` | `String[]` | 是 | 收件人 |
|
|
333
|
+
| `ccaddress` | `String[]` | 是 | 抄送人 |
|
|
334
|
+
| `bcaddress` | `String[]` | 是 | 密送人 |
|
|
335
|
+
| `id` | `String` | 是 | 关联记录 ID |
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## 6. DevLogger:运行日志采集
|
|
340
|
+
|
|
341
|
+
类:`com.g3cloud.platform.common.service.devlogger.DevLogger`(示例名,具体包以实际项目为准)
|
|
342
|
+
|
|
343
|
+
### 6.1 构造函数
|
|
344
|
+
|
|
345
|
+
```java
|
|
346
|
+
public DevLogger(UserInfo userInfo)
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
350
|
+
| ----------- | ---------- | -------- | -------- |
|
|
351
|
+
| `userInfo` | `UserInfo` | 是 | 用户对象 |
|
|
352
|
+
|
|
353
|
+
### 6.2 info 日志:`devLogInfo`
|
|
354
|
+
|
|
355
|
+
```java
|
|
356
|
+
public void devLogInfo(String info)
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
360
|
+
| ------- | -------- | -------- | -------- |
|
|
361
|
+
| `info` | `String` | 是 | 日志信息 |
|
|
362
|
+
|
|
363
|
+
### 6.3 error 日志:`devLogError`
|
|
364
|
+
|
|
365
|
+
```java
|
|
366
|
+
public void devLogError(String error, Throwable throwable)
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
370
|
+
| ------------ | ----------- | -------- | ---------- |
|
|
371
|
+
| `error` | `String` | 是 | 错误信息 |
|
|
372
|
+
| `throwable` | `Throwable` | 否 | 异常对象 |
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
## 7. TimeUtil:多时区时间工具
|
|
377
|
+
|
|
378
|
+
说明:`TimeUtil` 用于在多时区环境下安全处理时间,避免直接使用 `new Date()` / `Calendar.getInstance()` 带来的偏差。
|
|
379
|
+
|
|
380
|
+
### 7.1 获取当前时间:`getNowDate`
|
|
381
|
+
|
|
382
|
+
```java
|
|
383
|
+
TpSysTask task = new TpSysTask();
|
|
384
|
+
task.setBeginTime(TimeUtil.getNowDate(userInfo));
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
388
|
+
| ----------- | ---------- | -------- | -------- |
|
|
389
|
+
| `userInfo` | `UserInfo` | 是 | 用户对象 |
|
|
390
|
+
|
|
391
|
+
### 7.2 获取用户时区:`getUserTimeZone`
|
|
392
|
+
|
|
393
|
+
```java
|
|
394
|
+
TimeZone tz = TimeUtil.getUserTimeZone(userInfo);
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### 7.3 获取带时区的 `SimpleDateFormat`:`getSimpleDateFormat`
|
|
398
|
+
|
|
399
|
+
```java
|
|
400
|
+
SimpleDateFormat myDateFormat =
|
|
401
|
+
TimeUtil.getSimpleDateFormat("yyyy-MM-dd", userInfo);
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
| 参数 | 类型 | 是否必填 | 说明 |
|
|
405
|
+
| ----------- | ---------- | -------- | -------------- |
|
|
406
|
+
| `format` | `String` | 是 | 日期格式化模式 |
|
|
407
|
+
| `userInfo` | `UserInfo` | 是 | 用户对象 |
|
|
408
|
+
|
|
409
|
+
### 7.4 获取带时区的 `Calendar`
|
|
410
|
+
|
|
411
|
+
```java
|
|
412
|
+
Calendar cal = Calendar.getInstance(TimeUtil.getUserTimeZone(userInfo));
|
|
413
|
+
// 或
|
|
414
|
+
Calendar cal2 = TimeUtil.getCalendar(userInfo);
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## 8. 后端 SDK 使用建议 Checklist
|
|
420
|
+
|
|
421
|
+
- [ ] 在自定义类/触发器/定时类中统一使用 `CCService` 操作对象,不直接写 JDBC。
|
|
422
|
+
- [ ] 查询条件和排序中,自定义字段使用 API 名称并加 `__c` 后缀(共享表表达式除外)。
|
|
423
|
+
- [ ] 涉及时区的所有时间写入/比较统一使用 `TimeUtil`。
|
|
424
|
+
- [ ] 需要发邮件时首选 `SendEmail`,避免自己拼 SMTP。
|
|
425
|
+
- [ ] 关键业务流程和异常通过 `DevLogger` 记录,便于问题排查。
|
|
426
|
+
- [ ] 自定义设置使用 `getListCustomSetting` / `getCustomSetting` 统一读取。
|
|
427
|
+
|