9.3 保险产品准入规则

全套代码及资料全部完整提供,点此处下载

9.3.1 决策表

前面我们编写的规则文件都是drl形式的文件,Drools除了支持drl形式的文件外还支持xls格式的文件(即Excel文件)。这种xls格式的文件通常称为决策表(decision table)。

决策表(decision table)是一个“精确而紧凑的”表示条件逻辑的方式,非常适合商业级别的规则。决策表与现有的drl文件可以无缝替换。Drools提供了相应的API可以将xls文件编译为drl格式的字符串。

一个决策表的例子如下:

决策表语法:

关键字 说明 是否必须
RuleSet 相当于drl文件中的package 必须,只能有一个。如果没有设置RuleSet对应的值则使用默认值rule_table
Sequential 取值为Boolean类型。true表示规则按照表格自上到下的顺序执行,false表示乱序 可选
Import 相当于drl文件中的import,如果引入多个类则类之间用逗号分隔 可选
Variables 相当于drl文件中的global,用于定义全局变量,如果有多个全局变量则中间用逗号分隔 可选
RuleTable 它指示了后面将会有一批rule,RuleTable的名称将会作为以后生成rule的前缀 必须
CONDITION 规则条件关键字,相当于drl文件中的when。下面两行则表示 LHS 部分,第三行则为注释行,不计为规则部分,从第四行开始,每一行表示一条规则 每个规则表至少有一个
ACTION 规则结果关键字,相当于drl文件中的then 每个规则表至少有一个
NO-LOOP 相当于drl文件中的no-loop 可选
AGENDA-GROUP 相当于drl文件中的agenda-group 可选

在决策表中还经常使用到占位符,语法为$后面加数字,用于替换每条规则中设置的具体值。

上面的决策表例子转换为drl格式的规则文件内容如下:

  1. package rules;
  2. import com.itheima.drools.entity.PersonInfoEntity;
  3. import java.util.List;
  4. global java.util.List listRules;
  5. rule "personCheck_10"
  6. salience 65535
  7. agenda-group "sign"
  8. when
  9. $person : PersonInfoEntity(sex != "男")
  10. then
  11. listRules.add("性别不对");
  12. end
  13. rule "personCheck_11"
  14. salience 65534
  15. agenda-group "sign"
  16. when
  17. $person : PersonInfoEntity(age < 22 || age > 25)
  18. then
  19. listRules.add("年龄不合适");
  20. end
  21. rule "personCheck_12"
  22. salience 65533
  23. agenda-group "sign"
  24. when
  25. $person : PersonInfoEntity(salary < 10000)
  26. then
  27. listRules.add("工资太低了");
  28. end

要进行决策表相关操作,需要导入如下maven坐标:

  1. <dependency>
  2. <groupId>org.drools</groupId>
  3. <artifactId>drools-decisiontables</artifactId>
  4. <version>7.10.0.Final</version>
  5. </dependency>

通过下图可以发现,由于maven的依赖传递特性在导入drools-decisiontables坐标后,drools-core和drools-compiler等坐标也被传递了过来

Drools提供的将xls文件编译为drl格式字符串的API如下:

  1. String realPath = "C:\\testRule.xls";//指定决策表xls文件的磁盘路径
  2. File file = new File(realPath);
  3. InputStream is = new FileInputStream(file);
  4. SpreadsheetCompiler compiler = new SpreadsheetCompiler();
  5. String drl = compiler.compile(is, InputType.XLS);

Drools还提供了基于drl格式字符串创建KieSession的API:

  1. KieHelper kieHelper = new KieHelper();
  2. kieHelper.addContent(drl, ResourceType.DRL);
  3. KieSession session = kieHelper.build().newKieSession();

基于决策表的入门案例:

第一步:创建maven工程drools_decisiontable_demo并配置pom.xml文件

  1. <dependency>
  2. <groupId>org.drools</groupId>
  3. <artifactId>drools-decisiontables</artifactId>
  4. <version>7.10.0.Final</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>junit</groupId>
  8. <artifactId>junit</artifactId>
  9. <version>4.12</version>
  10. </dependency>

第二步:创建实体类PersonInfoEntity

  1. package com.itheima.drools.entity;
  2. public class PersonInfoEntity {
  3. private String sex;
  4. private int age;
  5. private double salary;
  6. public String getSex() {
  7. return sex;
  8. }
  9. public void setSex(String sex) {
  10. this.sex = sex;
  11. }
  12. public int getAge() {
  13. return age;
  14. }
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. public double getSalary() {
  19. return salary;
  20. }
  21. public void setSalary(double salary) {
  22. this.salary = salary;
  23. }
  24. }

第三步:创建xls规则文件(可以直接使用资料中提供的testRule.xls文件)

第四步:创建单元测试

  1. @Test
  2. public void test1() throws Exception{
  3. String realPath = "d:\\testRule.xls";//指定决策表xls文件的磁盘路径
  4. File file = new File(realPath);
  5. InputStream is = new FileInputStream(file);
  6. SpreadsheetCompiler compiler = new SpreadsheetCompiler();
  7. String drl = compiler.compile(is, InputType.XLS);
  8. System.out.println(drl);
  9. KieHelper kieHelper = new KieHelper();
  10. kieHelper.addContent(drl, ResourceType.DRL);
  11. KieSession session = kieHelper.build().newKieSession();
  12. PersonInfoEntity personInfoEntity = new PersonInfoEntity();
  13. personInfoEntity.setSex("男");
  14. personInfoEntity.setAge(35);
  15. personInfoEntity.setSalary(1000);
  16. List<String> list = new ArrayList<String>();
  17. session.setGlobal("listRules",list);
  18. session.insert(personInfoEntity);
  19. session.getAgenda().getAgendaGroup("sign").setFocus();
  20. session.fireAllRules();
  21. for (String s : list) {
  22. System.out.println(s);
  23. }
  24. session.dispose();
  25. }

9.3.2 规则介绍

各保险公司针对人身、财产推出了不同的保险产品,作为商业保险公司,筛选出符合公司利益最大化的客户是非常重要的,即各保险产品的准入人群是不同的,也就是说保险公司会针对不同的人群特征,制定不同的产品缴费和赔付规则。

我们来看一下某保险产品准入规则的简化版,当不满足以下规则时,系统模块需要返回准入失败标识和失败原因

  1. 规则1 保险公司是:PICC
  2. 规则2 销售区域是:北京、天津
  3. 规则3 投保人年龄:0 ~ 17
  4. 规则4 保险期间是:20年、25年、30
  5. 规则5 缴费方式是:趸交(一次性交清)或年交
  6. 规则6 保险期与交费期规则一:保险期间为20年期交费期间最长10年交且不能选择[趸交]
  7. 规则7 保险期与交费期规则二:保险期间为25年期交费期间最长15年交且不能选择[趸交]
  8. 规则8 保险期与交费期规则三:保险期间为30年期交费期间最长20年交且不能选择[趸交]
  9. 规则9 被保人要求:(投保年龄+保险期间)不得大于40周岁
  10. 规则10 保险金额规则:投保时约定,最低为5万元,超过部分必须为1000元的整数倍
  11. 规则11 出单基本保额限额规则:线上出单基本保额限额62.5万元,超62.5万元需配合契调转线下出单

在本案例中规则文件是一个Excel文件,业务人员可以直接更改这个文件中指标的值,系统不需要做任何变更。

9.3.3 实现步骤

本案例还是基于Spring Boot整合Drools的架构来实现。

第一步:创建maven工程insuranceInfoCheck并配置pom.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <parent>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starters</artifactId>
  10. <version>2.0.6.RELEASE</version>
  11. </parent>
  12. <groupId>com.itheima</groupId>
  13. <artifactId>insuranceInfoCheck</artifactId>
  14. <version>1.0-SNAPSHOT</version>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-aop</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>commons-lang</groupId>
  30. <artifactId>commons-lang</artifactId>
  31. <version>2.6</version>
  32. </dependency>
  33. <!--drools规则引擎-->
  34. <dependency>
  35. <groupId>org.drools</groupId>
  36. <artifactId>drools-core</artifactId>
  37. <version>7.6.0.Final</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.drools</groupId>
  41. <artifactId>drools-compiler</artifactId>
  42. <version>7.6.0.Final</version>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.drools</groupId>
  46. <artifactId>drools-templates</artifactId>
  47. <version>7.6.0.Final</version>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.kie</groupId>
  51. <artifactId>kie-api</artifactId>
  52. <version>7.6.0.Final</version>
  53. </dependency>
  54. <dependency>
  55. <groupId>org.kie</groupId>
  56. <artifactId>kie-spring</artifactId>
  57. <exclusions>
  58. <exclusion>
  59. <groupId>org.springframework</groupId>
  60. <artifactId>spring-tx</artifactId>
  61. </exclusion>
  62. <exclusion>
  63. <groupId>org.springframework</groupId>
  64. <artifactId>spring-beans</artifactId>
  65. </exclusion>
  66. <exclusion>
  67. <groupId>org.springframework</groupId>
  68. <artifactId>spring-core</artifactId>
  69. </exclusion>
  70. <exclusion>
  71. <groupId>org.springframework</groupId>
  72. <artifactId>spring-context</artifactId>
  73. </exclusion>
  74. </exclusions>
  75. <version>7.6.0.Final</version>
  76. </dependency>
  77. </dependencies>
  78. <build>
  79. <finalName>${project.artifactId}</finalName>
  80. <resources>
  81. <resource>
  82. <directory>src/main/java</directory>
  83. <includes>
  84. <include>**/*.xml</include>
  85. </includes>
  86. <filtering>false</filtering>
  87. </resource>
  88. <resource>
  89. <directory>src/main/resources</directory>
  90. <includes>
  91. <include>**/*.*</include>
  92. </includes>
  93. <filtering>false</filtering>
  94. </resource>
  95. </resources>
  96. <plugins>
  97. <plugin>
  98. <groupId>org.apache.maven.plugins</groupId>
  99. <artifactId>maven-compiler-plugin</artifactId>
  100. <version>2.3.2</version>
  101. <configuration>
  102. <source>1.8</source>
  103. <target>1.8</target>
  104. </configuration>
  105. </plugin>
  106. </plugins>
  107. </build>
  108. </project>

第二步:创建/resources/application.yml文件

  1. server:
  2. port: 8080
  3. spring:
  4. application:
  5. name: insuranceInfoCheck

第三步:创建实体类InsuranceInfo

  1. package com.itheima.drools.entity;
  2. /**
  3. * 保险信息
  4. */
  5. public class InsuranceInfo {
  6. private String param1;//保险公司
  7. private String param2;//方案代码
  8. private String param3;//渠道号
  9. private String param4;//销售区域
  10. private String param5;//投保年龄
  11. private String param6;//保险期间
  12. private String param7;//缴费期间
  13. private String param8;//缴费方式
  14. private String param9;//保障类型
  15. private String param10;//等待期
  16. private String param11;//犹豫期
  17. private String param12;//职业类型
  18. private String param13;//保额限制
  19. private String param14;//免赔额
  20. private String param15;//主险保额
  21. private String param16;//主险保费
  22. private String param17;//附加险保额
  23. private String param18;//附加险保费
  24. private String param19;//与投保人关系
  25. private String param20;//与被保人关系
  26. private String param21;//性别
  27. private String param22;//证件
  28. private String param23;//保费
  29. private String param24;//保额
  30. //getter setter省略
  31. }

第四步:创建决策表文件(也可以直接使用实战资料中提供的insuranceInfoCheck.xls文件)

第五步:封装工具类KieSessionUtils

  1. package com.itheima.drools.utils;
  2. import com.itheima.drools.entity.InsuranceInfo;
  3. import com.itheima.drools.entity.PersonInfoEntity;
  4. import org.drools.decisiontable.InputType;
  5. import org.drools.decisiontable.SpreadsheetCompiler;
  6. import org.kie.api.builder.Message;
  7. import org.kie.api.builder.Results;
  8. import org.kie.api.io.ResourceType;
  9. import org.kie.api.runtime.KieSession;
  10. import org.kie.internal.utils.KieHelper;
  11. import java.io.File;
  12. import java.io.FileInputStream;
  13. import java.io.FileNotFoundException;
  14. import java.io.InputStream;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. public class KieSessionUtils {
  18. private KieSessionUtils() {
  19. }
  20. // 把xls文件解析为String
  21. public static String getDRL (String realPath) throws FileNotFoundException {
  22. File file = new File(realPath); // 例如:C:\\abc.xls
  23. InputStream is = new FileInputStream(file);
  24. SpreadsheetCompiler compiler = new SpreadsheetCompiler();
  25. String drl = compiler.compile(is, InputType.XLS);
  26. System.out.println(drl);
  27. return drl;
  28. }
  29. // drl为含有内容的字符串
  30. public static KieSession createKieSessionFromDRL(String drl) throws Exception{
  31. KieHelper kieHelper = new KieHelper();
  32. kieHelper.addContent(drl, ResourceType.DRL);
  33. Results results = kieHelper.verify();
  34. if (results.hasMessages(Message.Level.WARNING, Message.Level.ERROR)) {
  35. List<Message> messages = results.getMessages(Message.Level.WARNING, Message.Level.ERROR);
  36. for (Message message : messages) {
  37. System.out.println("Error: "+message.getText());
  38. }
  39. // throw new IllegalStateException("Compilation errors were found. Check the logs.");
  40. }
  41. return kieHelper.build().newKieSession();
  42. }
  43. // realPath为Excel文件绝对路径
  44. public static KieSession getKieSessionFromXLS(String realPath) throws Exception {
  45. return createKieSessionFromDRL(getDRL(realPath));
  46. }
  47. }

第六步:创建RuleService类

  1. package com.itheima.drools.service;
  2. import com.itheima.drools.entity.InsuranceInfo;
  3. import com.itheima.drools.utils.KieSessionUtils;
  4. import org.kie.api.runtime.KieSession;
  5. import org.springframework.stereotype.Service;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. @Service
  9. public class RuleService {
  10. public List<String> insuranceInfoCheck(InsuranceInfo insuranceInfo) throws Exception{
  11. KieSession session = KieSessionUtils.getKieSessionFromXLS("D:\\rules.xls");
  12. session.getAgenda().getAgendaGroup("sign").setFocus();
  13. session.insert(insuranceInfo);
  14. List<String> listRules = new ArrayList<>();
  15. session.setGlobal("listRules", listRules);
  16. session.fireAllRules();
  17. return listRules;
  18. }
  19. }

第七步:创建RuleController类

  1. package com.itheima.drools.controller;
  2. import com.itheima.drools.entity.InsuranceInfo;
  3. import com.itheima.drools.service.RuleService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. @RestController
  11. @RequestMapping("/rule")
  12. public class RuleController {
  13. @Autowired
  14. private RuleService ruleService;
  15. @RequestMapping("/insuranceInfoCheck")
  16. public Map insuranceInfoCheck(){
  17. Map map = new HashMap();
  18. //模拟数据,实际应为页面传递过来
  19. InsuranceInfo insuranceInfo = new InsuranceInfo();
  20. insuranceInfo.setParam1("picc");
  21. insuranceInfo.setParam4("上海");
  22. insuranceInfo.setParam5("101");
  23. insuranceInfo.setParam6("12");
  24. insuranceInfo.setParam7("222");
  25. insuranceInfo.setParam8("1");
  26. insuranceInfo.setParam13("3");
  27. try {
  28. List<String> list = ruleService.insuranceInfoCheck(insuranceInfo);
  29. if(list != null && list.size() > 0){
  30. map.put("checkResult",false);
  31. map.put("msg","准入失败");
  32. map.put("detail",list);
  33. }else{
  34. map.put("checkResult",true);
  35. map.put("msg","准入成功");
  36. }
  37. return map;
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. map.put("checkResult",false);
  41. map.put("msg","未知错误");
  42. return map;
  43. }
  44. }
  45. }

第八步:创建启动类DroolsApplication

  1. package com.itheima.drools;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class DroolsApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(DroolsApplication.class);
  8. }
  9. }

全套代码及资料全部完整提供,点此处下载

第2-4-10章 规则引擎Drools实战(3)-保险产品准入规则的更多相关文章

  1. JAVA规则引擎 -- Drools

    Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...

  2. [Drools]JAVA规则引擎 -- Drools

    Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...

  3. drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)

    最近研究了一下规则引擎drools. 这篇博客带你搭建并运行一个可在线编辑,在线打包,远程执行的规则引擎(drools) 本篇博客同时参考https://blog.csdn.net/chinrui/a ...

  4. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象

    转载:https://blog.csdn.net/wo541075754/article/details/74943236 3.2.1 什么是KIE KIE(Knowledge Is Everythi ...

  5. 开源规则引擎 drools

    java语言开发的开源业务规则引擎 DROOLS(JBOSS RULES )具有一个易于访问企业策略.易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快.效率高.业务分析师或审核人员可以利用 ...

  6. 规则引擎drools封装

    一.前言 网上规则引擎drools介绍很多,并且有很多细致的说明,作者也不敢托大说自己的好用,但作者经过2个项目使用过规则引擎后,自己对规则引擎的理解并进行封装,对规则内容及如何使用,有自己的一番实践 ...

  7. 开源规则引擎 Drools 学习笔记 之 -- 1 cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule

    直接进入正题 我们在使用开源规则引擎 Drools 的时候, 启动的时候可能会抛出如下异常: Caused by: java.lang.ClassCastException: cn.com.cheng ...

  8. [Drools]JAVA规则引擎 -- Drools 2

    上一篇文章 http://blog.csdn.net/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的 ...

  9. 使用规则引擎Drools计算圆周率PI

    实际上是使用规则引擎能够更新工作内存区重新匹配规则实现迭代功能. 使用了策略模式实现. <规则引擎与RETE算法介绍> PPT : http://files.cnblogs.com/lov ...

  10. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective

    转载至:https://blog.csdn.net/wo541075754/article/details/75511887 activation-group 该属性将若干个规则划分成一个组,统一命名 ...

随机推荐

  1. G&GH05 删除文件和.gitignore

    注意事项与声明 平台: Windows 10 作者: JamesNULLiu 邮箱: jamesnulliu@outlook.com 博客: https://www.cnblogs.com/james ...

  2. MinIO分布式集群部署方式

    文章转载自:https://blog.51cto.com/u_10950710/4843738 关于分布式集群MinIo 单机Minio服务存在单点故障,如果是一个有N块硬盘的分布式Minio,只要有 ...

  3. kvm安装windows使用virtio驱动

    Windows安装VirtIO驱动的两种方法 已经使用IDE方式来安装好系统 (1)安装完Windows后,创建一块临时的硬盘和网卡,将其驱动都设置为virtio模式添加到Windows中 (2) 添 ...

  4. 9. Fluentd部署:日志

    Fluentd是用来处理其他系统产生的日志的,它本身也会产生一些运行时日志.Fluentd包含两个日志层:全局日志和插件级日志.每个层次的日志都可以进行单独配置. 日志级别 Fluentd的日志包含6 ...

  5. 5_SpringMVC

    一. 什么是MVC框架 MVC全名是Model View Controller, 是模型(model), 视图(view), 控制器(controller)的缩写, 一种软件设计典范, 用一种业务逻辑 ...

  6. SECS半导体设备通讯-4 GEM通信标准

    一 概述 GEM标准定义了通信链路上的半导体设备的行为. SECS-II标准定义了在主机和设备之间交换的消息和相关数据项.GEM标准则定义了在哪种情况下应该使用哪些SECS-II消息以及由此产生的结果 ...

  7. img通过修改css等比例缩小图片

    css中加上:object-fit:cover 例子: img{ width: 200px; height: 400px; object-fit: cover; }

  8. C++面向对象编程之虚函数与多态和继承和复合下的构造和析构

    1.对于非虚函数,是不希望派生类对该函数重新定义: 对于virtual函数,在父类已经有默认定义后,并希望子类重新定义它: 对于pure virtual函数,父类没有默认定义,派生类必须要重新定义它: ...

  9. 洛谷P1036 [NOIP2002 普及组] 选数 (搜索)

    n个数中选取k个数,判断这k个数的和是否为质数. 在dfs函数中的状态有:选了几个数,选的数的和,上一个选的数的位置: 试除法判断素数即可: 1 #include<bits/stdc++.h&g ...

  10. Docker Private Registry

    Docker Private Registry 目录 Docker Private Registry Docker Registry Docker Private Registry 使用docker- ...