|
|
@ -2,6 +2,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.qs.serve.common.exception.Assert; |
|
|
|
import com.qs.serve.modules.erp.entity.so.ErpDispatchSumPmsQuery; |
|
|
|
import com.qs.serve.modules.erp.entity.vo.ErpDispatchSumPmsVo; |
|
|
|
import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; |
|
|
@ -15,6 +16,7 @@ import com.qs.serve.modules.tzc.entity.TzcRebateGoods; |
|
|
|
import com.qs.serve.modules.tzc.entity.TzcRebatePeriod; |
|
|
|
import com.qs.serve.modules.tzc.entity.dto.TzcRebateCalculateDTO; |
|
|
|
import com.qs.serve.modules.tzc.entity.dto.TzcRebateLevelAmountDTO; |
|
|
|
import com.qs.serve.modules.tzc.entity.qo.TzcGetActivityRebateQuery; |
|
|
|
import com.qs.serve.modules.tzc.service.*; |
|
|
|
import com.qs.serve.modules.vtb.entity.VtbVerification; |
|
|
|
import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; |
|
|
@ -24,6 +26,7 @@ import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.time.LocalDate; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.stream.Collectors; |
|
|
@ -60,77 +63,108 @@ public class TzcRebateApplication4VerificationServiceImpl implements TzcRebateAp |
|
|
|
private final ErpDispatchDataMapper erpDispatchDataMapper; |
|
|
|
|
|
|
|
@Override |
|
|
|
public Object getRebateBatchVerificationList(Long costApplyId) { |
|
|
|
TbsCostApply costApply = tbsCostApplyService.getById(costApplyId); |
|
|
|
public List<TzcRebateCalculateDTO> getRebateBatchVerificationList(List<TzcGetActivityRebateQuery> queryList) { |
|
|
|
|
|
|
|
List<Long> activityIds = queryList.stream() |
|
|
|
.map(TzcGetActivityRebateQuery::getActivityId).collect(Collectors.toList()); |
|
|
|
List<TbsActivity> activityList = tbsActivityMapper.selectBatchIds(activityIds); |
|
|
|
|
|
|
|
if (CollUtil.isEmpty(activityList)){ |
|
|
|
Assert.throwEx("无效的活动id"); |
|
|
|
} |
|
|
|
|
|
|
|
Long rebateId = activityList.get(0).getRebateId(); |
|
|
|
String supplierCode = activityList.get(0).getSupplierCode(); |
|
|
|
|
|
|
|
List<TzcRebatePeriod> tzcRebatePeriods = tzcRebatePeriodService.list( |
|
|
|
new LambdaQueryWrapper<TzcRebatePeriod>() |
|
|
|
.eq(TzcRebatePeriod::getRebateId, costApply.getRebateId()) |
|
|
|
.eq(TzcRebatePeriod::getRebateId, rebateId) |
|
|
|
// 过滤不需要补充的返利期间
|
|
|
|
.eq(TzcRebatePeriod::getCompensationFlag,1) |
|
|
|
); |
|
|
|
List<TzcRebateGoods> goodsList = tzcRebateGoodsService.list( |
|
|
|
new LambdaQueryWrapper<TzcRebateGoods>() |
|
|
|
.eq(TzcRebateGoods::getRebateId, costApply.getRebateId()) |
|
|
|
.eq(TzcRebateGoods::getRebateId, rebateId) |
|
|
|
); |
|
|
|
Map<String, List<TzcRebateGoods>> goodsMap = goodsList.stream() |
|
|
|
.collect(Collectors.groupingBy(TzcRebateGoods::getTargetType)); |
|
|
|
// 区间目标合计金额
|
|
|
|
BigDecimal totalPeriodAmt= BigDecimal.ZERO; |
|
|
|
// 同期进货合计金额
|
|
|
|
BigDecimal totalSamePeriodAmt= BigDecimal.ZERO; |
|
|
|
// 实际发货金额
|
|
|
|
BigDecimal totalDispatchAmt = BigDecimal.ZERO; |
|
|
|
List<TzcRebateCalculateDTO> calculateDTOList = new ArrayList<>(); |
|
|
|
for (TzcRebatePeriod period : tzcRebatePeriods) { |
|
|
|
totalPeriodAmt = totalPeriodAmt.add(period.getPeriodAmount()); |
|
|
|
totalSamePeriodAmt = totalSamePeriodAmt.add(period.getSamePeriodAmount()); |
|
|
|
BigDecimal dispatchAmt = this.getPeriodDispatch( |
|
|
|
costApply.getSupplierCode(), |
|
|
|
period.getPeriodStartDate(), |
|
|
|
period.getPeriodEndDate(), |
|
|
|
goodsMap); |
|
|
|
totalDispatchAmt = totalDispatchAmt.add(dispatchAmt); |
|
|
|
TbsActivity activity = null; |
|
|
|
for (TbsActivity tbsActivity : activityList) { |
|
|
|
if (tbsActivity.getRebatePeriodId().equals(period.getId())){ |
|
|
|
activity = tbsActivity; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if (activity == null){ |
|
|
|
Assert.throwEx("缺少有效的活动id"); |
|
|
|
} |
|
|
|
// 实际发货金额,方式一(前端传参)
|
|
|
|
BigDecimal dispatchAmt = null; |
|
|
|
for (TzcGetActivityRebateQuery query : queryList) { |
|
|
|
if (query.getActivityId().equals(activity.getId())){ |
|
|
|
// 获取发货金额
|
|
|
|
dispatchAmt = query.getDispatchAmount(); |
|
|
|
} |
|
|
|
} |
|
|
|
if (dispatchAmt == null){ |
|
|
|
Assert.throwEx("缺少有效的发货金额"); |
|
|
|
} |
|
|
|
// 实际发货金额,方式二(通过数据库查询)
|
|
|
|
// BigDecimal dispatchAmt = this.getPeriodDispatch(
|
|
|
|
// supplierCode,
|
|
|
|
// period.getPeriodStartDate(),
|
|
|
|
// period.getPeriodEndDate(),
|
|
|
|
// goodsMap);
|
|
|
|
// 区间目标合计金额
|
|
|
|
BigDecimal periodAmt = period.getPeriodAmount(); |
|
|
|
// 同期进货合计金额
|
|
|
|
BigDecimal samePeriodAmt = period.getSamePeriodAmount(); |
|
|
|
// 计算满足的最高坎级
|
|
|
|
TzcRebateCalculateDTO calculateDTO = tzcRebateApplication4CostService.getHitRebateMaxLevel( |
|
|
|
dispatchAmt, |
|
|
|
rebateId, |
|
|
|
samePeriodAmt, |
|
|
|
periodAmt |
|
|
|
); |
|
|
|
List<TzcRebateLevelAmountDTO> levelAmountList = tzcRebateApplication4CostService.calculateRebate( |
|
|
|
calculateDTO,dispatchAmt, samePeriodAmt, TzcArgTypes.LevelOverallReturn); |
|
|
|
|
|
|
|
calculateDTO = this.calculateRebateVerification(calculateDTO, levelAmountList, activity); |
|
|
|
calculateDTOList.add(calculateDTO); |
|
|
|
} |
|
|
|
// 计算满足的最高坎级
|
|
|
|
TzcRebateCalculateDTO calculateDTO = tzcRebateApplication4CostService.getHitRebateMaxLevel( |
|
|
|
totalDispatchAmt, |
|
|
|
costApply.getRebateId(), |
|
|
|
totalSamePeriodAmt, |
|
|
|
totalPeriodAmt |
|
|
|
); |
|
|
|
List<TzcRebateLevelAmountDTO> levelAmountList = tzcRebateApplication4CostService.calculateRebate( |
|
|
|
calculateDTO,totalDispatchAmt, totalSamePeriodAmt, TzcArgTypes.LevelOverallReturn); |
|
|
|
return calculateDTOList; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 计算返利金额(扣减已核销金额) |
|
|
|
* @param calculateDTO |
|
|
|
* @param levelAmountList |
|
|
|
* @param activity |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
private TzcRebateCalculateDTO calculateRebateVerification(TzcRebateCalculateDTO calculateDTO, List<TzcRebateLevelAmountDTO> levelAmountList, TbsActivity activity) { |
|
|
|
Long activityId = activity.getId(); |
|
|
|
// 可返利金额
|
|
|
|
BigDecimal totalRebateAmt = BigDecimal.ZERO; |
|
|
|
BigDecimal verificationAmt = vtbVerificationMapper.totalActivityVerification(activityId+""); |
|
|
|
if (CollUtil.isNotEmpty(levelAmountList)){ |
|
|
|
// 合计每个坎级总目标返利金额
|
|
|
|
BigDecimal maxTotalReturn = BigDecimal.ZERO; |
|
|
|
for (TzcRebateLevelAmountDTO amountDTO : levelAmountList) { |
|
|
|
maxTotalReturn = maxTotalReturn.add(amountDTO.getLevelReturnAmt()); |
|
|
|
} |
|
|
|
|
|
|
|
// 统计返利每个期间返利金额
|
|
|
|
BigDecimal totalVerification = BigDecimal.ZERO; |
|
|
|
for (TzcRebatePeriod period : tzcRebatePeriods) { |
|
|
|
TbsActivity activity = tbsActivityService.getOne(new LambdaQueryWrapper<TbsActivity>() |
|
|
|
.eq(TbsActivity::getRebateId, costApply.getRebateId()) |
|
|
|
.eq(TbsActivity::getRebatePeriodId, period.getId()) |
|
|
|
,false |
|
|
|
); |
|
|
|
if (activity==null){ |
|
|
|
log.warn("返利期间未关联活动,返利ID:"+costApply.getRebateId()+"期间ID:"+period.getId()); |
|
|
|
continue; |
|
|
|
} |
|
|
|
// 已核销金额
|
|
|
|
BigDecimal verificationAmt = vtbVerificationMapper.totalActivityVerification(activity.getId()+""); |
|
|
|
// 计算每个区间可补金额
|
|
|
|
|
|
|
|
totalRebateAmt = totalRebateAmt.add(amountDTO.getReturnAmt()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 计算返利每个期间补充金额
|
|
|
|
// 结合核销金额及最高补偿金额,计算返利金额
|
|
|
|
// 返回活动对应的核销金额及返利计算流程
|
|
|
|
return null; |
|
|
|
// 可返利金额
|
|
|
|
BigDecimal totalReturnAmt = totalRebateAmt.subtract(verificationAmt); |
|
|
|
if(totalReturnAmt.compareTo(BigDecimal.ZERO)<0){ |
|
|
|
totalReturnAmt = BigDecimal.ZERO; |
|
|
|
} |
|
|
|
calculateDTO.setActivityId(activityId); |
|
|
|
calculateDTO.setLevelAmountList(levelAmountList); |
|
|
|
calculateDTO.setTotalRebateAmt(totalRebateAmt); |
|
|
|
calculateDTO.setVerificationAmt(verificationAmt); |
|
|
|
calculateDTO.setTotalReturnAmt(totalReturnAmt); |
|
|
|
return calculateDTO; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -208,31 +242,9 @@ public class TzcRebateApplication4VerificationServiceImpl implements TzcRebateAp |
|
|
|
sameDispatchAmt, |
|
|
|
rebatePeriod.getPeriodAmount() |
|
|
|
); |
|
|
|
calculateDTO.setActivityId(activityId); |
|
|
|
List<TzcRebateLevelAmountDTO> levelAmountList = tzcRebateApplication4CostService.calculateRebate( |
|
|
|
calculateDTO,dispatchAmt, sameDispatchAmt, TzcArgTypes.LevelReturn); |
|
|
|
BigDecimal totalReturnAmt = BigDecimal.ZERO; |
|
|
|
if (CollUtil.isNotEmpty(levelAmountList)){ |
|
|
|
// 计算已用的优惠
|
|
|
|
for (TzcRebateLevelAmountDTO amountDTO : levelAmountList) { |
|
|
|
// 返利金额
|
|
|
|
BigDecimal returnAmt = amountDTO.getReturnAmt(); |
|
|
|
// 设置的最高返利金额
|
|
|
|
BigDecimal maxReturn = amountDTO.getMaxReturn(); |
|
|
|
// 已核销金额
|
|
|
|
BigDecimal verificationAmt = vtbVerificationMapper.totalActivityVerification(activityId+""); |
|
|
|
// 剩余的可返利金额
|
|
|
|
BigDecimal surplusReturnAmt = maxReturn.subtract(verificationAmt); |
|
|
|
if (returnAmt.compareTo(surplusReturnAmt) > 0){ |
|
|
|
amountDTO.setReturnAmt(surplusReturnAmt); |
|
|
|
} |
|
|
|
totalReturnAmt = totalReturnAmt.add(amountDTO.getReturnAmt()); |
|
|
|
amountDTO.setVerificationAmt(verificationAmt); |
|
|
|
} |
|
|
|
} |
|
|
|
calculateDTO.setTotalReturnAmt(totalReturnAmt); |
|
|
|
calculateDTO.setLevelAmountList(levelAmountList); |
|
|
|
return calculateDTO; |
|
|
|
return this.calculateRebateVerification(calculateDTO, levelAmountList, activity); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|