第2-4-9章 规则引擎Drools实战(2)-信用卡申请
创始人
2024-03-03 02:47:42
0

文章目录

      • 9.2 信用卡申请
        • 9.2.1 计算规则
        • 9.2.2 实现步骤

9.2 信用卡申请

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

本小节我们需要通过Drools规则引擎来根据规则进行申请人的合法性检查,检查通过后再根据规则确定信用卡额度,最终页面效果如下:
在这里插入图片描述

9.2.1 计算规则

合法性检查规则如下:

规则编号名称描述
1检查学历与薪水1如果申请人既没房也没车,同时学历为大专以下,并且月薪少于5000,那么不通过
2检查学历与薪水2如果申请人既没房也没车,同时学历为大专或本科,并且月薪少于3000,那么不通过
3检查学历与薪水3如果申请人既没房也没车,同时学历为本科以上,并且月薪少于2000,同时之前没有信用卡的,那么不通过
4检查申请人已有的信用卡数量如果申请人现有的信用卡数量大于10,那么不通过

信用卡额度确定规则:

规则编号名称描述
1规则1如果申请人有房有车,或者月收入在20000以上,那么发放的信用卡额度为15000
2规则2如果申请人没房没车,但月收入在10000~20000之间,那么发放的信用卡额度为6000
3规则3如果申请人没房没车,月收入在10000以下,那么发放的信用卡额度为3000
4规则4如果申请人有房没车或者没房但有车,月收入在10000以下,那么发放的信用卡额度为5000
5规则5如果申请人有房没车或者是没房但有车,月收入在10000~20000之间,那么发放的信用卡额度为8000

9.2.2 实现步骤

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


4.0.0org.springframework.bootspring-boot-starters2.0.6.RELEASEcom.itheimacreditCardApply1.0-SNAPSHOTorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-aoporg.springframework.bootspring-boot-starter-testcommons-langcommons-lang2.6org.droolsdrools-core7.6.0.Finalorg.droolsdrools-compiler7.6.0.Finalorg.droolsdrools-templates7.6.0.Finalorg.kiekie-api7.6.0.Finalorg.kiekie-springorg.springframeworkspring-txorg.springframeworkspring-beansorg.springframeworkspring-coreorg.springframeworkspring-context7.6.0.Final${project.artifactId}src/main/java**/*.xmlfalsesrc/main/resources**/*.*falseorg.apache.maven.pluginsmaven-compiler-plugin2.3.21.81.8

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

server:port: 8080
spring:application:name: creditCardApply

第三步:编写配置类DroolsConfig

package com.itheima.drools.config;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.Resource;
import java.io.IOException;
/*** 规则引擎配置类*/
@Configuration
public class DroolsConfig {//指定规则文件存放的目录private static final String RULES_PATH = "rules/";private final KieServices kieServices = KieServices.Factory.get();@Bean@ConditionalOnMissingBeanpublic KieFileSystem kieFileSystem() throws IOException {KieFileSystem kieFileSystem = kieServices.newKieFileSystem();ResourcePatternResolver resourcePatternResolver =new PathMatchingResourcePatternResolver();Resource[] files =resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.*");String path = null;for (Resource file : files) {path = RULES_PATH + file.getFilename();kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));}return kieFileSystem;}@Bean@ConditionalOnMissingBeanpublic KieContainer kieContainer() throws IOException {KieRepository kieRepository = kieServices.getRepository();kieRepository.addKieModule(kieRepository::getDefaultReleaseId);KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());kieBuilder.buildAll();return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());}@Bean@ConditionalOnMissingBeanpublic KieBase kieBase() throws IOException {return kieContainer().getKieBase();}@Bean@ConditionalOnMissingBeanpublic KModuleBeanFactoryPostProcessor kiePostProcessor() {return new KModuleBeanFactoryPostProcessor();}
}

第四步:编写实体类CreditCardApplyInfo

package com.itheima.drools.entity;
/*** 信用卡申请信息*/
public class CreditCardApplyInfo {public static final String EDUCATION_1 = "专科以下";public static final String EDUCATION_2 = "专科";public static final String EDUCATION_3 = "本科";public static final String EDUCATION_4 = "本科以上";private String name;private String sex;private int age;private String education;private String telephone;private double monthlyIncome = 0;//月收入private String address;private boolean hasHouse = false;//是否有房private boolean hasCar = false;//是否有车private int hasCreditCardCount = 0;//现持有信用卡数量private boolean checkResult = true;//审核是否通过private double quota = 0;//额度public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getEducation() {return education;}public void setEducation(String education) {this.education = education;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public double getMonthlyIncome() {return monthlyIncome;}public void setMonthlyIncome(double monthlyIncome) {this.monthlyIncome = monthlyIncome;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public boolean isHasHouse() {return hasHouse;}public void setHasHouse(boolean hasHouse) {this.hasHouse = hasHouse;}public boolean isHasCar() {return hasCar;}public void setHasCar(boolean hasCar) {this.hasCar = hasCar;}public int getHasCreditCardCount() {return hasCreditCardCount;}public void setHasCreditCardCount(int hasCreditCardCount) {this.hasCreditCardCount = hasCreditCardCount;}public boolean isCheckResult() {return checkResult;}public void setCheckResult(boolean checkResult) {this.checkResult = checkResult;}public double getQuota() {return quota;}public void setQuota(double quota) {this.quota = quota;}public String toString() {if(checkResult){return "审核通过,信用卡额度为:" + quota;}else {return "审核不通过";}}
}

