Browse Source

feat: 计算返利添加测试日志

master
Yen 2 months ago
parent
commit
8d104e9de0
  1. 25
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateCalculateDTO.java
  2. 19
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/ErpDispatchSumPmsVo.java
  3. 19
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/SubjectDispatchSumVo.java
  4. 21
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java
  5. 2
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java
  6. 33
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java
  7. 20
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java
  8. 4
      cms-modules/cms-system/src/main/resources/mapper/erp/ErpDispatchDataMapper.xml

25
cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/dto/TzcRebateCalculateDTO.java

@ -40,4 +40,29 @@ public class TzcRebateCalculateDTO {
*/ */
private BigDecimal totalReturnAmt; private BigDecimal totalReturnAmt;
/**
* 错误信息
*/
private String errorMsg;
/**
* 调试信息
*/
private String debugMsg;
public void appendDebugMsg(String msg) {
if (this.debugMsg == null) {
this.debugMsg = msg;
} else {
this.debugMsg += ";\n" + msg;
}
}
public void appendErrorMsg(String msg) {
if (this.errorMsg == null) {
this.errorMsg = msg;
} else {
this.errorMsg += ";" + msg;
}
}
} }

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

@ -13,6 +13,7 @@ import java.util.List;
@Data @Data
public class ErpDispatchSumPmsVo { public class ErpDispatchSumPmsVo {
String activityId;
/** /**
* 客户编码 * 客户编码
*/ */
@ -24,26 +25,16 @@ public class ErpDispatchSumPmsVo {
BigDecimal totalAmount; BigDecimal totalAmount;
List<String> categoryIds; List<Long> categoryIds;
List<String> spuIds; List<Long> spuIds;
List<String> skuIds; List<Long> skuIds;
/** /**
* 按科目分割后的金额 * 按科目分割后的金额
*/ */
private List<SubjectDispatchSumVo> subjectDispatchAmountList; List<SubjectDispatchSumVo> subjectDispatchAmountList;
@Data
public static class SubjectDispatchSumVo {
BigDecimal subjectRate;
Long subjectId;
String subjectCode;
String subjectName;
BigDecimal subjectAmount;
}
} }

19
cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/vo/SubjectDispatchSumVo.java

@ -0,0 +1,19 @@
package com.qs.serve.modules.erp.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author YenHex
* @since 2025/5/7
*/
@Data
public class SubjectDispatchSumVo {
Long subjectId;
String subjectCode;
String subjectName;
BigDecimal subjectAmount;
}

21
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java

@ -7,8 +7,10 @@ import com.qs.serve.framework.base.model.dto.CommonIdsParam;
import com.qs.serve.framework.base.model.R; import com.qs.serve.framework.base.model.R;
import com.qs.serve.common.enums.BizType; import com.qs.serve.common.enums.BizType;
import com.qs.serve.common.enums.SystemModule; import com.qs.serve.common.enums.SystemModule;
import com.qs.serve.framework.base.util.JsonUtil;
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.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.*;
@ -55,6 +57,7 @@ public class TbsActivityController2 {
List<ErpDispatchSumPmsVo> result = new ArrayList<>(); List<ErpDispatchSumPmsVo> result = new ArrayList<>();
for (String s : idArr) { for (String s : idArr) {
ErpDispatchSumPmsVo vo = this.buildVrpDispatchSumPms(Long.parseLong(s)); ErpDispatchSumPmsVo vo = this.buildVrpDispatchSumPms(Long.parseLong(s));
vo.setActivityId(s);
result.add(vo); result.add(vo);
} }
return R.ok(result); return R.ok(result);
@ -107,15 +110,24 @@ public class TbsActivityController2 {
query.setSkuIds(ids); query.setSkuIds(ids);
hasGoods = true; hasGoods = true;
} }
ErpDispatchSumPmsVo sumPmsVo = CopierUtil.copy(query,new ErpDispatchSumPmsVo()); ErpDispatchSumPmsVo sumPmsVo = new ErpDispatchSumPmsVo();
sumPmsVo.setSupplierCode(query.getSupplierCode());
sumPmsVo.setStartDate(query.getStartDate());
sumPmsVo.setEndDate(query.getEndDate());
sumPmsVo.setCategoryIds(query.getCategoryIds());
sumPmsVo.setSpuIds(query.getSpuIds());
sumPmsVo.setSkuIds(query.getSkuIds());
BigDecimal amt = BigDecimal.ZERO; BigDecimal amt = BigDecimal.ZERO;
if (hasGoods){ if (hasGoods){
amt = erpDispatchDataMapper.queryCusAmtByPms(query); amt = erpDispatchDataMapper.queryCusAmtByPms(query);
if (amt==null){
amt = BigDecimal.ZERO;
}
List<TbsActivitySubject> activitySubjects = tbsActivitySubjectService.list(new LambdaQueryWrapper<TbsActivitySubject>() List<TbsActivitySubject> activitySubjects = tbsActivitySubjectService.list(new LambdaQueryWrapper<TbsActivitySubject>()
.eq(TbsActivitySubject::getActivityId,activityId)); .eq(TbsActivitySubject::getActivityId,activityId));
List<ErpDispatchSumPmsVo.SubjectDispatchSumVo> dispatchSumVoList = new ArrayList<>(); List<SubjectDispatchSumVo> dispatchSumVoList = new ArrayList<>();
sumPmsVo.setSubjectDispatchAmountList(dispatchSumVoList);
// 开始平摊逻辑 // 开始平摊逻辑
int size = activitySubjects.size(); int size = activitySubjects.size();
if (size > 0) { if (size > 0) {
@ -137,7 +149,7 @@ public class TbsActivityController2 {
remainingAmt = remainingAmt.subtract(allocatedAmt); remainingAmt = remainingAmt.subtract(allocatedAmt);
} }
ErpDispatchSumPmsVo.SubjectDispatchSumVo subjectDispatchSumVo = new ErpDispatchSumPmsVo.SubjectDispatchSumVo(); SubjectDispatchSumVo subjectDispatchSumVo = new SubjectDispatchSumVo();
subjectDispatchSumVo.setSubjectId(subject.getSubjectId()); subjectDispatchSumVo.setSubjectId(subject.getSubjectId());
subjectDispatchSumVo.setSubjectCode(subject.getSubjectCode()); subjectDispatchSumVo.setSubjectCode(subject.getSubjectCode());
subjectDispatchSumVo.setSubjectName(subject.getSubjectName()); subjectDispatchSumVo.setSubjectName(subject.getSubjectName());
@ -145,6 +157,7 @@ public class TbsActivityController2 {
dispatchSumVoList.add(subjectDispatchSumVo); dispatchSumVoList.add(subjectDispatchSumVo);
} }
} }
sumPmsVo.setSubjectDispatchAmountList(dispatchSumVoList);
} }
sumPmsVo.setTotalAmount(amt); sumPmsVo.setTotalAmount(amt);
return sumPmsVo; return sumPmsVo;

2
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java

@ -46,7 +46,7 @@ public class TzcRebateController {
@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){
List<TzcRebateCalculateDTO> result = new ArrayList<>(); List<TzcRebateCalculateDTO> result = new ArrayList<>();
for (TzcGetActivityRebateQuery query : queryList) { for (TzcGetActivityRebateQuery query : queryList) {
TzcRebateCalculateDTO dto = tzcRebateApplication4VerificationService.getActivityRebateAmount(query.getActivityId(),query.getDispatchAmount()); TzcRebateCalculateDTO dto = tzcRebateApplication4VerificationService.getActivityRebateAmount(query.getActivityId(),query.getDispatchAmount());

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

@ -1,5 +1,6 @@
package com.qs.serve.modules.tzc.service.impl; package com.qs.serve.modules.tzc.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qs.serve.common.utils.CopierUtil; import com.qs.serve.common.utils.CopierUtil;
@ -22,6 +23,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
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;
@ -127,7 +129,7 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
activity.setRebatePeriodId(period.getId()); activity.setRebatePeriodId(period.getId());
activity.setCostApplyId(costApplyId); activity.setCostApplyId(costApplyId);
activity.setActivityCode(rebate.getRebateCode()+"_"+(i+1)); activity.setActivityCode(rebate.getRebateCode()+"_"+(i+1));
activity.setActivityState(TbsActivityState.STATE_1_Finished); activity.setActivityState(TbsActivityState.STATE_0_Todo);
activity.setCostPassFlag(0); activity.setCostPassFlag(0);
activity.setActTitle(rebate.getRebateName()); activity.setActTitle(rebate.getRebateName());
activity.setSupplierId(rebate.getSupplierId()); activity.setSupplierId(rebate.getSupplierId());
@ -345,6 +347,9 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
.eq(TzcRebateLevels::getSamePeriodFlag, samePeriodFlag) .eq(TzcRebateLevels::getSamePeriodFlag, samePeriodFlag)
.orderByDesc(TzcRebateLevels::getLevelNum) .orderByDesc(TzcRebateLevels::getLevelNum)
); );
if (CollUtil.isEmpty(levelsList)){
dto.appendErrorMsg(samePeriodFlag==0?"未找到匹配无同期的坎级":"未找到匹配有同期的坎级");
}
dto.setSamePeriodLevelList(levelsList); dto.setSamePeriodLevelList(levelsList);
// 命中的最高坎级 // 命中的最高坎级
for (TzcRebateLevels levels : levelsList) { for (TzcRebateLevels levels : levelsList) {
@ -357,29 +362,32 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
}else if (levels.getConditionType().equals(1)){ }else if (levels.getConditionType().equals(1)){
periodAmount = rebatePeriod.getPeriodAmount(); periodAmount = rebatePeriod.getPeriodAmount();
} }
BigDecimal targetAmt = periodAmount.multiply(levels.getConditionRate())
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
// 发货金额大于坎级制定的百分比 // 发货金额大于坎级制定的百分比
boolean ok = dispatchAmt.compareTo( boolean ok = dispatchAmt.compareTo(targetAmt)>=0;
periodAmount.multiply(levels.getConditionRate())
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)
)>=0;
if (!ok){ if (!ok){
log.debug("命中最高坎级:"+levels.getLevelNum()+",条件比重:"+levels.getConditionRate()+"%"); dto.appendDebugMsg("跳过坎级:"+levels.getLevelNum()+",条件金额:"+targetAmt+",发货金额:"+dispatchAmt);
log.debug("跳过坎级:{},条件金额:{},发货金额:{}",levels.getLevelNum(),targetAmt,dispatchAmt);
continue; continue;
} }
dto.appendDebugMsg("命中坎级:"+levels.getLevelNum()+",条件金额:"+targetAmt+",发货金额:"+dispatchAmt);
dto.setMaxLevels(levels); dto.setMaxLevels(levels);
return dto; return dto;
}else if (levels.getConditionSelect().equals(1)){ }else if (levels.getConditionSelect().equals(1)){
// 发货金额大于坎级制定的固定金额 // 发货金额大于坎级制定的固定金额
boolean ok = dispatchAmt.compareTo(levels.getConditionAmount())>=0; boolean ok = dispatchAmt.compareTo(levels.getConditionAmount())>=0;
if (!ok){ if (!ok){
log.debug("命中最高坎级:"+levels.getLevelNum()+",条件固定金额:"+levels.getConditionAmount()); dto.appendDebugMsg("跳过坎级:"+levels.getLevelNum()+",条件金额:"+levels.getConditionAmount()+",发货金额:"+dispatchAmt);
log.debug("跳过坎级:{},条件金额:{},发货金额:{}",levels.getLevelNum(),levels.getConditionAmount(),dispatchAmt);
continue; continue;
} }
dto.appendDebugMsg("命中坎级:"+levels.getLevelNum()+",条件固定金额:"+levels.getConditionAmount()+",发货金额:"+dispatchAmt);
dto.setMaxLevels(levels); dto.setMaxLevels(levels);
return dto; return dto;
} }
} }
return null; return dto;
} }
@Override @Override
@ -387,11 +395,10 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
BigDecimal dispatchAmt, BigDecimal dispatchAmt,
BigDecimal sameDispatchAmt, BigDecimal sameDispatchAmt,
TzcArgTypes argType) { TzcArgTypes argType) {
if (dto==null){ TzcRebateLevels levels = dto.getMaxLevels();
log.debug("没有命中坎级"); if (levels==null){
return null; return null;
} }
TzcRebateLevels levels = dto.getMaxLevels();
List<TzcRebateLevels> allRebateLvList = dto.getSamePeriodLevelList(); List<TzcRebateLevels> allRebateLvList = dto.getSamePeriodLevelList();
TzcRebateLevelsConfig levelsConfig = tzcRebateLevelsConfigService.getOne( TzcRebateLevelsConfig levelsConfig = tzcRebateLevelsConfigService.getOne(
@ -403,9 +410,12 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
String[] configArr; String[] configArr;
if (levelsConfig==null){ if (levelsConfig==null){
log.warn("没有坎级配置:"+levels.getLevelNum()+";返利ID:"+levels.getRebateId()); log.warn("没有坎级配置:"+levels.getLevelNum()+";返利ID:"+levels.getRebateId());
dto.appendDebugMsg("没有坎级配置:"+levels.getLevelNum()+";返利ID:"+levels.getRebateId());
configArr = new String[]{levels.getLevelNum()+""}; configArr = new String[]{levels.getLevelNum()+""};
}else { }else {
log.debug("读取坎级配置,坎级:"+levels.getLevelNum()); log.debug("读取坎级配置,坎级:"+levels.getLevelNum());
dto.appendDebugMsg("读取坎级("+levels.getLevelNum()+")配置 ,配置叠级:"
+ String.join(",", levelsConfig.getLevelConfigs()));
configArr = levelsConfig.getLevelConfigs(); configArr = levelsConfig.getLevelConfigs();
} }
// 获取命中的坎级 // 获取命中的坎级
@ -467,6 +477,7 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
}else { }else {
rebateLevelsDTO.setReturnAmt(BigDecimal.ZERO); rebateLevelsDTO.setReturnAmt(BigDecimal.ZERO);
log.warn("返利参数TzcRebateLevelsArgument-ID:{},返利金额小于0",currentArgument.getId()); log.warn("返利参数TzcRebateLevelsArgument-ID:{},返利金额小于0",currentArgument.getId());
dto.appendErrorMsg("返利参数TzcRebateLevelsArgument-ID:"+currentArgument.getId()+",返利金额小于0");
} }
} }
} }

