纷享销客自定义函数命名空间及实例
1、按钮
在线文档地址:https://www.fxiaoke.com/mob/guide/crmdoc/src/8-1-2%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%89%E9%92%AE.html
返回参数有三种返回值,如下:
1、map:用以阻断或继续按钮的执行;
2、String:返回的需要是一个可以访问的网址,点击按钮之后将会跳转至指定的网址;
3、UIAction:跳转至系统自己的某些组件页面
按钮分为两种类型,如下:
UI按钮:1、涉及到页面跳转的时候,使用此按钮,返回参数是String的url网址、或者是UIAction跳转至编辑页面、打印模板等指定组件;
2、批量数据操作时,用此按钮可以获取到数据集合是context.dataList
业务按钮:1、进行前验证、执行动作的补充、执行完成后的提醒等;
2、批量操作时,用此按钮分别获取到每一条数据用context.data
1.1、Map
应用场景:此返参类型在按钮的前验证中触发,用于进行数据的验证、可通过对context.data的字段进行赋值,修改最终的数据。
返参说明:error : 是否出错 errorMessage : 出错后提示的错误信息 block : 提示异常信息后,是否阻塞保存
如下,判断保养时间是否超时并阻断提交
Datedate = 下次保养时间;
log.info("下次保养时间为:"+date);
Date now = Date.now();
boolean flag = now.daysBetween(date) > 60;
if(flag){
log.info("下次保养时间超过了60天");
return [ "error":true, "errorMessage":"下次保养时间距离当前超过了60天", "block":true ]
}else{
log.info("下次保养时间符合要求");
//输入正确,继续执行
return ["block": false];
}
1.1.1、获取新的页面填充之后的值进行校验
只能在前验证的位置获取到输入的参数,进行参数校验

2、获取新的表单页面的参数,需要在函数中设置自定义参数,然后在保存函数之后会提示匹配变量,获取表单数据直接通过变量名即可,如下
log.info("填写的退费金额变量:" + refund_param);
1.2、String
应用场景:在【执行动作】当中,进行指定页面路径的跳转。
返参为""或没有返参时,仅执行函数,不会进行页面跳转;有字符串返参时,可以用来进行网页路径的跳转,点击之后会在新的标签页打开指定的路径。
return"https://www.baidu.com/";
1.3、UIAction
应用场景:跳转至纷享销客内的一些组件页面
如下,跳转至详情页
UIAction openDialogAction = OpenDialogAction.build{
userData = [:] //传递给自定义组件的数据键值对listtitle = "title"//标题width = 123//宽高
maxHeight = 123//最大高度
component { //组件的apiName
apiName = "comp_yuio8__c"
}
}
return openDialogAction
组件文档
https://www.fxiaoke.com/mob/guide/uipaas/dist/#/custom-component/start/what
跳转至相关的组件
Mapdata = context.data;
data.put("field_jB28q__c", Date.now());
WebAction action = WebAction.builder()
.type('form')
.data(data)
.build()
return action
2、范围选择
当希望通过书写一个字段的值确定关联对象的范围时,在关联字段上定义
注意:关联字段取关联对象的字段时,直接输入字段名即可
String area = context.data.field_n29H8__c;
log.info("所在区域:"+ area);
// def(boolean errorInfo, Map result, String errorMessageInfo) = Fx.object.getOptionInfo("AccountObj","field_Szm71__c")
// log.info("客户的所在区域属性:"+result);
QueryTemplate template1 = QueryTemplate.AND(
["field_i582a__c":Operator.EQ(area)]
)
log.info(template1)
return template1;
3、UI事件
当一个输入框失去焦点之后,想要触发某些操作
https://www.fxiaoke.com/mob/guide/crmdoc/src/8-1-6UI%E4%BA%8B%E4%BB%B6.html
如下,在选择了一个日期后,想要自动确定另一个字段的日期
Date productDate = context.data.field_jB28q__c asDate;
log.info(productDate);
int month = (productDate.month + 2) asint;
log.info(month)
Date nextTime = productDate.withMonth(month);
log.info(nextTime);
//新建UIEvent事件
UIEvent event = UIEvent.build(context) {
// Date product = context.data.field_jB28q__c asDate;
// log.info(product);
editMaster("field_3Ey0i__c": nextTime)
}
return event
注意事项:
在UIEvent.build(context) {}里面不可以获取到context里面的值
3.1、 弹窗
3.1.1、代码
//红字提醒
Remind remind = Remind.Text("Text");
//弹窗提醒
Remind remind = Remind.Alert("Text");
3.1.2、 样式

