12.內(nèi)置動作(zuò)定義
概述
在之前的內(nèi)容當中我們了解到,如果要在決策集、決策表、交叉決策表、決策樹(shù)、評分卡、複雜評分卡或決策流中使用某個(gè)Spring Bean中定義的方法,那(nà)麽可(kě)以使用動作(zuò)庫将目标Bean及相應的方法定義到其中,然後在具體(tǐ)的決策集、決策表、交叉決策表、決策樹(shù)、評分卡、複雜評分卡或決策流中導入這個(gè)動作(zuò)庫就可(kě)以使用了,這種類型方法調用,需要我們的顯式的将目标動作(zuò)庫導入後方可(kě)使用。
在URule Pro中還(hái)提供了一種不需要導入動作(zuò)庫就可(kě)以調用類方法的方式,我們稱之為(wèi)內(nèi)置的動作(zuò),對于這些(xiē)內(nèi)置的動作(zuò),按規範要求定義好後,用戶無需導入就可(kě)以直接在所有(yǒu)規則文件中使用。
對于內(nèi)置動作(zuò)的使用與用戶自定義的動作(zuò)庫完全相同,不同地方在于內(nèi)置動作(zuò)不需要用戶定義,也不需要用戶導入,在任何一個(gè)決策集、決策表、交叉決策表、決策樹(shù)、評分卡、複雜評分卡或決策流中可(kě)以直接使用,如下圖所示:
如上(shàng)圖所示,URule Pro中目前默認提供的內(nèi)置動作(zuò)有(yǒu)七個(gè),分别用于獲取當前規則以及針對日期、字符串、常用數(shù)學函數(shù)、List集合、Map集合以及循環操作(zuò)的計(jì)算(suàn)。
當前規則的內(nèi)置動作(zuò)
該內(nèi)置動作(zuò)隻能在規則的那(nà)麽部分使用,不能在規則的條件中使用,否則會(huì)産生(shēng)錯誤。 該內(nèi)置動作(zuò)在2.1.9及以上(shàng)版本中提供
方法名 | 描述 |
---|---|
當前規則對象 | 返回當前規則對象Rule |
當前規則名 | 返回當前規則的字符串類型的規則名稱 |
當前規則匹配的條件 | 返回當前規則在匹配時(shí)所經曆的條件節點對象集合,返回的是一個(gè)Set集合對象,裏面是若幹個(gè)Criteria對象 |
日期的內(nèi)置動作(zuò)
方法名 | 描述 |
---|---|
格式化日期 | 對給定日期按指定格式進行(xíng)格式化,返回字符串。它需要兩個(gè)參數(shù):"目标日期","格式";目标日期是進行(xíng)格式化的日期對象,格式是指怎樣對這個(gè)日期進行(xíng)格式化,它采用的是java中的日期格式化模式,常用值如:yyyy-MM-dd HH:mm:ss或yyyy年MM月dd日等 |
加日期 | 對給定日期的年月日時(shí)分秒(miǎo)各字符添加值,返回日期對象,參數(shù):"目标日期","年數(shù)","月數(shù)","天數(shù)","小(xiǎo)時(shí)","分鍾","秒(miǎo)數(shù)";如果隻加其中某些(xiē)區(qū)段,那(nà)麽其它的可(kě)以加0,也就是不加。 |
日期加年 | 對給定日期的增加指定的年數(shù),返回日期對象,參數(shù):"目标日期","年數(shù)"。 |
日期加月 | 對給定日期的增加指定的月數(shù),返回日期對象,參數(shù):"目标日期","月數(shù)"。 |
日期加天 | 對給定日期的增加指定的天數(shù),返回日期對象,參數(shù):"目标日期","天數(shù)"。 |
日期加小(xiǎo)時(shí) | 對給定日期的增加指定的小(xiǎo)時(shí)數(shù),返回日期對象,參數(shù):"目标日期","小(xiǎo)時(shí)數(shù)"。 |
日期加分鍾 | 對給定日期的增加指定的分鍾數(shù),返回日期對象,參數(shù):"目标日期","分鍾數(shù)"。 |
日期加秒(miǎo) | 對給定日期的增加指定的秒(miǎo)數(shù),返回日期對象,參數(shù):"目标日期","秒(miǎo)數(shù)"。 |
減日期 | 對給定日期的年月日時(shí)分秒(miǎo)各字符減值,返回日期對象,參數(shù):"目标日期","年數(shù)","月數(shù)","天數(shù)","小(xiǎo)時(shí)","分鍾","秒(miǎo)數(shù)";如果隻減其中某些(xiē)區(qū)段,那(nà)麽其它的可(kě)以減0,也就是不減。 |
減日期減年 | 對給定日期的減指定的年數(shù),返回日期對象,參數(shù):"目标日期","年數(shù)"。 |
減日期減月 | 對給定日期的減指定的月數(shù),返回日期對象,參數(shù):"目标日期","月數(shù)"。 |
減日期減天 | 對給定日期的減指定的天數(shù),返回日期對象,參數(shù):"目标日期","天數(shù)"。 |
減日期減小(xiǎo)時(shí) | 對給定日期的減指定的小(xiǎo)時(shí)數(shù),返回日期對象,參數(shù):"目标日期","小(xiǎo)時(shí)數(shù)"。 |
減日期減分鍾 | 對給定日期的減指定的分鍾數(shù),返回日期對象,參數(shù):"目标日期","分鍾數(shù)"。 |
減日期減秒(miǎo) | 對給定日期的減指定的秒(miǎo)數(shù),返回日期對象,參數(shù):"目标日期","秒(miǎo)數(shù)"。 |
取年份 | 取指定日期的年份,返回數(shù)字,參數(shù):"目标日期" |
取月份 | 取指定日期的月份,返回數(shù)字,參數(shù):"目标日期" |
取星期 | 取指定日期的星期,返回數(shù)字,參數(shù):"目标日期" |
取天 | 取指定日期的天,返回數(shù)字,參數(shù):"目标日期" |
取小(xiǎo)時(shí) | 取指定日期的小(xiǎo)時(shí),返回數(shù)字,參數(shù):"目标日期" |
取分鍾 | 取指定日期的分鍾,返回數(shù)字,參數(shù):"目标日期" |
取秒(miǎo) | 取指定日期的秒(miǎo),返回數(shù)字,參數(shù):"目标日期" |
日期相減返回毫秒(miǎo) | 兩個(gè)日期相差操作(zuò),返回毫秒(miǎo),參數(shù):"日期","減去的日期" |
日期相減返回秒(miǎo) | 兩個(gè)日期相差操作(zuò),返回秒(miǎo),參數(shù):"日期","減去的日期" |
日期相減返回分鍾 | 兩個(gè)日期相差操作(zuò),返回分鍾,參數(shù):"日期","減去的日期" |
日期相減返回小(xiǎo)時(shí) | 兩個(gè)日期相差操作(zuò),返回小(xiǎo)時(shí),參數(shù):"日期","減去的日期" |
日期相減返回天 | 兩個(gè)日期相差操作(zuò),返回天數(shù),參數(shù):"日期","減去的日期" |
日期相減返回星期 | 兩個(gè)日期相差操作(zuò),返回星期數(shù),參數(shù):"日期","減去的日期" |
取指定月份天數(shù) | 取某個(gè)時(shí)間(jiān)段內(nèi)指定月份的天數(shù),多(duō)個(gè)月分可(kě)以用“,”分隔,比如“10,11,12”,就表示取目标時(shí)間(jiān)段內(nèi)在10月、11月和(hé)12月的天數(shù) |
取非指定月份天數(shù) | 與上(shàng)面的“取指定月份天數(shù)”的方法相反,取某個(gè)時(shí)間(jiān)段內(nèi)非指定月份的天數(shù),多(duō)個(gè)月分可(kě)以用“,”分隔,比如“10,11,12”,就表示取目标時(shí)間(jiān)段內(nèi)非10月、11月和(hé)12月的天數(shù) |
字符串的內(nèi)置動作(zuò)
方法名 | 描述 |
---|---|
去空(kōng)格 | 去除目标字符串兩邊空(kōng)格,返回字符串,參數(shù):"目标字符串" |
指定起始的字符串截取 | 截取指定區(qū)段的字符串,返回字符串,參數(shù):"目标字符串","開(kāi)始位置","結束位置" |
指定開(kāi)始的字符串截取 | 截取指定開(kāi)始位置到結束的字符串,返回字符串,參數(shù):"目标字符串","開(kāi)始位置" |
指定結束的字符串截取 | 截取從第一個(gè)字符開(kāi)始到指定位置結束的字符串,返回字符串,參數(shù):"目标字符串","結束位置" |
轉小(xiǎo)寫 | 将指定字符串換成小(xiǎo)寫(僅限英文),返回字符串,參數(shù):"目标字符串" |
轉大(dà)寫 | 将指定字符串換成大(dà)寫(僅限英文),返回字符串,參數(shù):"目标字符串" |
獲取長度 | 獲取指定字符串長度,返回數(shù)字,參數(shù):"目标字符串" |
獲取字符 | 獲取指定位置字符,返回字符,參數(shù):"目标字符串","位置" |
字符首次出現位置 | 獲取指定字符在當中字符串中首次出現的位置,返回數(shù)字,參數(shù):"目标字符串","要查找的字符串" |
字符最後出現位置 | 獲取指定字符在當中字符串中最後出現的位置,返回數(shù)字,參數(shù):"目标字符串","要查找的字符串" |
替換字符串 | 用新字符串替換指定字符串,返回替換後的字符串,參數(shù):"目标字符串","原字符串","新字符串" |
常用數(shù)學函數(shù)的內(nèi)置動作(zuò)
方法名 | 描述 |
---|---|
求絕對值 | 返回一個(gè)數(shù)字的絕對值,參數(shù):"數(shù)字" |
求最大(dà)值 | 求給定兩個(gè)數(shù)字中最大(dà)的那(nà)個(gè)數(shù)字,返回那(nà)個(gè)最大(dà)的數(shù)字,參數(shù):"數(shù)字1","數(shù)字2" |
求最小(xiǎo)值 | 求給定兩個(gè)數(shù)字中最小(xiǎo)的那(nà)個(gè)數(shù)字,返回那(nà)個(gè)最小(xiǎo)的數(shù)字,參數(shù):"數(shù)字1","數(shù)字2" |
求正弦 | 返回一個(gè)數(shù)字的正弦值,參數(shù):"數(shù)字" |
求餘弦 | 返回一個(gè)數(shù)字的餘弦值,參數(shù):"數(shù)字" |
求正切 | 返回一個(gè)數(shù)字的正切值,參數(shù):"數(shù)字" |
求餘切 | 返回一個(gè)數(shù)字的餘切值,參數(shù):"數(shù)字" |
求e為(wèi)底的對數(shù) | 返回一個(gè)數(shù)字以e為(wèi)底的對數(shù)值,參數(shù):"數(shù)字" |
求10為(wèi)底的對數(shù) | 返回一個(gè)數(shù)字以10為(wèi)底的對數(shù)值,參數(shù):"數(shù)字" |
四舍五入 | 返回一個(gè)數(shù)字四舍五入後的值,參數(shù):“數(shù)字” |
List集合的內(nèi)置動作(zuò)
方法名 | 描述 |
---|---|
求List大(dà)小(xiǎo) | 返回給定的一個(gè)集合對象的size屬性值,這個(gè)集合對象必須是List類型 。 |
求List中所有(yǒu)的數(shù)字最大(dà)值 | 參數(shù)為(wèi)一個(gè)包含所有(yǒu)數(shù)字的集合對象,要求這個(gè)集合對象裏每個(gè)元素都是數(shù)字類型,返回這個(gè)集合中最大(dà)的那(nà)個(gè)數(shù)字元素對象,這個(gè)集合對象必須是List類型 。 |
求List中所有(yǒu)的數(shù)字最小(xiǎo)值 | 參數(shù)為(wèi)一個(gè)包含所有(yǒu)數(shù)字的集合對象,要求這個(gè)集合對象裏每個(gè)元素都是數(shù)字類型,返回這個(gè)集合中最小(xiǎo)的那(nà)個(gè)數(shù)字元素對象,這個(gè)集合對象必須是List類型 。 |
向List中添加對象 | 參數(shù)有(yǒu)兩個(gè),分别是"集合對象","要添加的對象",意思是把第二個(gè)參數(shù)對象值添加到第一個(gè)集合中去,這個(gè)集合對象必須是List類型,該方法沒有(yǒu)返回 值。 |
集合排序 | 參數(shù)有(yǒu)三個(gè),分别是"集合對象","屬性名","排序方式",其中第一個(gè)參數(shù)這個(gè)集合對象必須是List類型;第二個(gè)參數(shù)為(wèi)這個(gè)集合中對象的某一個(gè)屬性名,第三個(gè)是一個(gè)字符串,可(kě)選值有(yǒu)"1"、"true"、"正序",這三個(gè)值均表示對這個(gè)集合中指定屬性名按正序排列,其它值則表示按倒序排列,該方法沒有(yǒu)返回 值。 |
抽取集合屬性 | 參數(shù)有(yǒu)兩個(gè),分别是"集合對象","屬性名",第一個(gè)參數(shù)這個(gè)集合對象必須是List類型;第二個(gè)參數(shù)為(wèi)這個(gè)集合中對象的屬性名。該方法的作(zuò)用就是将這個(gè)集合對象中每個(gè)元素的指定屬性值取出來(lái),放在一個(gè)List集合中返回。 |
從List中删除對象 | 參數(shù)有(yǒu)兩個(gè),分别是"集合對象","要删除的對象",第一個(gè)參數(shù)必須是一個(gè)List類型對象,第二個(gè)參數(shù)是指定要從這個(gè)集合中删除的對象,該方法沒有(yǒu)返回值。 |
指定對象是否存在 | 參數(shù)有(yǒu)兩個(gè),分别是"集合對象","要判斷的對象",第一個(gè)參數(shù)必須是一個(gè)List類型對象,第二個(gè)參數(shù)是要判斷的對象,該方法沒有(yǒu)返回一個(gè)布爾值。 |
List是否為(wèi)空(kōng) | 參數(shù)有(yǒu)一個(gè),也就是"集合對象",這個(gè)參數(shù)必須是一個(gè)List類型對象,用于判斷當前給定的List對象裏有(yǒu)沒有(yǒu)元素,該方法返回布爾值。 |
Map集合的內(nèi)置動作(zuò)
方法名 | 描述 |
---|---|
添加到Map | 該方法的參數(shù)有(yǒu)三個(gè),分别是"Map對象","key","value",第一個(gè)參數(shù)必須是一個(gè)Map類型;第二個(gè)參數(shù)表示要添加對象的Key值;第三個(gè)為(wèi)要添加的具體(tǐ)對象,該方法沒有(yǒu)返回值。 |
從Map中删除 | 該方法的參數(shù)有(yǒu)兩個(gè),分别是"Map對象","key",第一個(gè)參數(shù)必須是一個(gè)Map類型;第二個(gè)參數(shù)表示要删除對象的Key值,該方法沒有(yǒu)返回值。 |
指定Key是否存在 | 該方法的參數(shù)有(yǒu)兩個(gè),分别是"Map對象","key",第一個(gè)參數(shù)必須是一個(gè)Map類型;第二個(gè)參數(shù)表示要判斷的對象的Key值,如果指定的key存在返回true,否則返回false. |
從Map中取值 | 該方法的參數(shù)有(yǒu)兩個(gè),分别是"Map對象","key",第一個(gè)參數(shù)必須是一個(gè)Map類型;第二個(gè)參數(shù)表示要取的對象的Key值,返回key值對應的對象。 |
返回Map大(dà)小(xiǎo) | 該方法的參數(shù)有(yǒu)一個(gè),就是"Map對象",作(zuò)用是返回這個(gè)Map對象裏對象的數(shù)量。 |
返回Map的Key集合 | 該方法的參數(shù)有(yǒu)一個(gè),就是"Map對象",作(zuò)用是返回這個(gè)Map對象裏key值對應的Set集合 |
返回Map的值集合 | 該方法的參數(shù)有(yǒu)一個(gè),就是"Map對象",作(zuò)用是返回這個(gè)Map對象裏value值的Collection集合 |
創建一個(gè)HashMap實例 | 無參數(shù),創建一個(gè)HashMap對象實例 |
對象的的內(nèi)置動作(zuò)
方法名 | 描述 |
---|---|
對象實例化 | 需要一個(gè)字符串類型的參數(shù),用于指定要實例化對象的完整類路徑,需要注意的是,指定的要實例化的對象必須要有(yǒu)一個(gè)空(kōng)的構造方法,否則方法執行(xíng)的時(shí)候會(huì)出現錯誤 |
根據對象創建新實例 | 需要指定一個(gè)具體(tǐ)的對象作(zuò)為(wèi)參數(shù),方法會(huì)根據這個(gè)指定的對象,實例化一個(gè)新的對象,注意這裏隻是實例化一個(gè)新的對象,而不會(huì)對原對象進行(xíng)clone操作(zuò) |
對象取值 | 需要兩個(gè)參數(shù),分别是目标對象和(hé)屬性名,方法會(huì)從目标對象裏取對應的屬性名對應的屬性值 |
循環操作(zuò)的內(nèi)置動作(zuò)
循環操作(zuò)的動作(zuò)就一個(gè),那(nà)就是中斷循環,該動作(zuò)隻能用在循環規則裏,用于在一定條件下中斷當前的循環規則。
自定義內(nèi)置動作(zuò)
在用戶使用過程當中,如果有(yǒu)一些(xiē)自己內(nèi)部常用的操作(zuò),而這些(xiē)操作(zuò)在URule Pro中的內(nèi)置動作(zuò)中又沒有(yǒu),那(nà)麽可(kě)以利用自定義內(nèi)置動作(zuò)的方式定義自己的內(nèi)置動作(zuò)。
定義內(nèi)置動作(zuò)非常簡單,隻需要在需要暴露給用戶使用的Spring bean中添加相應的annotation即可(kě)。我們先來(lái)看看URule Pro中提供的針對字符串的內(nèi)置動作(zuò)類的部分源代碼。
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="去空(kōng)格")
@ActionMethodParameter(names={"目标字符串"})
public String trim(String str){
if(str==null){
return str;
}
return str.trim();
}
@ActionMethod(name="指定起始的字符串截取")
@ActionMethodParameter(names={"目标字符串","開(kāi)始位置","結束位置"})
public String substring(String str,int start,int end){
return str.substring(start, end);
}
......
}
可(kě)以看到,首先我們需要在”類“層面添加一個(gè)名為(wèi)ActionBean的annotation,它隻有(yǒu)一個(gè)屬性,就是要定義這個(gè)內(nèi)置動作(zuò)的名稱。然後在需要暴露的方法中添加兩個(gè)annotation,分别是ActionMethod和(hé)ActionMethodParameter。ActionMethod是用來(lái)定義用戶看到的方法名稱的,而ActionMethodParameter則是用來(lái)定義用戶看到的各個(gè)參數(shù)名稱,它的names屬性是一個(gè)數(shù)組,要求給出的描述參數(shù)要與當前方法的參數(shù)個(gè)數(shù)匹配,如果小(xiǎo)于參數(shù)個(gè)數(shù),那(nà)麽用戶将會(huì)看到後面的參數(shù)無描述信息。
在類中定義好這些(xiē)Annotation之後,将這個(gè)類配置到Spring當中,讓其成為(wèi)一個(gè)标準的Spring Bean,并為(wèi)其定義一個(gè)Bean Id,這樣URule在啓動時(shí)就會(huì)自動加載,并讓其成為(wèi)內(nèi)置動作(zuò),用戶就可(kě)以直接使用了。
定義內(nèi)置動作(zuò)的Spring Bean時(shí),一定不要忘記給這個(gè)Spring Bean定義一個(gè)Id,這樣才能保證規則在任何地方運行(xíng)都不會(huì)出錯,這點很(hěn)關鍵。
在定義內(nèi)置動作(zuò)時(shí)需要注意,如果我們規則運行(xíng)方式采用的是客戶端服務器(qì)模式(參見第16小(xiǎo)節內(nèi)容介紹),那(nà)麽必須要保證調用知識包的客戶端Spring環境裏有(yǒu)這個(gè)Bean,且Bean的Id要與動作(zuò)庫定義時(shí)的Id保證一至,否則調用會(huì)出現錯誤。