20
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java

@ -1,5 +1,6 @@
package com.qs.serve.modules.tzc.service.impl; package com.qs.serve.modules.tzc.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.qs.serve.modules.tbs.entity.TbsActivity; import com.qs.serve.modules.tbs.entity.TbsActivity;
import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; import com.qs.serve.modules.tbs.mapper.TbsActivityMapper;
import com.qs.serve.modules.tbs.service.*; import com.qs.serve.modules.tbs.service.*;
@ -53,14 +54,15 @@ public class TzcRebateApplication4VerificationServiceImpl implements TzcRebateAp
TbsActivity activity = tbsActivityMapper.selectById(activityId); TbsActivity activity = tbsActivityMapper.selectById(activityId);
TzcRebatePeriod rebatePeriod = tzcRebatePeriodService.getById(activity.getRebatePeriodId()); TzcRebatePeriod rebatePeriod = tzcRebatePeriodService.getById(activity.getRebatePeriodId());
BigDecimal sameDispatchAmt = rebatePeriod.getSamePeriodAmount(); BigDecimal sameDispatchAmt = rebatePeriod.getSamePeriodAmount();
//BigDecimal sameDispatchAmt = BigDecimal.ZERO;
// 获取最高命中的坎级 // 获取最高命中的坎级
TzcRebateCalculateDTO calculateDTO = tzcRebateApplication4CostService.getHitRebateMaxLevel( TzcRebateCalculateDTO calculateDTO = tzcRebateApplication4CostService.getHitRebateMaxLevel(
dispatchAmt, sameDispatchAmt, activity.getRebatePeriodId()); dispatchAmt, sameDispatchAmt, activity.getRebatePeriodId());
if (calculateDTO != null){ calculateDTO.setActivityId(activityId);
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;
BigDecimal totalReturnAmt = BigDecimal.ZERO; if (CollUtil.isNotEmpty(levelAmountList)){
// 计算已用的优惠 // 计算已用的优惠
for (TzcRebateLevelAmountDTO amountDTO : levelAmountList) { for (TzcRebateLevelAmountDTO amountDTO : levelAmountList) {
// 返利金额 // 返利金额
@ -74,12 +76,12 @@ public class TzcRebateApplication4VerificationServiceImpl implements TzcRebateAp
if (returnAmt.compareTo(surplusReturnAmt) > 0){ if (returnAmt.compareTo(surplusReturnAmt) > 0){
amountDTO.setReturnAmt(surplusReturnAmt); amountDTO.setReturnAmt(surplusReturnAmt);
} }
totalReturnAmt.add(amountDTO.getReturnAmt()); totalReturnAmt = totalReturnAmt.add(amountDTO.getReturnAmt());
amountDTO.setVerificationAmt(verificationAmt); amountDTO.setVerificationAmt(verificationAmt);
} }
calculateDTO.setTotalReturnAmt(totalReturnAmt);
calculateDTO.setLevelAmountList(levelAmountList);
} }
calculateDTO.setTotalReturnAmt(totalReturnAmt);
calculateDTO.setLevelAmountList(levelAmountList);
return calculateDTO; return calculateDTO;
} }

