Skip to main content

后端开发教程

自定义类

一、介绍

类即为java类,自定义按钮,触发器,定时类等模块都可以调用自定义类,在类中处理一些逻辑。

💡
注意:当调用CCService的方法时,要对异常进行抛出或者捕获。定时类是一段Jave代码片段,新建定时作业时,指定定时类,定时类中的代码可以根据定时作业设置的时间执行。

1.进入类开发页面

  • 登录系统,点击右上角人头像,选择开发者平台按钮,此按钮目前只开放给管理员简档用户。
  • 选择左侧:扩展——》类

2.案例:查询客户对象数据

import net.sf.json.JSONObject;
import net.sf.json.JSONArray;
import net.sf.json.JSON;
/**
 * author:*** on 2022-10-12
 * 客户类
 */
public class AccountClass{
    private CCService cs;
    private UserInfo userInfo;
    public AccountClass(UserInfo userInfo) {
        this.userInfo = userInfo;
        cs = new CCService(userInfo);
    }

    public JSONObject selectAccount() throws Exception {
        JSONObject rtninfo = new JSONObject();//New JSONObject
        JSONArray dataList = new JSONArray();//New JSONArray
        boolean flag = false;
        try{
            //查询客户对象数据
            String sql = "select name,leixing,fenji,hangye from Account where is_deleted='0' ";
            List<CCObject> AccountList = cs.cqlQuery("Account", sql);//客户List
            for (int i=0;i<AccountList.size();i++) {
                String name = AccountList.get(i).get("name")==null?"":AccountList.get(i).get("name").toString();//客户名称
                String type = AccountList.get(i).get("leixing")==null?"":AccountList.get(i).get("leixing").toString();//类型
                String grade = AccountList.get(i).get("fenji")==null?"0":AccountList.get(i).get("fenji").toString();//分级
                String industry = AccountList.get(i).get("hangye")==null?"0":AccountList.get(i).get("hangye").toString();//行业
                
                JSONObject data = new JSONObject();//New JSONObject
                data.put("name", name);//客户名称
                data.put("type", type);//类型
                data.put("grade", grade);//分级
                data.put("industry", industry);//行业
                data.put("no",(i+1)+"");//序号
                dataList.add(data);
            }
            flag = true;
        }catch(Exception e){
            throw e;
        }
        rtninfo.put("status",flag);//状态
        rtninfo.put("data",dataList.toString());//客户数据
        return rtninfo;
    }
}

3.使用场景

二、进阶:类/定时类

1.CCService

1.1 在类中使用CCService

在类中使用CCService类中的方法,需要先实例化CCService对象。实例化方法如下:

CCService cs = new CCService((UserInfo)userInfo);

1.2 新增记录:insert

新增记录时,使用CCObject对象,CCObject有两个构造方法:

  • 传入对象API名称,构造一个数据对象:
CCObject opp = new CCObject("Opportunity");
  • 传入对象API名称和共享标志,构造一个对象的共享表对象:
CCObject oppshare = new CCObject("Opportunity", CCObject.IS_SHARED);

给CCObject赋值时,可以直接使用中文字段名称,无需转换为API名称。要将CCobject保存到数据库,调用方法 cs.insert(opp)。注意:ID,自动编号,创建人,创建时间等系统字段不需要赋值!

1.3 查询记录:cquery

查询记录时,使用cs.cquery方法。cs.cquery方法有三个重载方法:

  • 返回所有记录:
List<CCObject> opps = cs.cquery("Opportunity");
  • 按条件返回记录,支持常用的where条件:
List<CCObject> opps = cs.cquery("Opportunity", "khmc__c = '" + record_new.get("id") + "'");
  • 按条件返回并排序:
List<CCObject> opps = cs.cquery("Opportunity", "khmc__c = '" + record_new.get("id") + "'", "jine__c desc");

注意:exp和ordering条件中的字段API名称后一定要加"__c"。

1.4 修改记录:update

修改记录时,使用cs.update方法。cs.update方法需要传入一个CCObject对象。

CCObject opp = cs.query("Opportunity", "id = '" + record_id + "'").get(0);

opp.put("name", "修改后的机会名称");

cs.update(opp);

1.5 删除记录:delete

删除记录时,使用cs.delete方法。cs.delete方法需要传入一个CCObject对象。

CCObject opp = cs.query("Opportunity", "id = '" + record_id + "'").get(0);

cs.delete(opp);

1.6 操作共享表:

  • 查询共享表
List<CCObject> cquery(String objectApiName,String expression,boolean isDataObject);isDataObject 需要传入 false;
  • 新增共享表记录:见新增记录。
  • 删除共享表
deleteShareObjectBySql(String objectApiName,String expression)

注意:共享表的表达式中字段不需要加"__c"

1.8 使用自定义设置 customSetting

  • 查询“列表”类型的自定义设置数据,返回对应apiName的全部数据
Map map = cs.getListCustomSetting(String apiName);
  • 查询“列表”类型的自定义设置数据,返回对应apiName和Name的单条数据
Map map = cs.getListCustomSetting(String apiName, String Name);
  • 查询“层次结构”类型的自定义设置数据,返回对应apiName和权限(id为简档id或用户id)的单条数据
Map map = cs.getCustomSetting(String apiName, String id);

2.SendEmail

SendEmail sendEmail = new SendEmail(userInfo);
sendEmail.sendMailFromSystem(
String []toAddress,
String []ccAddress,
String []bccAddress,
String subject,
String content,
boolean isText);

3.DevLogger

  • 使用自定义log日志 DevLogger
// 初始化日志类
DevLogger cclogger = new DevLogger(userInfo);
// 打印info级别日志
cclogger.devLogInfo(String log);
// 打印error级别日志
cclogger.devLogError(String log);
// 打印error级别异常日志
cclogger.devLogError(String log, Throwable throwable);

4.TimeUtil

  • 日期时间类型数据多时区支持。

由于java.util.Date和Calendar是基于本地时区的,因此在涉及到跨时区的数据处理时,可能会出现错误。

为了解决这个问题,可以使用TimeUtil工具类中的getNowDate(userInfo)方法来获取当前时间。getNowDate(userInfo)方法会根据用户信息中的时区来获取当前时间,因此可以保证数据的准确性。

例如,在将日期保存到数据库时,可以将new Date()改为调用TimeUtil.getNowDate(userInfo):

TpSysTask task = new TpSysTask();
task.setBeginTime(TimeUtil.getNowDate(userInfo));
  • 使用SimpleDateFormat来对Date进行格式化时,应给SimpleDateFormat类实例设置时区,

例如:

SimpleDateFormat myDateFormat=new SimpleDateFormat("yyyy-MM-dd");
myDateFormat.setTimeZone(TimeUtil.getUserTimeZone(userInfo));
// 或者使用TimeUtil提供的工具方法获取实例
SimpleDateFormat myDateFormat=TimeUtil.getSimpleDateFormat("yyyy-MM-dd",userInfo);
  • 使用Calendar类处理日期时,应给Calendar实例设置时区,获取Calendar对象的方法可任选以下两种,
Calendar cal=Calendar.getInstance(TimeUtil.getUserTimeZone(userInfo))
Calendar cal=TimeUtil.getCalendar(userInfo);

5.CCObject

  • 构造函数
// 构造一个数据对象,需传入对象API名称: 
CCObject opp = new CCObject("Opportunity");

// 构造一个对象的共享表对象,需传入对象API名称及共享标志: 
CCObject oppshare = new CCObject("Opportunity",CCObject.IS_SHARED);

// 给CCObject赋值直接用put,name 为对象的字段API名称
opp.put("name","value");

三、示例:类/定时类

1.触发器使用类

触发器可以直接调用CCService类中的方法,无需实例化CCService对象。这是因为触发器由cloudcc平台动态进行编译,因此触发器可以直接对类进行调用。在触发器中调用,写法同java调用方法。

2.自定义类使用类

自定义类调用该类,需要使用PageClsInvoker类的invoker()方法。PageClsInvoker类是一个包装类,用于将自定义类的方法包装成函数,使自定义类可以直接调用。

// 自定义类中调用自定义类的方法
PageClsInvoker.invoker("Hello","test5",userInfo,map);

详细方法:调用自定义类的方法,需要使用PageClsInvoker类的invoker()方法。

invoker()方法有两个重载版本:

Object invoker(String calssname, String method, List<Map> conlist, List<Map> arglist);
Object invoker(String calssname, String method, List<Map> conlist, Map map);

参数说明:

  • calssname:自定义类的名称。
  • method:需要调用的自定义类的方法名称。
  • conlist:调用的自定义类的构造器参数。如果没有,则可传null。
    • argType:参数类型
    • argValue:参数值
  • arglist:调用的自定义类的方法的参数。如果没有,则可传null。
    • argType:参数类型
    • argValue:参数

使用Object invoker(String calssname, String method, List<Map> conlist, Map map);

public class Hello{

    public Hello(){}
    
    public Hello(UserInfo userInfo){
        System.out.print("测试");
    }
    
    public void test5(Map map) throws Exception{
        System.out.print("获取map中的值"+map.get(“name”));
    }
}
  • 在自定义类中可以通过这样调用:
List<Map> conlist = new ArrayList<Map>();

Map c = new HashMap();
c.put("argType",UserInfo.class);
c.put("argValue",userInfo);
conlist.add(c); 

Map m = new HashMap();
m.put("name",”Alex”); 

new PageClsInvoker(userInfo).invoker("Hello","test5",conlist,m);

使用Object invoker(String calssname, String method, List<Map> conlist, List<Map> arglist);

public class Hello{

    public Hello(){}
    
    public ServiceResult test3(UserInfo userInfo,String leadName) throws Exception{
        CCService cs = new CCService((UserInfo)userInfo);
        CCObject co = new CCObject("Lead");
        co.put("name",name);
        ServiceResult sr = cs.insert(co);return sr;
     }
}
  • 在自定义类中可以通过这样调用:
List<Map> arglist = new ArrayList<Map>();

Map c = new HashMap();
c.put("argType",UserInfo.class);
c.put("argValue",userInfo);
arglist.add(c);

Map n = new HashMap();
n.put("argType",String.class);
n.put("argValue",”Alex”);
arglist.add(n); 

new PageClsInvoker(userInfo).invoker("Hello","test5",null, arglist);