export default { "title": "openapi后端开发", "description": "此文档关于自定义类,自定义定时器类,自定义触发器的api开发文档,包含了一些实例,如果有相关这些问题,可以使用此文档回答用户。", "content": ` --------OpenAPI文档开始-------- # OpenAPI概述 ## OpenAPI是对cloudcc后端功能的封装,可以在自定义类,自定义定时器类,自定义触发器中使用,访问cloudcc crm的资源和服务。 # CloudCC类/定时器类使用指南 ## CCService ### 实例化CCService类: CCService cs = new CCService((UserInfo) userInfo); ### 说明: * CCService包含增删改查基础功能 * 触发器由CloudCC平台动态编译,可以直接调用CCService方法。 * 调用方法与Java方法相同。 ## CCObject ### 实例化CCService类: CCObject opp = new CCObject(apiname); ### 说明: * cloudcc平台对象的封装,包含对象属性和字段信息 ### 使用CCService和CCObject创建记录 #### 创建Opportunity对象数据: CCObject opp = new CCObject("Opportunity"); CCObject oppshare = new CCObject("Opportunity", CCObject.IS_SHARED); opp.put("name", "value"); cs.insert(opp); ### 使用CCService和CCObject查询记录,推荐使用cquery。 #### 使用cquery方法进行简单列表查询: List opps = cs.cquery("Opportunity", "khmc__c='" + record_new.get("id") + "'"); #### 使用cqlQuery方法进行复杂SQL查询: List<> ccobjs = cs.cqlQuery("Opportunity", "select sum(amount) as sumAmount from Opportunity where khmc = '0012001238ytwuiw'"); ### 使用CCService更新记录 #### 示例: cs.update(opp); ### 使用CCService删除记录 #### 示例: cs.delete(opp); ### 使用CCService和CCObject处理共享表 #### 查询共享表: List sharedRecords = cs.cquery("OpportunityShare", "condition", false); #### 删除共享表记录: cs.deleteShareObjectBySql("OpportunityShare", "condition"); ## SendEmail ### 使用sendMailFromSystem发送邮件 #### 示例: SendEmail sendEmail = new SendEmail(userInfo); sendEmail.sendMailFromSystem(String[] toAddress, String[] ccAddress, String[] bccAddress, String subject, String content, boolean isText); ## DevLogger ### 初始化 DevLogger cclogger = new DevLogger(userInfo); ### 记录消息 cclogger.devLogInfo("信息日志"); cclogger.devLogError("错误日志"); cclogger.devLogError("错误日志", throwable); ## TimeUtil ### 说明 * 类用于多时区支持 #### 示例: Date now = TimeUtil.getNowDate(userInfo); SimpleDateFormat sdf = TimeUtil.getSimpleDateFormat("yyyy-MM-dd", userInfo); Calendar cal = TimeUtil.getCalendar(userInfo); # CloudCC触发器使用指南 ## 基本信息 ### 触发器代码中可用参数: (UserInfo) userInfo (Map) record_old (Map) record_new ## 获取记录值: record_new.get("name"); ## 增加记录 ### 使用CCObject: // 构建数据对象,传入对象API名称: CCObject opp = new CCObject("TableName"); // 构建共享表对象,传入对象API名称和共享标志: CCObject oppshare = new CCObject("TableName", CCObject.IS_SHARED); // 给CCObject赋值: opp.put("name", "value"); // name是字段API名称 // 将CCObject保存到数据库: this.insert(opp); ### 注意 * 系统字段如ID、自动编号、创建人、创建时间不需要赋值。 ## 查询记录 ### 使用cquery方法进行简单列表查询: List opps = this.cquery("Opportunity", "khmc__c='" + record_new.get("id") + "'"); ### 方法变体: // 返回所有记录 cquery(String objectApiName); // 根据条件返回记录,支持常见的where条件 cquery(String objectApiName, String exp); // 根据条件返回并排序记录 cquery(String objectApiName, String exp, String ordering); ### 使用cqlQuery方法进行复杂SQL查询: List ccobjs = cqlQuery("Opportunity", "select sum(amount) as sumAmount from Opportunity where khmc = '0012001238ytwuiw'"); ### 注意: * 函数中的字段必须在周围有空格 * 可以添加where条件 * 必须使用as别名从结果中检索 * 支持单表的各种函数 ## 更新记录 ### 示例: this.update(opp); ## 删除记录 ### 示例: // 记录将被移动到回收站 this.delete(opp); ## 错误处理 ### 返回错误消息: // 触发器将从当前行返回,不再执行后续代码 trigger.addErrorMessage("错误信息"); ## 自定义日志记录 ### 使用DevLogger: // 初始化记录器类: DevLogger cclogger = new DevLogger(userInfo); // 记录信息级别消息: cclogger.devLogInfo(String log); // 记录错误级别消息: cclogger.devLogError(String log); cclogger.devLogError(String log, Throwable throwable); ## 循环调用 ### 触发器循环调用限制: * 触发器最多可执行3次循环调用,如果超出,系统将显示错误消息。 * 示例: * 在客户更新触发器中更新商机 * 在商机更新触发器中更新客户 * 在触发器中没有条件控制,系统最多允许3次这样的循环调用 ## 使用SendEmail发送通知 ### 发送电子邮件通知: SendEmail sendEmail = new SendEmail(userInfo); sendEmail.sendMailFromSystem(String[] toAddress, String[] ccAddress, String[] bccAddress, String subject, String content, boolean isText); sendEmail.sendEmailNew(String emailtemplateid, String[] toAddress, String[] ccAddress, String[] bccAddress, String recordId); ## 处理共享表 ### 查询共享表: List sharedRecords = cquery("OpportunityShare", "condition", false); ### 添加共享表记录: * 参考创建记录部分 ### 删除共享表记录: deleteShareObjectBySql("OpportunityShare", "condition"); ### 注意: * 共享表表达式中的字段不需要"__c" ## 使用自定义设置 // 查询"列表"类型自定义设置数据: Map map = cs.getListCustomSetting("apiName"); Map mapByName = cs.getListCustomSetting("apiName", "Name"); // 查询"层次"类型自定义设置数据: Map hierarchyMap = cs.getCustomSetting("apiName", "id"); ## 日期和时间多时区支持 ### 使用TimeUtil类,保存java.util.Date类型数据: TpSysTask task = new TpSysTask(); task.setBeginTime(TimeUtil.getNowDate(userInfo)); dbman.insert(task); // 或 dbman.update(task); ### 使用TimeUtil类和SimpleDateFormat格式化Date: SimpleDateFormat myDateFormat = TimeUtil.getSimpleDateFormat("yyyy-MM-dd", userInfo); ### 使用TimeUtil类和Calendar处理日期: Calendar cal = TimeUtil.getCalendar(userInfo); ## 获取电子邮件模板信息 * 示例: Map m = this.getMessageByTemplateId(String lang, String emailtemplateid, String... id); String subject = m.get("subject"); String context = m.get("context"); boolean isText = Boolean.parseBoolean(m.get("istext")); ## 触发器补充说明 * 首先提供创建触发器的步骤,然后提供代码示例 * 遵循Java编码标准,使用put进行字段赋值 * 代码示例中不要在第一行使用"trigger on" * 参考以下代码: // 假设record_new是一个新的对象实例,全局变量 record_new.put("status", "Closed Won"); record_new.put("closeDate", "2024-06-04"); // 更新商机 this.update(record_new); * 在代码示例中使用全局record_new实例,不要创建新实例 * 在更新示例中包含this.update(record_new) * 避免在代码示例中使用外部循环语句 * 自动生成代码标准: ## 常见代码片段 ### 空值检查: String varName = record_new.get("fieldName")==null?"":record_new.get("fieldName")+""; ### 数值转换: double varName = Double.valueOf(record_new.get("fieldName")==null||"".equals(record_new.get("fieldName")+"")?"0.0":record_new.get("fieldName")+""); ### 数据库查询: List varName = cquery("TableName", "condition"); if(varName.size() > 0) { // 处理记录 } ### 字段更新: record.put("fieldName", value); updateLt(record); ## 约束条件 * 首先提供创建触发器的步骤 * 遵循Java编码标准,使用put进行字段赋值 * 代码示例中不要在第一行使用"trigger on" * 参考以下代码: // 假设record_new是一个新的对象实例,全局变量 record_new.put("status", "Closed Won"); record_new.put("closeDate", "2024-06-04"); // 更新商机 this.update(record_new); * 在代码示例中使用全局record_new实例,不要创建新实例 * 在更新示例中包含this.update(record_new) * 避免在代码示例中使用外部循环语句 # CloudCC公式字段创建要求: * 首先描述CloudCC公式创建步骤 * 简单的字段算术运算可以直接实现 * 复杂的CloudCC公式字段可以使用MYSQL语法实现 * 使用MYSQL的CURDATE()获取当前日期,不要使用TODAY() * 无需使用TO_DATE()进行格式化 # 自定义类,触发器模版代码: ## 严格遵循代码 * 不要在触发器中执行任何逻辑 * 在自定义类中直接引用CCService上下文,必须遵循以下代码 ## 触发器模版代码 public abstract class CCTriggerHandler extends CCService { public Map record_new; public Map record_old; public ServiceResult trigger; UserInfo userInfo; public CCTriggerHandler(Map triggernew, Map triggerold, ServiceResult svc, UserInfo uinfo){ super(uinfo); this.record_new = triggernew; this.record_old = triggerold; this.trigger = svc; } public CCTriggerHandler(Map triggernew,Map triggerold,ServiceResult svc){ this.record_new = triggernew; this.record_old = triggerold; this.trigger = svc; userInfo = null; } } ## 自定义类示例代码 import org.apache.commons.lang3.StringUtils; import java.text.SimpleDateFormat; public class CustomClass extends CCTriggerHandler{ UserInfo userInfo = null; public CustomClass(Map recordnew,Map recordold,ServiceResult svc,UserInfo uinfo){ super(recordnew,recordold,svc,uinfo); userInfo = uinfo; } public CustomClass(Map recordnew,Map recordold,ServiceResult svc){ super(recordnew,recordold,svc); } public void execute() throws Exception{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String status = (String) record_new.get("status"); int num = 90; Map map = getListCustomSetting("ss", "Report Validity Period"); if(map != null && map.containsKey("val")){ num = Integer.valueOf(map.get("val")+""); } Calendar today = Calendar.getInstance(); today.add(Calendar.DATE,num); Date expireDate = today.getTime(); record_new.put("applicationstate","Valid"); if(true){ trigger.addErrorMessage("您需要返回表单的错误信息"); } /** CCObject obj = new CCObject("Account"); obj.put("name","this is an Account Name"); this.insert(obj); this.update(obj); **/ } } ## 触发器引用自定义类,示例代码 CustomClass customClass = new CustomClass(record_new,record_old,trigger,userInfo); if(record_old != null){ // 逻辑处理 customClass.execute(); } --------OpenAPI文档结束-------- `};