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