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

2019-09-19 12:06 更新

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

概述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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={"目標字符串","開始位置","結(jié)束位置"})
    public String substring(String str,int start,int end){
        return str.substring(start, end);
    }
    ......
}

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

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

定義內(nèi)置動作的Spring Bean時,一定不要忘記給這個Spring Bean定義一個Id,這樣才能保證規(guī)則在任何地方運行都不會出錯,這點很關(guān)鍵。

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號