|
|
@ -44,6 +44,7 @@ import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.*; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
@ -196,7 +197,7 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
|
|
|
|
// 保存坎级和设置参数
|
|
|
|
List<TzcRebateLevelsArgument> argumentList = new ArrayList<>(); |
|
|
|
List<TzcRebateLevels> levelsList = this.saveLevelListAndArgs(param.getLevelsList(), rebateId,argumentList); |
|
|
|
List<TzcRebateLevels> levelsList = this.saveLevelListAndArgs(param, rebateId,argumentList); |
|
|
|
|
|
|
|
// 返利的商品,关联主表id和code
|
|
|
|
for (TzcRebateGoods rebateGoods : tzcRebateGoodsList) { |
|
|
@ -386,13 +387,27 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
|
|
|
|
/** |
|
|
|
* 保存坎级和设置参数 |
|
|
|
* @param levelsParamList |
|
|
|
* @param param |
|
|
|
* @param rebateId |
|
|
|
* @param argumentList |
|
|
|
*/ |
|
|
|
private List<TzcRebateLevels> saveLevelListAndArgs(List<TzcRebateLevelsParam> levelsParamList, |
|
|
|
private List<TzcRebateLevels> saveLevelListAndArgs(TzcRebateParam param, |
|
|
|
Long rebateId, |
|
|
|
List<TzcRebateLevelsArgument> argumentList) { |
|
|
|
// 期间最大的同期金额
|
|
|
|
BigDecimal maxSameAmt = BigDecimal.ZERO; |
|
|
|
// 期间最大的目标金额
|
|
|
|
BigDecimal maxTargetAmt = BigDecimal.ZERO; |
|
|
|
for (TzcRebatePeriodParam periodParam : param.getPeriodList()) { |
|
|
|
if (periodParam.getPeriodAmount()!=null && periodParam.getPeriodAmount().compareTo(maxTargetAmt)>0){ |
|
|
|
maxTargetAmt = periodParam.getPeriodAmount(); |
|
|
|
} |
|
|
|
if (periodParam.getSamePeriodAmount()!= null && periodParam.getSamePeriodAmount().compareTo(maxSameAmt)>0){ |
|
|
|
maxSameAmt = periodParam.getSamePeriodAmount(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
List<TzcRebateLevelsParam> levelsParamList = param.getLevelsList(); |
|
|
|
List<TzcRebateLevels> levelsList = new ArrayList<>(); |
|
|
|
for (TzcRebateLevelsParam levelsParam : levelsParamList) { |
|
|
|
TzcRebateLevels levels = new TzcRebateLevels(); |
|
|
@ -412,13 +427,35 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
levelsList.add(levels); |
|
|
|
Long levelId = levels.getId(); |
|
|
|
|
|
|
|
// 年度补偿返利
|
|
|
|
TzcRebateLevelsArgument argument = buildArgByParam(levelsParam.getOverallTargetArgument()); |
|
|
|
argument.setBusinessType(TzcArgTypes.LevelOverallReturn.name()); |
|
|
|
argument.setLevelId(levelId); |
|
|
|
argument.setRebateId(rebateId); |
|
|
|
tzcRebateLevelsArgumentService.save(argument); |
|
|
|
|
|
|
|
TzcRebateLevelsArgument argument2 = buildArgByParam(levelsParam.getTargetArgument()); |
|
|
|
// 目标返利
|
|
|
|
TzcRebateArgumentParam targetArgument = levelsParam.getTargetArgument(); |
|
|
|
TzcRebateLevelsArgument argument2 = buildArgByParam(targetArgument); |
|
|
|
// 最高返利上限如果为空,流程修改
|
|
|
|
if (argument2.getMaxReturn()==null){ |
|
|
|
// 如果设置固定金额,则返利上限 = 返利固定金额
|
|
|
|
if (argument2.getRateAmtFlag()==1){ |
|
|
|
argument2.setMaxReturn(argument2.getReturnFixed()); |
|
|
|
}else { |
|
|
|
if (levels.getConditionSelect()==1){ |
|
|
|
// 匹配条件为固定金额情况:返利上限 = 条件的固定金额 * 返利比率
|
|
|
|
argument2.setMaxReturn(levels.getConditionAmountEnd().multiply(argument2.getReturnRate() |
|
|
|
.divide(BigDecimal.valueOf(100),2, RoundingMode.HALF_UP))); |
|
|
|
}else { |
|
|
|
// 匹配条件为百分比情况:返利上限 = 符合条件的金额A * 返利比率
|
|
|
|
// 符合条件的金额A-为期间最高的同期金额或者期间最高目标金额
|
|
|
|
BigDecimal allowAmt = levels.getConditionType()==0?maxSameAmt:maxTargetAmt; |
|
|
|
argument2.setMaxReturn(allowAmt.multiply(argument2.getReturnRate() |
|
|
|
.divide(BigDecimal.valueOf(100),2, RoundingMode.HALF_UP))); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
argument2.setBusinessType(TzcArgTypes.LevelReturn.name()); |
|
|
|
argument2.setLevelId(levelId); |
|
|
|
argument2.setRebateId(rebateId); |
|
|
@ -651,9 +688,13 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
// Assert.throwEx("科目额度合计异常金额:"+totalAmount+"元");
|
|
|
|
// }
|
|
|
|
|
|
|
|
boolean isCompensation = false; |
|
|
|
List<TzcRebatePeriodParam> periodList = param.getPeriodList(); |
|
|
|
for (int i = 0; i < periodList.size(); i++) { |
|
|
|
TzcRebatePeriodParam period = periodList.get(i); |
|
|
|
if (period.getCompensationFlag()!=null&&period.getCompensationFlag().equals(1)){ |
|
|
|
isCompensation = true; |
|
|
|
} |
|
|
|
for (int j = i + 1; j < periodList.size(); j++) { |
|
|
|
TzcRebatePeriodParam period2 = periodList.get(j); |
|
|
|
if (period.getPeriodEndDate().compareTo(period2.getPeriodStartDate()) >= 0 |
|
|
@ -673,7 +714,9 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
this.checkSameLevelSameSettings(entry.getKey(), levelsList); |
|
|
|
TzcRebateLevelsParam levels = levelsList.get(0); |
|
|
|
levels.getTargetArgument().check("返利"); |
|
|
|
levels.getOverallTargetArgument().check("总目标返利"); |
|
|
|
if (isCompensation){ |
|
|
|
levels.getOverallTargetArgument().check("总目标返利"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|