优化个人贷款流程及模型展示
This commit is contained in:
@@ -125,7 +125,7 @@ public class ModelInvokeDTO {
|
||||
|
||||
/**
|
||||
* 贷款用途(非必填)
|
||||
* 可选值:consumer/business
|
||||
* 可选值:经营/消费
|
||||
*/
|
||||
private String loanPurpose;
|
||||
|
||||
|
||||
@@ -41,6 +41,11 @@ public class PersonalLoanPricingCreateDTO implements Serializable {
|
||||
@NotBlank(message = "申请金额不能为空")
|
||||
private String applyAmt;
|
||||
|
||||
@Schema(description = "贷款用途", requiredMode = Schema.RequiredMode.REQUIRED, example = "business", allowableValues = {"business", "consumer"})
|
||||
@NotBlank(message = "贷款用途不能为空")
|
||||
@Pattern(regexp = "^(business|consumer)$", message = "贷款用途必须是:business、consumer之一")
|
||||
private String loanPurpose;
|
||||
|
||||
@Schema(description = "业务种类", requiredMode = Schema.RequiredMode.REQUIRED, example = "存量转贷", allowableValues = {"新增", "存量新增", "存量转贷"})
|
||||
@NotBlank(message = "业务种类不能为空")
|
||||
@Pattern(regexp = "^(新增|存量新增|存量转贷)$", message = "业务种类必须是:新增、存量新增、存量转贷之一")
|
||||
|
||||
@@ -159,12 +159,21 @@ public class ModelRetailOutputFields {
|
||||
// 本金逾期
|
||||
private String prinOverdue;
|
||||
|
||||
// BP_本金逾期
|
||||
private String bpPrinOverdue;
|
||||
|
||||
// 利息逾期
|
||||
private String interestOverdue;
|
||||
|
||||
// BP_利息逾期
|
||||
private String bpIinterestOverdue;
|
||||
|
||||
// 信用卡逾期
|
||||
private String cardOverdue;
|
||||
|
||||
// BP_信用卡逾期
|
||||
private String bpCardOverdue;
|
||||
|
||||
// BP_灰名单与逾期
|
||||
private String bpGreyOverdue;
|
||||
|
||||
|
||||
@@ -102,11 +102,25 @@ public class LoanPricingModelService {
|
||||
|
||||
private void normalizePersonalModelInvokeDTO(ModelInvokeDTO modelInvokeDTO)
|
||||
{
|
||||
modelInvokeDTO.setLoanPurpose(toPersonalModelLoanPurpose(modelInvokeDTO.getLoanPurpose()));
|
||||
modelInvokeDTO.setBizProof(toZeroOne(modelInvokeDTO.getBizProof()));
|
||||
modelInvokeDTO.setLoanLoop(toZeroOne(modelInvokeDTO.getLoanLoop()));
|
||||
modelInvokeDTO.setCollThirdParty(toZeroOne(modelInvokeDTO.getCollThirdParty()));
|
||||
}
|
||||
|
||||
private String toPersonalModelLoanPurpose(String value)
|
||||
{
|
||||
if ("business".equals(value))
|
||||
{
|
||||
return "经营";
|
||||
}
|
||||
if ("consumer".equals(value))
|
||||
{
|
||||
return "消费";
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
private void normalizeCorporateModelInvokeDTO(ModelInvokeDTO modelInvokeDTO)
|
||||
{
|
||||
modelInvokeDTO.setCollThirdParty(toZeroOne(modelInvokeDTO.getCollThirdParty()));
|
||||
|
||||
@@ -242,6 +242,7 @@ public class LoanPricingWorkflowServiceImpl implements ILoanPricingWorkflowServi
|
||||
.set(LoanPricingWorkflow::getIdNum, editingWorkflow.getIdNum())
|
||||
.set(LoanPricingWorkflow::getGuarType, editingWorkflow.getGuarType())
|
||||
.set(LoanPricingWorkflow::getApplyAmt, editingWorkflow.getApplyAmt())
|
||||
.set(LoanPricingWorkflow::getLoanPurpose, editingWorkflow.getLoanPurpose())
|
||||
.set(LoanPricingWorkflow::getBusinessType, editingWorkflow.getBusinessType())
|
||||
.set(LoanPricingWorkflow::getLoanRateHistory, editingWorkflow.getLoanRateHistory())
|
||||
.set(LoanPricingWorkflow::getCouponRate, editingWorkflow.getCouponRate())
|
||||
|
||||
@@ -28,6 +28,7 @@ public class LoanPricingConverter {
|
||||
entity.setIdNum(dto.getIdNum());
|
||||
entity.setGuarType(dto.getGuarType());
|
||||
entity.setApplyAmt(dto.getApplyAmt());
|
||||
entity.setLoanPurpose(dto.getLoanPurpose());
|
||||
entity.setBusinessType(dto.getBusinessType());
|
||||
entity.setLoanRateHistory(dto.getLoanRateHistory());
|
||||
entity.setCouponRate(dto.getCouponRate());
|
||||
|
||||
@@ -49,8 +49,11 @@
|
||||
"greyCust": "否",
|
||||
"blackCust": "否",
|
||||
"prinOverdue": "否",
|
||||
"bpPrinOverdue": "0",
|
||||
"interestOverdue": "否",
|
||||
"bpIinterestOverdue": "0",
|
||||
"cardOverdue": "否",
|
||||
"bpCardOverdue": "0",
|
||||
"bpGreyOverdue": "98",
|
||||
"totalBpRisk": "95",
|
||||
"totalBp": "350",
|
||||
|
||||
@@ -25,5 +25,8 @@ class ModelRetailOutputFieldsTest
|
||||
assertTrue(fieldNames.contains("greyBlackCust"), "缺少字段 greyBlackCust");
|
||||
assertTrue(fieldNames.contains("blackCust"), "缺少字段 blackCust");
|
||||
assertTrue(fieldNames.contains("branchBp"), "缺少字段 branchBp");
|
||||
assertTrue(fieldNames.contains("bpPrinOverdue"), "缺少字段 bpPrinOverdue");
|
||||
assertTrue(fieldNames.contains("bpIinterestOverdue"), "缺少字段 bpIinterestOverdue");
|
||||
assertTrue(fieldNames.contains("bpCardOverdue"), "缺少字段 bpCardOverdue");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,6 @@ import java.util.Objects;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.argThat;
|
||||
import static org.mockito.Mockito.verify;
|
||||
@@ -44,27 +42,27 @@ class LoanPricingModelServicePersonalParamsTest {
|
||||
private LoanPricingModelService loanPricingModelService;
|
||||
|
||||
@Test
|
||||
void shouldRemoveLoanPurposeAndKeepPersonalModelFieldsInCreateDto() throws NoSuchFieldException {
|
||||
assertThrows(NoSuchFieldException.class,
|
||||
() -> PersonalLoanPricingCreateDTO.class.getDeclaredField("loanPurpose"));
|
||||
void shouldContainLoanPurposeAndPersonalModelFieldsInCreateDto() throws NoSuchFieldException {
|
||||
assertNotNull(PersonalLoanPricingCreateDTO.class.getDeclaredField("loanPurpose"));
|
||||
assertNotNull(PersonalLoanPricingCreateDTO.class.getDeclaredField("bizProof"));
|
||||
assertNotNull(PersonalLoanPricingCreateDTO.class.getDeclaredField("loanTerm"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldMapBizProofButNotLoanPurposeFromPersonalDto() {
|
||||
void shouldMapLoanPurposeAndBizProofFromPersonalDto() {
|
||||
PersonalLoanPricingCreateDTO dto = new PersonalLoanPricingCreateDTO();
|
||||
dto.setCustIsn("CUST001");
|
||||
dto.setCustName("张三");
|
||||
dto.setGuarType("信用");
|
||||
dto.setApplyAmt("100000");
|
||||
dto.setLoanPurpose("business");
|
||||
dto.setBusinessType("新增");
|
||||
dto.setLoanTerm("3");
|
||||
dto.setBizProof("1");
|
||||
|
||||
LoanPricingWorkflow workflow = LoanPricingConverter.toEntity(dto);
|
||||
|
||||
assertNull(workflow.getLoanPurpose());
|
||||
assertEquals("business", workflow.getLoanPurpose());
|
||||
assertEquals("1", workflow.getBizProof());
|
||||
assertEquals("3", workflow.getLoanTerm());
|
||||
}
|
||||
@@ -89,6 +87,7 @@ class LoanPricingModelServicePersonalParamsTest {
|
||||
workflow.setIdNum("110101199001011234");
|
||||
workflow.setGuarType("信用");
|
||||
workflow.setApplyAmt("100000");
|
||||
workflow.setLoanPurpose("consumer");
|
||||
workflow.setLoanTerm("3");
|
||||
workflow.setBizProof("true");
|
||||
workflow.setLoanLoop("false");
|
||||
@@ -114,10 +113,27 @@ class LoanPricingModelServicePersonalParamsTest {
|
||||
&& Objects.equals("110101199001011234", dto.getIdNum())
|
||||
&& Objects.equals("信用", dto.getGuarType())
|
||||
&& Objects.equals("100000", dto.getApplyAmt())
|
||||
&& Objects.equals("消费", dto.getLoanPurpose())
|
||||
&& Objects.equals("3", dto.getLoanTerm())
|
||||
&& Objects.equals("1", dto.getBizProof())
|
||||
&& Objects.equals("0", dto.getLoanLoop())
|
||||
&& Objects.equals("1", dto.getCollThirdParty())
|
||||
&& Objects.equals("一类", dto.getCollType())));
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldConvertBusinessLoanPurposeForPersonalModel() {
|
||||
LoanPricingWorkflow workflow = new LoanPricingWorkflow();
|
||||
workflow.setId(2L);
|
||||
workflow.setCustType("个人");
|
||||
workflow.setLoanPurpose("business");
|
||||
|
||||
when(loanPricingWorkflowMapper.selectById(2L)).thenReturn(workflow);
|
||||
when(modelService.invokePersonalModel(any())).thenReturn(new ModelRetailOutputFields());
|
||||
|
||||
loanPricingModelService.invokeModelAsync(2L);
|
||||
|
||||
verify(modelService).invokePersonalModel(argThat((ModelInvokeDTO dto) ->
|
||||
Objects.equals("经营", dto.getLoanPurpose())));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -496,6 +496,7 @@ class LoanPricingWorkflowServiceImplTest
|
||||
dto.setIdNum("110101199001019999");
|
||||
dto.setGuarType("抵押");
|
||||
dto.setApplyAmt("200000");
|
||||
dto.setLoanPurpose("business");
|
||||
dto.setBusinessType("新增");
|
||||
dto.setLoanTerm("3");
|
||||
dto.setLoanLoop("1");
|
||||
@@ -510,6 +511,7 @@ class LoanPricingWorkflowServiceImplTest
|
||||
verify(loanPricingWorkflowMapper).update(any(), updateWrapperCaptor.capture());
|
||||
String sqlSet = updateWrapperCaptor.getValue().getSqlSet();
|
||||
assertTrue(sqlSet.contains("apply_amt"));
|
||||
assertTrue(sqlSet.contains("loan_purpose"));
|
||||
assertTrue(sqlSet.contains("cust_name"));
|
||||
assertTrue(sqlSet.contains("id_num"));
|
||||
assertTrue(sqlSet.contains("biz_proof"));
|
||||
@@ -518,6 +520,7 @@ class LoanPricingWorkflowServiceImplTest
|
||||
assertTrue(updateWrapperCaptor.getValue().getParamNameValuePairs().containsValue("张三"));
|
||||
assertTrue(updateWrapperCaptor.getValue().getParamNameValuePairs().containsValue("110101199001019999"));
|
||||
assertTrue(updateWrapperCaptor.getValue().getParamNameValuePairs().containsValue("普通住宅、土地、厂房"));
|
||||
assertTrue(updateWrapperCaptor.getValue().getParamNameValuePairs().containsValue("business"));
|
||||
assertTrue(updateWrapperCaptor.getValue().getParamNameValuePairs().containsValue("是"));
|
||||
assertTrue(updateWrapperCaptor.getValue().getParamNameValuePairs().containsValue("1"));
|
||||
verify(sensitiveFieldCryptoService, never()).encrypt(any());
|
||||
|
||||
Reference in New Issue
Block a user