在aviator引擎的基础上进行项目化的使用,扩展定义
1 规则设置数据定义
编码
名称
处理方式
string
字符串
强转
int
整数
强转
double
浮点数
强转
boolean
布尔值
强转
long
长整数
强转
date
日期
转换为java日期对象
millis
毫秒值
时间计算推荐使用毫秒值,例如天数
array
数组
出差人等此类数据,便于处理
area
区划
预留行政区划特殊类型
money
金额
对金额,去除千分位,转换为BigDecimal
2 规则设置操作符
2.1 算数运算符
运算符
说明
表达式
入参
结果
+
加
A+B
A=10,B=3
13
-
减
A-B
A=10,B=3
7
*
乘
A*B
A=10,B=3
30
/
除
A/B
A=10,B=3
3
%
取余
A%B
A=10,B=3
1
-
负
-A
A=10
-10
2.2 逻辑运算符
运算符
说明
表达式
入参
结果
||
或者
A||B
A=true,B=false
true
&&
并且
A&&B
A=true,B=false
false
!
非
!A
A=true
false
2.3 关系运算符
运算符
说明
表达式
入参
结果
<
小于
A
A=10,B=20
true
<=
小于等于
A<=B
A=10,B=20
true
>
大于
A>B
A=10,B=20
false
>=
大于等于
A>=B
A=10,B=20
false
==
等于
A==B
A=10,B=20
false
!=
不等于
A!=B
A=10,B=20
true
2.4 三元运算符
运算符
说明
表达式
入参
结果
?:
形式为bool ? exp1: exp2。 其中bool必须为Boolean类型的表达式
A
A=10,B=20
10
2.4 正则表达式
运算符
说明
表达式
入参
结果
=~
field01 =~ /^[A-Z]+$/"
field01=ABC
true
2.4 正则表达式
3 函数
3.1原生函数列表
运算符
说明
sysdate()
返回当前时间对象java.util.Date
now()
返回 System.currentTimeMillis
max(v1,v2,v3, ...)
返回参数列表中的最大值。
min(v1,v2,v3, ...)
返回参数列表中的最小值。
date_to_string(date,format)
将 Date 对象转化化特定格式的字符
string_to_date(source,format)
将特定格式的字符串转化为 Date 对象
string.contains(s1,s2)
判断 s1 是否包含 s2,返回 Boolean
string.length(s)
求字符串长度,返回 Long
string.startsWith(s1,s2)
s1 是否以 s2 开始,返回 Boolean
string.endsWith(s1,s2)
s1 是否以 s2 结尾,返回 Boolean
string.substring(s,begin[,end])
截取字符串 s,从 begin 到 end,如果忽略 end 的话,将从 begin 到结尾
string.indexOf(s1,s2)
java 中的 s1.indexOf(s2),求 s2 在 s1 中 的起始索引位置,如果不存在为-1
string.split(target,regex,[limit])
按照regex分隔符,将target字符串分割成数组
count(seq)
返回集合大小
include(seq,element)
判断 element 是否在集合 seq 中,返回 boolean 值
3.2自定义函数列表
运算符
说明
nvl(v1,v2)
如果v1为空,返回v2
sql.list(v1)
执行v1语句,返回数组类型的数据
sql.map(v1)
执行v1语句,返回map类型的数据
sql.one(v1)
执行v1语句,返回单个数据,常用与 select count(1) from dual 此类写法
4 语法
4.1 脚本语法
4.1.1 关键字let
声明定义一个变量或者对象
let a = 99;
let b = '张三';
let c = vo.bill;
let d = string_to_date('2011-11-11','yyyy-MM-dd');
4.1.1 注释
代码注释用于在代码中说明代码的用意或者注意事项,你可以通过连续的两个 # 号引入一行注释:
## examples/demo2.av
## 这是一行注释
a = 1;## 行尾注释
4.1.2 作用域
## 全局作用域
let a = 1;
a = a + 1;
println(a);
a 的作用域在 let 定义后,在整个脚本内有效,我们称之为全局作用域,在这个范围内,你可以正常地读写它。
但是你可以限定一个变量的作用域,通过大括号来引入一个嵌套的作用域:
let a = 1; ## 全局作用域内的 a
{
## 嵌套作用域 scope1
let a = 2; ## let 定义了 scope1 内有效的变量 a
println(a); ## 2
a = 3;
}
println(a); ## 1
进入作用域后以域内为准,离开作用域后域内的变量就失效了
let a = 1;
{
let b = 2;
println(b); ## 2
}
println(b); ## null
println(a); ## 1
4.1.2 条件语句
使用方式如下
if 条件1 {
如果条件1为真,执行这里;(条件为真才执行)
} else if 条件2 {
否则,当条件2为真执行这里。(当条件1不为真,条件2为真执行这里)
} else {
条件1,条件2都不为真,执行这里
}
let a = rand(1100); ## 随机一个数字
if a > 1000 {
println("a 大于 1000.");
} elsif a > 100 {
println("a 大于 100.");
} elsif a > 10 {
println("a 大于 10.");
} else {
println("a 小于 10 ");
}
println("a is " + a + ".");
## a 大于 100.
## a is 674.
4.1.3 循环语句
4.1.3.1 for
for .. in 可以用于任何集合结构,比如数组、 java.util.List 、 java.util.Map 等等:
##定义测试数据
let m = seq.map("a", 1, "b", 2, "c", 3);
let list = seq.list(1, 2, 3, 4, 5, 6, 7, 8, 9);
## m 是一个map类型的集合
for x in m {
println(x.key + "=" + x.value);
}
## list 是一个数组
let sum = 0;
for x in list {
sum = sum + x;
}
println("sum of list is "+ sum);
4.1.3.2 continue/break/return
continue : 结束本次循环,循环变量继续递增或递减,开始下次循环
##打印所有奇数
let list = seq.list(1, 2, 3, 4, 5, 6, 7, 8, 9);
for x in list {
if x % 2 == 0 {
continue;
}
println(x);
}
break : 结束循环,执行循环后面的代码(如果有的话)
###打印到第一个大于5时,结束循环
let list = seq.list(1, 2, 3, 4, 5, 6, 7, 8, 9);
for x in list {
if x > 5 {
break;
}
println(x);
}
return : 结束脚本的执行,return后面的所有代码都不再执行,并将结果返回
##返回一个大于5的数字
let list = seq.list(1, 2, 3, 4, 5, 6, 7, 8, 9);
for x in list {
if x > 5 {
return x;
}
println(x);
}
4.1.4.3 while
while 循环本质上是条件语句和循环的结合,当满足一定条件下,不停地执行一段代码块,直到条件变为否定:
while(循环条件){
循环操作
}
举例
let sum = 1;
while sum < 1000 {
sum = sum + sum;
}
## sum 从 1 开始,不停地累加自身,直到超过 1000 才终止,这里输出:1024
println(sum);
使用条件语句可以改写为下面的写法,含义相同
let sum = 1;
while true {
sum = sum + sum;
if sum > 1000 {
break;
}
}
println(sum);
规则类型定义
赋值计算
数值类型
结束时间 - 开始时间 = 天数
金额计算
标准 * 人数 * 天数 = 金额
字符类型
校验规则
控件只读显隐
举例说明
1 内部函数使用