diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateCalculateDTO.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateCalculateDTO.java index 84ea644..89f7a54 100644 --- a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateCalculateDTO.java +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateCalculateDTO.java @@ -36,7 +36,18 @@ public class TzcRebateCalculateDTO { private List levelAmountList; /** - * 返利总金额 + * 统计返利规则的金额 + */ + private BigDecimal totalRebateAmt; + + /** + * 已经核销金额 + */ + private BigDecimal verificationAmt; + + /** + * 返利总金额(可用的返利金额) + * totalReturnAmt = totalRebateAmt - verificationAmt */ private BigDecimal totalReturnAmt; diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateLevelAmountDTO.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateLevelAmountDTO.java index 2db7c5e..884fdbf 100644 --- a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateLevelAmountDTO.java +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateLevelAmountDTO.java @@ -17,20 +17,10 @@ import java.math.BigDecimal; public class TzcRebateLevelAmountDTO extends TzcRebateLevels { /** - * 坎级返利金额(最终结果) + * 坎级返利金额(非最终结果) */ private BigDecimal returnAmt; - /** - * 最大返利金额 - */ - private BigDecimal maxReturn; - - /** - * 已经核销金额 - */ - private BigDecimal verificationAmt; - /** * 计算所得的返利金额(非最终结果,因为要排除其它条件) */ diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java index c9ffbcb..3fcd5e6 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java @@ -1,5 +1,6 @@ package com.qs.serve.modules.tbs.controller; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.qs.serve.common.annotation.SysLog; import com.qs.serve.common.utils.CopierUtil; @@ -14,6 +15,8 @@ import com.qs.serve.modules.erp.entity.vo.SubjectDispatchSumVo; import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.tzc.entity.TzcRebatePeriod; +import com.qs.serve.modules.tzc.service.TzcRebatePeriodService; import com.qs.serve.modules.vtb.service.VtbFundFlowService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -39,12 +42,41 @@ public class TbsActivityController2 { private final VtbFundFlowService vtbFundFlowService; private final TbsActivityService tbsActivityService; + private final TbsCostApplyService tbsCostApplyService; private final TbsCostApplyPart1Service tbsCostApplyPart1Service; private final TbsActivityApplicationService tbsActivityApplicationService; private final TbsActivityGoodsService tbsActivityGoodsService; private final TbsActivitySubjectService tbsActivitySubjectService; private final ErpDispatchDataMapper erpDispatchDataMapper; + private final TzcRebatePeriodService tzcRebatePeriodService; + /** + * 获取返利年度的活动ID + * @param costApplyId + * @return + */ + @GetMapping("/getList4RebateCheckYear/{costApplyId}") + public R getList4RebateCheckYear(@PathVariable Long costApplyId){ + List periods = tzcRebatePeriodService.list( + new LambdaQueryWrapper() + .eq(TzcRebatePeriod::getRebateId, costApplyId) + // 过滤不需要补充的返利期间 + .eq(TzcRebatePeriod::getCompensationFlag,1) + ); + List pIds = periods.stream().map(TzcRebatePeriod::getId).collect(Collectors.toList()); + if(CollUtil.isEmpty(pIds)){ + return R.error(); + } + List activityList = tbsActivityService.list( + new LambdaQueryWrapper() + .eq(TbsActivity::getId,costApplyId) + .in(TbsActivity::getRebatePeriodId,pIds) + ); + for (TbsActivity activity : activityList) { + tbsCostApplyPart1Service.buildDetailVo(activity); + } + return R.ok(activityList); + } /** * 获取活动对应的发货金额,并分割到科目维度 diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java index ffbe7e4..bb2cb57 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java @@ -44,6 +44,11 @@ public class TzcRebateController { private TzcRebateApplicationService tzcRebateApplicationService; private TzcRebateApplication4VerificationService tzcRebateApplication4VerificationService; + /** + * 季度返利 + * @param queryList + * @return + */ @PostMapping("/getRebateInfo") public R> getRebateByActivityId(@RequestBody List queryList){ if (queryList != null){ @@ -57,6 +62,16 @@ public class TzcRebateController { return R.ok(); } + /** + * 年度返利 + * @param queryList + * @return + */ + @PostMapping("/getRebateInfoOfYear") + public R> getRebateByYear(@RequestBody List queryList){ + return R.ok(tzcRebateApplication4VerificationService.getRebateBatchVerificationList(queryList)); + } + /** * 翻页 * @param param diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4VerificationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4VerificationService.java index 5cf911b..82ca2ce 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4VerificationService.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4VerificationService.java @@ -3,6 +3,7 @@ package com.qs.serve.modules.tzc.service; import com.qs.serve.modules.tzc.consts.TzcArgTypes; import com.qs.serve.modules.tzc.entity.*; import com.qs.serve.modules.tzc.entity.dto.TzcRebateCalculateDTO; +import com.qs.serve.modules.tzc.entity.qo.TzcGetActivityRebateQuery; import java.math.BigDecimal; import java.util.List; @@ -16,10 +17,10 @@ public interface TzcRebateApplication4VerificationService { /** * 获取批量核销列表(总目标达标补偿) - * @param costApplyId + * @param queryList * @return */ - Object getRebateBatchVerificationList(Long costApplyId); + List getRebateBatchVerificationList(List queryList); /** * 获取活动返利金额 diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java index 6197f33..e7bbbf2 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java @@ -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 getRebateBatchVerificationList(List queryList) { + + List activityIds = queryList.stream() + .map(TzcGetActivityRebateQuery::getActivityId).collect(Collectors.toList()); + List activityList = tbsActivityMapper.selectBatchIds(activityIds); + + if (CollUtil.isEmpty(activityList)){ + Assert.throwEx("无效的活动id"); + } + + Long rebateId = activityList.get(0).getRebateId(); + String supplierCode = activityList.get(0).getSupplierCode(); + List tzcRebatePeriods = tzcRebatePeriodService.list( new LambdaQueryWrapper() - .eq(TzcRebatePeriod::getRebateId, costApply.getRebateId()) + .eq(TzcRebatePeriod::getRebateId, rebateId) // 过滤不需要补充的返利期间 .eq(TzcRebatePeriod::getCompensationFlag,1) ); List goodsList = tzcRebateGoodsService.list( new LambdaQueryWrapper() - .eq(TzcRebateGoods::getRebateId, costApply.getRebateId()) + .eq(TzcRebateGoods::getRebateId, rebateId) ); Map> goodsMap = goodsList.stream() .collect(Collectors.groupingBy(TzcRebateGoods::getTargetType)); - // 区间目标合计金额 - BigDecimal totalPeriodAmt= BigDecimal.ZERO; - // 同期进货合计金额 - BigDecimal totalSamePeriodAmt= BigDecimal.ZERO; - // 实际发货金额 - BigDecimal totalDispatchAmt = BigDecimal.ZERO; + List 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 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 levelAmountList = tzcRebateApplication4CostService.calculateRebate( - calculateDTO,totalDispatchAmt, totalSamePeriodAmt, TzcArgTypes.LevelOverallReturn); + return calculateDTOList; + } + /** + * 计算返利金额(扣减已核销金额) + * @param calculateDTO + * @param levelAmountList + * @param activity + * @return + */ + private TzcRebateCalculateDTO calculateRebateVerification(TzcRebateCalculateDTO calculateDTO, List 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() - .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 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); } } diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java index a67d9f3..5f2ac5d 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java @@ -918,8 +918,11 @@ public class VtbVerificationServiceImpl extends ServiceImpl