Browse Source

feat(rebate): 年度核销部分代码(暂停)

master
Yen 2 months ago
parent
commit
34d734c0bf
  1. 5
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevels.java
  2. 2
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateLevelAmountDTO.java
  3. 2
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/ErpDispatchSumPmsVo.java
  4. 1
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java
  5. 6
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4CostService.java
  6. 11
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java
  7. 150
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java
  8. 9
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java

5
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;

2
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;

2
cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/ErpDispatchSumPmsVo.java

@ -27,6 +27,8 @@ public class ErpDispatchSumPmsVo {
List<Long> categoryIds;
List<Long> seriesIds;
List<Long> spuIds;
List<Long> skuIds;

1
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<TbsActivityMapper,TbsAct
sumPmsVo.setCategoryIds(query.getCategoryIds());
sumPmsVo.setSpuIds(query.getSpuIds());
sumPmsVo.setSkuIds(query.getSkuIds());
sumPmsVo.setSeriesIds(query.getSeriesIds());
BigDecimal amt = BigDecimal.ZERO;
if (hasGoods) {
amt = erpDispatchDataMapper.queryCusAmtByPms(query);

6
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4CostService.java

@ -41,13 +41,15 @@ public interface TzcRebateApplication4CostService {
/**
* 获取最高命中返利坎级的信息及坎级列表
* @param dispatchAmt 当前客户的发货金额
* @param rebateId 返利id
* @param sameDispatchAmt 同期发货金额
* @param rebatePeriodId 返利期间id
* @param tarPeriodAmount 目标发货金额
* @return
*/
TzcRebateCalculateDTO getHitRebateMaxLevel(BigDecimal dispatchAmt,
Long rebateId,
BigDecimal sameDispatchAmt,
Long rebatePeriodId);
BigDecimal tarPeriodAmount);
/**
* 计算坎级返利

11
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java

@ -334,15 +334,15 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
@Override
public TzcRebateCalculateDTO getHitRebateMaxLevel(BigDecimal dispatchAmt,
Long rebateId,
BigDecimal sameDispatchAmt,
Long rebatePeriodId) {
BigDecimal tarPeriodAmount) {
TzcRebateCalculateDTO dto = new TzcRebateCalculateDTO();
// 判断是否同期
int samePeriodFlag = sameDispatchAmt.compareTo(BigDecimal.ZERO)==0?0:1;
TzcRebatePeriod rebatePeriod = tzcRebatePeriodService.getById(rebatePeriodId);
List<TzcRebateLevels> levelsList = tzcRebateLevelsService.list(
new LambdaQueryWrapper<TzcRebateLevels>()
.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());

150
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<TzcRebatePeriod> tzcRebatePeriods = tzcRebatePeriodService.list(
new LambdaQueryWrapper<TzcRebatePeriod>()
.eq(TzcRebatePeriod::getRebateId, costApply.getRebateId())
// 过滤不需要补充的返利期间
.eq(TzcRebatePeriod::getCompensationFlag,1)
);
List<TzcRebateGoods> goodsList = tzcRebateGoodsService.list(
new LambdaQueryWrapper<TzcRebateGoods>()
.eq(TzcRebateGoods::getRebateId, costApply.getRebateId())
);
Map<String, List<TzcRebateGoods>> 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<TzcRebateLevelAmountDTO> 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<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()+"");
// 计算每个区间可补金额
}
}
// 计算返利每个期间补充金额
// 结合核销金额及最高补偿金额,计算返利金额
// 返回活动对应的核销金额及返利计算流程
return null;
}
/**
* 获取期间发货金额
* @param supplierCode
* @param startDate
* @param endDate
* @param goodsMap
* @return
*/
public BigDecimal getPeriodDispatch(String supplierCode,
LocalDate startDate,
LocalDate endDate,
Map<String, List<TzcRebateGoods>> goodsMap){
ErpDispatchSumPmsQuery query = new ErpDispatchSumPmsQuery();
query.setSupplierCode(supplierCode);
query.setStartDate(startDate);
query.setEndDate(endDate);
boolean hasGoods = false;
List<TzcRebateGoods> brandGoodsList = goodsMap.get("brand");
if(brandGoodsList!=null){
List<Long> ids = brandGoodsList.stream()
.map(TzcRebateGoods::getTargetId).collect(Collectors.toList());
query.setBrandIds(ids);
hasGoods = true;
}
List<TzcRebateGoods> seriesGoodsList = goodsMap.get("series");
if(seriesGoodsList!=null){
List<Long> ids = seriesGoodsList.stream()
.map(TzcRebateGoods::getTargetId).collect(Collectors.toList());
query.setSeriesIds(ids);
hasGoods = true;
}
List<TzcRebateGoods> categoryGoodsList = goodsMap.get("category");
if(categoryGoodsList!=null){
List<Long> ids = categoryGoodsList.stream()
.map(TzcRebateGoods::getTargetId).collect(Collectors.toList());
query.setCategoryIds(ids);
hasGoods = true;
}
List<TzcRebateGoods> spuGoodsList = goodsMap.get("spu");
if(spuGoodsList!=null){
List<Long> ids = spuGoodsList.stream()
.map(TzcRebateGoods::getTargetId).collect(Collectors.toList());
query.setSpuIds(ids);
hasGoods = true;
}
List<TzcRebateGoods> skuGoodsList = goodsMap.get("sku");
if(skuGoodsList!=null){
List<Long> 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<TzcRebateLevelAmountDTO> levelAmountList = tzcRebateApplication4CostService.calculateRebate(
calculateDTO,dispatchAmt, sameDispatchAmt, TzcArgTypes.LevelReturn);

9
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<VtbVerificationMappe
return;
}
// 防止重复支付,如果需要重新调用产生支付需要清理日志
LambdaQueryWrapper<SysSyncLog> logLqw2 = new LambdaQueryWrapper<>();
logLqw2.eq(SysSyncLog::getRemark,"支付完成["+verification.getVerificationCode()+"]");
long count2 = sysSyncLogService.count(logLqw2);
if (count2>0){
return;
}
LambdaQueryWrapper<SysSyncLog> 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 ServiceImpl<VtbVerificationMappe
if (count>0){
return;
}
for (VtbVerificationSubject verificationSubject : verificationSubjects) {
subject.setSubjectCode(verificationSubject.getSubjectCode());
subject.setSubjectName(verificationSubject.getSubjectName());

Loading…
Cancel
Save