REBUILD 高级计算公式实战

1,056 阅读4分钟

高级计算公式在触发器 字段更新数据校验 中使用,是 REBUILD 最强大的功能之一。他可以根据业务需要计算出您需要的值并进行自动更新。介于高级计算公式的强大能力,其使用也需要一定的技术门槛,且具有一定的复杂度。

本文将通过一些示例介绍触发器的使用,希望对您有一定启发。开始前我们假定您具备以下能力,否则可能无法理解本文所涉内容。

  1. 对编程语言有一定了解
  2. 了解 REBUILD 的 触发器字段更新
  3. 了解 Aviator 脚本语言

高级计算公式基于 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 正则表达式,同时使用 // 包裹

如果您有想编写的公式,可留言说明。