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