普通评分卡
打开规则项目,在评分卡节点上点击右键,在弹出的菜单中选择添加评分卡项,就可以创建一个普通评分卡,如下图所示:
在普通评分卡编辑器中,最上部是工具栏,通过这个工具栏导入需要的库文件,这一点与其它的决策集编辑器基本一致;工具栏下面评分卡属性部分;接下来是评分卡配置的表格;最后是评分卡的得分计算方式及分值最终赋给哪个对象。
评分卡属性有三块,第一块是配置当前评分卡表格是否支持权重(默认是不支持);第二块是给当前评分卡命名;第三块是具体属性项目,与决策树、决策表一样,具体属性项有四个,含义与决策树、决策表完全相同。
与决策集、决策表一样,评分卡定义时同样需要导入相关的库文件,在评分卡配置表格中,属性列对应的目标对象就要求我们选择一个变量对象,然后才可以通过工具栏上通过“添加属性行”按钮添加的属性行定义具体的属性。为演示这一操作,我们导入之前定义的包含“会员”变量库文件,导入后就可以为评分卡第一列属性列选择目标对象了,如下图所示:
这里我们选择会员,接下来点击工具栏上添加属性行按钮添加的属性行,在属性行的第一列中,我们可以点击选择具体的属性,可以看到这里的属性菜单内容来自属性列头中选择的目标对象,如果我们更改了目标对象,那么每个属性行中属性菜单内容也会做相应的变化,如下图所示:
在每个属性行中,除了可以选择目标属性外,还可以在单元格里点击右键,在弹出的菜单里选择“添加条件行”项,为当前属性拆分出更多的条件行,如下图所示:
在条件列中,每个单元格都可以在其中点击右键,通过弹出的右键菜单配置具体的单元格条件,可以看到其条件配置窗口与决策表中条件配置窗口完全相同,如下图:
在URule Pro当中,评分卡还允许添加自定义列,通过点击工具栏上的“添加自定义列”就可以为当前评分卡添加一个自定义列,自定义列中每个单元格都可以进行值定义,在运行时,引擎会自动计算这些单元格的值。一般情况下,添加自定义列的作用有两种:一种是对当前行进行备注,起到一个注释的作用;还有一种就是在“得分计算方式”中选择“自定义”时,在自定义类中通过代码可以获取到每行的自定义列信息,从而做进一步的加工处理。
到这里,一个标准的评分卡表格就配置完了,接下来看看评分卡的得分计算方式,在URule Pro当中,对于得分计算方式提供了三种类型,如下图:
第一种也就是默认的是“求和”,所谓求和就是对在运行时所有满足条件的条件行对应的分值列的值内容进行累加求和;第二种类型是“加权求和”,如果选择加权求和,那么需要我们将评分卡表格上部的“权重”属性设置为“支持”,这样可以看到所有的属性行中多出一个名为权重的编辑框,我们在这个编辑框中输入具体的权重值,如下图:
一般情况下,每个属性单元格是的权重属性值是一个小数,所有的权重值加起应该是1。
这样在将得分计算方式改为“加权求和”后,引擎将在运行时取到每个满足条件的条件行的分值,将这个分值与当前行对应的权重值做乘法计算,最后将所有乘法计算后的结果相加作为当前评分卡的最终得分。
得分计算的最后一种方式是“自定义”,一旦选择这种方式,那么我们需要指定自定义计算得分的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 {
/**
* 计算得分方法
* @param scorecard 当前评分卡对象
* @param context 运行时上下文对象
* @return 返回最终的得分值
*/
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 评分卡表格的所有的行信息
*/
List<RowItem> getRowItems();
}
将实现了ScoringStrategy接口的类配置到spring上下文中,使其成为一个标准的spring bean,将bean的ID输入到上面的自定义Bean的ID的编辑框中即可。下面是一个实现了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;
}
}
配置完得分计算方式后,我们还需要配置计算好的得分该赋给谁,这里默认是不赋给任何对象,这样计算后分值只会存留在引擎中,会在控制台以一条警告信息的形式打印出来。
一般情况下,计算好的得分, 我们需要将它放到一个变量或参数当中,我们在代码中就可以得到这个评分值,从而做进一步处理。点击“不赋值”,在弹出的菜单中选择要赋值的目标对象,如下图:
可以看到,这里能赋值的对象只有变量和参数,通常情况下,我们会选择将评分值赋给一个参数,从而在业务代码中从参数中取到这个分值再做其它处理。当然如果选择变量那么就需要导入相应的变量库文件,选择参数就要导入相应的参数库文件。
到这里,一个简单的评分卡就定义完成了,有兴趣的可以在当前项目里创建一个知识包,将这个评分卡放到知识包里,然后对其进行仿真测试,看看在给出一定条件后规则的评分情况是怎么样,这里就不再赘述。
这里的介绍的评分卡是URule Pro中提供的一种相对简单的评分卡,它只能对一个对象的某些属性进行评估计算,如果我们需要对多个对象的属性进行条件叠加来计算得分的话,那么这里的评分卡功能就满足不了了,所以URule Pro还提供了一种复杂评分卡工具,功能类似于我们的决策表,用于实现多对象多条件累加评分计算,后一章节中就将对这种复杂评分卡工具进行介绍。
从Excel中导入
URule Pro中的评分卡支持从Excel中导入,我们只需要按要求在Excel中定义好具体的评分卡内容,然后就可以直接将这个Excel导入到一个复杂评分卡当中。下图是一个定义好的可以导入到复杂评分卡的Excel截图, 点击此处下载该Excel:
可以看到,在这个Excel当中,第一行用于定义对象及对象下用于定义条件的属性,比如上图中的“客户”以及其下的“年龄”、“性别”、“婚否”,这个对象及其下属性要求我们必须预先在当前项目的某一个变量库文件里定义好,否则导入该Excel时会产生错误;第二列用于定义具体属性对应的条件,其列头为“条件”是固定不变的,这样导入引擎就可以将该列作为条件列处理;最后一列的列头名为“分值”,这里的“分值”也是固定的,不能更改,这样导入的时候引擎就会认为该列是用于评分的列。