第五步:在resources/rules下创建规则文件creditCardApply.drl文件

package com.itheima.creditCardApply
import com.itheima.drools.entity.CreditCardApplyInfo//合法性检查
rule "如果申请人既没房也没车,同时学历为大专以下,并且月薪少于5000,那么不通过"salience 10no-loop truewhen$c:CreditCardApplyInfo(hasCar == false &&hasHouse == false &&education == CreditCardApplyInfo.EDUCATION_1 &&monthlyIncome < 5000)then$c.setCheckResult(false);drools.halt();
end
rule "如果申请人既没房也没车,同时学历为大专或本科,并且月薪少于3000,那么不通过"salience 10no-loop truewhen$c:CreditCardApplyInfo(hasCar == false &&hasHouse == false &&(education == CreditCardApplyInfo.EDUCATION_2  ||education == CreditCardApplyInfo.EDUCATION_3) &&monthlyIncome < 3000)then$c.setCheckResult(false);drools.halt();
end
rule "如果申请人既没房也没车,同时学历为本科以上,并且月薪少于2000,同时之前没有信用卡的,那么不通过"salience 10no-loop truewhen$c:CreditCardApplyInfo(hasCar == false &&hasHouse == false &&education == CreditCardApplyInfo.EDUCATION_4 &&monthlyIncome < 2000 &&hasCreditCardCount == 0)then$c.setCheckResult(false);drools.halt();
end
rule "如果申请人现有的信用卡数量大于10,那么不通过"salience 10no-loop truewhen$c:CreditCardApplyInfo(hasCreditCardCount > 10)then$c.setCheckResult(false);drools.halt();
end
//--------------------------------------------------------------------------
//确定额度
rule "如果申请人有房有车,或者月收入在20000以上,那么发放的信用卡额度为15000"salience 1no-loop trueactivation-group "quota_group"when$c:CreditCardApplyInfo(checkResult == true &&((hasHouse == true && hasCar == true) ||(monthlyIncome > 20000)))then$c.setQuota(15000);
end
rule "如果申请人没房没车,但月收入在10000~20000之间,那么发放的信用卡额度为6000"salience 1no-loop trueactivation-group "quota_group"when$c:CreditCardApplyInfo(checkResult == true &&hasHouse == false &&hasCar == false &&monthlyIncome >= 10000 &&monthlyIncome <= 20000)then$c.setQuota(6000);
end
rule "如果申请人没房没车,月收入在10000以下,那么发放的信用卡额度为3000"salience 1no-loop trueactivation-group "quota_group"when$c:CreditCardApplyInfo(checkResult == true &&hasHouse == false &&hasCar == false &&monthlyIncome < 10000)then$c.setQuota(3000);
end
rule "如果申请人有房没车或者没房但有车,月收入在10000以下,那么发放的信用卡额度为5000"salience 1no-loop trueactivation-group "quota_group"when$c:CreditCardApplyInfo(checkResult == true &&((hasHouse == true && hasCar == false) ||(hasHouse == false && hasCar == true)) &&monthlyIncome < 10000)then$c.setQuota(5000);
end
rule "如果申请人有房没车或者是没房但有车,月收入在10000~20000之间,那么发放的信用卡额度为8000"salience 1no-loop trueactivation-group "quota_group"when$c:CreditCardApplyInfo(checkResult == true &&((hasHouse == true && hasCar == false) ||(hasHouse == false && hasCar == true)) &&monthlyIncome >= 10000 &&monthlyIncome <= 20000)then$c.setQuota(8000);
end

第六步:创建RuleService

package com.itheima.drools.service;import com.itheima.drools.entity.CreditCardApplyInfo;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class RuleService {@Autowiredprivate KieBase kieBase;//调用Drools规则引擎实现信用卡申请public CreditCardApplyInfo creditCardApply(CreditCardApplyInfo creditCardApplyInfo){KieSession session = kieBase.newKieSession();session.insert(creditCardApplyInfo);session.fireAllRules();session.dispose();return creditCardApplyInfo;}
}

第七步:创建RuleController

package com.itheima.drools.controller;import com.itheima.drools.entity.CreditCardApplyInfo;
import com.itheima.drools.service.RuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/rule")
public class RuleController {@Autowiredprivate RuleService ruleService;@RequestMapping("/creditCardApply")public CreditCardApplyInfo creditCardApply(@RequestBody CreditCardApplyInfo creditCardApplyInfo){creditCardApplyInfo = ruleService.creditCardApply(creditCardApplyInfo);return creditCardApplyInfo;}
}

第八步:创建启动类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);}
}

第九步:导入静态资源文件到resources/static目录下
全套代码及资料全部完整提供,点此处下载

相关内容

热门资讯

美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...