一、简介
在URULE规则引擎当中,评分卡和决策集都是互通的,评分卡分为属性,条件和分值,一般需要对实体进行综合评分,可以使用评分卡或复杂评分卡来实现;
二、创建评分卡
打开规则项目,在评分卡节点上点击右键,在弹出的菜单中选择添加评分卡项,就可以创建一个普通评分卡,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/6d45d2f9017bf0fa12e8e2a4b50601b7.png)
在普通评分卡编辑器中,最上部是工具栏,通过这个工具栏导入需要的库文件,这一点与其它的决策集编辑器基本一致;工具栏下面评分卡属性部分;接下来是评分卡配置的表格;最后是评分卡的得分计算方式及分值最终赋给哪个对象。
评分卡属性有三块,第一块是配置当前评分卡表格是否支持权重(默认是不支持);第二块是给当前评分卡命名;第三块是具体属性项目,与决策树、决策表一样,具体属性项有五个,含义与决策树、决策表完全相同。
三、编辑评分卡规则
与决策集、决策表一样,评分卡定义时同样需要导入相关的库文件,在评分卡配置表格中,属性列对应的目标对象就要求我们选择一个变量对象,然后才可以通过工具栏上通过“添加属性行”按钮添加的属性行定义具体的属性。为演示这一操作,我们导入之前定义的包含“团队成员”变量库文件,导入后就可以为评分卡第一列属性列选择目标对象了,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/c7b4ddb74536983da6e6ae9255d4dd5d.png)
这里我们选择团队成员,接下来点击工具栏上添加属性行按钮添加的属性行,在属性行的第一列中,我们可以点击选择具体的属性,可以看到这里的属性菜单内容来自属性列头中选择的目标对象,如果我们更改了目标对象,那么每个属性行中属性菜单内容也会做相应的变化,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/2af7fc15e33c8f9c9025409693837069.png)
在每个属性行中,除了可以选择目标属性外,还可以在单元格里点击右键,在弹出的菜单里选择“添加条件行”项,为当前属性拆分出更多的条件行,如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/104634e18765a7f2b33b23c1d3915884.png)
在条件列中,每个单元格都可以在其中点击右键,通过弹出的右键菜单配置具体的单元格条件,可以看到其条件配置窗口与决策表中条件配置窗口完全相同,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/ee7ba9b94c69f7fdc5452190195ef11b.png)
依次配置好各个条件行单元格,效果如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/9d978e2905bf8583c5d347294fe47ad5.png)
在URule Pro当中,评分卡还允许添加自定义列,通过点击工具栏上的“添加自定义列”就可以为当前评分卡添加一个自定义列,自定义列中每个单元格都可以进行值定义,在运行时,引擎会自动计算这些单元格的值。一般情况下,添加自定义列的作用有两种:一种是对当前行进行备注,起到一个注释的作用;还有一种就是在“得分计算方式”中选择“自定义”时,在自定义类中通过代码可以获取到每行的自定义列信息,从而做进一步的加工处理。
到这里,一个标准的评分卡表格就配置完了,接下来看看评分卡的得分计算方式,在URule Pro当中,对于得分计算方式提供了三种类型,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/07e281a1487a42a9c365bb1a590986fa.png)
第一种也就是默认的是“求和”,所谓求和就是对在运行时所有满足条件的条件行对应的分值列的值内容进行累加求和;第二种类型是“加权求和”,如果选择加权求和,那么需要我们将评分卡表格上部的“权重”属性设置为“支持”,这样可以看到所有的属性行中多出一个名为权重的编辑框,我们在这个编辑框中输入具体的权重值,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/fdc37c910d826d34995b6b267d91032a.png)
一般情况下,每个属性单元格是的权重属性值是一个小数,所有的权重值加起应该是1。
这样在将得分计算方式改为“加权求和”后,引擎将在运行时取到每个满足条件的条件行的分值,将这个分值与当前行对应的权重值做乘法计算,最后将所有乘法计算后的结果相加作为当前评分卡的最终得分。
得分计算的最后一种方式是“自定义”,一旦选择这种方式,那么我们需要指定自定义计算得分的Bean的ID,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/f32d45c69ebe9a5a5b91b319114a02f2.png)
自定义计算需要实现ScoringStrategy接口,把实现类配置到spring上下文中,使其成为一个标准的spring bean,将bean的ID输入到上面的自定义Bean的ID的编辑框中即可。代码如下:
@Component("testScoringStrategy")
public class TestScoringStrategy implements ScoringStrategy {
@Override
public Object calculate(Scorecard scorecard, Context context) {
System.out.println("评分卡名:"+scorecard.getName());
//这里的bigdecimal为什么定义为数组,可以去看streamAPI
//也可以直接new一个Bigdecimal 下面用for循环就可以
final BigDecimal[] result = {new BigDecimal(0)};
BigDecimal res=null;
scorecard.getRowItems().stream().forEach((rowItem->{
result[0] = result[0].add(Utils.toBigDecimal(rowItem.getScore()));
if (Optional.ofNullable(rowItem.getCellItems()).isPresent()) {
rowItem.getCellItems().forEach(cellItem ->
System.out.println("自定义列" + cellItem.getColName() + ":" + cellItem.getValue()));
}
}));
return result[0];
}
}
这里的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();
}
配置完得分计算方式后,我们还需要配置计算好的得分该赋给谁,这里默认是不赋给任何对象,这样计算后分值只会存留在引擎中,会在控制台以一条警告信息的形式打印出来。
一般情况下,计算好的得分, 我们需要将它放到一个变量或参数当中,我们在代码中就可以得到这个评分值,从而做进一步处理。点击“不赋值”,在弹出的菜单中选择要赋值的目标对象,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/b0c828c82b5d74a4eee7ca82d49a96eb.png)
可以看到,这里能赋值的对象只有变量和参数,通常情况下,我们会选择将评分值赋给一个参数,从而在业务代码中从参数中取到这个分值再做其它处理。当然如果选择变量那么就需要导入相应的变量库文件,选择参数就要导入相应的参数库文件。
四、测试评分卡规则
这里我们选择的是自定义方法测试
![](https://i-blog.csdnimg.cn/blog_migrate/7b93cef2c970ed94eeda3191c980639e.png)
可以看到测试结果正确,证明我们自定义的实现类方法可以用。
五、从Excel中导入
以上我们介绍的是在urule页面中编辑普通评分卡规则以及在项目中自定义实现评分卡的计算规则,下面介绍一下从EXCEL中导入规则
URule Pro中的评分卡支持从Excel中导入,我们只需要按要求在Excel中定义好具体的评分卡内容,然后就可以直接将这个Excel导入到一个复杂评分卡当中。下图是一个定义好的可以导入到复杂评分卡的Excel截图
![](https://i-blog.csdnimg.cn/blog_migrate/285b520218c14de9578b0e3adc05d291.png)
可以看到,在这个Excel当中,第一行用于定义对象及对象下用于定义条件的属性,比如上图中的“团队成员”以及其下的“利润”、“项目奖金”,这个对象及其下属性要求我们必须预先在当前项目的某一个变量库文件里定义好,否则导入该Excel时会产生错误;第二列用于定义具体属性对应的条件,其列头为“条件”是固定不变的,这样导入引擎就可以将该列作为条件列处理;最后一列的列头名为“分值”,这里的“分值”也是固定的,不能更改,这样导入的时候引擎就会认为该列是用于评分的列。
导入Excel到urule界面时,如下图
![](https://i-blog.csdnimg.cn/blog_migrate/d4bd712d9f0dd2229196bc8299540c2c.png)
测试urule评分卡规则
![](https://i-blog.csdnimg.cn/blog_migrate/65550c63f4985de7c8e591f13d05cfed.png)
总结:
如果需要用于实体进行综合评分,则使用评分卡或复杂评分卡来实现,总的来说,在决策集,决策表,决策树,评分卡规则时互通的,在某些情况下用某一个更简洁,所以灵活使用urule规则引擎可以省时省力的完成业务。