👔 feat: 申请信用卡

This commit is contained in:
bunny 2025-05-18 18:35:38 +08:00
parent 3ce9c81757
commit 1e5d1274d7
9 changed files with 231 additions and 7 deletions

View File

@ -0,0 +1,49 @@
package cn.bunny.drools.bean.exercise;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CreditCardApply {
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;
}

View File

@ -0,0 +1,36 @@
package cn.bunny.drools.controller;
import cn.bunny.drools.bean.exercise.CreditCardApply;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.SneakyThrows;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Tag(name = "申请信用卡")
@RequestMapping("/api/credit-card")
public class CreditCardApplyController {
@SneakyThrows
@PostMapping("")
@Operation(summary = "申请信用卡")
public CreditCardApply creditCardApply(@RequestBody CreditCardApply creditCardApply) {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieBase kieBase = kieContainer.getKieBase("CreditCardApply");
KieSession kieSession = kieBase.newKieSession();
kieSession.insert(creditCardApply);
kieSession.fireAllRules();
kieSession.dispose();
kieSession.close();
return creditCardApply;
}
}

View File

@ -1,11 +1,15 @@
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<!-- 练习 -->
<kbase name="Exercise" packages="rules.exercise" default="true">
<kbase name="Exercise" packages="rules.exercise.test" default="false">
</kbase>
<!-- 练习 -->
<kbase name="ExerciseTax" packages="rules.exercise.tax" default="true">
<!-- 计算税额 -->
<kbase name="ExerciseTax" packages="rules.exercise.tax" default="false">
</kbase>
<!-- 信用卡 -->
<kbase name="CreditCardApply" packages="rules.exercise.card" default="false">
</kbase>
<!-- demo 练习 -->

View File

@ -0,0 +1,56 @@
package rules.exercise.card;
import cn.bunny.drools.bean.exercise.CreditCardApply;
rule "检查学历与薪水1 如果申请人既没房也没车同时学历为大专以下并且月薪少于5000那么不通过"
salience 10
no-loop true
// && 可以写成 ,
when
$creditCard:CreditCardApply(hasHouse == false, hasCar == false,
education == CreditCardApply.EDUCATION_1, monthlyIncome < 5000)
then
// 审核不通过直接结束
$creditCard.setCheckResult(false);
drools.halt();
end
rule "检查学历与薪水2 如果申请人既没房也没车同时学历为大专或本科并且月薪少于3000那么不通过"
salience 10
no-loop true
when
$creditCard:CreditCardApply(hasCar == false, hasHouse==false,
(education == CreditCardApply.EDUCATION_2 || education == CreditCardApply.EDUCATION_3)
&&
monthlyIncome < 3000
)
then
$creditCard.setCheckResult(false);
drools.halt();
end
rule "检查学历与薪水3 如果申请人既没房也没车同时学历为本科以上并且月薪少于2000同时之前没有信用卡的那么不通过"
salience 10
no-loop true
when
$creditCard:CreditCardApply(hasCar == false, hasHouse==false,
education == CreditCardApply.EDUCATION_4 , monthlyIncome < 2000
, hasCreditCardCount == 0
)
then
$creditCard.setCheckResult(false);
drools.halt();
end
rule "检查申请人已有的信用卡数量 如果申请人现有的信用卡数量大于10那么不通过"
salience 10
no-loop true
when
$creditCard:CreditCardApply(hasCreditCardCount > 20)
then
$creditCard.setCheckResult(false);
drools.halt();
end

View File

@ -0,0 +1,79 @@
package rules.exercise.card;
import cn.bunny.drools.bean.exercise.CreditCardApply;
rule "如果申请人有房有车或者月收入在20000以上那么发放的信用卡额度为15000"
salience 1
no-loop true
activation-group "credit_card_apply_group"
// && 可以写成 ,
when
$creditCard:CreditCardApply(
checkResult == true
&&
(hasHouse == true && hasCar == true)
||
(monthlyIncome > 20000)
)
then
$creditCard.setQuota(15000);
end
rule "如果申请人没房没车但月收入在10000~20000之间那么发放的信用卡额度为6000"
salience 1
no-loop true
activation-group "credit_card_apply_group"
when
$creditCard:CreditCardApply(
checkResult == true && hasHouse == false && hasCar == false
&& monthlyIncome >= 10000 && monthlyIncome <= 20000
)
then
$creditCard.setQuota(6000);
end
rule "如果申请人没房没车月收入在10000以下那么发放的信用卡额度为3000"
salience 1
no-loop true
activation-group "credit_card_apply_group"
when
$creditCard:CreditCardApply(
checkResult == true && hasHouse == false && hasCar == false
&& monthlyIncome < 10000
)
then
$creditCard.setQuota(3000);
end
rule "如果申请人有房没车或者没房但有车月收入在1000以下那么发放的信用卡额度为5000"
salience 1
no-loop true
activation-group "credit_card_apply_group"
when
$creditCard:CreditCardApply(
checkResult == true && (hasHouse == true || hasCar == false)
&& monthlyIncome < 10000
)
then
$creditCard.setQuota(5000);
end
rule "如果申请人有房没车或者是没房但有车月收入在10000~20000之间那么发放的信用卡额度为8000"
salience 1
no-loop true
activation-group "credit_card_apply_group"
when
$creditCard:CreditCardApply(
checkResult == true
&&
((hasHouse == true && hasCar == false) || (hasHouse == false && hasCar == true))
&&
monthlyIncome >= 10000 && monthlyIncome <= 20000
)
then
$creditCard.setQuota(8000);
end

View File

@ -1,4 +1,4 @@
package rules.exercise;
package rules.exercise.test;
import cn.bunny.drools.bean.exercise.ComparisonOperation;

View File

@ -1,4 +1,4 @@
package rules.exercise;
package rules.exercise.test;
import cn.bunny.drools.bean.exercise.ComparisonOperation;
rule "exercise-02-contains"

View File

@ -1,4 +1,4 @@
package rules.exercise;
package rules.exercise.test;
import cn.bunny.drools.bean.exercise.ComparisonOperation;
rule "exercise-03-contains"

View File

@ -1,4 +1,4 @@
package rules.exercise;
package rules.exercise.test;
import cn.bunny.drools.bean.exercise.ComparisonOperation;
rule "exercise-04-contains"