4
cms-modules/cms-system/src/main/resources/mapper/erp/ErpDispatchDataMapper.xml

@ -128,13 +128,13 @@
SUM(d.sum_money) as totalAmount SUM(d.sum_money) as totalAmount
FROM FROM
`erp_dispatch_data` d `erp_dispatch_data` d
left JOIN goods_sku ON d.invCode = goods_sku.sku_code left JOIN goods_sku ON d.inv_code = goods_sku.sku_code
left join goods_spu ON goods_sku.spu_id = goods_spu.id left join goods_spu ON goods_sku.spu_id = goods_spu.id
where where
d.place = '001' d.place = '001'
and d.date &gt;= #{query.startDate} and d.date &gt;= #{query.startDate}
and d.date &lt;= #{query.endDate} and d.date &lt;= #{query.endDate}
and d.cus_code = #{query.customerCode} and d.cus_code = #{query.supplierCode}
<if test="query.brandIds!=null and query.brandIds.size > 0"> <if test="query.brandIds!=null and query.brandIds.size > 0">
and goods_spu.category_first in and goods_spu.category_first in
<foreach collection="query.brandIds" item ="selectId" index="i" open="(" close=")" separator=","> <foreach collection="query.brandIds" item ="selectId" index="i" open="(" close=")" separator=",">

Loading…
Cancel
Save