|
|
@ -18,6 +18,7 @@ import com.qs.serve.modules.tbs.service.TbsCenterDtoService; |
|
|
|
import com.qs.serve.modules.tzc.consts.TzcArgTypes; |
|
|
|
import com.qs.serve.modules.tzc.entity.*; |
|
|
|
import com.qs.serve.modules.tzc.entity.bo.*; |
|
|
|
import com.qs.serve.modules.tzc.entity.vo.TzcRebateLevelsVo; |
|
|
|
import com.qs.serve.modules.tzc.entity.vo.TzcRebatePeriodVo; |
|
|
|
import com.qs.serve.modules.tzc.entity.vo.TzcRebateSubjectVo; |
|
|
|
import com.qs.serve.modules.tzc.entity.vo.TzcRebateVo; |
|
|
@ -31,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.stream.Collectors; |
|
|
@ -72,18 +74,43 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
List<TzcRebateGoods> goodsList = tzcRebateGoodsService.list(qw); |
|
|
|
List<TzcRebateLevelsConfig> configList = tzcRebateLevelsConfigService.list(qw); |
|
|
|
List<TzcRebateCenter> centerList = tzcRebateCenterService.list(qw); |
|
|
|
List<TzcRebateLevels> levelsList = tzcRebateLevelsService.list(qw); |
|
|
|
|
|
|
|
List<TzcRebateLevelsVo> levelsVoList = buildLevelVoList(argumentList, levelsList); |
|
|
|
tzcRebateVo.setLevelsList(levelsVoList); |
|
|
|
|
|
|
|
List<TzcRebateSubjectVo> subjectVoList = buildSubjectVoList(subjectList, centerList); |
|
|
|
tzcRebateVo.setSubjectList(subjectVoList); |
|
|
|
|
|
|
|
List<TzcRebatePeriodVo> periodVoList = buildPeriodVoList(argumentList, periodList); |
|
|
|
tzcRebateVo.setPeriodList(periodVoList); |
|
|
|
|
|
|
|
tzcRebateVo.setGoodsList(goodsList); |
|
|
|
tzcRebateVo.setConfigList(configList); |
|
|
|
|
|
|
|
return tzcRebateVo; |
|
|
|
} |
|
|
|
|
|
|
|
@NotNull |
|
|
|
private List<TzcRebateLevelsVo> buildLevelVoList(List<TzcRebateLevelsArgument> argumentList, List<TzcRebateLevels> levelsList) { |
|
|
|
List<TzcRebateLevelsVo> levelsVoList = new ArrayList<>(); |
|
|
|
for (TzcRebateLevels levels : levelsList) { |
|
|
|
TzcRebateLevelsVo levelsVo = CopierUtil.copy(levels,new TzcRebateLevelsVo()); |
|
|
|
for (TzcRebateLevelsArgument argument : argumentList) { |
|
|
|
if(argument.getLevelId().equals(levels.getId())){ |
|
|
|
if (argument.getBusinessType().equals(TzcArgTypes.LevelReturn.name())){ |
|
|
|
levelsVo.setTargetArgument(argument); |
|
|
|
}else if (argument.getBusinessType().equals(TzcArgTypes.LevelOverallReturn.name())){ |
|
|
|
levelsVo.setOverallTargetArgument(argument); |
|
|
|
}else { |
|
|
|
Assert.throwEx("坎级参数类型错误"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return levelsVoList; |
|
|
|
} |
|
|
|
|
|
|
|
@NotNull |
|
|
|
private List<TzcRebateSubjectVo> buildSubjectVoList(List<TzcRebateSubject> subjectList, List<TzcRebateCenter> centerList) { |
|
|
|
List<TzcRebateSubjectVo> subjectVoList = new ArrayList<>(); |
|
|
@ -136,9 +163,15 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
rebateCode = "FL"+CodeGenUtil.generate(CodeGenUtil.SourceKey.TZC_REBATE); |
|
|
|
} |
|
|
|
|
|
|
|
// 校验返利参数
|
|
|
|
// 校验返利参数(取消判断金额)
|
|
|
|
this.validRebateParam(param); |
|
|
|
|
|
|
|
// 获取最高坎级返回的金额
|
|
|
|
BigDecimal maxAmount = this.getMaxLevelsAmount(param); |
|
|
|
// 计算和平摊到科目和成本中心(不再读取前端的金额)
|
|
|
|
List<TzcRebateSubjectParam> subjectParamList = param.getSubjectList(); |
|
|
|
this.calculateSubjectAndCenter(subjectParamList, maxAmount); |
|
|
|
|
|
|
|
if (isUpdate){ |
|
|
|
//删除旧数据
|
|
|
|
this.removeOldRebateDataById(rebateId); |
|
|
@ -156,7 +189,7 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
rebateId = rebate.getId(); |
|
|
|
|
|
|
|
// 返利的商品
|
|
|
|
List<TzcRebateGoods> tzcRebateGoodsList = this.buildRebateGoodsList(param.getGoodsList()); |
|
|
|
List<TzcRebateGoods> tzcRebateGoodsList = this.buildRebateGoodsList(param.getGoodsType(),param.getGoodsList()); |
|
|
|
// 返利的商品,关联主表id和code
|
|
|
|
for (TzcRebateGoods rebateGoods : tzcRebateGoodsList) { |
|
|
|
rebateGoods.setRebateId(rebate.getId()); |
|
|
@ -187,6 +220,100 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
return rebate; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 计算和平摊到科目和成本中心(不再读取前端的金额) |
|
|
|
* 均摊TzcRebateSubjectParam的subjectAmount |
|
|
|
* 根据subjectAmount和centerRate均摊到TzcRebateCenterParam的centerAmount |
|
|
|
* @param subjectParamList |
|
|
|
* @param maxAmount |
|
|
|
*/ |
|
|
|
private void calculateSubjectAndCenter(List<TzcRebateSubjectParam> subjectParamList, BigDecimal maxAmount) { |
|
|
|
int subjectSize = subjectParamList.size(); |
|
|
|
BigDecimal totalRate = BigDecimal.ZERO; |
|
|
|
|
|
|
|
// 计算总的比例
|
|
|
|
for (TzcRebateSubjectParam subjectParam : subjectParamList) { |
|
|
|
totalRate = totalRate.add(subjectParam.getSubjectRate()); |
|
|
|
} |
|
|
|
|
|
|
|
BigDecimal remainingAmount = maxAmount; |
|
|
|
for (int i = 0; i < subjectSize; i++) { |
|
|
|
TzcRebateSubjectParam subjectParam = subjectParamList.get(i); |
|
|
|
BigDecimal subjectRate = subjectParam.getSubjectRate(); |
|
|
|
BigDecimal subjectAmount; |
|
|
|
|
|
|
|
if (i == subjectSize - 1) { |
|
|
|
// 最后一个科目获得剩余金额
|
|
|
|
subjectAmount = remainingAmount; |
|
|
|
} else { |
|
|
|
subjectAmount = maxAmount.multiply(subjectRate).divide(totalRate, 2, BigDecimal.ROUND_HALF_UP); |
|
|
|
remainingAmount = remainingAmount.subtract(subjectAmount); |
|
|
|
} |
|
|
|
|
|
|
|
subjectParam.setSubjectAmount(subjectAmount); |
|
|
|
|
|
|
|
// 处理成本中心
|
|
|
|
List<TzcRebateCenterParam> centerList = subjectParam.getCenterList(); |
|
|
|
int centerSize = centerList.size(); |
|
|
|
BigDecimal totalCenterRate = BigDecimal.ZERO; |
|
|
|
|
|
|
|
// 计算成本中心的总比例
|
|
|
|
for (TzcRebateCenterParam centerParam : centerList) { |
|
|
|
totalCenterRate = totalCenterRate.add(centerParam.getCenterRate()); |
|
|
|
} |
|
|
|
|
|
|
|
BigDecimal remainingCenterAmount = subjectAmount; |
|
|
|
for (int j = 0; j < centerSize; j++) { |
|
|
|
TzcRebateCenterParam centerParam = centerList.get(j); |
|
|
|
BigDecimal centerRate = centerParam.getCenterRate(); |
|
|
|
BigDecimal centerAmount; |
|
|
|
|
|
|
|
if (j == centerSize - 1) { |
|
|
|
// 最后一个成本中心获得剩余金额
|
|
|
|
centerAmount = remainingCenterAmount; |
|
|
|
} else { |
|
|
|
centerAmount = subjectAmount.multiply(centerRate).divide(totalCenterRate, 2, BigDecimal.ROUND_HALF_UP); |
|
|
|
remainingCenterAmount = remainingCenterAmount.subtract(centerAmount); |
|
|
|
} |
|
|
|
|
|
|
|
centerParam.setCenterAmount(centerAmount); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取最高坎级返回的金额 |
|
|
|
* @param param |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public BigDecimal getMaxLevelsAmount(TzcRebateParam param){ |
|
|
|
int level = 0; |
|
|
|
String config = ""; |
|
|
|
for (TzcRebateLevelsConfigParam configParam : param.getConfigList()) { |
|
|
|
if(configParam.getLevelNum()>level){ |
|
|
|
level = configParam.getLevelNum(); |
|
|
|
config = configParam.getLevelConfigs(); |
|
|
|
} |
|
|
|
} |
|
|
|
String[] configArr = config.split(","); |
|
|
|
BigDecimal maxAmount = BigDecimal.ZERO; |
|
|
|
for (TzcRebateLevelsParam levelsParam : param.getLevelsList()) { |
|
|
|
String lvNum = levelsParam.getLevelNum()+""; |
|
|
|
for (String levelNum : configArr) { |
|
|
|
if(lvNum.equals(levelNum)){ |
|
|
|
BigDecimal amt1 = levelsParam.getTargetArgument().getMaxReturnAmt(); |
|
|
|
BigDecimal amt2 = levelsParam.getOverallTargetArgument().getMaxReturnAmt(); |
|
|
|
if(amt1.compareTo(amt2)>0){ |
|
|
|
maxAmount = amt1; |
|
|
|
}else { |
|
|
|
maxAmount = amt2; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return maxAmount; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 保存坎级和设置参数 |
|
|
|
* @param param |
|
|
@ -343,27 +470,32 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
} |
|
|
|
|
|
|
|
@NotNull |
|
|
|
private List<TzcRebateGoods> buildRebateGoodsList(List<TzcRebateGoodsParam> goodsList) { |
|
|
|
private List<TzcRebateGoods> buildRebateGoodsList(String goodsTypeAll,List<TzcRebateGoodsParam> goodsList) { |
|
|
|
List<TzcRebateGoods> tzcRebateGoodsList = new ArrayList<>(); |
|
|
|
// 方式一:支持多种
|
|
|
|
// Map<String,List<TzcRebateGoodsParam>> goodsListMap = goodsList.stream()
|
|
|
|
// .collect(Collectors.groupingBy(TzcRebateGoodsParam::getGoodsType));
|
|
|
|
// for (Map.Entry<String, List<TzcRebateGoodsParam>> entry : goodsListMap.entrySet()) {
|
|
|
|
// String goodsType = entry.getKey();
|
|
|
|
// List<TzcRebateGoodsParam> goodsParamList = entry.getValue();
|
|
|
|
// List<GoodsTargetInfo> goodsTargetList = goodsApplicationService.getGoodsTargetInfo(goodsType,goodsParamList.stream()
|
|
|
|
// .map(TzcRebateGoodsParam::getGoodsId).collect(Collectors.toList()));
|
|
|
|
// for (GoodsTargetInfo targetInfo : goodsTargetList) {
|
|
|
|
// TzcRebateGoods rebateGoods = CopierUtil.copy(targetInfo,new TzcRebateGoods());
|
|
|
|
// for (TzcRebateGoodsParam goodsParam : goodsParamList) {
|
|
|
|
// if(goodsParam.getGoodsId().equals(targetInfo.getTargetId())){
|
|
|
|
// rebateGoods.setTmpUk(goodsParam.getTmpUk());
|
|
|
|
// rebateGoods.setRemark(goodsParam.getRemark());
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// tzcRebateGoodsList.add(rebateGoods);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// 方式二:只支持一种,兼容旧活动接口参数
|
|
|
|
Map<String,List<TzcRebateGoodsParam>> goodsListMap = new HashMap<>(); |
|
|
|
goodsListMap.put(goodsTypeAll,goodsList); |
|
|
|
|
|
|
|
for (Map.Entry<String, List<TzcRebateGoodsParam>> entry : goodsListMap.entrySet()) { |
|
|
|
String goodsType = entry.getKey(); |
|
|
|
List<TzcRebateGoodsParam> goodsParamList = entry.getValue(); |
|
|
|
List<GoodsTargetInfo> goodsTargetList = goodsApplicationService.getGoodsTargetInfo(goodsType,goodsParamList.stream() |
|
|
|
.map(TzcRebateGoodsParam::getGoodsId).collect(Collectors.toList())); |
|
|
|
for (GoodsTargetInfo targetInfo : goodsTargetList) { |
|
|
|
TzcRebateGoods rebateGoods = CopierUtil.copy(targetInfo,new TzcRebateGoods()); |
|
|
|
for (TzcRebateGoodsParam goodsParam : goodsParamList) { |
|
|
|
if(goodsParam.getGoodsId().equals(targetInfo.getTargetId())){ |
|
|
|
rebateGoods.setTmpUk(goodsParam.getTmpUk()); |
|
|
|
rebateGoods.setRemark(goodsParam.getRemark()); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
tzcRebateGoodsList.add(rebateGoods); |
|
|
|
} |
|
|
|
} |
|
|
|
return tzcRebateGoodsList; |
|
|
|
} |
|
|
|
|
|
|
@ -381,9 +513,9 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
if(centerParam.getCenterRate().compareTo(BigDecimal.ZERO)<0){ |
|
|
|
Assert.throwEx("成本中心占比不能小于0"); |
|
|
|
} |
|
|
|
if(centerParam.getCenterAmount().compareTo(BigDecimal.ZERO)<0){ |
|
|
|
Assert.throwEx("成本中心额度不能小于0"); |
|
|
|
} |
|
|
|
// if(centerParam.getCenterAmount().compareTo(BigDecimal.ZERO)<0){
|
|
|
|
// Assert.throwEx("成本中心额度不能小于0");
|
|
|
|
// }
|
|
|
|
totalCenterRate = totalCenterRate.add(centerParam.getCenterRate()); |
|
|
|
totalCenterAmount = totalCenterAmount.add(centerParam.getCenterAmount()); |
|
|
|
} |
|
|
@ -396,9 +528,9 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
if(subjectParam.getSubjectRate().compareTo(BigDecimal.ZERO)<0){ |
|
|
|
Assert.throwEx("科目占比不能小于0"); |
|
|
|
} |
|
|
|
if(subjectParam.getSubjectAmount().compareTo(BigDecimal.ZERO)<0){ |
|
|
|
Assert.throwEx("科目额度不能小于0"); |
|
|
|
} |
|
|
|
// if(subjectParam.getSubjectAmount().compareTo(BigDecimal.ZERO)<0){
|
|
|
|
// Assert.throwEx("科目额度不能小于0");
|
|
|
|
// }
|
|
|
|
totalRate = totalRate.add(subjectParam.getSubjectRate()); |
|
|
|
totalAmount = totalAmount.add(subjectParam.getSubjectAmount()); |
|
|
|
|
|
|
@ -406,9 +538,9 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
if(totalRate.compareTo(oneHundred)!=0){ |
|
|
|
Assert.throwEx("科目占比合计["+totalRate+"%]不为100%"); |
|
|
|
} |
|
|
|
if(totalAmount.compareTo(param.getRebateAmount())!=0){ |
|
|
|
Assert.throwEx("科目额度合计异常金额:"+totalAmount+"元"); |
|
|
|
} |
|
|
|
// if(totalAmount.compareTo(param.getRebateAmount())!=0){
|
|
|
|
// Assert.throwEx("科目额度合计异常金额:"+totalAmount+"元");
|
|
|
|
// }
|
|
|
|
|
|
|
|
List<TzcRebatePeriodParam> periodList = param.getPeriodList(); |
|
|
|
for (int i = 0; i < periodList.size(); i++) { |
|
|
@ -427,6 +559,21 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 坎级数字必须唯一
|
|
|
|
if(CollUtil.isNotEmpty(param.getLevelsList())){ |
|
|
|
Map<Integer,List<TzcRebateLevelsParam>> map = param.getLevelsList().stream() |
|
|
|
.collect(Collectors.groupingBy(TzcRebateLevelsParam::getLevelNum)); |
|
|
|
for (Map.Entry<Integer, List<TzcRebateLevelsParam>> entry : map.entrySet()) { |
|
|
|
List<TzcRebateLevelsParam> levelsList = entry.getValue(); |
|
|
|
if(levelsList.size()>1){ |
|
|
|
Assert.throwEx("坎级数字["+entry.getKey()+"]不能重复"); |
|
|
|
} |
|
|
|
TzcRebateLevelsParam levels = levelsList.get(0); |
|
|
|
levels.getTargetArgument().check("返利"); |
|
|
|
levels.getOverallTargetArgument().check("总目标返利"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 校验坎级叠加
|
|
|
|
if(ResultFlag.isTrue(param.getOverlayFlag())){ |
|
|
|
if(CollUtil.isEmpty(param.getConfigList())){ |
|
|
@ -435,9 +582,4 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void commitRebate(Long id) { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|