4、流程触发
4.1、审批流
定义审批的流程
4.2、业务流
需要手动在对象数据页面发起,里面可以定义审批
4.3、工作流
可以定时自动触发、数据字段更新时触发、数据作废、新建时触发。
5、计划任务
类似于工作流,可以定时执行,不过不再监听对象属性的变化。要么手动执行,要么到达时间选择符合要求的数据进行执行。
一般用来批量刷数据,时间最好在晚上执行,只能获取到id集合。
不要在这里赋值累増的变量。
数据是分批次执行的,每20条为一批,这一批中如果过某条执行出现异常了,则这一批的剩余数据将不再执行。
在调试页面选择具体的数据运行脚本,则context.objectIds中的id只有所选择的那条数据
5.1、基础例子
//计划任务中可以先得到数据的id集合,然后根据id集合查询得到具体的数据List ids = context.objectIds as List
def(boolean errorFind,List dataFind,String errorMessageFind) = Fx.object.findByIds("PaymentPlanObj",ids);
if( errorMessageFind ){
log.info("查询数据失败:" + errorMessageFind);
}elseif( dataFind ){
dataFind.each{
dataItem ->
//得到每一个对象详情Map dataDetail = dataItem as Map
}
}else{
log.info("未查询到数据");
}
6、促销
暂不做详细讲解
7、自增编号
本身有自增编号字段,当不满足时,可以使用自定义函数定义。
如下,根据对象的产品类型,确定其前缀。
Stringtype = context.data.field_fEz5m__c;
log.info(type);
def (Boolean error,Stringdata,String errorMessage) = Fx.object.getOptionName("object_5CF02__c","field_fEz5m__c",type);
String prefix = "";
if( data =="工业设备" ){
prefix = "i-";
}else{
prefix = "a-";
}
String now = Date.now() as String;
now = now.replaceAll("-", "");
log.info(now);
prefix = prefix + now + "-"// prefix = prefix + now.year + now.month + now.day + "-"// log.info(prefix);
IncrementNumber rule = IncrementNumber.builder()
.counter('object_5CF02__c_name') // 计数器的key,递增的自增编码需要保证key唯一,同理,更换counter可以重计自增编号
.condition('DAY') // 按年、月、日重计 `YEAR` `MONTH` `DAY` `NONE`
.postfix('') // 编码后缀
.prefix(prefix) // 编码前缀
.serialNumber(4) // 自增编码位数
.initialValue(1) // 编号起始值不能小于 0,且默认为 1
.steppingNumber(1) // 步进器默认为1,且不能小于1
.buildRule()
return rule
8、自定义控制器
初学时,一般用不到这里
9、导入
9.1、预处理
导入前执行一次,此时失败整个导入都将不能进行,必须在最后返回ValidateResult,代码逻辑内返回的不起作用
获取整个参数列表
log.info("执行设备导入的预处理代码");
List<Map> dataList = context.dataList as Listlog.info("导入的数据如下:"+dataList);
boolean flag = false;
if( dataList.size() > 0 ){
flag = true;
}
return ValidateResult.builder()
.success(flag)
.errorMessage("我是导入前预处理函数!!!!")
.build()
返回false时,导入将被取消,效果如下

9.2、前验证
每行数据都会触发,失败则当前行数据不能导入。
导入后context.data中单选框的值为id;
关联对象在表格中为主属性,函数取值时为数据id;
可以直接通过data.put()方式修改这个对象的值
log.info("查询【确认收入】检查是否可以创建【回款】");
Map data = context.data as Map;
String accountId = data["field_VulpB__c"] as String;
Date returnDate = data["field_sRf93__c"] asDate;
BigDecimal returnAmount = data["field_xWtSl__c"] as BigDecimal;
QueryTemplate template = QueryTemplate.AND(
["field_c8L4x__c": Operator.EQ(accountId)],
["field_wV3jw__c":Operator.EQ(returnDate)],
["field_rtXi1__c":Operator.EQ(returnAmount)]
);
APIResult ret = Fx.object.findOne("object_8We11__c", //
FQLAttribute.builder()
.columns(["_id", "name"]) //
.queryTemplate(template)
.build(),
SelectAttribute.builder()
.needInvalid(false)
.build());
if(ret.isError()){
log.info(ret.message());
}
boolean flag = ret.data;
return ValidateResult.builder()
// 返回 false 将终止本次导入
.success(flag)
.errorMessage("没有匹配的确认收入,不能新建")
.build()
10、自定义组件
用以进行一些定制化页面的开发