高级计算公式在触发器 字段更新 或 数据校验 中使用,是 REBUILD 最强大的功能之一。他可以根据业务需要计算出您需要的值并进行自动更新。介于高级计算公式的强大能力,其使用也需要一定的技术门槛,且具有一定的复杂度。
本文将通过一些示例介绍触发器的使用,希望对您有一定启发。开始前我们假定您具备以下能力,否则可能无法理解本文所涉内容。
高级计算公式基于 Aviator 脚本语言,当您在编写公式时就是在编写 Aviator 脚本
基础示例
从最简单的例子开始,如下图所示。
此示例用于将地区 district
和地址 address
拼接为一个完整地址,并且中间用 -
相连。其中:
##
开头的一行是注释,不是必须的。注释在实际执行时不起作用,只是在编写复杂公式时通过注释可以帮助我们更好的理解{district}
{address}
是字段内部标识,可以看出他们使用{}
包裹起来,这是必须的
基于上述示例我们再进一步,如果地区和地址为空,我们就不拼接,该如何编写?请参考:
if (ISNULL({district}) && ISNULL({address})) {
return nil;
} else {
return {district} + "-" + {address};
}
可以看到,这是一个多行的公式,因此他需要完整的语法表达,包括:
- 尾部使用
;
结束(相较于上述单行示例无需;
) - 通过
return
来返回我们需要的值(相较于上述单行示例无需return
) - 其中
ISNULL
是一个用来判断是否为空的函数 - 如果要返回空,注意使用
nil
关键词而不是null
(许多脚本语言会使用null
表示空)
如上,若您能理解并通过上述示例举一反三,恭喜您已具备编写高级计算公式的能力。
示例列表
根据企业注册时间修改客户等级
实体和字段
- 实体1:Account
- 关键字段:
字段 | 字段类型 | 说明 |
---|---|---|
registrationDate | 日期 | 企业注册日期 |
accountLevel | 下拉列表 | 客户等级 |
公式
## 未填写企业注册日期则返回原值(即不做修改)
if (ISNULL({registrationDate})) {
return {accountLevel};
}
## 用当前日期减去企业注册日期得出注册天数
let xday = CURRENTDATE() - {registrationDate};
## 根据注册天数返回客户等级
## 请注意下拉列表需要返回 ID,详情参阅 https://getrebuild.com/docs/admin/trigger/fieldwriteback#%E5%AD%97%E6%AE%B5%E5%8F%98%E9%87%8F%E5%80%BC%E8%AF%B4%E6%98%8E
## 具体 ID 值可通过 OpenAPI 获取 https://getrebuild.com/docs/dev/how-use-apis
if (xday > 3650) {
return '012-018dcbe2fa5b003d';
} elsif (xday > 1825) {
return '012-018dcbe2fa5b003a';
} elsif (xday > 365) {
return '012-018dcbe2fa5b003c';
} else {
return '012-018dcbe2fa5b0031';
}
记录所有审批人
实体和字段
- 实体1:SalesOrder
- 关键字段:
字段 | 字段类型 | 说明 |
---|---|---|
allApprovers | 多引用(用户) | 历史审批人 |
approvalLastUser | 引用(用户) | 最后审批人(系统内置字段) |
公式
## 获取字段值待用
let all = {allApprovers};
let last = {approvalLastUser};
## 获取数组(多引用字段会保持为 ID,多个用 `,` 分割)
let allSeq = string.split(all == nil ? '' : all, ',');
## 添加最后审批人到数组
seq.add(allSeq, last);
## 返回
return allSeq;
根据电话号码(区号)确定所在地区
实体和字段
- 实体1:Account
- 关键字段:
字段 | 字段类型 | 说明 |
---|---|---|
phone | 电话 | 联系电话 |
area | 分类 | 所在地区 |
公式
## 获取字段值待用
let all = {allApprovers};
let last = {approvalLastUser};
## 获取数组(多引用字段会保持为 ID,多个用 `,` 分割)
let allSeq = string.split(all == nil ? '' : all, ',');
## 添加最后审批人到数组
seq.add(allSeq, last);
## 返回
return allSeq;
限制数据提交时间(数据校验)
实体和字段
无
公式
## 获取当前小时、分钟
let hour = DATEPICKAT(CURRENTDATE(), 'H');
let minte = DATEPICKAT(CURRENTDATE(), 'I');
## 17时,超过30分时返回 true 禁止提交
if (hour == 17 && minte >= 30) {
return true;
}
## 17时到19时返回 true 禁止提交
return hour >= 17 || hour <= 19;
通过正则验证身份证号(数据校验)
实体和字段
- 实体1:User
- 关键字段:
字段 | 字段类型 | 说明 |
---|---|---|
idcard | 文本 | 身份证号 |
公式
## 通过正则表达式验证,也可以换成其他的正则表达式
{idcard} =~ /^(\d{6,6})(\d{4,4})(\d{2,2})(\d{2,2})(\d{3,3})([0-9]|X)$/ ? false : true
Aviator 中的正则表达式使用 Java 正则表达式,同时使用
//
包裹
如果您有想编写的公式,可留言说明。