第2-4-9章 規則引擎Drools實戰(2)-信用卡申請
阿新 • • 發佈:2022-11-30
目錄
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檔案
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" 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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starters</artifactId> <version>2.0.6.RELEASE</version> </parent> <groupId>com.itheima</groupId> <artifactId>creditCardApply</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!--drools規則引擎--> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>7.6.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>7.6.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-templates</artifactId> <version>7.6.0.Final</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>7.6.0.Final</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-spring</artifactId> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> </exclusions> <version>7.6.0.Final</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> <filtering>false</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
第二步:建立/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
@ConditionalOnMissingBean
public 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
@ConditionalOnMissingBean
public 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
@ConditionalOnMissingBean
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
@ConditionalOnMissingBean
public 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 10
no-loop true
when
$c:CreditCardApplyInfo(hasCar == false &&
hasHouse == false &&
education == CreditCardApplyInfo.EDUCATION_1 &&
monthlyIncome < 5000)
then
$c.setCheckResult(false);
drools.halt();
end
rule "如果申請人既沒房也沒車,同時學歷為大專或本科,並且月薪少於3000,那麼不通過"
salience 10
no-loop true
when
$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 10
no-loop true
when
$c:CreditCardApplyInfo(hasCar == false &&
hasHouse == false &&
education == CreditCardApplyInfo.EDUCATION_4 &&
monthlyIncome < 2000 &&
hasCreditCardCount == 0)
then
$c.setCheckResult(false);
drools.halt();
end
rule "如果申請人現有的信用卡數量大於10,那麼不通過"
salience 10
no-loop true
when
$c:CreditCardApplyInfo(hasCreditCardCount > 10)
then
$c.setCheckResult(false);
drools.halt();
end
//--------------------------------------------------------------------------
//確定額度
rule "如果申請人有房有車,或者月收入在20000以上,那麼發放的信用卡額度為15000"
salience 1
no-loop true
activation-group "quota_group"
when
$c:CreditCardApplyInfo(checkResult == true &&
((hasHouse == true && hasCar == true) ||
(monthlyIncome > 20000)))
then
$c.setQuota(15000);
end
rule "如果申請人沒房沒車,但月收入在10000~20000之間,那麼發放的信用卡額度為6000"
salience 1
no-loop true
activation-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 1
no-loop true
activation-group "quota_group"
when
$c:CreditCardApplyInfo(checkResult == true &&
hasHouse == false &&
hasCar == false &&
monthlyIncome < 10000)
then
$c.setQuota(3000);
end
rule "如果申請人有房沒車或者沒房但有車,月收入在10000以下,那麼發放的信用卡額度為5000"
salience 1
no-loop true
activation-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 1
no-loop true
activation-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 {
@Autowired
private 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 {
@Autowired
private 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目錄下
全套程式碼及資料全部完整提供,點此處下載