From e988cc5d733eb64cd8ba4811ff07f24ce21367ae Mon Sep 17 00:00:00 2001 From: Yen Date: Fri, 23 May 2025 09:42:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(rebate):=20=E8=BF=94=E5=88=A9=E7=9A=84?= =?UTF-8?q?=E9=A2=84=E7=AE=97=E9=87=91=E9=A2=9D=E5=8C=B9=E9=85=8D=E8=A7=84?= =?UTF-8?q?=E5=88=99=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TzcRebateApplication4CostService.java | 6 ++- .../TzcRebateApplication4CostServiceImpl.java | 39 ++++++++++++++++--- .../impl/TzcRebateApplicationServiceImpl.java | 16 +++++++- 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4CostService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4CostService.java index 2a34e04..e32b688 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4CostService.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4CostService.java @@ -43,11 +43,15 @@ public interface TzcRebateApplication4CostService { * @param levelsList * @param argumentList * @param configList + * @param maxPeriodAmt 区间最高目标金额 * @return */ BigDecimal getMaxLevelsAmount(List levelsList, List argumentList, - List configList); + List configList, + BigDecimal maxPeriodAmt, + boolean hasCompensationFlag + ); /** * 获取最高命中返利坎级的信息及坎级列表 diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java index 740c633..b49c994 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java @@ -3,6 +3,7 @@ package com.qs.serve.modules.tzc.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.exception.Assert; import com.qs.serve.common.utils.CopierUtil; import com.qs.serve.modules.tbs.common.TbsActivityState; import com.qs.serve.modules.tbs.common.TbsCostApplyState; @@ -301,7 +302,9 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio @Override public BigDecimal getMaxLevelsAmount(List levelsList, List argumentList, - List configList){ + List configList, + BigDecimal maxPeriodAmt, + boolean hasCompensationFlag){ BigDecimal maxAmount = BigDecimal.ZERO; for (TzcRebateLevelsConfig config : configList) { Set levelNumSet = Arrays.stream(config.getLevelConfigs()).collect(Collectors.toSet()); @@ -311,7 +314,8 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio for (String levelNumStr : levelNumSet) { int levelNum = Integer.parseInt(levelNumStr); // 当前坎级最高返利金额 - BigDecimal currentLevelMaxAmount = getCurrentLevelMaxAmount(levelsList, argumentList, levelNum); + BigDecimal currentLevelMaxAmount = getCurrentLevelMaxAmount( + levelsList, argumentList, levelNum,maxPeriodAmt,hasCompensationFlag); if (currentLevelMaxAmount.compareTo(BigDecimal.ZERO)>0){ currentConfAmount = currentConfAmount.add(currentLevelMaxAmount); } @@ -331,7 +335,11 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio * @return */ @NotNull - private BigDecimal getCurrentLevelMaxAmount(List levelsList, List argumentList, int levelNum) { + private BigDecimal getCurrentLevelMaxAmount(List levelsList, + List argumentList, + int levelNum, + BigDecimal maxPeriodAmt, + boolean hasCompensationFlag) { BigDecimal currentLevelMaxAmount = BigDecimal.ZERO; for (TzcRebateLevels levels : levelsList) { if(levels.getLevelNum()== levelNum){ @@ -339,8 +347,29 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio BigDecimal currentArgAmount = BigDecimal.ZERO; for (TzcRebateLevelsArgument argument : argumentList) { if(argument.getLevelId().equals(levels.getId())){ - if (argument.getMaxReturn().compareTo(currentArgAmount)>0){ - currentArgAmount = argument.getMaxReturn(); + BigDecimal argAmount = BigDecimal.ZERO; + // 使用最高金额 + if (argument.getMaxReturn()!=null){ + argAmount = argument.getMaxReturn(); + }else { + // 使用固定金额 + if (argument.getRateAmtFlag().equals(0)){ + argAmount = argument.getReturnFixed(); + }else if (argument.getRateAmtFlag().equals(1)){ + // 使用比例金额(目标返利x比例) + if (argument.getSumAddFlag().equals(0)){ + argAmount = argument.getReturnRate().multiply(maxPeriodAmt) + .divide(BigDecimal.valueOf(100),2,RoundingMode.HALF_UP); + }else{ + // 增量返利缺参数:普通返利和需要年度补充则抛出异常 + if ( argument.getBusinessType().equals(TzcArgTypes.LevelReturn.name()) || !hasCompensationFlag ){ + Assert.throwEx("坎级("+levelNum+")基于增量但未设置最高返利金额,预算占用计算失败"); + } + } + } + } + if (argAmount.compareTo(currentArgAmount)>0){ + currentArgAmount = argAmount; } } } diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplicationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplicationServiceImpl.java index 73be8c8..89bc056 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplicationServiceImpl.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplicationServiceImpl.java @@ -216,8 +216,22 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ configList.add(config); } + // 获取区间目标最高金额 + BigDecimal maxPeriodTarAmount = BigDecimal.ZERO; + // 判断是否有补偿 + boolean hasCompensationFlag = false; + for (TzcRebatePeriodParam periodParam : param.getPeriodList()) { + if(periodParam.getPeriodAmount().compareTo(maxPeriodTarAmount)>0){ + maxPeriodTarAmount = periodParam.getPeriodAmount(); + if (periodParam.getCompensationFlag().equals(1)){ + hasCompensationFlag = true; + } + } + } + // 获取最高坎级返回的金额(叠加金额) - BigDecimal maxAmount = tzcRebateApplication4CostService.getMaxLevelsAmount(levelsList, argumentList, configList); + BigDecimal maxAmount = tzcRebateApplication4CostService.getMaxLevelsAmount( + levelsList, argumentList, configList,maxPeriodTarAmount,hasCompensationFlag); BigDecimal totalAllAmount = maxAmount.multiply(new BigDecimal(param.getPeriodList().size())); String periodMsg = "坎级叠加最高金额为:"+maxAmount; // 判断是否超预算