Browse Source

feat(rebate): 返利的预算金额匹配规则变更

master
Yen 2 months ago
parent
commit
e988cc5d73
  1. 6
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4CostService.java
  2. 39
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java
  3. 16
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplicationServiceImpl.java

6
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 levelsList
* @param argumentList * @param argumentList
* @param configList * @param configList
* @param maxPeriodAmt 区间最高目标金额
* @return * @return
*/ */
BigDecimal getMaxLevelsAmount(List<TzcRebateLevels> levelsList, BigDecimal getMaxLevelsAmount(List<TzcRebateLevels> levelsList,
List<TzcRebateLevelsArgument> argumentList, List<TzcRebateLevelsArgument> argumentList,
List<TzcRebateLevelsConfig> configList); List<TzcRebateLevelsConfig> configList,
BigDecimal maxPeriodAmt,
boolean hasCompensationFlag
);
/** /**
* 获取最高命中返利坎级的信息及坎级列表 * 获取最高命中返利坎级的信息及坎级列表

39
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 cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.common.utils.CopierUtil;
import com.qs.serve.modules.tbs.common.TbsActivityState; import com.qs.serve.modules.tbs.common.TbsActivityState;
import com.qs.serve.modules.tbs.common.TbsCostApplyState; import com.qs.serve.modules.tbs.common.TbsCostApplyState;
@ -301,7 +302,9 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
@Override @Override
public BigDecimal getMaxLevelsAmount(List<TzcRebateLevels> levelsList, public BigDecimal getMaxLevelsAmount(List<TzcRebateLevels> levelsList,
List<TzcRebateLevelsArgument> argumentList, List<TzcRebateLevelsArgument> argumentList,
List<TzcRebateLevelsConfig> configList){ List<TzcRebateLevelsConfig> configList,
BigDecimal maxPeriodAmt,
boolean hasCompensationFlag){
BigDecimal maxAmount = BigDecimal.ZERO; BigDecimal maxAmount = BigDecimal.ZERO;
for (TzcRebateLevelsConfig config : configList) { for (TzcRebateLevelsConfig config : configList) {
Set<String> levelNumSet = Arrays.stream(config.getLevelConfigs()).collect(Collectors.toSet()); Set<String> levelNumSet = Arrays.stream(config.getLevelConfigs()).collect(Collectors.toSet());
@ -311,7 +314,8 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
for (String levelNumStr : levelNumSet) { for (String levelNumStr : levelNumSet) {
int levelNum = Integer.parseInt(levelNumStr); 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){ if (currentLevelMaxAmount.compareTo(BigDecimal.ZERO)>0){
currentConfAmount = currentConfAmount.add(currentLevelMaxAmount); currentConfAmount = currentConfAmount.add(currentLevelMaxAmount);
} }
@ -331,7 +335,11 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
* @return * @return
*/ */
@NotNull @NotNull
private BigDecimal getCurrentLevelMaxAmount(List<TzcRebateLevels> levelsList, List<TzcRebateLevelsArgument> argumentList, int levelNum) { private BigDecimal getCurrentLevelMaxAmount(List<TzcRebateLevels> levelsList,
List<TzcRebateLevelsArgument> argumentList,
int levelNum,
BigDecimal maxPeriodAmt,
boolean hasCompensationFlag) {
BigDecimal currentLevelMaxAmount = BigDecimal.ZERO; BigDecimal currentLevelMaxAmount = BigDecimal.ZERO;
for (TzcRebateLevels levels : levelsList) { for (TzcRebateLevels levels : levelsList) {
if(levels.getLevelNum()== levelNum){ if(levels.getLevelNum()== levelNum){
@ -339,8 +347,29 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
BigDecimal currentArgAmount = BigDecimal.ZERO; BigDecimal currentArgAmount = BigDecimal.ZERO;
for (TzcRebateLevelsArgument argument : argumentList) { for (TzcRebateLevelsArgument argument : argumentList) {
if(argument.getLevelId().equals(levels.getId())){ if(argument.getLevelId().equals(levels.getId())){
if (argument.getMaxReturn().compareTo(currentArgAmount)>0){ BigDecimal argAmount = BigDecimal.ZERO;
currentArgAmount = argument.getMaxReturn(); // 使用最高金额
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;
} }
} }
} }

16
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); 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())); BigDecimal totalAllAmount = maxAmount.multiply(new BigDecimal(param.getPeriodList().size()));
String periodMsg = "坎级叠加最高金额为:"+maxAmount; String periodMsg = "坎级叠加最高金额为:"+maxAmount;
// 判断是否超预算 // 判断是否超预算

Loading…
Cancel
Save