From 9a4be16c0510ede649190a39239251c21fc36ac8 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Tue, 25 Aug 2026 03:25:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=AF=84=E5=88=86=E9=87=8F?= =?UTF-8?q?=E5=8C=96=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/entity/CreditScoreItem.java | 10 +++ .../pojo/entity/CreditScoreItemOption.java | 20 +++++ .../entity/CustomerCreditScoreDetail.java | 9 ++ .../CreditScoreQuantificationServiceImpl.java | 89 ++++++++++++++++++- .../impl/CustomerArchiveServiceImpl.java | 13 ++- .../blade_credit_score_quantification.sql | 6 ++ ...antification_base_value_patch_20260825.sql | 11 +++ ...tification_score_option_patch_20260825.sql | 13 +++ doc/sql/transport/blade_customer_archive.sql | 3 + ...core_detail_score_input_patch_20260825.sql | 48 ++++++++++ 10 files changed, 217 insertions(+), 5 deletions(-) create mode 100644 doc/sql/transport/blade_credit_score_quantification_base_value_patch_20260825.sql create mode 100644 doc/sql/transport/blade_credit_score_quantification_score_option_patch_20260825.sql create mode 100644 doc/sql/transport/blade_customer_credit_score_detail_score_input_patch_20260825.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CreditScoreItem.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CreditScoreItem.java index 98b27ba..576c731 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CreditScoreItem.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CreditScoreItem.java @@ -72,6 +72,16 @@ public class CreditScoreItem extends TenantEntity { */ @Schema(description = "评分项目") private String itemName; + /** + * 选项类型:option-选项,score-分值 + */ + @Schema(description = "选项类型:option-选项,score-分值") + private String optionType; + /** + * 分值模式基准数值 + */ + @Schema(description = "分值模式基准数值") + private BigDecimal baseValue; /** * 分值 */ diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CreditScoreItemOption.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CreditScoreItemOption.java index 5ebce38..de5481b 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CreditScoreItemOption.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CreditScoreItemOption.java @@ -67,6 +67,26 @@ public class CreditScoreItemOption extends TenantEntity { */ @Schema(description = "选项描述") private String optionName; + /** + * 变化类型:increase-每增加,decrease-每减少 + */ + @Schema(description = "变化类型:increase-每增加,decrease-每减少") + private String changeType; + /** + * 变化数值 + */ + @Schema(description = "变化数值") + private BigDecimal changeValue; + /** + * 变化单位:%、件、次、项、天 + */ + @Schema(description = "变化单位:%、件、次、项、天") + private String changeUnit; + /** + * 分值类型:add-加,subtract-减 + */ + @Schema(description = "分值类型:add-加,subtract-减") + private String scoreType; /** * 分值 */ diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CustomerCreditScoreDetail.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CustomerCreditScoreDetail.java index 1e6fc4a..eae9a63 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CustomerCreditScoreDetail.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CustomerCreditScoreDetail.java @@ -68,6 +68,15 @@ public class CustomerCreditScoreDetail extends TenantEntity { @Schema(description = "评分项目") private String itemName; + @Schema(description = "选项类型:option-选项,score-分值") + private String optionType; + + @Schema(description = "分值模式基准数值") + private BigDecimal baseValue; + + @Schema(description = "分值模式用户输入数值") + private BigDecimal scoreInput; + @Schema(description = "评分标准") private String optionDescription; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CreditScoreQuantificationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CreditScoreQuantificationServiceImpl.java index 3131f4c..c4c07a2 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CreditScoreQuantificationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CreditScoreQuantificationServiceImpl.java @@ -87,6 +87,13 @@ public class CreditScoreQuantificationServiceImpl extends BaseServiceImpl SCORE_OPTION_UNITS = Set.of("%", "件", "次", "项", "天"); private static final String ROW_TYPE_MAIN = "主表"; private static final String ROW_TYPE_ITEM = "评分项目"; private static final String ROW_TYPE_OPTION = "选项"; @@ -253,6 +260,7 @@ public class CreditScoreQuantificationServiceImpl extends BaseServiceImpl> itemMap = items.stream().map(item -> { CreditScoreItemVO itemVO = Objects.requireNonNull(BeanUtil.copyProperties(item, CreditScoreItemVO.class)); + itemVO.setBaseValue(normalizeBaseValue(itemVO.getBaseValue())); itemVO.setOptions(optionMap.getOrDefault(item.getId(), new ArrayList<>())); return itemVO; }).collect(Collectors.groupingBy(CreditScoreItemVO::getCategoryId)); @@ -263,6 +271,10 @@ public class CreditScoreQuantificationServiceImpl extends BaseServiceImpl loadStandards(Long quantificationId) { return standardMapper.selectList(Wrappers.lambdaQuery() .eq(CreditRatingStandard::getQuantificationId, quantificationId) @@ -335,7 +347,7 @@ public class CreditScoreQuantificationServiceImpl extends BaseServiceImpl itemMap) { @@ -475,6 +487,17 @@ public class CreditScoreQuantificationServiceImpl extends BaseServiceImpl itemNames = new HashSet<>(); for (CreditScoreItemVO item : items) { item.setItemName(trimToEmpty(item.getItemName())); + String optionType = trimToEmpty(item.getOptionType()); + if (Func.isEmpty(optionType)) { + optionType = OPTION_TYPE_OPTION; + } + if (!OPTION_TYPE_OPTION.equals(optionType) && !OPTION_TYPE_SCORE.equals(optionType)) { + throw new ServiceException(item.getItemName() + "选项类型不正确"); + } + item.setOptionType(optionType); + if (OPTION_TYPE_SCORE.equals(optionType) && item.getBaseValue() == null) { + throw new ServiceException(item.getItemName() + "基准数值不能为空"); + } item.setScoreDescription(trimToNull(item.getScoreDescription())); item.setOptionDescription(trimToNull(item.getOptionDescription())); if (Func.isEmpty(item.getItemName())) { @@ -486,7 +509,10 @@ public class CreditScoreQuantificationServiceImpl extends BaseServiceImpl 2) { + throw new ServiceException(item.getItemName() + "变化数值最多保留两位小数"); + } + if (!SCORE_OPTION_UNITS.contains(option.getChangeUnit())) { + throw new ServiceException(item.getItemName() + "变化单位不正确"); + } + if (!SCORE_TYPE_ADD.equals(option.getScoreType()) && !SCORE_TYPE_SUBTRACT.equals(option.getScoreType())) { + throw new ServiceException(item.getItemName() + "加减类型不正确"); + } + if (Func.isEmpty(option.getScore()) || option.getScore().compareTo(BigDecimal.ZERO) <= 0) { + throw new ServiceException(item.getItemName() + "基础分值必须大于0"); + } + if (option.getScore().scale() > 2) { + throw new ServiceException(item.getItemName() + "基础分值最多保留两位小数"); + } + // 分值模式的选项名称由规则自动生成,避免从“选项”模式切换后残留旧名称。 + option.setOptionName(buildScoreOptionName(option)); + validateLength(option.getOptionName(), OPTION_NAME_MAX_LENGTH, "选项描述最多100字符"); + } + + private String buildScoreOptionName(CreditScoreItemOptionVO option) { + String changeLabel = CHANGE_TYPE_DECREASE.equals(option.getChangeType()) ? "每减少" : "每增加"; + String scoreLabel = SCORE_TYPE_SUBTRACT.equals(option.getScoreType()) ? "减" : "加"; + return changeLabel + formatDecimal(option.getChangeValue()) + option.getChangeUnit() + + scoreLabel + formatDecimal(option.getScore()) + "分"; + } + + private String formatDecimal(BigDecimal value) { + return value == null ? "" : value.stripTrailingZeros().toPlainString(); + } + + private void validateScale(BigDecimal value, String message) { + if (value != null && value.stripTrailingZeros().scale() > 2) { + throw new ServiceException(message); + } + } + private void validateStandards(List standards, boolean fullValidate) { if (!fullValidate && Func.isEmpty(standards)) { return; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java index aa8f058..8fd928e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java @@ -668,10 +668,17 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl itemOptions = optionMap.getOrDefault(item.getId(), new ArrayList<>()); - detail.setScore(resolveFullScore(itemOptions)); + // 分值模式的项目分值是项目本身配置的基础分,选项中的 score 是阶梯变动分值。 + // 其他选项模式仍以选项最高分作为项目满分。 + BigDecimal fullScore = "score".equalsIgnoreCase(item.getOptionType()) + ? item.getScore() + : resolveFullScore(itemOptions); + detail.setScore(fullScore == null ? BigDecimal.ZERO : fullScore); detail.setOptionsJson(buildOptionsJson(itemOptions)); detail.setSelfScore(BigDecimal.ZERO); detail.setReviewScore(BigDecimal.ZERO); @@ -688,6 +695,10 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl