From 34d734c0bf6c9add845a40be833e5f977bdddcd5 Mon Sep 17 00:00:00 2001 From: Yen Date: Mon, 12 May 2025 15:46:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(rebate):=20=E5=B9=B4=E5=BA=A6=E6=A0=B8?= =?UTF-8?q?=E9=94=80=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81(=E6=9A=82?= =?UTF-8?q?=E5=81=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tzc/entity/TzcRebateLevels.java | 5 +- .../entity/dto/TzcRebateLevelAmountDTO.java | 2 +- .../erp/entity/vo/ErpDispatchSumPmsVo.java | 2 + .../service/impl/TbsActivityServiceImpl.java | 1 + .../TzcRebateApplication4CostService.java | 6 +- .../TzcRebateApplication4CostServiceImpl.java | 11 +- ...teApplication4VerificationServiceImpl.java | 150 +++++++++++++++++- .../impl/VtbVerificationServiceImpl.java | 9 ++ 8 files changed, 172 insertions(+), 14 deletions(-) diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevels.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevels.java index 680c39f..488bfb9 100644 --- a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevels.java +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevels.java @@ -50,9 +50,12 @@ public class TzcRebateLevels implements Serializable { @NotNull(message = "条件选择:0-百分比;1-固定金额不能为空") private Integer conditionSelect; - /** 满足条件的比例 */ + /** 满足条件的比例-开始 */ private BigDecimal conditionRate; + /** 满足条件的比例-结束 */ + //private BigDecimal conditionRateEnd; + /** 满足条件的金额 */ private BigDecimal conditionAmount; 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 ba3a40a..2db7c5e 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 @@ -32,7 +32,7 @@ public class TzcRebateLevelAmountDTO extends TzcRebateLevels { private BigDecimal verificationAmt; /** - * 计算所得的返利金额(非最终结果) + * 计算所得的返利金额(非最终结果,因为要排除其它条件) */ private BigDecimal levelReturnAmt; diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/ErpDispatchSumPmsVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/ErpDispatchSumPmsVo.java index 07fcd2f..0884c40 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/ErpDispatchSumPmsVo.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/ErpDispatchSumPmsVo.java @@ -27,6 +27,8 @@ public class ErpDispatchSumPmsVo { List categoryIds; + List seriesIds; + List spuIds; List skuIds; diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java index aaa9df5..21c1b52 100644 --- a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java @@ -133,6 +133,7 @@ public class TbsActivityServiceImpl extends ServiceImpl levelsList = tzcRebateLevelsService.list( new LambdaQueryWrapper() - .eq(TzcRebateLevels::getRebateId, rebatePeriod.getRebateId()) + .eq(TzcRebateLevels::getRebateId, rebateId) // 同期数据过滤 .eq(TzcRebateLevels::getSamePeriodFlag, samePeriodFlag) .orderByDesc(TzcRebateLevels::getLevelNum) @@ -359,10 +359,10 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio BigDecimal periodAmount = null; String msg = ""; if (levels.getConditionType().equals(0)){ - periodAmount = rebatePeriod.getSamePeriodAmount(); + periodAmount = sameDispatchAmt; msg = "同期金额:"+periodAmount; }else if (levels.getConditionType().equals(1)){ - periodAmount = rebatePeriod.getPeriodAmount(); + periodAmount = tarPeriodAmount; msg = "目标金额:"+periodAmount; } msg = "("+msg+",占比:"+levels.getConditionRate()+"%)"; @@ -458,6 +458,7 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio dto.appendErrorMsg("坎级ID:"+rebateLevels.getId()+",缺少参数:"+argType.name()); continue; } + dto.appendDebugMsg("读取坎级("+rebateLevels.getLevelNum()+")配置 ,返利参数:"+currentArgument.getBusinessType()); TzcRebateLevelAmountDTO rebateLevelsDTO = CopierUtil.copy(rebateLevels,new TzcRebateLevelAmountDTO()); rebateLevelsDTO.setArgument(currentArgument); rebateLevelsDTO.setMaxReturn(currentArgument.getMaxReturn()); 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 cf5ca27..6197f33 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 @@ -1,10 +1,17 @@ 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.modules.erp.entity.so.ErpDispatchSumPmsQuery; +import com.qs.serve.modules.erp.entity.vo.ErpDispatchSumPmsVo; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsActivityGoods; +import com.qs.serve.modules.tbs.entity.TbsCostApply; import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; import com.qs.serve.modules.tbs.service.*; import com.qs.serve.modules.tzc.consts.TzcArgTypes; +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; @@ -16,7 +23,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author YenHex @@ -47,27 +57,157 @@ public class TzcRebateApplication4VerificationServiceImpl implements TzcRebateAp private final TzcRebateGoodsService tzcRebateGoodsService; private final TzcRebateLevelsConfigService tzcRebateLevelsConfigService; private final TzcRebateLevelsService tzcRebateLevelsService; + private final ErpDispatchDataMapper erpDispatchDataMapper; @Override public Object getRebateBatchVerificationList(Long costApplyId) { - // 过滤不需要补充的返利期间 - // 加载相关活动 - // 已核销金额 + TbsCostApply costApply = tbsCostApplyService.getById(costApplyId); + List tzcRebatePeriods = tzcRebatePeriodService.list( + new LambdaQueryWrapper() + .eq(TzcRebatePeriod::getRebateId, costApply.getRebateId()) + // 过滤不需要补充的返利期间 + .eq(TzcRebatePeriod::getCompensationFlag,1) + ); + List goodsList = tzcRebateGoodsService.list( + new LambdaQueryWrapper() + .eq(TzcRebateGoods::getRebateId, costApply.getRebateId()) + ); + Map> goodsMap = goodsList.stream() + .collect(Collectors.groupingBy(TzcRebateGoods::getTargetType)); + // 区间目标合计金额 + BigDecimal totalPeriodAmt= BigDecimal.ZERO; + // 同期进货合计金额 + BigDecimal totalSamePeriodAmt= BigDecimal.ZERO; + // 实际发货金额 + BigDecimal totalDispatchAmt = BigDecimal.ZERO; + 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); + } + // 计算满足的最高坎级 + TzcRebateCalculateDTO calculateDTO = tzcRebateApplication4CostService.getHitRebateMaxLevel( + totalDispatchAmt, + costApply.getRebateId(), + totalSamePeriodAmt, + totalPeriodAmt + ); + List levelAmountList = tzcRebateApplication4CostService.calculateRebate( + calculateDTO,totalDispatchAmt, totalSamePeriodAmt, TzcArgTypes.LevelOverallReturn); + + 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()+""); + // 计算每个区间可补金额 + + } + } + + // 计算返利每个期间补充金额 // 结合核销金额及最高补偿金额,计算返利金额 // 返回活动对应的核销金额及返利计算流程 return null; } + /** + * 获取期间发货金额 + * @param supplierCode + * @param startDate + * @param endDate + * @param goodsMap + * @return + */ + public BigDecimal getPeriodDispatch(String supplierCode, + LocalDate startDate, + LocalDate endDate, + Map> goodsMap){ + ErpDispatchSumPmsQuery query = new ErpDispatchSumPmsQuery(); + query.setSupplierCode(supplierCode); + query.setStartDate(startDate); + query.setEndDate(endDate); + + boolean hasGoods = false; + List brandGoodsList = goodsMap.get("brand"); + if(brandGoodsList!=null){ + List ids = brandGoodsList.stream() + .map(TzcRebateGoods::getTargetId).collect(Collectors.toList()); + query.setBrandIds(ids); + hasGoods = true; + } + List seriesGoodsList = goodsMap.get("series"); + if(seriesGoodsList!=null){ + List ids = seriesGoodsList.stream() + .map(TzcRebateGoods::getTargetId).collect(Collectors.toList()); + query.setSeriesIds(ids); + hasGoods = true; + } + List categoryGoodsList = goodsMap.get("category"); + if(categoryGoodsList!=null){ + List ids = categoryGoodsList.stream() + .map(TzcRebateGoods::getTargetId).collect(Collectors.toList()); + query.setCategoryIds(ids); + hasGoods = true; + } + List spuGoodsList = goodsMap.get("spu"); + if(spuGoodsList!=null){ + List ids = spuGoodsList.stream() + .map(TzcRebateGoods::getTargetId).collect(Collectors.toList()); + query.setSpuIds(ids); + hasGoods = true; + } + List skuGoodsList = goodsMap.get("sku"); + if(skuGoodsList!=null){ + List ids = skuGoodsList.stream() + .map(TzcRebateGoods::getTargetId).collect(Collectors.toList()); + query.setSkuIds(ids); + hasGoods = true; + } + BigDecimal amt = BigDecimal.ZERO; + if (hasGoods) { + amt = erpDispatchDataMapper.queryCusAmtByPms(query); + if (amt==null){ + amt = BigDecimal.ZERO; + } + } + return amt; + } + @Override public TzcRebateCalculateDTO getActivityRebateAmount(Long activityId, BigDecimal dispatchAmt) { TbsActivity activity = tbsActivityMapper.selectById(activityId); TzcRebatePeriod rebatePeriod = tzcRebatePeriodService.getById(activity.getRebatePeriodId()); BigDecimal sameDispatchAmt = rebatePeriod.getSamePeriodAmount(); - //BigDecimal sameDispatchAmt = BigDecimal.ZERO; // 获取最高命中的坎级 TzcRebateCalculateDTO calculateDTO = tzcRebateApplication4CostService.getHitRebateMaxLevel( - dispatchAmt, sameDispatchAmt, activity.getRebatePeriodId()); + dispatchAmt, + activity.getRebateId(), + sameDispatchAmt, + rebatePeriod.getPeriodAmount() + ); calculateDTO.setActivityId(activityId); List levelAmountList = tzcRebateApplication4CostService.calculateRebate( calculateDTO,dispatchAmt, sameDispatchAmt, TzcArgTypes.LevelReturn); 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 d760b5e..a67d9f3 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 @@ -1715,6 +1715,14 @@ public class VtbVerificationServiceImpl extends ServiceImpl logLqw2 = new LambdaQueryWrapper<>(); + logLqw2.eq(SysSyncLog::getRemark,"支付完成["+verification.getVerificationCode()+"]"); + long count2 = sysSyncLogService.count(logLqw2); + if (count2>0){ + return; + } + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); logLqw.eq(SysSyncLog::getFailReason,"{\"status\":500,\"message\":\"已存在支付信息,不能修改\",\"data\":null}"); logLqw.like(SysSyncLog::getRemark,"["+verification.getVerificationCode()+"]"); @@ -1722,6 +1730,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl0){ return; } + for (VtbVerificationSubject verificationSubject : verificationSubjects) { subject.setSubjectCode(verificationSubject.getSubjectCode()); subject.setSubjectName(verificationSubject.getSubjectName());