變量庫文件
在業務系統開(kāi)發過程中,會(huì)用到大(dà)量包含Getter和(hé)Setter方法的簡單的Java對象,它們被稱之為(wèi)POJO(Plain Ordinary Java Object),或BOM(Business Object Model)對象,這些(xiē)對象在開(kāi)發中作(zuò)為(wèi)數(shù)據的載體(tǐ),負責數(shù)據的傳遞。在URule Pro當中,變量庫就是用來(lái)映射這些(xiē)POJO對象,從而使得(de)我們可(kě)以在具體(tǐ)的規則文件中使用它們,從而完成規則與業務數(shù)據的交互。 進入URule Pro規則設計(jì)頁,在“庫”節點點擊右鍵,在彈出的菜單中選擇“添加變量庫”就可(kě)以創建變量庫文件,如下圖所示:
創建好變量庫文件後,可(kě)以看到系統會(huì)用變量庫編輯器(qì)自動打開(kāi)這個(gè)文件。在這個(gè)編輯器(qì)中,首先需要添加變量的分類,然後再添加具體(tǐ)的變量字段。對應到Java實體(tǐ)對象,就是要添加對應的實體(tǐ)對象信息,再添加這個(gè)實體(tǐ)對象所擁有(yǒu)的屬性信息。如下圖所示:
添加一個(gè)分類,輸入名稱,這個(gè)名稱是對當前分類的描述,會(huì)在規則中直接引用顯示,所以一般我們會(huì)使用中文描述來(lái)作(zuò)為(wèi)名稱,類路徑,就是這個(gè)分類對應的實體(tǐ)類的完整路徑,比如上(shàng)圖中的“com.bstek.entity.Customer”。
無論是變量分類還(hái)是具體(tǐ)的變量,都有(yǒu)一個(gè)“用途”的屬性,可(kě)選值有(yǒu)三個(gè),分别是:In、Out、InOut,含義如下表所示:
名稱 | 描述 |
---|---|
In | 表示該變量隻能用于輸入、不能用于輸出,在規則中可(kě)以用于條件判斷,但(dàn)不能給這個(gè)變量賦值,同時(shí)在快速測試中,不能選擇用于輸出。 |
Out | 表示該變量隻能用于輸出、不能用于輸入,在規則中既可(kě)以用于條件判斷,也可(kě)以給這個(gè)變量賦值,但(dàn)在快速測試中,不能選擇其用于輸入,隻能選擇其作(zuò)為(wèi)輸出。 |
InOut | 表示該變量即可(kě)以作(zuò)為(wèi)輸入、也可(kě)以作(zuò)為(wèi)輸出。 |
變量的類路徑是規則引擎在執行(xíng)過程中查找對應對象的唯一标識,所以在定義時(shí)一定要讓其與實際業務中對應的POJO對象的完整類路徑一緻,否則在運行(xíng)時(shí)将會(huì)出現找不到類的情況,或者使得(de)規則在計(jì)算(suàn)時(shí)不會(huì)出現我們期望的結果。
變量類路徑也可(kě)以理(lǐ)解為(wèi)一個(gè)變量的ID,實際使用時(shí),這個(gè)類路徑對應的類可(kě)以是不存在的,這樣在代碼中我們可(kě)以使用GeneralEntity來(lái)模拟這個(gè)類對象。在引擎提供的快速測試以及Rest調用中,所有(yǒu)的變量對象都是通(tōng)過GeneralEntity模拟運行(xíng)。
“參數(shù)”是系統的保留字,專門(mén)用于“參數(shù)庫”文件使用,因此在變量分類名稱定義時(shí),不能使用“參數(shù)”。
變量維護的5種方式
手工添加字段
點擊上(shàng)圖中的“添加字段”按鈕,即可(kě)在右側表格中多(duō)一個(gè)空(kōng)白行(xíng),在新增行(xíng)中分别填充【字段名稱】【标題】【數(shù)據類型】等內(nèi)容,說明(míng)如下:
名稱 | 描述 |
---|---|
字段名稱 | 字段屬性名稱,能常定義為(wèi)通(tōng)俗易懂的英文表示,符合java的駝峰命名法,且在該字段列表中是唯一的,多(duō)數(shù)在後台程序調用時(shí)會(huì)用到 |
标題 | 字段的中文說明(míng),在規則設計(jì)器(qì)中顯示,在當前變量中應該保持唯一性 |
數(shù)據類型 | 在格表中下拉選擇合适的數(shù)據類型:String字符串,Integer短(duǎn)整型,Long長整型,Float短(duǎn)浮點型,Double長浮點型,BigDecimal金融浮點型,Date日期,Map集合,List集合,Object對象型 |
用途 | 同上(shàng)【添加變量】中的說明(míng) |
默認值 | 同下【變量字段默認值】中的說明(míng) |
根據類路徑生(shēng)成字段
這時(shí),需要先定義變量的分類,如果當前定義的類路徑對應的類在當前應用中存在的話(huà)(通(tōng)常需要程序員的協助,先定義好變量,然後在“Jar文件熱部署功能”中上(shàng)傳到服務器(qì))),那(nà)麽可(kě)以在當前變量分類所在行(xíng)點擊右鍵,在彈出的菜單中選擇“根據類路徑生(shēng)成字段”,系統就會(huì)通(tōng)過Java的反射功能生(shēng)成當前類對應的所有(yǒu)字段信息。上(shàng)圖中com.bstek.entity.Customer類源碼如下所示:
package com.bstek.entity;
import java.util.Date;
import com.bstek.urule.model.Label;
/**
* @author Jacky.gao
* @since 2016年9月29日
*/
public class Customer {
@Label("名稱")
private String name;
@Label("年齡")
private int age;
@Label("出生(shēng)日期")
private Date birthday;
@Label("等級")
private int level;
@Label("手機号")
private String mobile;
@Label("性别")
private boolean gender;
@Label("是否有(yǒu)車(chē)")
private boolean car;
@Label("婚否")
private boolean married;
@Label("是否有(yǒu)房(fáng)")
private boolean house;
//省略上(shàng)述所有(yǒu)屬性對應的getter與setter方法......
}
在這個(gè)類當中,可(kě)以看到每個(gè)屬性都有(yǒu)一個(gè)名為(wèi)Label的annotation,它是一個(gè)由URule Pro提供的用來(lái)描述字段屬性的annotation,這裏描述的值,在生(shēng)成變量時(shí)會(huì)自動寫到變量的“标題”當中,這裏的标題将會(huì)在規則中直接引用,讓标題有(yǒu)意義,對于規則的清晰表達很(hěn)有(yǒu)價值。
如果這個(gè)類在當前所在的項目當中,所以可(kě)以直接通(tōng)過反射生(shēng)成所有(yǒu)的屬性,生(shēng)成後的效果如下:
可(kě)以看到上(shàng)圖中Label這個(gè)annotation對應的描述寫入到變量的“标題”當中。
這到裏,變量庫文件就定義好了,可(kě)以根據需要在一個(gè)文件中添加多(duō)個(gè)變量 分類,相應對應到多(duō)個(gè)POJO類。
根據數(shù)據庫表生(shēng)成字段
- 在使用該功能前,應首先在【數(shù)據源配置】功能中,定義一個(gè)數(shù)據源,并保證可(kě)用
- 右鍵目标變量“根據數(shù)據庫表生(shēng)成字段”,彈出如下畫(huà)面:選擇數(shù)據源,填寫“表名稱”,點擊“刷新字段”按鈕,如下圖所示:
- 點擊确認後,再指定“用途”後,如下所示:
根據JSON生(shēng)成字段
選中目标變量後,右鍵行(xíng)“根據JSON生(shēng)成字段”彈出如下窗口:
- 輸入合格的JSON數(shù)據
{
"name":"張三",
"sex":"男",
"age":"30"
}
- 點擊下一步,進入“對象樹(shù)”窗口
- 點擊下一步,進入“字段列表”窗口
- 點擊【确認】按鈕後,回到如下窗口,然後按需調整“标題”、“數(shù)據類型”、“用途”、“默認值”的單元格內(nèi)容
說明(míng):在實際生(shēng)産中,可(kě)能某些(xiē)用戶會(huì)存在根據‘一個(gè)json數(shù)據’快速生(shēng)成變量的需求,那(nà)麽此時(shí)“JSON生(shēng)成字段”的功能特征就能用上(shàng)。
excel導入
變量字段默認值
字段默認值,默認為(wèi)空(kōng)。如果字段設置默認值,當調用規則時(shí),用到當前字段,發現為(wèi)空(kōng)時(shí)将會(huì)使用默認值。
這樣就省去了以前需要判斷字段是否有(yǒu)值的條件判斷。如不需要默認值,保持原樣不設置默認值即可(kě)。
默認值功能在調用規則傳入變量、變量類型的參數(shù) 、規則中動态生(shēng)成實例時(shí),均有(yǒu)效。
但(dàn)如果用Java API調用規則,參數(shù)是變量類型,傳入前需要調用 Utils.assignVariableObjectDefaultValue(參數(shù),session);
再觸發執行(xíng)規則。
參考如下代碼:
//從Spring中獲取KnowledgeService接口實例
KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
//通(tōng)過KnowledgeService接口獲取指定的知識包ID"213"
KnowledgePackage knowledgePackage=service.getKnowledge("213");
//通(tōng)過取到的KnowledgePackage對象創建KnowledgeSession對象
KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);
GeneralEntity employee=new GeneralEntity("rete.test.Employee");
employee.put("id","0001");
employee.put("name","馬克");
employee.put("salary",111000);
//根據變量庫設置的默認值設置變量實例
Utils.assignVariableObjectDefaultValue(employee,session);
Map<String,Object> parameter=new HashMap<String,Object>();
parameter.put("currentEmployee", employee);
//開(kāi)始規則流并設置參數(shù)
session.startProcess("flow-test",parameter);
改變表格行(xíng)顯示順序
在上(shàng)圖中,通(tōng)過右鍵表格數(shù)據行(xíng)的【上(shàng)移】【下移】項,來(lái)改變顯示的先後順序,有(yǒu)将常用的字段順序放在前面,有(yǒu)利于規則設計(jì)人(rén)員在規則文件設計(jì)畫(huà)面中快速選擇,以提升工效。