1.所有写好的代码不要运行。
原因:例如更新删除等操作会直接同步到数据库。所以不要进行测试。可以打log测试
2.报价单一般是按钮类型。
3.所有的_id都为唯一标记,但是人员唯一标记为userid;
例如客户有唯一 标识_id,客户下可以根据_id和销售订单对应的name根据find查找到
4.UIEvent一般需要在之前获取当前信息,set("field_Kxuan__c":zc)里面的:不要写成了中文的
//获取主对象字段
String zc=context.data.field_XuzFy__c as String
log.info(zc)
UIEvent event=UIEvent.build(context){
//获取从对象的字段并赋值
editDetail "object_7l627__c" set("field_Kxuan__c":zc)
}
return event
4.UIEvent一般需要在之前获取当前信息,set("field_Kxuan__c":zc)里面的:不要写成了中文的
//获取主对象字段
String zc=context.data.field_XuzFy__c as String
log.info(zc)
UIEvent event=UIEvent.build(context){
//获取从对象的字段并赋值
editDetail "object_7l627__c" set("field_Kxuan__c":zc)
}
return event
5.自定义字段区别
单行文本:适用于填写简短的文字,如姓名
多行文本:适用于填写大段的的文字,
单选/多选:适用于几个选项里选一个/多个
数字:适用于填写文字,如年龄、订购数量
金额:带千分位
日期:yyyy-MM-dd
时间: HH:mm
日期时间:yyyy-MM-dd HH:mm
手机:用于输入手机密码
图片:适用于上传图片
附件:上传文件
邮箱:用于输入邮箱地址
查找关联:用于将当前对象与其他对象建立关联关系
主从关系:支持定义一种特殊的主从关联关系,从对象的数据授权受主对象
6.动态关联的字段都是id关联。不必对应相关的显示的中文类型(重要)
例如计划任务:
//符合条件的数据ids ,因为可能不止一个,需要我们进行遍历,这块用ids遍历比文档好,因为文档有数据条数限制
List ids = context.objectIds as List
ids.each{item->
//获取当前id
String id=item as String
//根据当前对象id,过滤查找所有对象的上级客户parent_account_id,这里上级客户是动态关联对象
def (Boolean error,QueryResult data,String errorMessage) = Fx.object.find("AccountObj",[["parent_account_id":id]],100,0);
if( error ){
log.info("查询上级客户出现错误:"+errorMessage)
}
log.info(data)//QueryResult(size=0, total=0, dataList=[])
List list=data.dataList as List
log.info(list)
//判断如果当前不为空有下级客户
if(list!=null&&list.size()>0){
log.info("当前客户有下级客户")
}
if(list.size()==0){
log.info("作废当前客户"+id)
def (Boolean error1,Map data1,String errorMessage1) = Fx.object.remove("AccountObj",id)
if( error1 ){
log.info("作废当前客户出现错误!"+errorMessage1)
}
}
}
7.锁定状态不可编译不可作废
8.考虑字段为空的情景
单行文本:适用于填写简短的文字,如姓名
多行文本:适用于填写大段的的文字,
单选/多选:适用于几个选项里选一个/多个
数字:适用于填写文字,如年龄、订购数量
金额:带千分位
日期:yyyy-MM-dd
时间: HH:mm
日期时间:yyyy-MM-dd HH:mm
手机:用于输入手机密码
图片:适用于上传图片
附件:上传文件
邮箱:用于输入邮箱地址
查找关联:用于将当前对象与其他对象建立关联关系
主从关系:支持定义一种特殊的主从关联关系,从对象的数据授权受主对象
6.动态关联的字段都是id关联。不必对应相关的显示的中文类型(重要)
例如计划任务:
//符合条件的数据ids ,因为可能不止一个,需要我们进行遍历,这块用ids遍历比文档好,因为文档有数据条数限制
List ids = context.objectIds as List
ids.each{item->
//获取当前id
String id=item as String
//根据当前对象id,过滤查找所有对象的上级客户parent_account_id,这里上级客户是动态关联对象
def (Boolean error,QueryResult data,String errorMessage) = Fx.object.find("AccountObj",[["parent_account_id":id]],100,0);
if( error ){
log.info("查询上级客户出现错误:"+errorMessage)
}
log.info(data)//QueryResult(size=0, total=0, dataList=[])
List list=data.dataList as List
log.info(list)
//判断如果当前不为空有下级客户
if(list!=null&&list.size()>0){
log.info("当前客户有下级客户")
}
if(list.size()==0){
log.info("作废当前客户"+id)
def (Boolean error1,Map data1,String errorMessage1) = Fx.object.remove("AccountObj",id)
if( error1 ){
log.info("作废当前客户出现错误!"+errorMessage1)
}
}
}
7.锁定状态不可编译不可作废
8.考虑字段为空的情景
9.对于CRM配置的对象管理-->自定义对象管理等,可以在定制开发平台--> 对象及字段API 里面看到
10.主对象有个字段是查找关联字段,我们根据查找关联字段然后使用findById或者find方法对从对象查找,那么对应的字段应该为 _id 。查找关联字段主对象前端显示的字段一般对应的是从对象左上角显示的内容。但是还是通过 _id 关联
11.find函数:需要对函数的返回结果进行判空处理
12.null as long强制转换之前进行判空处理
13.聚和函数or find 函数:null的条件一般会被忽略
14.前验证函数使用时,页面上不可见字段一般都不要用。(会出现空指的情况)所谓的页面不可见字段就是被后端在前端显示的时候隐藏了。
管理-->对象管理-->自定义对象-->点击某个对象-->布局-->点击某个字段-->进到布局配置界面后点某个字段,可以看到右上一个小眼睛。点击隐藏即可
15.CRM--客户--左上角跟进状态--创建销售记录
16.绑定的流程后动作等需要审批能执行自定义函数
17.我们在对象管理的预设对象和自定义对象这里可以查看每一个字段的类型,因为在对象字段API里面有时查找不到对应的字段类型
18.前验证需要设置命名空间为按钮,我们设置返回值为Map
Boolean reBoolean = false
Map reMap = ["error": reBoolean,"errorMessage": ""]
reBoolean = true;
reMap.put("error", reBoolean)
reMap.put("errorMessage", "查询客户失败,请重试或联系管理员!")
return reMap
19.更新负责人需要用Fx.object.changeOwner(<String ObjectAPIName>,<String ObjectDataId>,<String OwnerId>)
20.根据英文标识获取中文的函数
def (Boolean error,String data,String errorMessage) = Fx.object.getOptionName("PartnerObj","field_k48sh__c","0wi184Mr0")
if( error ){
log.info(errorMessage)
}
log.info(data)
if( error ){
log.info(errorMessage)
}
log.info(data)
21.查找关联字段和引用字段
查找关联字段可以使用查找关联到具体对象,但是不会刷新
引用字段存储的也是另一个对象的_id,并且新建后可以自动刷新这个字段。但是他底层会走计算服务,也即是我们更改了关联的
对象的值之后需要把他能带过来吗还是需要带过来吗?
22、如果使用按钮后动作,这个后动作必须执行完审批流程后才执行这个动作,会有问题人员List多选时案例
23、审批流通过后先执行工作流
24.UI事件更新可以阻断当前页面从对象的新建,不能阻断对主对象更改
UI校验事件弹出框不能阻断,红字提醒可以阻断,点击保存无效,弹出框不能阻断
25 Map map={"XXX" : "!!!"}
String XXX=map[XXX]//获取XXX的key的value值,XXX不要加双引号
26.有时候我们获取的json是字符串,只是看起来像Map
json转Map字符串-parse
-
定义:Fx.json.parse(<String jsonstr>)
-
返回值类型:Map
-
举例:
Fx.json.parse("{"a":1,"b":2}") //返回:{"a":1,"b":2}
例如:
def res = Fx.json.parse(s)
log.info("@@@@@")
log.info(res)
Map m = res as Map
log.info(m.code)
String sCodeData = m["code"] as String;
String sMessage = m["message"] as String;
27.create可以创建多个从对象,格式为:
def(Boolean error,Map data,String errorMessage) =
Fx.object.create("object_2fJ1o__c",["name":"主从同时新建主1"],
["object_Ssm46__c":[
["name":"张三1"],
["name":"张三2"]
]
],true)
28.自定义对象:新建,编译,复制没有按钮后动作
29.新建,编译最新版本走的是UI按钮,一般用来和ui组件,外部链接开发
新建保存,编译保存走的是内部业务逻辑。
30.主从对象,从对象不能绑定UI事件,我们可以绑定主对象里面的对从对象修改。
31.计算字段走的计算服务,不能直接更改update
32.客户退回公海,线索退回线索池.都需要我们进行在公海管理里面找到,然后在里面配置并写函数
33.企业ID在CRM客户详情里,可能在代理通客户对象
34.客户的归属部门为负责人的一级部门
35.[271] as List 不要这样搞,要271 as String 之后再这样list.add(271 as String)
36.获取map里面的值 直接String XXX=map["key"] as String
37.create创建的数据为key-value值 。这里的<data:"map">所以我们要取的话必须取到Map map = map1.data as Map
38.按钮后动作先执行审批流才会执行他,工作流也是
39.Map map = ["admin":123]
map.put("admin",123)
Integer sum=0
log.info(map)
map.each {
String key,value ->
log.info(value)
sum=sum+value
log.info(sum)
}
map.put("admin",123)
Integer sum=0
log.info(map)
map.each {
String key,value ->
log.info(value)
sum=sum+value
log.info(sum)
}
先给map赋值才能计算,否则报错
40.context.outTenantId 获取外部企业ID(只有按钮函数适用)只有下游到上游才能获得好像
41.业务流测试需要重新走流程,比如新加了一个逻辑,之前已有数据已经走逻辑了。测试是不生效的
42.find查找的时候不能以日期为条件吗NIN,不可以,时间戳,看似是日期字段,其实是时间戳到毫秒级,不能nin
43.批量update不允许预设对象,只允许自定义对象
44.降序的时候是为null的先查到,然后才是不为空的降序
45.管理----》回收站可以看到作废的数据。但是直接在主对象编辑的时候删除从对象点击保存后不会到回收站
46. Fx.object.update("AccountObj","id123456",["name":"纷享销客"],false);一定要填写true
47.按钮不能够在循环里面返回Map,可以设置一个flag
48.给list赋值不能为null,应该为[]
49.预设对象【库存】不允许通过函数更改
50.