普通評分(fēn)卡
打開規則項目,在評分(fēn)卡節點上點擊右鍵,在彈出的菜單中(zhōng)選擇添加評分(fēn)卡項,就可(kě)以創建一個普通評分(fēn)卡,如下图所示:
在普通評分(fēn)卡編輯器中(zhōng),最上部是工(gōng)具(jù)欄,通過這個工(gōng)具(jù)欄導入需要的庫文(wén)件,這一點與其它的決策集編輯器基本一緻;工(gōng)具(jù)欄下面評分(fēn)卡屬性部分(fēn);接下來是評分(fēn)卡配置的表格;最後是評分(fēn)卡的得分(fēn)計算方式及分(fēn)值最終賦給哪個對象。
評分(fēn)卡屬性有(yǒu)三塊,第一塊是配置當前評分(fēn)卡表格是否支持權重(默認是不支持);第二塊是給當前評分(fēn)卡命名(míng);第三塊是具(jù)體(tǐ)屬性項目,與決策樹、決策表一樣,具(jù)體(tǐ)屬性項有(yǒu)四個,含義與決策樹、決策表完全相同。
與決策集、決策表一樣,評分(fēn)卡定義時同樣需要導入相關的庫文(wén)件,在評分(fēn)卡配置表格中(zhōng),屬性列對應的目标對象就要求我們選擇一個變量對象,然後才可(kě)以通過工(gōng)具(jù)欄上通過“添加屬性行”按鈕添加的屬性行定義具(jù)體(tǐ)的屬性。為(wèi)演示這一操作(zuò),我們導入之前定義的包含“會員”變量庫文(wén)件,導入後就可(kě)以為(wèi)評分(fēn)卡第一列屬性列選擇目标對象了,如下图所示:
這裏我們選擇會員,接下來點擊工(gōng)具(jù)欄上添加屬性行按鈕添加的屬性行,在屬性行的第一列中(zhōng),我們可(kě)以點擊選擇具(jù)體(tǐ)的屬性,可(kě)以看到這裏的屬性菜單内容來自屬性列頭中(zhōng)選擇的目标對象,如果我們更改了目标對象,那麽每個屬性行中(zhōng)屬性菜單内容也會做相應的變化,如下图所示:
在每個屬性行中(zhōng),除了可(kě)以選擇目标屬性外,還可(kě)以在單元格裏點擊右鍵,在彈出的菜單裏選擇“添加條件行”項,為(wèi)當前屬性拆分(fēn)出更多(duō)的條件行,如下图所示:
在條件列中(zhōng),每個單元格都可(kě)以在其中(zhōng)點擊右鍵,通過彈出的右鍵菜單配置具(jù)體(tǐ)的單元格條件,可(kě)以看到其條件配置窗口與決策表中(zhōng)條件配置窗口完全相同,如下图:
在URule Pro當中(zhōng),評分(fēn)卡還允許添加自定義列,通過點擊工(gōng)具(jù)欄上的“添加自定義列”就可(kě)以為(wèi)當前評分(fēn)卡添加一個自定義列,自定義列中(zhōng)每個單元格都可(kě)以進行值定義,在運行時,引擎會自動計算這些單元格的值。一般情況下,添加自定義列的作(zuò)用(yòng)有(yǒu)兩種:一種是對當前行進行備注,起到一個注釋的作(zuò)用(yòng);還有(yǒu)一種就是在“得分(fēn)計算方式”中(zhōng)選擇“自定義”時,在自定義類中(zhōng)通過代碼可(kě)以獲取到每行的自定義列信息,從而做進一步的加工(gōng)處理(lǐ)。
到這裏,一個标準的評分(fēn)卡表格就配置完了,接下來看看評分(fēn)卡的得分(fēn)計算方式,在URule Pro當中(zhōng),對于得分(fēn)計算方式提供了三種類型,如下图:
第一種也就是默認的是“求和”,所謂求和就是對在運行時所有(yǒu)滿足條件的條件行對應的分(fēn)值列的值内容進行累加求和;第二種類型是“加權求和”,如果選擇加權求和,那麽需要我們将評分(fēn)卡表格上部的“權重”屬性設置為(wèi)“支持”,這樣可(kě)以看到所有(yǒu)的屬性行中(zhōng)多(duō)出一個名(míng)為(wèi)權重的編輯框,我們在這個編輯框中(zhōng)輸入具(jù)體(tǐ)的權重值,如下图:
一般情況下,每個屬性單元格是的權重屬性值是一個小(xiǎo)數,所有(yǒu)的權重值加起應該是1。
這樣在将得分(fēn)計算方式改為(wèi)“加權求和”後,引擎将在運行時取到每個滿足條件的條件行的分(fēn)值,将這個分(fēn)值與當前行對應的權重值做乘法計算,最後将所有(yǒu)乘法計算後的結果相加作(zuò)為(wèi)當前評分(fēn)卡的最終得分(fēn)。
得分(fēn)計算的最後一種方式是“自定義”,一旦選擇這種方式,那麽我們需要指定自定義計算得分(fēn)的Bean的ID,如下图:
這裏的Bean要求實現URule Pro中(zhōng)提供的com.bstek.urule.model.scorecard.runtime.ScoringStrategy接口,其源碼如下:
package com.bstek.urule.model.scorecard.runtime;
import com.bstek.urule.runtime.rete.Context;
/**
* @author Jacky.gao
*/
public interface ScoringStrategy {
/**
* 計算得分(fēn)方法
* @param scorecard 當前評分(fēn)卡對象
* @param context 運行時上下文(wén)對象
* @return 返回最終的得分(fēn)值
*/
Object calculate(Scorecard scorecard,Context context);
}
其中(zhōng)用(yòng)到的Scorecard源碼如下:
package com.bstek.urule.model.scorecard.runtime;
import java.util.List;
/**
* @author Jacky.gao
*/
public interface Scorecard {
/**
* @return 評分(fēn)卡名(míng)稱
*/
String getName();
/**
* @return 評分(fēn)卡表格的所有(yǒu)的行信息
*/
List<RowItem> getRowItems();
}
将實現了ScoringStrategy接口的類配置到spring上下文(wén)中(zhōng),使其成為(wèi)一個标準的spring bean,将bean的ID輸入到上面的自定義Bean的ID的編輯框中(zhōng)即可(kě)。下面是一個實現了ScoringStrategy接口的類示例源碼:
package com.bstek.urule;
import java.math.BigDecimal;
import com.bstek.urule.model.scorecard.runtime.CellItem;
import com.bstek.urule.model.scorecard.runtime.RowItem;
import com.bstek.urule.model.scorecard.runtime.Scorecard;
import com.bstek.urule.model.scorecard.runtime.ScoringStrategy;
import com.bstek.urule.runtime.rete.Context;
/**
* @author Jacky.gao
*/
public class TestScoringStrategy implements ScoringStrategy {
@Override
public Object calculate(Scorecard scorecard, Context context) {
BigDecimal result=new BigDecimal(120.12);
System.out.println("評分(fēn)卡名(míng):"+scorecard.getName());
for(RowItem row:scorecard.getRowItems()){
result=result.multiply(Utils.toBigDecimal(row.getScore()));
for(CellItem cellItem:row.getCellItems()){
System.out.println("自定義列"+cellItem.getColName()+":"+cellItem.getValue());
}
}
return result;
}
}
配置完得分(fēn)計算方式後,我們還需要配置計算好的得分(fēn)該賦給誰,這裏默認是不賦給任何對象,這樣計算後分(fēn)值隻會存留在引擎中(zhōng),會在控制台以一條警告信息的形式打印出來。
一般情況下,計算好的得分(fēn), 我們需要将它放到一個變量或參數當中(zhōng),我們在代碼中(zhōng)就可(kě)以得到這個評分(fēn)值,從而做進一步處理(lǐ)。點擊“不賦值”,在彈出的菜單中(zhōng)選擇要賦值的目标對象,如下图:
可(kě)以看到,這裏能(néng)賦值的對象隻有(yǒu)變量和參數,通常情況下,我們會選擇将評分(fēn)值賦給一個參數,從而在業務(wù)代碼中(zhōng)從參數中(zhōng)取到這個分(fēn)值再做其它處理(lǐ)。當然如果選擇變量那麽就需要導入相應的變量庫文(wén)件,選擇參數就要導入相應的參數庫文(wén)件。
到這裏,一個簡單的評分(fēn)卡就定義完成了,有(yǒu)興趣的可(kě)以在當前項目裏創建一個知識包,将這個評分(fēn)卡放到知識包裏,然後對其進行仿真測試,看看在給出一定條件後規則的評分(fēn)情況是怎麽樣,這裏就不再贅述。
這裏的介紹的評分(fēn)卡是URule Pro中(zhōng)提供的一種相對簡單的評分(fēn)卡,它隻能(néng)對一個對象的某些屬性進行評估計算,如果我們需要對多(duō)個對象的屬性進行條件疊加來計算得分(fēn)的話,那麽這裏的評分(fēn)卡功能(néng)就滿足不了了,所以URule Pro還提供了一種複雜評分(fēn)卡工(gōng)具(jù),功能(néng)類似于我們的決策表,用(yòng)于實現多(duō)對象多(duō)條件累加評分(fēn)計算,後一章節中(zhōng)就将對這種複雜評分(fēn)卡工(gōng)具(jù)進行介紹。
從Excel中(zhōng)導入
URule Pro中(zhōng)的評分(fēn)卡支持從Excel中(zhōng)導入,我們隻需要按要求在Excel中(zhōng)定義好具(jù)體(tǐ)的評分(fēn)卡内容,然後就可(kě)以直接将這個Excel導入到一個複雜評分(fēn)卡當中(zhōng)。下图是一個定義好的可(kě)以導入到複雜評分(fēn)卡的Excel截图, 點擊此處下載該Excel:
可(kě)以看到,在這個Excel當中(zhōng),第一行用(yòng)于定義對象及對象下用(yòng)于定義條件的屬性,比如上图中(zhōng)的“客戶”以及其下的“年齡”、“性别”、“婚否”,這個對象及其下屬性要求我們必須預先在當前項目的某一個變量庫文(wén)件裏定義好,否則導入該Excel時會産(chǎn)生錯誤;第二列用(yòng)于定義具(jù)體(tǐ)屬性對應的條件,其列頭為(wèi)“條件”是固定不變的,這樣導入引擎就可(kě)以将該列作(zuò)為(wèi)條件列處理(lǐ);最後一列的列頭名(míng)為(wèi)“分(fēn)值”,這裏的“分(fēn)值”也是固定的,不能(néng)更改,這樣導入的時候引擎就會認為(wèi)該列是用(yòng)于評分(fēn)的列。