在向?qū)揭?guī)則集中,我們通過鼠標(biāo)點(diǎn)擊就可以定義出各種類型的復(fù)雜業(yè)務(wù)規(guī)則;如果你是一個(gè)程序員,可能會(huì)更青睞代碼的方式來定義業(yè)務(wù)規(guī)則,所以在URule Pro中還提供了腳本式規(guī)則集,讓我們可以采用腳本的方式來定義業(yè)務(wù)規(guī)則。與向?qū)揭?guī)則集對(duì)應(yīng),腳本式規(guī)則集里可以實(shí)現(xiàn)向?qū)揭?guī)則中能實(shí)現(xiàn)的所有功能,反過來也是一樣。
雖然說腳本式規(guī)則集能實(shí)現(xiàn)向?qū)揭?guī)則集的所有功能,但在實(shí)際使用中,我們還是推薦大家使用向?qū)揭?guī)則集來定義我們的業(yè)務(wù)規(guī)則,這是因?yàn)橄驅(qū)揭?guī)則集是通過鼠標(biāo)點(diǎn)擊方式,一步步引導(dǎo)我們進(jìn)行操作,所以它的出錯(cuò)機(jī)率很小,所以推薦使用。在URule Pro當(dāng)中所有的功能點(diǎn)都可以采用向?qū)Х绞絹硗瓿啥x。
在腳本式規(guī)則集中,采用URule Pro自定義的一套腳本語法,關(guān)鍵字既可以使用英文也可以是中文,在一個(gè)普通規(guī)則或一個(gè)循環(huán)規(guī)則當(dāng)中,我們可以使用純英文關(guān)鍵字來定義,也可以全部使用純中文關(guān)鍵字來定義,如果你愿意,也可以使用中英文混合的關(guān)鍵字來定義。因?yàn)橹С种形年P(guān)鍵字,使得URule Pro的腳本式?jīng)Q策集更加適合國(guó)人編寫,可讀性也就更強(qiáng),再配合URule Pro中提供的腳本式?jīng)Q策集編輯器中提供的全功能代碼提示功能,可大幅提高腳本式?jīng)Q策集的編寫效率。
打開URule Pro控制臺(tái),在項(xiàng)目下的“決策集”節(jié)點(diǎn)右鍵,選擇“添加腳本式?jīng)Q策集”菜單項(xiàng),即可創(chuàng)建一個(gè)新的腳本式?jīng)Q策集文件,如下圖所示:
URule Pro中的腳本的語法定義與解析采用的是ANTLR實(shí)現(xiàn),在一個(gè)腳本式?jīng)Q策集當(dāng)中,同樣可以導(dǎo)入變量庫(kù)、常量庫(kù)、參數(shù)庫(kù)以及動(dòng)作庫(kù),同樣可以編寫普通規(guī)則和循環(huán)規(guī)則。對(duì)于一個(gè)完整的腳本規(guī)則文件,它的內(nèi)容主要由三部分構(gòu)成,分別是:導(dǎo)入資源庫(kù)的頭部分、規(guī)則定義部分以及函數(shù)定義部分;我們先來看看資源庫(kù)導(dǎo)入的頭部分。
所謂的庫(kù)文件導(dǎo)入部分,就是指在整個(gè)腳本規(guī)則文件的最頂部來定義導(dǎo)入哪些庫(kù)文件,前面提到,通過最上方的工具欄,可以將我們規(guī)則當(dāng)中需要用到的資源為導(dǎo)入進(jìn)來。以導(dǎo)入變量庫(kù)文件為例,在導(dǎo)入操作之前,需要我們首先將編輯光標(biāo)定位于文件頭部,然后點(diǎn)擊最上方工具欄中“導(dǎo)入常量庫(kù)”按鈕,在彈出窗口中選擇目標(biāo)資源庫(kù)文件,確定后,就可以在當(dāng)前腳本規(guī)則文件中加入要導(dǎo)入的資源庫(kù)文件,如下圖所示:
導(dǎo)入其它類型的資源庫(kù)操作也是一樣,每條導(dǎo)入可以添加“;”結(jié)尾,也可以不加;在導(dǎo)入資源庫(kù)文件時(shí),如果我們選擇當(dāng)前資源庫(kù)文件的某個(gè)具體版本,那么版本號(hào)就會(huì)出現(xiàn)在文件名的后方,如下圖所示:
可以看到版本號(hào)置于文件結(jié)尾處,與文件名之間以“:”分隔。
需要注意的是,導(dǎo)入庫(kù)文件的定義信息,必須要置于整個(gè)腳本規(guī)則文件的頂部,具體的規(guī)則及函數(shù)定義必須位于導(dǎo)入資源庫(kù)定義信息之下,否則就有語法錯(cuò)誤。但對(duì)于變量庫(kù)、參數(shù)庫(kù)、常量庫(kù)及動(dòng)作庫(kù)之間的順序則是任意的。
接下來我們來看看規(guī)則定義,規(guī)則的位置是任意的,只是保證它們的位置在導(dǎo)入資源庫(kù)定義內(nèi)容之下就行。
在一個(gè)腳本式規(guī)則文件當(dāng)中,可以添加零至多個(gè)普通規(guī)則或循環(huán)規(guī)則定義信息,其定義位置必須要在導(dǎo)入庫(kù)文件的定義信息之下。一個(gè)標(biāo)準(zhǔn)的普通規(guī)則定義的結(jié)構(gòu)如下。
在一個(gè)普通規(guī)則當(dāng)中,else部分如果沒有動(dòng)作可定義,那么是可以省略不寫的,就像下面這樣:
看完普通規(guī)則后,我們?cè)賮砜纯囱h(huán)規(guī)則定義,下面是一個(gè)標(biāo)準(zhǔn)的循環(huán)規(guī)則定義結(jié)構(gòu):
對(duì)照向?qū)經(jīng)Q策集里的循環(huán)規(guī)則定義,可以看到結(jié)構(gòu)完全一致,唯一不同的是這里采用腳本方式實(shí)現(xiàn)。同樣在腳本式循環(huán)規(guī)則的循環(huán)體中,如果沒有“否則”部分,那么這里的“else”部分的定義就可以省略,這與普通規(guī)則一樣。
無論是普通規(guī)則,還是循環(huán)規(guī)則,屬性定義部分都是一樣的,而且與向?qū)揭?guī)則中普通規(guī)則和循環(huán)規(guī)則保持一致。
如果不記得屬性有哪些可以通過ALT+"/"鍵打開代碼提示,選擇需要的屬性即可,多個(gè)屬性之間可以用空格或","號(hào)分隔,具體屬性中英文名及描述見規(guī)則屬性部分介紹,如下圖所示:
在腳本式?jīng)Q策集編輯器當(dāng)中,通過使用ALT+"/"鍵就可以打開當(dāng)前光標(biāo)所在位置的代碼提示功能,如果你在按ALT+"/"鍵時(shí)沒出現(xiàn)代碼提示菜單,則你的瀏覽器可能已占用了這個(gè)快捷鍵,我們必須要將這個(gè)快捷鍵開放出現(xiàn),留給腳本式?jīng)Q策集編輯器使用。
屬性賦值通過”=“實(shí)現(xiàn),多個(gè)屬性之間需要添加空格或回車,對(duì)于String類型的屬性值需要添加雙引號(hào)包裹,日期類型要采用“yyyy-MM-dd HH:mm:ss”格式來定義,布爾類型則直接輸入true或false,如下圖所示的屬性:
對(duì)于一個(gè)普通規(guī)則,條件定義部分在if與then之間,對(duì)于循環(huán)規(guī)則,條件定義部分指的是循環(huán)體中在if與then之間的部分。
在條件定義部分中我們可以添加具體的業(yè)務(wù)條件判斷,與向?qū)揭?guī)則類似,在編寫腳本式規(guī)則條件時(shí),單個(gè)條件也是由條件左邊部分,比較操作符及條件右邊部分。在條件左邊部分,同樣可以使用參數(shù)、變量及方法,當(dāng)然也可以添加簡(jiǎn)單的加、減、乘、除,對(duì)于條件的比較操作符,我們可以通過ALT+"/"鍵打開代碼提示來進(jìn)行查看,如下圖所示:
條件左邊值格式為:變量/參數(shù)/方法 [+][/][*][/] 變量/參數(shù)/方法/數(shù)字/字符串 [+][/][*][/]變量/參數(shù)/方法/ 數(shù)字/字符串...
合法的條件左邊值定義示例 |
---|
員工.salary/10 |
員工.salary-10 |
員工.salary+10-5*2/3 |
員工.salary+10 |
員工.salary*10 |
員工.salary |
參數(shù).approve |
參數(shù).amount+10 |
MethodTest.判斷用戶名("張三")+12*12 |
MethodTest.判斷用戶名("張三") |
與條件左邊值類似,條件右邊值除了可輸入單個(gè)普通的數(shù)字、字符串、變量、參數(shù)、方法、常量外,也可以使用一級(jí)或多級(jí)加、減、乘、除操作連接復(fù)雜表達(dá)式,但一級(jí)或多級(jí)加、減、乘、除操作的右邊對(duì)象同樣可以是普通的數(shù)字、字符串、變量、參數(shù)、方法、常量,其語法格式如下:
數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 ...
在條件右邊值當(dāng)中,可以使用括號(hào)來實(shí)現(xiàn)加、減、乘、除運(yùn)算優(yōu)先級(jí),依照條件右邊值語法格式,上面條件左邊值格式為不合法的示例,在條件右邊值中都是合法的。在條件左值當(dāng)中,我們可不以使用常量,但在條件右值當(dāng)中就可以使用常量,下面是幾個(gè)合法的條件右邊值定義示例:
合法的條件右邊值定義示例 |
---|
員工.salary+10-(員工.level-2.11*(2+2.1)) |
MethodTest.判斷用戶名("張三")+員工.salary |
員工.salary+員工.level+10 |
MethodTest.判斷用戶名("張三")+12*12 |
員工.salary+10-5*2/3*(2+1.11) |
MethodTest.判斷用戶名("張三") |
員工.salary+10-5*2/3 |
員工.salary-10 |
員工.salary-10 |
參數(shù).approve |
參數(shù).amount+10 |
員工.salary+10 |
員工.salary*10 |
true |
false |
10 |
"yes" |
$學(xué)歷.大專 |
10+20 |
20*0.08+30 |
在規(guī)則編寫過程當(dāng)中,如果有多個(gè)條件,那么可以采用“and”或“or”符號(hào)來對(duì)多個(gè)條件進(jìn)行連接組合,同時(shí)對(duì)于組合的條件,還可以添加括號(hào)來實(shí)現(xiàn)組件條件計(jì)算的優(yōu)先級(jí),在未添加括號(hào)的多個(gè)組合條件之間,要使用相同連接符號(hào),也就是說在未添加括號(hào)的多個(gè)組合條件之間,要么使用“and”,要么使用“or”。下面當(dāng)前羅列了一些常用的組合條件示例:
組合條件 | 描述 |
---|---|
員工.level==1 or 員工.level==2 | 兩條件只滿足一個(gè)條件即可 |
員工.salary>1000 and 員工.salary<10000 | 兩條件必須同時(shí)滿足 |
員工.salary>1000 and 員工.salary<10000 and (員工.level==1 or 員工.level==2 or (員工.學(xué)歷 == $學(xué)歷.大專 and 員工.salary>員工.level*1.5 and 員工.dept.id=="D21")) | 前兩個(gè)條件滿足,括號(hào)內(nèi)前兩個(gè)條件與最后那括號(hào)內(nèi)條件必須要滿足其一 |
員工.salary>1000 and 員工.salary<10000 and (員工.level==1 or 員工.level==2) | 前兩個(gè)條件必須同時(shí)滿足,同時(shí)后面兩個(gè)條件必須要有一個(gè)滿足 |
員工.學(xué)歷 == $學(xué)歷.大專 and 員工.salary>員工.level*1.5 and 員工.dept.id=="D21" | 表示三個(gè)條件必須同時(shí)滿足 |
通過上面的例子可以看到,通過“and”或“or”符號(hào)來對(duì)多個(gè)條件進(jìn)行連接組合以及添加括號(hào)或多層嵌套括號(hào)可以實(shí)現(xiàn)非常復(fù)雜的條件組合,從而滿足我們的業(yè)務(wù)需求。對(duì)于連接多個(gè)條件的“and”或“or”符號(hào),在使用時(shí)還可以用“&&”或“||”來替換,程序員一定很熟悉,“&&”或“||”在代碼中表示的就是“并且”“或者”,除此之外,我們還可以直接使用“并且”“或者”的中文來連接多個(gè)條件,如下面的截圖所示:
在腳本式規(guī)則中,條件定義的可讀性與向?qū)揭?guī)則相比就很差了,所以這也是我們不推薦使用腳本式規(guī)則的原因之一。
腳本式?jīng)Q策集中普通規(guī)則的的動(dòng)作定義部分寫在“then”與“end”之間或者是“else”與“end”之間,循環(huán)規(guī)則中除了循環(huán)體中可在上述兩個(gè)地方添加動(dòng)作外,還可以在"loopStart"與“if”之間或"loopEnd"與"end"之間添加動(dòng)作,動(dòng)作可有一個(gè)或多個(gè),每個(gè)動(dòng)作以“;”或回車結(jié)束。可執(zhí)行的動(dòng)作有三種類型,那就是為變量或參數(shù)賦值、執(zhí)行方法、執(zhí)行自定義函數(shù)以及控制臺(tái)內(nèi)容輸出。我們首先來看看針對(duì)變量或參數(shù)的賦值操作。
賦值操作的語法格式如下:
變量或參數(shù) = 數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/]數(shù)字/字符串/變量/參數(shù)/方法/常量 ...
可以看到,針對(duì)變量或參數(shù)的賦值,首先要寫出具體的變量或參數(shù)名,然后是“=”符號(hào),接下來在“=”右邊是一個(gè)簡(jiǎn)單或復(fù)雜的賦值表達(dá)式。在這里賦值表達(dá)式與條件的右邊值格式完全相同,所以這里不再贅述。
在做執(zhí)行方法操作時(shí),我們需要導(dǎo)入定義目標(biāo)方法的動(dòng)作庫(kù),一旦導(dǎo)入,我們通過ALT+"/"鍵代碼提示中就可以看到當(dāng)前文件中可用的方法,選擇好一個(gè)方法后,如果這個(gè)方法中包含參數(shù),那么我們還要根據(jù)在方法定義時(shí)指定的參數(shù)類型,為方法填充適當(dāng)?shù)膮?shù),對(duì)于方法參數(shù),它也支持類型條件右邊值那種復(fù)雜的語法格式,執(zhí)行方法的語法格式如下:
方法名([參數(shù)1,參數(shù)2...])
所謂執(zhí)行自定義函數(shù)是指執(zhí)行在當(dāng)前規(guī)則文件當(dāng)中定義的自定義函數(shù),關(guān)于自定義函數(shù)見后面內(nèi)容描述,執(zhí)行自定義函數(shù)的格式如下:
函數(shù)名([參數(shù)1,參數(shù)2...])
在URule Pro當(dāng)中,內(nèi)置了一個(gè)名為out的向控制臺(tái)內(nèi)容輸出內(nèi)容的函數(shù),其語法格式如下:
out(數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 [+][-][*][/] 數(shù)字/字符串/變量/參數(shù)/方法/常量 ... )
從格式中可以看到,它以“out”開頭,后面的括號(hào)中就是我們需要輸出的內(nèi)容,對(duì)于輸出內(nèi)容格式,與條件的右邊值格式完全相同。
在規(guī)則編寫當(dāng)中,無論是普通規(guī)則還是循環(huán)規(guī)則,所有的關(guān)鍵字可以使用對(duì)應(yīng)的中文來進(jìn)行替代,具體見下表:
關(guān)鍵字 | 對(duì)應(yīng)的中文關(guān)鍵字 |
---|---|
rule | 規(guī)則 |
loopRule | 循環(huán)規(guī)則 |
loopTarget | 循環(huán)對(duì)象 |
loopStart | 開始前動(dòng)作 |
loopEnd | 結(jié)束后動(dòng)作 |
if | 如果 |
then | 那么 |
end | 結(jié)束 |
and | 并且 |
or | 或者 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
EndWith | 結(jié)束于 |
NotEndWith | 不結(jié)束于 |
StartWith | 開始于 |
NotStartWith | 不開始于 |
In | 不集合中 |
NotIn | 不在集合中 |
Match | 匹配 |
NotMatch | 不匹配 |
EqualsIgnoreCase | 忽略大小寫等于 |
NotEqualsIgnoreCase | 忽略大小寫不等于 |
下面的截圖中是一個(gè)用英文關(guān)鍵字編寫的普通規(guī)則
對(duì)應(yīng)的中文規(guī)則如下:
下圖中是一個(gè)用中英文關(guān)鍵字混合的規(guī)則:
在腳本式?jīng)Q策集中,可通過//來添加單行備注,多行備注用/..備注內(nèi)容../實(shí)現(xiàn)
盡管在腳本式規(guī)則集中提供了與向?qū)揭?guī)則集一樣的功能,但由于其需要手寫的特點(diǎn),決定了它的編寫過程中出現(xiàn)錯(cuò)誤的可能性,同時(shí),腳本式規(guī)則中多條件的組合可讀性相比向?qū)揭?guī)則中圖形化展現(xiàn)方式也要差很多,所以我們還是推薦大家使用向?qū)揭?guī)則集。在URule Pro中,所有的功能點(diǎn)都可以通過向?qū)渲玫姆绞酵瓿?,完全不需要手寫任何腳本。
更多建議: