Browse Source

feat(rebate): 年度返利规则接口

master
Yen 2 months ago
parent
commit
ca46c9b3c3
  1. 13
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateCalculateDTO.java
  2. 12
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateLevelAmountDTO.java
  3. 32
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java
  4. 15
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java
  5. 5
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4VerificationService.java
  6. 166
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java
  7. 7
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

13
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<TzcRebateLevelAmountDTO> levelAmountList; private List<TzcRebateLevelAmountDTO> levelAmountList;
/** /**
* 返利总金额 * 统计返利规则的金额
*/
private BigDecimal totalRebateAmt;
/**
* 已经核销金额
*/
private BigDecimal verificationAmt;
/**
* 返利总金额(可用的返利金额)
* totalReturnAmt = totalRebateAmt - verificationAmt
*/ */
private BigDecimal totalReturnAmt; private BigDecimal totalReturnAmt;

12
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 { public class TzcRebateLevelAmountDTO extends TzcRebateLevels {
/** /**
* 坎级返利金额(最终结果) * 坎级返利金额(最终结果)
*/ */
private BigDecimal returnAmt; private BigDecimal returnAmt;
/**
* 最大返利金额
*/
private BigDecimal maxReturn;
/**
* 已经核销金额
*/
private BigDecimal verificationAmt;
/** /**
* 计算所得的返利金额(非最终结果因为要排除其它条件) * 计算所得的返利金额(非最终结果因为要排除其它条件)
*/ */

32
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; package com.qs.serve.modules.tbs.controller;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.annotation.SysLog; import com.qs.serve.common.annotation.SysLog;
import com.qs.serve.common.utils.CopierUtil; 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.erp.mapper.ErpDispatchDataMapper;
import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.service.*; 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 com.qs.serve.modules.vtb.service.VtbFundFlowService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -39,12 +42,41 @@ public class TbsActivityController2 {
private final VtbFundFlowService vtbFundFlowService; private final VtbFundFlowService vtbFundFlowService;
private final TbsActivityService tbsActivityService; private final TbsActivityService tbsActivityService;
private final TbsCostApplyService tbsCostApplyService;
private final TbsCostApplyPart1Service tbsCostApplyPart1Service; private final TbsCostApplyPart1Service tbsCostApplyPart1Service;
private final TbsActivityApplicationService tbsActivityApplicationService; private final TbsActivityApplicationService tbsActivityApplicationService;
private final TbsActivityGoodsService tbsActivityGoodsService; private final TbsActivityGoodsService tbsActivityGoodsService;
private final TbsActivitySubjectService tbsActivitySubjectService; private final TbsActivitySubjectService tbsActivitySubjectService;
private final ErpDispatchDataMapper erpDispatchDataMapper; private final ErpDispatchDataMapper erpDispatchDataMapper;
private final TzcRebatePeriodService tzcRebatePeriodService;
/**
* 获取返利年度的活动ID
* @param costApplyId
* @return
*/
@GetMapping("/getList4RebateCheckYear/{costApplyId}")
public R<?> getList4RebateCheckYear(@PathVariable Long costApplyId){
List<TzcRebatePeriod> periods = tzcRebatePeriodService.list(
new LambdaQueryWrapper<TzcRebatePeriod>()
.eq(TzcRebatePeriod::getRebateId, costApplyId)
// 过滤不需要补充的返利期间
.eq(TzcRebatePeriod::getCompensationFlag,1)
);
List<Long> pIds = periods.stream().map(TzcRebatePeriod::getId).collect(Collectors.toList());
if(CollUtil.isEmpty(pIds)){
return R.error();
}
List<TbsActivity> activityList = tbsActivityService.list(
new LambdaQueryWrapper<TbsActivity>()
.eq(TbsActivity::getId,costApplyId)
.in(TbsActivity::getRebatePeriodId,pIds)
);
for (TbsActivity activity : activityList) {
tbsCostApplyPart1Service.buildDetailVo(activity);
}
return R.ok(activityList);
}
/** /**
* 获取活动对应的发货金额并分割到科目维度 * 获取活动对应的发货金额并分割到科目维度

15
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 TzcRebateApplicationService tzcRebateApplicationService;
private TzcRebateApplication4VerificationService tzcRebateApplication4VerificationService; private TzcRebateApplication4VerificationService tzcRebateApplication4VerificationService;
/**
* 季度返利
* @param queryList
* @return
*/
@PostMapping("/getRebateInfo") @PostMapping("/getRebateInfo")
public R<List<TzcRebateCalculateDTO>> getRebateByActivityId(@RequestBody List<TzcGetActivityRebateQuery> queryList){ public R<List<TzcRebateCalculateDTO>> getRebateByActivityId(@RequestBody List<TzcGetActivityRebateQuery> queryList){
if (queryList != null){ if (queryList != null){
@ -57,6 +62,16 @@ public class TzcRebateController {
return R.ok(); return R.ok();
} }
/**
* 年度返利
* @param queryList
* @return
*/
@PostMapping("/getRebateInfoOfYear")
public R<List<TzcRebateCalculateDTO>> getRebateByYear(@RequestBody List<TzcGetActivityRebateQuery> queryList){
return R.ok(tzcRebateApplication4VerificationService.getRebateBatchVerificationList(queryList));
}
/** /**
* 翻页 * 翻页
* @param param * @param param

5
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.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.TzcRebateCalculateDTO;
import com.qs.serve.modules.tzc.entity.qo.TzcGetActivityRebateQuery;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
@ -16,10 +17,10 @@ public interface TzcRebateApplication4VerificationService {
/** /**
* 获取批量核销列表(总目标达标补偿) * 获取批量核销列表(总目标达标补偿)
* @param costApplyId * @param queryList
* @return * @return
*/ */
Object getRebateBatchVerificationList(Long costApplyId); List<TzcRebateCalculateDTO> getRebateBatchVerificationList(List<TzcGetActivityRebateQuery> queryList);
/** /**
* 获取活动返利金额 * 获取活动返利金额

166
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 cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.so.ErpDispatchSumPmsQuery;
import com.qs.serve.modules.erp.entity.vo.ErpDispatchSumPmsVo; import com.qs.serve.modules.erp.entity.vo.ErpDispatchSumPmsVo;
import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; 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.TzcRebatePeriod;
import com.qs.serve.modules.tzc.entity.dto.TzcRebateCalculateDTO; 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.dto.TzcRebateLevelAmountDTO;
import com.qs.serve.modules.tzc.entity.qo.TzcGetActivityRebateQuery;
import com.qs.serve.modules.tzc.service.*; import com.qs.serve.modules.tzc.service.*;
import com.qs.serve.modules.vtb.entity.VtbVerification; import com.qs.serve.modules.vtb.entity.VtbVerification;
import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper;
@ -24,6 +26,7 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -60,77 +63,108 @@ public class TzcRebateApplication4VerificationServiceImpl implements TzcRebateAp
private final ErpDispatchDataMapper erpDispatchDataMapper; private final ErpDispatchDataMapper erpDispatchDataMapper;
@Override @Override
public Object getRebateBatchVerificationList(Long costApplyId) { public List<TzcRebateCalculateDTO> getRebateBatchVerificationList(List<TzcGetActivityRebateQuery> queryList) {
TbsCostApply costApply = tbsCostApplyService.getById(costApplyId);
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( List<TzcRebatePeriod> tzcRebatePeriods = tzcRebatePeriodService.list(
new LambdaQueryWrapper<TzcRebatePeriod>() new LambdaQueryWrapper<TzcRebatePeriod>()
.eq(TzcRebatePeriod::getRebateId, costApply.getRebateId()) .eq(TzcRebatePeriod::getRebateId, rebateId)
// 过滤不需要补充的返利期间 // 过滤不需要补充的返利期间
.eq(TzcRebatePeriod::getCompensationFlag,1) .eq(TzcRebatePeriod::getCompensationFlag,1)
); );
List<TzcRebateGoods> goodsList = tzcRebateGoodsService.list( List<TzcRebateGoods> goodsList = tzcRebateGoodsService.list(
new LambdaQueryWrapper<TzcRebateGoods>() new LambdaQueryWrapper<TzcRebateGoods>()
.eq(TzcRebateGoods::getRebateId, costApply.getRebateId()) .eq(TzcRebateGoods::getRebateId, rebateId)
); );
Map<String, List<TzcRebateGoods>> goodsMap = goodsList.stream() Map<String, List<TzcRebateGoods>> goodsMap = goodsList.stream()
.collect(Collectors.groupingBy(TzcRebateGoods::getTargetType)); .collect(Collectors.groupingBy(TzcRebateGoods::getTargetType));
// 区间目标合计金额 List<TzcRebateCalculateDTO> calculateDTOList = new ArrayList<>();
BigDecimal totalPeriodAmt= BigDecimal.ZERO;
// 同期进货合计金额
BigDecimal totalSamePeriodAmt= BigDecimal.ZERO;
// 实际发货金额
BigDecimal totalDispatchAmt = BigDecimal.ZERO;
for (TzcRebatePeriod period : tzcRebatePeriods) { for (TzcRebatePeriod period : tzcRebatePeriods) {
totalPeriodAmt = totalPeriodAmt.add(period.getPeriodAmount()); TbsActivity activity = null;
totalSamePeriodAmt = totalSamePeriodAmt.add(period.getSamePeriodAmount()); for (TbsActivity tbsActivity : activityList) {
BigDecimal dispatchAmt = this.getPeriodDispatch( if (tbsActivity.getRebatePeriodId().equals(period.getId())){
costApply.getSupplierCode(), activity = tbsActivity;
period.getPeriodStartDate(), break;
period.getPeriodEndDate(), }
goodsMap); }
totalDispatchAmt = totalDispatchAmt.add(dispatchAmt); 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);
} }
// 计算满足的最高坎级 return calculateDTOList;
TzcRebateCalculateDTO calculateDTO = tzcRebateApplication4CostService.getHitRebateMaxLevel( }
totalDispatchAmt,
costApply.getRebateId(),
totalSamePeriodAmt,
totalPeriodAmt
);
List<TzcRebateLevelAmountDTO> levelAmountList = tzcRebateApplication4CostService.calculateRebate(
calculateDTO,totalDispatchAmt, totalSamePeriodAmt, TzcArgTypes.LevelOverallReturn);
/**
* 计算返利金额(扣减已核销金额)
* @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)){ if (CollUtil.isNotEmpty(levelAmountList)){
// 合计每个坎级总目标返利金额
BigDecimal maxTotalReturn = BigDecimal.ZERO;
for (TzcRebateLevelAmountDTO amountDTO : levelAmountList) { for (TzcRebateLevelAmountDTO amountDTO : levelAmountList) {
maxTotalReturn = maxTotalReturn.add(amountDTO.getLevelReturnAmt()); totalRebateAmt = totalRebateAmt.add(amountDTO.getReturnAmt());
}
// 统计返利每个期间返利金额
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()+"");
// 计算每个区间可补金额
} }
} }
// 可返利金额
BigDecimal totalReturnAmt = totalRebateAmt.subtract(verificationAmt);
// 计算返利每个期间补充金额 if(totalReturnAmt.compareTo(BigDecimal.ZERO)<0){
// 结合核销金额及最高补偿金额,计算返利金额 totalReturnAmt = BigDecimal.ZERO;
// 返回活动对应的核销金额及返利计算流程 }
return null; 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, sameDispatchAmt,
rebatePeriod.getPeriodAmount() rebatePeriod.getPeriodAmount()
); );
calculateDTO.setActivityId(activityId);
List<TzcRebateLevelAmountDTO> levelAmountList = tzcRebateApplication4CostService.calculateRebate( List<TzcRebateLevelAmountDTO> levelAmountList = tzcRebateApplication4CostService.calculateRebate(
calculateDTO,dispatchAmt, sameDispatchAmt, TzcArgTypes.LevelReturn); calculateDTO,dispatchAmt, sameDispatchAmt, TzcArgTypes.LevelReturn);
BigDecimal totalReturnAmt = BigDecimal.ZERO; return this.calculateRebateVerification(calculateDTO, levelAmountList, activity);
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;
} }
} }

7
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<VtbVerificationMappe
totalDispatchAmt = totalDispatchAmt.add(verificationSubject.getFinalDispatchAmt()); totalDispatchAmt = totalDispatchAmt.add(verificationSubject.getFinalDispatchAmt());
} }
} }
ErpDispatchSumPmsVo dispatchSumPmsVo = activityService.getDispatchSumByActivity(activity); // 校验核销金额不予超过返利金额
verification.setAutoDispatchAmt(dispatchSumPmsVo.getTotalAmount()); if (verification.getRebateId()!=null){
ErpDispatchSumPmsVo dispatchSumPmsVo = activityService.getDispatchSumByActivity(activity);
verification.setAutoDispatchAmt(dispatchSumPmsVo.getTotalAmount());
}
verification.setFinalDispatchAmt(totalDispatchAmt); verification.setFinalDispatchAmt(totalDispatchAmt);
verification.setFinalDispatchAmtRecord(totalDispatchAmt); verification.setFinalDispatchAmtRecord(totalDispatchAmt);
verification.setAmount(totalAmount); verification.setAmount(totalAmount);

Loading…
Cancel
Save