From b769180bb1463409df2f230b6e1f27ac2b13d2a8 Mon Sep 17 00:00:00 2001
From: wkc <978997012@qq.com>
Date: Mon, 24 Aug 2026 16:07:02 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=AA=E4=BA=BA=E8=B4=B7?=
=?UTF-8?q?=E6=AC=BE=E6=B5=81=E7=A8=8B=E5=8F=8A=E6=A8=A1=E5=9E=8B=E5=B1=95?=
=?UTF-8?q?=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../domain/dto/ModelInvokeDTO.java | 2 +-
.../dto/PersonalLoanPricingCreateDTO.java | 5 +
.../entity/ModelRetailOutputFields.java | 9 ++
.../service/LoanPricingModelService.java | 14 +++
.../impl/LoanPricingWorkflowServiceImpl.java | 1 +
.../util/LoanPricingConverter.java | 1 +
.../main/resources/data/retail_output.json | 3 +
.../entity/ModelRetailOutputFieldsTest.java | 3 +
...PricingModelServicePersonalParamsTest.java | 30 +++--
.../LoanPricingWorkflowServiceImplTest.java | 3 +
.../components/ModelOutputDisplay.vue | 113 ++++++++++++------
.../components/PersonalCreateDialog.vue | 14 +++
.../components/PersonalWorkflowDetail.vue | 9 ++
.../personal-create-input-params.test.js | 15 ++-
ruoyi-ui/tests/retail-display-fields.test.js | 27 ++++-
...0260824-personal-workflow-optimization.sql | 5 +
16 files changed, 198 insertions(+), 56 deletions(-)
create mode 100644 sql/20260824-personal-workflow-optimization.sql
diff --git a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java
index a160c00..7dcf960 100644
--- a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java
+++ b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java
@@ -125,7 +125,7 @@ public class ModelInvokeDTO {
/**
* 贷款用途(非必填)
- * 可选值:consumer/business
+ * 可选值:经营/消费
*/
private String loanPurpose;
diff --git a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java
index 96c9923..220be1b 100644
--- a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java
+++ b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java
@@ -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 = "业务种类必须是:新增、存量新增、存量转贷之一")
diff --git a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/entity/ModelRetailOutputFields.java b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/entity/ModelRetailOutputFields.java
index 2fbbb5f..b3a337c 100644
--- a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/entity/ModelRetailOutputFields.java
+++ b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/entity/ModelRetailOutputFields.java
@@ -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;
diff --git a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java
index 31dccd4..ac5f4a3 100644
--- a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java
+++ b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java
@@ -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()));
diff --git a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImpl.java b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImpl.java
index b6f439e..1cf0689 100644
--- a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImpl.java
+++ b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImpl.java
@@ -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())
diff --git a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java
index e05e2c1..167b3df 100644
--- a/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java
+++ b/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java
@@ -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());
diff --git a/ruoyi-loan-pricing/src/main/resources/data/retail_output.json b/ruoyi-loan-pricing/src/main/resources/data/retail_output.json
index d9a8af5..6991fa6 100644
--- a/ruoyi-loan-pricing/src/main/resources/data/retail_output.json
+++ b/ruoyi-loan-pricing/src/main/resources/data/retail_output.json
@@ -49,8 +49,11 @@
"greyCust": "否",
"blackCust": "否",
"prinOverdue": "否",
+ "bpPrinOverdue": "0",
"interestOverdue": "否",
+ "bpIinterestOverdue": "0",
"cardOverdue": "否",
+ "bpCardOverdue": "0",
"bpGreyOverdue": "98",
"totalBpRisk": "95",
"totalBp": "350",
diff --git a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/entity/ModelRetailOutputFieldsTest.java b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/entity/ModelRetailOutputFieldsTest.java
index 1149931..0256a19 100644
--- a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/entity/ModelRetailOutputFieldsTest.java
+++ b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/entity/ModelRetailOutputFieldsTest.java
@@ -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");
}
}
diff --git a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java
index 8840287..7cb4b8e 100644
--- a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java
+++ b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java
@@ -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())));
+ }
}
diff --git a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImplTest.java b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImplTest.java
index 6fe0012..56d355f 100644
--- a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImplTest.java
+++ b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImplTest.java
@@ -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());
diff --git a/ruoyi-ui/src/views/loanPricing/workflow/components/ModelOutputDisplay.vue b/ruoyi-ui/src/views/loanPricing/workflow/components/ModelOutputDisplay.vue
index 720ce46..687d849 100644
--- a/ruoyi-ui/src/views/loanPricing/workflow/components/ModelOutputDisplay.vue
+++ b/ruoyi-ui/src/views/loanPricing/workflow/components/ModelOutputDisplay.vue
@@ -41,7 +41,15 @@
模型输出结果 影响BP