12.内置动作定义
12.内置动作定义
概述
在之前的内容当中我们了解到,如果要在决策集、决策表、交叉决策表、决策树、评分卡、复杂评分卡或决策流中使用某个Spring Bean中定义的方法,那么可以使用动作库将目标Bean及相应的方法定义到其中,然后在具体的决策集、决策表、交叉决策表、决策树、评分卡、复杂评分卡或决策流中导入这个动作库就可以使用了,这种类型方法调用,需要我们的显式的将目标动作库导入后方可使用。
在URule Pro中还提供了一种不需要导入动作库就可以调用类方法的方式,我们称之为内置的动作,对于这些内置的动作,按规范要求定义好后,用户无需导入就可以直接在所有规则文件中使用。
对于内置动作的使用与用户自定义的动作库完全相同,不同地方在于内置动作不需要用户定义,也不需要用户导入,在任何一个决策集、决策表、交叉决策表、决策树、评分卡、复杂评分卡或决策流中可以直接使用,如下图所示:
如上图所示,URule Pro中目前默认提供的内置动作有七个,分别用于获取当前规则以及针对日期、字符串、常用数学函数、List集合、Map集合以及循环操作的计算。
-
当前规则的内置动作
该内置动作只能在规则的那么部分使用,不能在规则的条件中使用,否则会产生错误。 该内置动作在2.1.9及以上版本中提供 方法名 描述 当前规则对象 返回当前规则对象Rule 当前规则名 返回当前规则的字符串类型的规则名称 当前规则匹配的条件 返回当前规则在匹配时所经历的条件节点对象集合,返回的是一个Set集合对象,里面是若干个Criteria对象
-
日期的内置动作
方法名 | 描述 |
---|---|
格式化日期 | 对给定日期按指定格式进行格式化,返回字符串。它需要两个参数:"目标日期","格式";目标日期是进行格式化的日期对象,格式是指怎样对这个日期进行格式化,它采用的是java中的日期格式化模式,常用值如:yyyy-MM-dd HH:mm:ss或yyyy年MM月dd日等 |
加日期 | 对给定日期的年月日时分秒各字符添加值,返回日期对象,参数:"目标日期","年数","月数","天数","小时","分钟","秒数";如果只加其中某些区段,那么其它的可以加0,也就是不加。 |
日期加年 | 对给定日期的增加指定的年数,返回日期对象,参数:"目标日期","年数"。 |
日期加月 | 对给定日期的增加指定的月数,返回日期对象,参数:"目标日期","月数"。 |
日期加天 | 对给定日期的增加指定的天数,返回日期对象,参数:"目标日期","天数"。 |
日期加小时 | 对给定日期的增加指定的小时数,返回日期对象,参数:"目标日期","小时数"。 |
日期加分钟 | 对给定日期的增加指定的分钟数,返回日期对象,参数:"目标日期","分钟数"。 |
日期加秒 | 对给定日期的增加指定的秒数,返回日期对象,参数:"目标日期","秒数"。 |
减日期 | 对给定日期的年月日时分秒各字符减值,返回日期对象,参数:"目标日期","年数","月数","天数","小时","分钟","秒数";如果只减其中某些区段,那么其它的可以减0,也就是不减。 |
减日期减年 | 对给定日期的减指定的年数,返回日期对象,参数:"目标日期","年数"。 |
减日期减月 | 对给定日期的减指定的月数,返回日期对象,参数:"目标日期","月数"。 |
减日期减天 | 对给定日期的减指定的天数,返回日期对象,参数:"目标日期","天数"。 |
减日期减小时 | 对给定日期的减指定的小时数,返回日期对象,参数:"目标日期","小时数"。 |
减日期减分钟 | 对给定日期的减指定的分钟数,返回日期对象,参数:"目标日期","分钟数"。 |
减日期减秒 | 对给定日期的减指定的秒数,返回日期对象,参数:"目标日期","秒数"。 |
取年份 | 取指定日期的年份,返回数字,参数:"目标日期" |
取月份 | 取指定日期的月份,返回数字,参数:"目标日期" |
取星期 | 取指定日期的星期,返回数字,参数:"目标日期" |
取天 | 取指定日期的天,返回数字,参数:"目标日期" |
取小时 | 取指定日期的小时,返回数字,参数:"目标日期" |
取分钟 | 取指定日期的分钟,返回数字,参数:"目标日期" |
取秒 | 取指定日期的秒,返回数字,参数:"目标日期" |
日期相减返回毫秒 | 两个日期相差操作,返回毫秒,参数:"日期","减去的日期" |
日期相减返回秒 | 两个日期相差操作,返回秒,参数:"日期","减去的日期" |
日期相减返回分钟 | 两个日期相差操作,返回分钟,参数:"日期","减去的日期" |
日期相减返回小时 | 两个日期相差操作,返回小时,参数:"日期","减去的日期" |
日期相减返回天 | 两个日期相差操作,返回天数,参数:"日期","减去的日期" |
日期相减返回星期 | 两个日期相差操作,返回星期数,参数:"日期","减去的日期" |
取指定月份天数 | 取某个时间段内指定月份的天数,多个月分可以用“,”分隔,比如“10,11,12”,就表示取目标时间段内在10月、11月和12月的天数 |
取非指定月份天数 | 与上面的“取指定月份天数”的方法相反,取某个时间段内非指定月份的天数,多个月分可以用“,”分隔,比如“10,11,12”,就表示取目标时间段内非10月、11月和12月的天数 |
-
字符串的内置动作
方法名 | 描述 |
---|---|
去空格 | 去除目标字符串两边空格,返回字符串,参数:"目标字符串" |
指定起始的字符串截取 | 截取指定区段的字符串,返回字符串,参数:"目标字符串","开始位置","结束位置" |
指定开始的字符串截取 | 截取指定开始位置到结束的字符串,返回字符串,参数:"目标字符串","开始位置" |
指定结束的字符串截取 | 截取从第一个字符开始到指定位置结束的字符串,返回字符串,参数:"目标字符串","结束位置" |
转小写 | 将指定字符串换成小写(仅限英文),返回字符串,参数:"目标字符串" |
转大写 | 将指定字符串换成大写(仅限英文),返回字符串,参数:"目标字符串" |
获取长度 | 获取指定字符串长度,返回数字,参数:"目标字符串" |
获取字符 | 获取指定位置字符,返回字符,参数:"目标字符串","位置" |
字符首次出现位置 | 获取指定字符在当中字符串中首次出现的位置,返回数字,参数:"目标字符串","要查找的字符串" |
字符最后出现位置 | 获取指定字符在当中字符串中最后出现的位置,返回数字,参数:"目标字符串","要查找的字符串" |
替换字符串 | 用新字符串替换指定字符串,返回替换后的字符串,参数:"目标字符串","原字符串","新字符串" |
-
常用数学函数的内置动作
方法名 | 描述 |
---|---|
求绝对值 | 返回一个数字的绝对值,参数:"数字" |
求最大值 | 求给定两个数字中最大的那个数字,返回那个最大的数字,参数:"数字1","数字2" |
求最小值 | 求给定两个数字中最小的那个数字,返回那个最小的数字,参数:"数字1","数字2" |
求正弦 | 返回一个数字的正弦值,参数:"数字" |
求余弦 | 返回一个数字的余弦值,参数:"数字" |
求正切 | 返回一个数字的正切值,参数:"数字" |
求余切 | 返回一个数字的余切值,参数:"数字" |
求e为底的对数 | 返回一个数字以e为底的对数值,参数:"数字" |
求10为底的对数 | 返回一个数字以10为底的对数值,参数:"数字" |
四舍五入 | 返回一个数字四舍五入后的值,参数:“数字” |
-
List集合的内置动作
方法名 | 描述 |
---|---|
求List大小 | 返回给定的一个集合对象的size属性值,这个集合对象必须是List类型 。 |
求List中所有的数字最大值 | 参数为一个包含所有数字的集合对象,要求这个集合对象里每个元素都是数字类型,返回这个集合中最大的那个数字元素对象,这个集合对象必须是List类型 。 |
求List中所有的数字最小值 | 参数为一个包含所有数字的集合对象,要求这个集合对象里每个元素都是数字类型,返回这个集合中最小的那个数字元素对象,这个集合对象必须是List类型 。 |
向List中添加对象 | 参数有两个,分别是"集合对象","要添加的对象",意思是把第二个参数对象值添加到第一个集合中去,这个集合对象必须是List类型,该方法没有返回 值。 |
集合排序 | 参数有三个,分别是"集合对象","属性名","排序方式",其中第一个参数这个集合对象必须是List类型;第二个参数为这个集合中对象的某一个属性名,第三个是一个字符串,可选值有"1"、"true"、"正序",这三个值均表示对这个集合中指定属性名按正序排列,其它值则表示按倒序排列,该方法没有返回 值。 |
抽取集合属性 | 参数有两个,分别是"集合对象","属性名",第一个参数这个集合对象必须是List类型;第二个参数为这个集合中对象的属性名。该方法的作用就是将这个集合对象中每个元素的指定属性值取出来,放在一个List集合中返回。 |
从List中删除对象 | 参数有两个,分别是"集合对象","要删除的对象",第一个参数必须是一个List类型对象,第二个参数是指定要从这个集合中删除的对象,该方法没有返回值。 |
指定对象是否存在 | 参数有两个,分别是"集合对象","要判断的对象",第一个参数必须是一个List类型对象,第二个参数是要判断的对象,该方法没有返回一个布尔值。 |
List是否为空 | 参数有一个,也就是"集合对象",这个参数必须是一个List类型对象,用于判断当前给定的List对象里有没有元素,该方法返回布尔值。 |
-
Map集合的内置动作
方法名 | 描述 |
---|---|
添加到Map | 该方法的参数有三个,分别是"Map对象","key","value",第一个参数必须是一个Map类型;第二个参数表示要添加对象的Key值;第三个为要添加的具体对象,该方法没有返回值。 |
从Map中删除 | 该方法的参数有两个,分别是"Map对象","key",第一个参数必须是一个Map类型;第二个参数表示要删除对象的Key值,该方法没有返回值。 |
指定Key是否存在 | 该方法的参数有两个,分别是"Map对象","key",第一个参数必须是一个Map类型;第二个参数表示要判断的对象的Key值,如果指定的key存在返回true,否则返回false. |
从Map中取值 | 该方法的参数有两个,分别是"Map对象","key",第一个参数必须是一个Map类型;第二个参数表示要取的对象的Key值,返回key值对应的对象。 |
返回Map大小 | 该方法的参数有一个,就是"Map对象",作用是返回这个Map对象里对象的数量。 |
-
循环操作的内置动作
循环操作的动作就一个,那就是中断循环,该动作只能用在循环规则里,用于在一定条件下中断当前的循环规则。
自定义内置动作
在用户使用过程当中,如果有一些自己内部常用的操作,而这些操作在URule Pro中的内置动作中又没有,那么可以利用自定义内置动作的方式定义自己的内置动作。
定义内置动作非常简单,只需要在需要暴露给用户使用的Spring bean中添加相应的annotation即可。我们先来看看URule Pro中提供的针对字符串的内置动作类的部分源代码。
package com.bstek.urule.runtime.builtinaction;
import com.bstek.urule.model.library.action.annotation.ActionBean;
import com.bstek.urule.model.library.action.annotation.ActionMethod;
import com.bstek.urule.model.library.action.annotation.ActionMethodParameter;
/**
* @author Jacky.gao
* @since 2015年11月27日
*/
@ActionBean(name="字符串")
public class StringAction {
@ActionMethod(name="去空格")
@ActionMethodParameter(names={"目标字符串"})
public String trim(String str){
if(str==null){
return str;
}
return str.trim();
}
@ActionMethod(name="指定起始的字符串截取")
@ActionMethodParameter(names={"目标字符串","开始位置","结束位置"})
public String substring(String str,int start,int end){
return str.substring(start, end);
}
......
}
可以看到,首先我们需要在”类“层面添加一个名为ActionBean的annotation,它只有一个属性,就是要定义这个内置动作的名称。然后在需要暴露的方法中添加两个annotation,分别是ActionMethod和ActionMethodParameter。ActionMethod是用来定义用户看到的方法名称的,而ActionMethodParameter则是用来定义用户看到的各个参数名称,它的names属性是一个数组,要求给出的描述参数要与当前方法的参数个数匹配,如果小于参数个数,那么用户将会看到后面的参数无描述信息。
在类中定义好这些Annotation之后,将这个类配置到Spring当中,让其成为一个标准的Spring Bean,并为其定义一个Bean Id,这样URule在启动时就会自动加载,并让其成为内置动作,用户就可以直接使用了。
定义内置动作的Spring Bean时,一定不要忘记给这个Spring Bean定义一个Id,这样才能保证规则在任何地方运行都不会出错,这点很关键。
在定义内置动作时需要注意,如果我们规则运行方式采用的是客户端服务器模式(参见第16小节内容介绍),那么必须要保证调用知识包的客户端Spring环境里有这个Bean,且Bean的Id要与动作库定义时的Id保证一至,否则调用会出现错误。
更多建议: