12.內(nèi)置動(dòng)作定義

2019-09-19 12:06 更新

12.內(nèi)置動(dòng)作定義

概述

在之前的內(nèi)容當(dāng)中我們了解到,如果要在決策集、決策表、交叉決策表、決策樹、評(píng)分卡、復(fù)雜評(píng)分卡或決策流中使用某個(gè)Spring Bean中定義的方法,那么可以使用動(dòng)作庫(kù)將目標(biāo)Bean及相應(yīng)的方法定義到其中,然后在具體的決策集、決策表、交叉決策表、決策樹、評(píng)分卡、復(fù)雜評(píng)分卡或決策流中導(dǎo)入這個(gè)動(dòng)作庫(kù)就可以使用了,這種類型方法調(diào)用,需要我們的顯式的將目標(biāo)動(dòng)作庫(kù)導(dǎo)入后方可使用。

在URule Pro中還提供了一種不需要導(dǎo)入動(dòng)作庫(kù)就可以調(diào)用類方法的方式,我們稱之為內(nèi)置的動(dòng)作,對(duì)于這些內(nèi)置的動(dòng)作,按規(guī)范要求定義好后,用戶無需導(dǎo)入就可以直接在所有規(guī)則文件中使用。

對(duì)于內(nèi)置動(dòng)作的使用與用戶自定義的動(dòng)作庫(kù)完全相同,不同地方在于內(nèi)置動(dòng)作不需要用戶定義,也不需要用戶導(dǎo)入,在任何一個(gè)決策集、決策表、交叉決策表、決策樹、評(píng)分卡、復(fù)雜評(píng)分卡或決策流中可以直接使用,如下圖所示:

如上圖所示,URule Pro中目前默認(rèn)提供的內(nèi)置動(dòng)作有七個(gè),分別用于獲取當(dāng)前規(guī)則以及針對(duì)日期、字符串、常用數(shù)學(xué)函數(shù)、List集合、Map集合以及循環(huán)操作的計(jì)算。

  • 當(dāng)前規(guī)則的內(nèi)置動(dòng)作

    該內(nèi)置動(dòng)作只能在規(guī)則的那么部分使用,不能在規(guī)則的條件中使用,否則會(huì)產(chǎn)生錯(cuò)誤。 該內(nèi)置動(dòng)作在2.1.9及以上版本中提供 方法名 描述
    當(dāng)前規(guī)則對(duì)象 返回當(dāng)前規(guī)則對(duì)象Rule
    當(dāng)前規(guī)則名 返回當(dāng)前規(guī)則的字符串類型的規(guī)則名稱
    當(dāng)前規(guī)則匹配的條件 返回當(dāng)前規(guī)則在匹配時(shí)所經(jīng)歷的條件節(jié)點(diǎn)對(duì)象集合,返回的是一個(gè)Set集合對(duì)象,里面是若干個(gè)Criteria對(duì)象

  • 日期的內(nèi)置動(dòng)作

方法名 描述
格式化日期 對(duì)給定日期按指定格式進(jìn)行格式化,返回字符串。它需要兩個(gè)參數(shù):"目標(biāo)日期","格式";目標(biāo)日期是進(jìn)行格式化的日期對(duì)象,格式是指怎樣對(duì)這個(gè)日期進(jìn)行格式化,它采用的是java中的日期格式化模式,常用值如:yyyy-MM-dd HH:mm:ss或yyyy年MM月dd日等
加日期 對(duì)給定日期的年月日時(shí)分秒各字符添加值,返回日期對(duì)象,參數(shù):"目標(biāo)日期","年數(shù)","月數(shù)","天數(shù)","小時(shí)","分鐘","秒數(shù)";如果只加其中某些區(qū)段,那么其它的可以加0,也就是不加。
日期加年 對(duì)給定日期的增加指定的年數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","年數(shù)"。
日期加月 對(duì)給定日期的增加指定的月數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","月數(shù)"。
日期加天 對(duì)給定日期的增加指定的天數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","天數(shù)"。
日期加小時(shí) 對(duì)給定日期的增加指定的小時(shí)數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","小時(shí)數(shù)"。
日期加分鐘 對(duì)給定日期的增加指定的分鐘數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","分鐘數(shù)"。
日期加秒 對(duì)給定日期的增加指定的秒數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","秒數(shù)"。
減日期 對(duì)給定日期的年月日時(shí)分秒各字符減值,返回日期對(duì)象,參數(shù):"目標(biāo)日期","年數(shù)","月數(shù)","天數(shù)","小時(shí)","分鐘","秒數(shù)";如果只減其中某些區(qū)段,那么其它的可以減0,也就是不減。
減日期減年 對(duì)給定日期的減指定的年數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","年數(shù)"。
減日期減月 對(duì)給定日期的減指定的月數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","月數(shù)"。
減日期減天 對(duì)給定日期的減指定的天數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","天數(shù)"。
減日期減小時(shí) 對(duì)給定日期的減指定的小時(shí)數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","小時(shí)數(shù)"。
減日期減分鐘 對(duì)給定日期的減指定的分鐘數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","分鐘數(shù)"。
減日期減秒 對(duì)給定日期的減指定的秒數(shù),返回日期對(duì)象,參數(shù):"目標(biāo)日期","秒數(shù)"。
取年份 取指定日期的年份,返回?cái)?shù)字,參數(shù):"目標(biāo)日期"
取月份 取指定日期的月份,返回?cái)?shù)字,參數(shù):"目標(biāo)日期"
取星期 取指定日期的星期,返回?cái)?shù)字,參數(shù):"目標(biāo)日期"
取天 取指定日期的天,返回?cái)?shù)字,參數(shù):"目標(biāo)日期"
取小時(shí) 取指定日期的小時(shí),返回?cái)?shù)字,參數(shù):"目標(biāo)日期"
取分鐘 取指定日期的分鐘,返回?cái)?shù)字,參數(shù):"目標(biāo)日期"
取秒 取指定日期的秒,返回?cái)?shù)字,參數(shù):"目標(biāo)日期"
日期相減返回毫秒 兩個(gè)日期相差操作,返回毫秒,參數(shù):"日期","減去的日期"
日期相減返回秒 兩個(gè)日期相差操作,返回秒,參數(shù):"日期","減去的日期"
日期相減返回分鐘 兩個(gè)日期相差操作,返回分鐘,參數(shù):"日期","減去的日期"
日期相減返回小時(shí) 兩個(gè)日期相差操作,返回小時(shí),參數(shù):"日期","減去的日期"
日期相減返回天 兩個(gè)日期相差操作,返回天數(shù),參數(shù):"日期","減去的日期"
日期相減返回星期 兩個(gè)日期相差操作,返回星期數(shù),參數(shù):"日期","減去的日期"
取指定月份天數(shù) 取某個(gè)時(shí)間段內(nèi)指定月份的天數(shù),多個(gè)月分可以用“,”分隔,比如“10,11,12”,就表示取目標(biāo)時(shí)間段內(nèi)在10月、11月和12月的天數(shù)
取非指定月份天數(shù) 與上面的“取指定月份天數(shù)”的方法相反,取某個(gè)時(shí)間段內(nèi)非指定月份的天數(shù),多個(gè)月分可以用“,”分隔,比如“10,11,12”,就表示取目標(biāo)時(shí)間段內(nèi)非10月、11月和12月的天數(shù)

  • 字符串的內(nèi)置動(dòng)作

方法名 描述
去空格 去除目標(biāo)字符串兩邊空格,返回字符串,參數(shù):"目標(biāo)字符串"
指定起始的字符串截取 截取指定區(qū)段的字符串,返回字符串,參數(shù):"目標(biāo)字符串","開始位置","結(jié)束位置"
指定開始的字符串截取 截取指定開始位置到結(jié)束的字符串,返回字符串,參數(shù):"目標(biāo)字符串","開始位置"
指定結(jié)束的字符串截取 截取從第一個(gè)字符開始到指定位置結(jié)束的字符串,返回字符串,參數(shù):"目標(biāo)字符串","結(jié)束位置"
轉(zhuǎn)小寫 將指定字符串換成小寫(僅限英文),返回字符串,參數(shù):"目標(biāo)字符串"
轉(zhuǎn)大寫 將指定字符串換成大寫(僅限英文),返回字符串,參數(shù):"目標(biāo)字符串"
獲取長(zhǎng)度 獲取指定字符串長(zhǎng)度,返回?cái)?shù)字,參數(shù):"目標(biāo)字符串"
獲取字符 獲取指定位置字符,返回字符,參數(shù):"目標(biāo)字符串","位置"
字符首次出現(xiàn)位置 獲取指定字符在當(dāng)中字符串中首次出現(xiàn)的位置,返回?cái)?shù)字,參數(shù):"目標(biāo)字符串","要查找的字符串"
字符最后出現(xiàn)位置 獲取指定字符在當(dāng)中字符串中最后出現(xiàn)的位置,返回?cái)?shù)字,參數(shù):"目標(biāo)字符串","要查找的字符串"
替換字符串 用新字符串替換指定字符串,返回替換后的字符串,參數(shù):"目標(biāo)字符串","原字符串","新字符串"

  • 常用數(shù)學(xué)函數(shù)的內(nèi)置動(dòng)作

方法名 描述
求絕對(duì)值 返回一個(gè)數(shù)字的絕對(duì)值,參數(shù):"數(shù)字"
求最大值 求給定兩個(gè)數(shù)字中最大的那個(gè)數(shù)字,返回那個(gè)最大的數(shù)字,參數(shù):"數(shù)字1","數(shù)字2"
求最小值 求給定兩個(gè)數(shù)字中最小的那個(gè)數(shù)字,返回那個(gè)最小的數(shù)字,參數(shù):"數(shù)字1","數(shù)字2"
求正弦 返回一個(gè)數(shù)字的正弦值,參數(shù):"數(shù)字"
求余弦 返回一個(gè)數(shù)字的余弦值,參數(shù):"數(shù)字"
求正切 返回一個(gè)數(shù)字的正切值,參數(shù):"數(shù)字"
求余切 返回一個(gè)數(shù)字的余切值,參數(shù):"數(shù)字"
求e為底的對(duì)數(shù) 返回一個(gè)數(shù)字以e為底的對(duì)數(shù)值,參數(shù):"數(shù)字"
求10為底的對(duì)數(shù) 返回一個(gè)數(shù)字以10為底的對(duì)數(shù)值,參數(shù):"數(shù)字"
四舍五入 返回一個(gè)數(shù)字四舍五入后的值,參數(shù):“數(shù)字”

  • List集合的內(nèi)置動(dòng)作

方法名 描述
求List大小 返回給定的一個(gè)集合對(duì)象的size屬性值,這個(gè)集合對(duì)象必須是List類型 。
求List中所有的數(shù)字最大值 參數(shù)為一個(gè)包含所有數(shù)字的集合對(duì)象,要求這個(gè)集合對(duì)象里每個(gè)元素都是數(shù)字類型,返回這個(gè)集合中最大的那個(gè)數(shù)字元素對(duì)象,這個(gè)集合對(duì)象必須是List類型 。
求List中所有的數(shù)字最小值 參數(shù)為一個(gè)包含所有數(shù)字的集合對(duì)象,要求這個(gè)集合對(duì)象里每個(gè)元素都是數(shù)字類型,返回這個(gè)集合中最小的那個(gè)數(shù)字元素對(duì)象,這個(gè)集合對(duì)象必須是List類型 。
向List中添加對(duì)象 參數(shù)有兩個(gè),分別是"集合對(duì)象","要添加的對(duì)象",意思是把第二個(gè)參數(shù)對(duì)象值添加到第一個(gè)集合中去,這個(gè)集合對(duì)象必須是List類型,該方法沒有返回 值。
集合排序 參數(shù)有三個(gè),分別是"集合對(duì)象","屬性名","排序方式",其中第一個(gè)參數(shù)這個(gè)集合對(duì)象必須是List類型;第二個(gè)參數(shù)為這個(gè)集合中對(duì)象的某一個(gè)屬性名,第三個(gè)是一個(gè)字符串,可選值有"1"、"true"、"正序",這三個(gè)值均表示對(duì)這個(gè)集合中指定屬性名按正序排列,其它值則表示按倒序排列,該方法沒有返回 值。
抽取集合屬性 參數(shù)有兩個(gè),分別是"集合對(duì)象","屬性名",第一個(gè)參數(shù)這個(gè)集合對(duì)象必須是List類型;第二個(gè)參數(shù)為這個(gè)集合中對(duì)象的屬性名。該方法的作用就是將這個(gè)集合對(duì)象中每個(gè)元素的指定屬性值取出來,放在一個(gè)List集合中返回。
從List中刪除對(duì)象 參數(shù)有兩個(gè),分別是"集合對(duì)象","要?jiǎng)h除的對(duì)象",第一個(gè)參數(shù)必須是一個(gè)List類型對(duì)象,第二個(gè)參數(shù)是指定要從這個(gè)集合中刪除的對(duì)象,該方法沒有返回值。
指定對(duì)象是否存在 參數(shù)有兩個(gè),分別是"集合對(duì)象","要判斷的對(duì)象",第一個(gè)參數(shù)必須是一個(gè)List類型對(duì)象,第二個(gè)參數(shù)是要判斷的對(duì)象,該方法沒有返回一個(gè)布爾值。
List是否為空 參數(shù)有一個(gè),也就是"集合對(duì)象",這個(gè)參數(shù)必須是一個(gè)List類型對(duì)象,用于判斷當(dāng)前給定的List對(duì)象里有沒有元素,該方法返回布爾值。

  • Map集合的內(nèi)置動(dòng)作

方法名 描述
添加到Map 該方法的參數(shù)有三個(gè),分別是"Map對(duì)象","key","value",第一個(gè)參數(shù)必須是一個(gè)Map類型;第二個(gè)參數(shù)表示要添加對(duì)象的Key值;第三個(gè)為要添加的具體對(duì)象,該方法沒有返回值。
從Map中刪除 該方法的參數(shù)有兩個(gè),分別是"Map對(duì)象","key",第一個(gè)參數(shù)必須是一個(gè)Map類型;第二個(gè)參數(shù)表示要?jiǎng)h除對(duì)象的Key值,該方法沒有返回值。
指定Key是否存在 該方法的參數(shù)有兩個(gè),分別是"Map對(duì)象","key",第一個(gè)參數(shù)必須是一個(gè)Map類型;第二個(gè)參數(shù)表示要判斷的對(duì)象的Key值,如果指定的key存在返回true,否則返回false.
從Map中取值 該方法的參數(shù)有兩個(gè),分別是"Map對(duì)象","key",第一個(gè)參數(shù)必須是一個(gè)Map類型;第二個(gè)參數(shù)表示要取的對(duì)象的Key值,返回key值對(duì)應(yīng)的對(duì)象。
返回Map大小 該方法的參數(shù)有一個(gè),就是"Map對(duì)象",作用是返回這個(gè)Map對(duì)象里對(duì)象的數(shù)量。

  • 循環(huán)操作的內(nèi)置動(dòng)作

循環(huán)操作的動(dòng)作就一個(gè),那就是中斷循環(huán),該動(dòng)作只能用在循環(huán)規(guī)則里,用于在一定條件下中斷當(dāng)前的循環(huán)規(guī)則。

自定義內(nèi)置動(dòng)作

在用戶使用過程當(dāng)中,如果有一些自己內(nèi)部常用的操作,而這些操作在URule Pro中的內(nèi)置動(dòng)作中又沒有,那么可以利用自定義內(nèi)置動(dòng)作的方式定義自己的內(nèi)置動(dòng)作。

定義內(nèi)置動(dòng)作非常簡(jiǎn)單,只需要在需要暴露給用戶使用的Spring bean中添加相應(yīng)的annotation即可。我們先來看看URule Pro中提供的針對(duì)字符串的內(nèi)置動(dòng)作類的部分源代碼。

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={"目標(biāo)字符串"})
    public String trim(String str){
        if(str==null){
            return str;
        }
        return str.trim();
    }


    @ActionMethod(name="指定起始的字符串截取")
    @ActionMethodParameter(names={"目標(biāo)字符串","開始位置","結(jié)束位置"})
    public String substring(String str,int start,int end){
        return str.substring(start, end);
    }
    ......
}

可以看到,首先我們需要在”類“層面添加一個(gè)名為ActionBean的annotation,它只有一個(gè)屬性,就是要定義這個(gè)內(nèi)置動(dòng)作的名稱。然后在需要暴露的方法中添加兩個(gè)annotation,分別是ActionMethod和ActionMethodParameter。ActionMethod是用來定義用戶看到的方法名稱的,而ActionMethodParameter則是用來定義用戶看到的各個(gè)參數(shù)名稱,它的names屬性是一個(gè)數(shù)組,要求給出的描述參數(shù)要與當(dāng)前方法的參數(shù)個(gè)數(shù)匹配,如果小于參數(shù)個(gè)數(shù),那么用戶將會(huì)看到后面的參數(shù)無描述信息。

在類中定義好這些Annotation之后,將這個(gè)類配置到Spring當(dāng)中,讓其成為一個(gè)標(biāo)準(zhǔn)的Spring Bean,并為其定義一個(gè)Bean Id,這樣URule在啟動(dòng)時(shí)就會(huì)自動(dòng)加載,并讓其成為內(nèi)置動(dòng)作,用戶就可以直接使用了。

定義內(nèi)置動(dòng)作的Spring Bean時(shí),一定不要忘記給這個(gè)Spring Bean定義一個(gè)Id,這樣才能保證規(guī)則在任何地方運(yùn)行都不會(huì)出錯(cuò),這點(diǎn)很關(guān)鍵。

在定義內(nèi)置動(dòng)作時(shí)需要注意,如果我們規(guī)則運(yùn)行方式采用的是客戶端服務(wù)器模式(參見第16小節(jié)內(nèi)容介紹),那么必須要保證調(diào)用知識(shí)包的客戶端Spring環(huán)境里有這個(gè)Bean,且Bean的Id要與動(dòng)作庫(kù)定義時(shí)的Id保證一至,否則調(diào)用會(huì)出現(xiàn)錯(cuò)誤。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)