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