12.内置动作定义

2019-09-19 12:06 更新

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保证一至,否则调用会出现错误。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号