|
@ -2,7 +2,7 @@ package com.qs.serve.modules.tzc.service.impl; |
|
|
|
|
|
|
|
|
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.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; |
|
|
import com.qs.serve.modules.tbs.entity.*; |
|
|
import com.qs.serve.modules.tbs.entity.*; |
|
@ -10,6 +10,8 @@ import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; |
|
|
import com.qs.serve.modules.tbs.service.*; |
|
|
import com.qs.serve.modules.tbs.service.*; |
|
|
import com.qs.serve.modules.tzc.consts.TzcArgTypes; |
|
|
import com.qs.serve.modules.tzc.consts.TzcArgTypes; |
|
|
import com.qs.serve.modules.tzc.entity.*; |
|
|
import com.qs.serve.modules.tzc.entity.*; |
|
|
|
|
|
import com.qs.serve.modules.tzc.entity.dto.TzcRebateCalculateDTO; |
|
|
|
|
|
import com.qs.serve.modules.tzc.entity.dto.TzcRebateLevelAmountDTO; |
|
|
import com.qs.serve.modules.tzc.service.*; |
|
|
import com.qs.serve.modules.tzc.service.*; |
|
|
import lombok.AllArgsConstructor; |
|
|
import lombok.AllArgsConstructor; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
@ -329,7 +331,10 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public TzcRebateLevels getHitRebateMaxLevel(BigDecimal dispatchAmt,BigDecimal sameDispatchAmt,Long rebatePeriodId) { |
|
|
public TzcRebateCalculateDTO getHitRebateMaxLevel(BigDecimal dispatchAmt, |
|
|
|
|
|
BigDecimal sameDispatchAmt, |
|
|
|
|
|
Long rebatePeriodId) { |
|
|
|
|
|
TzcRebateCalculateDTO dto = new TzcRebateCalculateDTO(); |
|
|
// 判断是否同期
|
|
|
// 判断是否同期
|
|
|
int samePeriodFlag = sameDispatchAmt.compareTo(BigDecimal.ZERO)==0?0:1; |
|
|
int samePeriodFlag = sameDispatchAmt.compareTo(BigDecimal.ZERO)==0?0:1; |
|
|
TzcRebatePeriod rebatePeriod = tzcRebatePeriodService.getById(rebatePeriodId); |
|
|
TzcRebatePeriod rebatePeriod = tzcRebatePeriodService.getById(rebatePeriodId); |
|
@ -340,6 +345,7 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio |
|
|
.eq(TzcRebateLevels::getSamePeriodFlag, samePeriodFlag) |
|
|
.eq(TzcRebateLevels::getSamePeriodFlag, samePeriodFlag) |
|
|
.orderByDesc(TzcRebateLevels::getLevelNum) |
|
|
.orderByDesc(TzcRebateLevels::getLevelNum) |
|
|
); |
|
|
); |
|
|
|
|
|
dto.setSamePeriodLevelList(levelsList); |
|
|
// 命中的最高坎级
|
|
|
// 命中的最高坎级
|
|
|
for (TzcRebateLevels levels : levelsList) { |
|
|
for (TzcRebateLevels levels : levelsList) { |
|
|
// 条件选择:0-百分比;1-固定金额
|
|
|
// 条件选择:0-百分比;1-固定金额
|
|
@ -357,21 +363,118 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio |
|
|
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP) |
|
|
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP) |
|
|
)>=0; |
|
|
)>=0; |
|
|
if (!ok){ |
|
|
if (!ok){ |
|
|
log.debug("命中坎级:"+levels.getLevelNum()+",条件比重:"+levels.getConditionRate()+"%"); |
|
|
log.debug("命中最高坎级:"+levels.getLevelNum()+",条件比重:"+levels.getConditionRate()+"%"); |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
return levels; |
|
|
dto.setMaxLevels(levels); |
|
|
|
|
|
return dto; |
|
|
}else if (levels.getConditionSelect().equals(1)){ |
|
|
}else if (levels.getConditionSelect().equals(1)){ |
|
|
// 发货金额大于坎级制定的固定金额
|
|
|
// 发货金额大于坎级制定的固定金额
|
|
|
boolean ok = dispatchAmt.compareTo(levels.getConditionAmount())>=0; |
|
|
boolean ok = dispatchAmt.compareTo(levels.getConditionAmount())>=0; |
|
|
if (!ok){ |
|
|
if (!ok){ |
|
|
log.debug("命中坎级:"+levels.getLevelNum()+",条件固定金额:"+levels.getConditionAmount()); |
|
|
log.debug("命中最高坎级:"+levels.getLevelNum()+",条件固定金额:"+levels.getConditionAmount()); |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
return levels; |
|
|
dto.setMaxLevels(levels); |
|
|
|
|
|
return dto; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return null; |
|
|
return null; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public List<TzcRebateLevelAmountDTO> calculateRebate(TzcRebateCalculateDTO dto, |
|
|
|
|
|
BigDecimal dispatchAmt, |
|
|
|
|
|
BigDecimal sameDispatchAmt, |
|
|
|
|
|
TzcArgTypes argType) { |
|
|
|
|
|
if (dto==null){ |
|
|
|
|
|
log.debug("没有命中坎级"); |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
TzcRebateLevels levels = dto.getMaxLevels(); |
|
|
|
|
|
List<TzcRebateLevels> allRebateLvList = dto.getSamePeriodLevelList(); |
|
|
|
|
|
|
|
|
|
|
|
TzcRebateLevelsConfig levelsConfig = tzcRebateLevelsConfigService.getOne( |
|
|
|
|
|
new LambdaQueryWrapper<TzcRebateLevelsConfig>() |
|
|
|
|
|
.eq(TzcRebateLevelsConfig::getRebateId, levels.getRebateId()) |
|
|
|
|
|
.eq(TzcRebateLevelsConfig::getLevelNum, levels.getLevelNum()) |
|
|
|
|
|
,false |
|
|
|
|
|
); |
|
|
|
|
|
String[] configArr; |
|
|
|
|
|
if (levelsConfig==null){ |
|
|
|
|
|
log.warn("没有坎级配置:"+levels.getLevelNum()+";返利ID:"+levels.getRebateId()); |
|
|
|
|
|
configArr = new String[]{levels.getLevelNum()+""}; |
|
|
|
|
|
}else { |
|
|
|
|
|
log.debug("读取坎级配置,坎级:"+levels.getLevelNum()); |
|
|
|
|
|
configArr = levelsConfig.getLevelConfigs(); |
|
|
|
|
|
} |
|
|
|
|
|
// 获取命中的坎级
|
|
|
|
|
|
List<TzcRebateLevels> hitLevelsList = new ArrayList<>(); |
|
|
|
|
|
for (TzcRebateLevels lv : allRebateLvList) { |
|
|
|
|
|
for (String levelNum : configArr) { |
|
|
|
|
|
if (lv.getLevelNum().toString().equals(levelNum)){ |
|
|
|
|
|
hitLevelsList.add(lv); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 加载返利参数
|
|
|
|
|
|
List<Long> hitLevelsIds = hitLevelsList.stream().map(TzcRebateLevels::getId).collect(Collectors.toList()); |
|
|
|
|
|
List<TzcRebateLevelsArgument> argumentList = tzcRebateLevelsArgumentService.list( |
|
|
|
|
|
new LambdaQueryWrapper<TzcRebateLevelsArgument>() |
|
|
|
|
|
.eq(TzcRebateLevelsArgument::getRebateId, levels.getRebateId()) |
|
|
|
|
|
.in(TzcRebateLevelsArgument::getLevelId,hitLevelsIds) |
|
|
|
|
|
); |
|
|
|
|
|
Map<Long,List<TzcRebateLevelsArgument>> argumentListMap = argumentList.stream() |
|
|
|
|
|
.collect(Collectors.groupingBy(TzcRebateLevelsArgument::getLevelId)); |
|
|
|
|
|
|
|
|
|
|
|
// 进行返利叠加
|
|
|
|
|
|
List<TzcRebateLevelAmountDTO> levelAmountDTOList = new ArrayList<>(); |
|
|
|
|
|
for (TzcRebateLevels rebateLevels : hitLevelsList) { |
|
|
|
|
|
log.debug("读取坎级配置,坎级:"+rebateLevels.getLevelNum()); |
|
|
|
|
|
List<TzcRebateLevelsArgument> arguments = argumentListMap.get(rebateLevels.getId()); |
|
|
|
|
|
TzcRebateLevelsArgument currentArgument = null; |
|
|
|
|
|
for (TzcRebateLevelsArgument argument : arguments) { |
|
|
|
|
|
if (argument.getBusinessType().equals(argType.name())){ |
|
|
|
|
|
currentArgument = argument; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (currentArgument==null){ |
|
|
|
|
|
log.error("没有命中坎级参数:"+argType.name()); |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
TzcRebateLevelAmountDTO rebateLevelsDTO = CopierUtil.copy(rebateLevels,new TzcRebateLevelAmountDTO()); |
|
|
|
|
|
rebateLevelsDTO.setArgument(currentArgument); |
|
|
|
|
|
rebateLevelsDTO.setMaxReturn(currentArgument.getMaxReturn()); |
|
|
|
|
|
// 选择的策略:0-百分比;1-固定金额
|
|
|
|
|
|
if (currentArgument.getRateAmtFlag().equals(1)){ |
|
|
|
|
|
rebateLevelsDTO.setReturnAmt(currentArgument.getReturnFixed()); |
|
|
|
|
|
}else if (currentArgument.getRateAmtFlag().equals(0)){ |
|
|
|
|
|
//目标销量维度:0-总量;1-增量
|
|
|
|
|
|
if (currentArgument.getSumAddFlag().equals(0)){ |
|
|
|
|
|
BigDecimal rs = dispatchAmt.multiply(currentArgument.getReturnRate()) |
|
|
|
|
|
.divide(BigDecimal.valueOf(100),2,RoundingMode.HALF_UP); |
|
|
|
|
|
rebateLevelsDTO.setReturnAmt(rs); |
|
|
|
|
|
}else if (currentArgument.getSumAddFlag().equals(1)){ |
|
|
|
|
|
// 增量 = (发货金额 - 同比发货金额) * 返利比例 / 100
|
|
|
|
|
|
BigDecimal rs = dispatchAmt.subtract(sameDispatchAmt) |
|
|
|
|
|
.multiply(currentArgument.getReturnRate()) |
|
|
|
|
|
.divide(BigDecimal.valueOf(100),2,RoundingMode.HALF_UP); |
|
|
|
|
|
if (rs.compareTo(BigDecimal.ZERO)>0){ |
|
|
|
|
|
rebateLevelsDTO.setReturnAmt(rs); |
|
|
|
|
|
}else { |
|
|
|
|
|
rebateLevelsDTO.setReturnAmt(BigDecimal.ZERO); |
|
|
|
|
|
log.warn("返利参数TzcRebateLevelsArgument-ID:{},返利金额小于0",currentArgument.getId()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
// 记录坎级返利金额
|
|
|
|
|
|
rebateLevelsDTO.setLevelReturnAmt(rebateLevelsDTO.getReturnAmt()); |
|
|
|
|
|
levelAmountDTOList.add(rebateLevelsDTO); |
|
|
|
|
|
} |
|
|
|
|
|
return levelAmountDTOList; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|