在之前的內(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)操作的計算。
該內(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對象 |
方法名 | 描述 |
---|---|
格式化日期 | 對給定日期按指定格式進行格式化,返回字符串。它需要兩個參數(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ù) |
方法名 | 描述 |
---|---|
去空格 | 去除目標字符串兩邊空格,返回字符串,參數(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ù)字的絕對值,參數(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大小 | 返回給定的一個集合對象的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 | 該方法的參數(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)操作的動作就一個,那就是中斷循環(huán),該動作只能用在循環(huán)規(guī)則里,用于在一定條件下中斷當(dāng)前的循環(huán)規(guī)則。
在用戶使用過程當(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)錯誤。
更多建議: