Drools实战-保险产品准入规则
1、规则介绍
各保险公司针对人身、财产推出了不同的保险产品,作为商业保险公司,筛选出符合公司利益最大化的客户是非常重要的,即各保险产品的准入人群是不同的,也就是说保险公司会针对不同的人群特征,制定不同的产品缴费和赔付规则。
下面保险产品准入规则的简化版,当不满足以下规则时,系统模块需要返回准入失败标识和失败原因
规则1: 保险公司是:PICC 规则2: 销售区域是:北京、天津 规则3: 投保人年龄:0 ~ 17岁 规则4: 保险期间是:20年、25年、30年 规则5: 缴费方式是:趸交(一次性交清)或年交 规则6: 保险期与交费期规则一:保险期间为20年期交费期间最长10年交且不能选择[趸交] 规则7: 保险期与交费期规则二:保险期间为25年期交费期间最长15年交且不能选择[趸交] 规则8: 保险期与交费期规则三:保险期间为30年期交费期间最长20年交且不能选择[趸交] 规则9: 被保人要求:(投保年龄+保险期间)不得大于40周岁
规则10: 保险金额规则:投保时约定,最低为5万元,超过部分必须为1000元的整数倍
规则11: 出单基本保额限额规则:线上出单基本保额限额62.5万元,超62.5万元需配合契调转线下出单
在本案例中规则文件是一个Excel文件,业务人员可以直接更改这个文件中指标的值,系统不需要做任何变更。
2、实现步骤
基于Spring Boot整合Drools的架构来实现。
2.1、创建maven工程insuranceInfoCheck并配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot spring-boot-starters 2.0.6.RELEASE org.example insuranceInfoCheck 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-aop org.springframework.boot spring-boot-starter-test commons-lang commons-lang 2.6 org.drools drools-core 7.6.0.Final org.drools drools-compiler 7.6.0.Final org.drools drools-templates 7.6.0.Final org.kie kie-api 7.6.0.Final org.kie kie-spring org.springframework spring-tx org.springframework spring-beans org.springframework spring-core org.springframework spring-context 7.6.0.Final ${project.artifactId} src/main/java **/*.xml false src/main/resources **/*.* false org.apache.maven.plugins maven-compiler-plugin 2.3.2 1.8
2.2、创建/resources/application.yml文件
server: port: 8080 spring: application: name: insuranceInfoCheck
2.3、创建实体类InsuranceInfo
package com.itheima.drools.entity; /** * 保险信息 */ public class InsuranceInfo { private String param1;//保险公司 private String param2;//方案代码 private String param3;//渠道号 private String param4;//销售区域 private String param5;//投保年龄 private String param6;//保险期间 private String param7;//缴费期间 private String param8;//缴费方式 private String param9;//保障类型 private String param10;//等待期 private String param11;//犹豫期 private String param12;//职业类型 private String param13;//保额限制 private String param14;//免赔额 private String param15;//主险保额 private String param16;//主险保费 private String param17;//附加险保额 private String param18;//附加险保费 private String param19;//与投保人关系 private String param20;//与被保人关系 private String param21;//性别 private String param22;//证件 private String param23;//保费 private String param24;//保额 //getter setter省略 }
2.4、创建决策表文件
2.5、第五步:封装工具类KieSessionUtils
package com.itheima.drools.utils; import com.itheima.drools.entity.InsuranceInfo; import org.drools.decisiontable.InputType; import org.drools.decisiontable.SpreadsheetCompiler; import org.kie.api.builder.Message; import org.kie.api.builder.Results; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieSession; import org.kie.internal.utils.KieHelper; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.List; public class KieSessionUtils { public KieSessionUtils() { } // 把xls文件解析为String public static String getDRL (String realPath) throws FileNotFoundException { File file = new File(realPath); // 例如:C:\\abc.xls InputStream is = new FileInputStream(file); SpreadsheetCompiler compiler = new SpreadsheetCompiler(); String drl = compiler.compile(is, InputType.XLS); System.out.println(drl); return drl; } // drl为含有内容的字符串 public static KieSession createKieSessionFromDRL(String drl) throws Exception{ KieHelper kieHelper = new KieHelper(); kieHelper.addContent(drl, ResourceType.DRL); Results results = kieHelper.verify(); if (results.hasMessages(Message.Level.WARNING, Message.Level.ERROR)) { Listmessages = results.getMessages(Message.Level.WARNING, Message.Level.ERROR); for (Message message : messages) { System.out.println("Error: "+message.getText()); } // throw new IllegalStateException("Compilation errors were found. Check the logs."); } return kieHelper.build().newKieSession(); } // realPath为Excel文件绝对路径 public static KieSession getKieSessionFromXLS(String realPath) throws Exception { return createKieSessionFromDRL(getDRL(realPath)); } }
2.6、创建RuleService类
package com.itheima.drools.service; import com.itheima.drools.entity.InsuranceInfo; import com.itheima.drools.utils.KieSessionUtils; import org.kie.api.runtime.KieSession; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class RuleService { public ListinsuranceInfoCheck(InsuranceInfo insuranceInfo) throws Exception{ KieSession session = KieSessionUtils.getKieSessionFromXLS("C:\\Users\\Administrator\\Desktop\\insuranceInfoCheck.xls"); session.getAgenda().getAgendaGroup("sign").setFocus(); session.insert(insuranceInfo); List listRules = new ArrayList<>(); session.setGlobal("listRules", listRules); session.fireAllRules(); session.dispose(); return listRules; } }
2.7、创建RuleController类
package com.itheima.drools.controller; import com.itheima.drools.entity.InsuranceInfo; import com.itheima.drools.service.RuleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/rule") public class RuleController { @Autowired private RuleService ruleService; @RequestMapping("/insuranceInfoCheck") public Map insuranceInfoCheck() { Map map = new HashMap(); //模拟数据,实际应为页面传递过来 InsuranceInfo insuranceInfo = new InsuranceInfo(); insuranceInfo.setParam1("picc"); insuranceInfo.setParam4("上海"); insuranceInfo.setParam5("101"); insuranceInfo.setParam6("12"); insuranceInfo.setParam7("222"); insuranceInfo.setParam8("1"); insuranceInfo.setParam13("3"); try { Listlist = ruleService.insuranceInfoCheck(insuranceInfo); if(list != null && list.size() > 0){ map.put("checkResult",false); map.put("msg","准入失败"); map.put("detail",list); }else{ map.put("checkResult",true); map.put("msg","准入成功"); } return map; } catch (Exception e) { e.printStackTrace(); map.put("checkResult",false); map.put("msg","未知错误"); return map; } } }
2.8、创建启动类DroolsApplication
package com.itheima.drools; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DroolsApplication { public static void main(String[] args) { SpringApplication.run(DroolsApplication.class); } }