Browse Source

feat(rebate): 返利匹配日志

master
Yen 2 months ago
parent
commit
be990ad0d6
  1. 30
      cms-framework/cms-framework-base/src/main/java/com/qs/serve/framework/base/util/DebugStrUtil.java
  2. 2
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevelsArgument.java
  3. 6
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcRebateArgumentParam.java
  4. 1
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcRebateParam.java
  5. 5
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java
  6. 29
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java
  7. 6
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplicationServiceImpl.java

30
cms-framework/cms-framework-base/src/main/java/com/qs/serve/framework/base/util/DebugStrUtil.java

@ -0,0 +1,30 @@
package com.qs.serve.framework.base.util;
import com.qs.serve.common.context.SecurityUserUtil;
/**
* @author YenHex
* @since 2025/5/26
*/
public class DebugStrUtil {
private final static ThreadLocal<String> DEBUG_STRING = new ThreadLocal<>();
public static void removeThreadLocal(){
DEBUG_STRING.remove();
}
public static String getStr(){
return DEBUG_STRING.get();
}
public static void appendStr(String string){
String debugString = DEBUG_STRING.get();
if(debugString == null){
debugString = string;
}else{
debugString = debugString +" \n"+ string;
}
DEBUG_STRING.set(debugString);
}
}

2
cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevelsArgument.java

@ -44,7 +44,7 @@ public class TzcRebateLevelsArgument implements Serializable {
/** 目标销量维度:0-总量;1-增量 */ /** 目标销量维度:0-总量;1-增量 */
private Integer sumAddFlag; private Integer sumAddFlag;
/** 选择的策略:0-百分比;固定金额 */ /** 选择的策略:0-百分比;1-固定金额 */
private Integer rateAmtFlag; private Integer rateAmtFlag;
/** 返利百分比 */ /** 返利百分比 */

6
cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcRebateArgumentParam.java

@ -51,9 +51,9 @@ public class TzcRebateArgumentParam implements Serializable {
if (this.rateAmtFlag == 1 && this.returnFixed == null){ if (this.rateAmtFlag == 1 && this.returnFixed == null){
Assert.throwEx(businessType+":返利固定金额不能为空"); Assert.throwEx(businessType+":返利固定金额不能为空");
} }
if(this.maxReturn==null){ // if(this.maxReturn==null){
Assert.throwEx(businessType+":总量最高返利金额不能为空"); // Assert.throwEx(businessType+":总量最高返利金额不能为空");
} // }
} }
} }

1
cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcRebateParam.java

@ -70,7 +70,6 @@ public class TzcRebateParam{
private Long supplierId; private Long supplierId;
/** 返利总金额 */ /** 返利总金额 */
@NotNull(message = "返利总金额(总预算上限)不能为空")
private BigDecimal rebateAmount; private BigDecimal rebateAmount;
/** 备注 */ /** 备注 */

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

@ -10,6 +10,7 @@ import com.qs.serve.common.utils.PageUtil;
import com.qs.serve.common.utils.StringUtils; import com.qs.serve.common.utils.StringUtils;
import com.qs.serve.framework.base.model.PageVo; import com.qs.serve.framework.base.model.PageVo;
import com.qs.serve.framework.base.model.R; import com.qs.serve.framework.base.model.R;
import com.qs.serve.framework.base.util.DebugStrUtil;
import com.qs.serve.modules.tzc.entity.bo.TzcRebateParam; import com.qs.serve.modules.tzc.entity.bo.TzcRebateParam;
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 com.qs.serve.modules.tzc.entity.qo.TzcGetActivityRebateQuery;
@ -106,7 +107,9 @@ public class TzcRebateController {
@SysLog(module = SystemModule.Policy, title = "返利信息", biz = BizType.UPDATE) @SysLog(module = SystemModule.Policy, title = "返利信息", biz = BizType.UPDATE)
public R<?> modifyRebate(@RequestBody @Valid TzcRebateParam param){ public R<?> modifyRebate(@RequestBody @Valid TzcRebateParam param){
TzcRebate tzcRebate = tzcRebateApplicationService.modifyRebate(param); TzcRebate tzcRebate = tzcRebateApplicationService.modifyRebate(param);
return R.ok(tzcRebate); String msg = DebugStrUtil.getStr();
DebugStrUtil.removeThreadLocal();
return R.ok(tzcRebate,msg);
} }
/** /**

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

@ -5,6 +5,7 @@ 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.exception.Assert; import com.qs.serve.common.exception.Assert;
import com.qs.serve.common.utils.CopierUtil; import com.qs.serve.common.utils.CopierUtil;
import com.qs.serve.framework.base.util.DebugStrUtil;
import com.qs.serve.modules.tbs.common.TbsActivityState; import com.qs.serve.modules.tbs.common.TbsActivityState;
import com.qs.serve.modules.tbs.common.TbsCostApplyState; import com.qs.serve.modules.tbs.common.TbsCostApplyState;
import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.entity.*;
@ -315,25 +316,39 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
List<TzcRebateLevelsConfig> configList, List<TzcRebateLevelsConfig> configList,
BigDecimal maxPeriodAmt, BigDecimal maxPeriodAmt,
boolean hasCompensationFlag){ boolean hasCompensationFlag){
DebugStrUtil.appendStr("是否需要年度补偿:"+hasCompensationFlag+";期间目标最大金额:"+maxPeriodAmt);
BigDecimal maxAmount = BigDecimal.ZERO; BigDecimal maxAmount = BigDecimal.ZERO;
String maxLevelNumConfig = "";
// 存储每坎级最高金额
Map<String,BigDecimal> levelAmountMap = new HashMap<>();
for (TzcRebateLevels levels : levelsList) {
int levelNum = levels.getLevelNum();
BigDecimal levelAmt = getCurrentLevelMaxAmount(levelsList,argumentList,levelNum,maxPeriodAmt,hasCompensationFlag);
levelAmountMap.put(levelNum+"",levelAmt);
DebugStrUtil.appendStr("坎级 "+levelNum+" ,返利金额:"+levelAmt);
}
for (TzcRebateLevelsConfig config : configList) { for (TzcRebateLevelsConfig config : configList) {
Set<String> levelNumSet = Arrays.stream(config.getLevelConfigs()).collect(Collectors.toSet()); Set<String> levelNumSet = Arrays.stream(config.getLevelConfigs()).collect(Collectors.toSet());
// 默认包含当前坎级 // 默认包含当前坎级
levelNumSet.add(config.getLevelNum()+""); levelNumSet.add(config.getLevelNum()+"");
BigDecimal currentConfAmount = BigDecimal.ZERO; BigDecimal currentConfAmount = BigDecimal.ZERO;
for (String levelNumStr : levelNumSet) { for (String levelNumStr : levelNumSet) {
int levelNum = Integer.parseInt(levelNumStr);
// 当前坎级最高返利金额 // 当前坎级最高返利金额
BigDecimal currentLevelMaxAmount = getCurrentLevelMaxAmount( BigDecimal currentLevelMaxAmount = levelAmountMap.get(levelNumStr);
levelsList, argumentList, levelNum,maxPeriodAmt,hasCompensationFlag);
if (currentLevelMaxAmount.compareTo(BigDecimal.ZERO)>0){ if (currentLevelMaxAmount.compareTo(BigDecimal.ZERO)>0){
currentConfAmount = currentConfAmount.add(currentLevelMaxAmount); currentConfAmount = currentConfAmount.add(currentLevelMaxAmount);
} }
} }
String levelNumConfig = Arrays.stream(config.getLevelConfigs()).collect(Collectors.joining(","));
DebugStrUtil.appendStr("坎级叠加:"
+ levelNumConfig
+",合计金额:"+currentConfAmount);
if (currentConfAmount.compareTo(maxAmount)>0){ if (currentConfAmount.compareTo(maxAmount)>0){
maxAmount = currentConfAmount; maxAmount = currentConfAmount;
maxLevelNumConfig = levelNumConfig;
} }
} }
DebugStrUtil.appendStr("使用坎级配置:"+maxLevelNumConfig+";最高坎级叠加金额:"+maxAmount);
return maxAmount; return maxAmount;
} }
@ -356,6 +371,10 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
// 排除返利和补偿返利的最高金额 // 排除返利和补偿返利的最高金额
BigDecimal currentArgAmount = BigDecimal.ZERO; BigDecimal currentArgAmount = BigDecimal.ZERO;
for (TzcRebateLevelsArgument argument : argumentList) { for (TzcRebateLevelsArgument argument : argumentList) {
// 不需要年度补偿则跳过
if (argument.getBusinessType().equals(TzcArgTypes.LevelOverallReturn.name())&&!hasCompensationFlag){
continue;
}
if(argument.getLevelId().equals(levels.getId())){ if(argument.getLevelId().equals(levels.getId())){
BigDecimal argAmount = BigDecimal.ZERO; BigDecimal argAmount = BigDecimal.ZERO;
// 使用最高金额 // 使用最高金额
@ -363,9 +382,9 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
argAmount = argument.getMaxReturn(); argAmount = argument.getMaxReturn();
}else { }else {
// 使用固定金额 // 使用固定金额
if (argument.getRateAmtFlag().equals(0)){ if (argument.getRateAmtFlag().equals(1)){
argAmount = argument.getReturnFixed(); argAmount = argument.getReturnFixed();
}else if (argument.getRateAmtFlag().equals(1)){ }else if (argument.getRateAmtFlag().equals(0)){
// 使用比例金额(目标返利x比例) // 使用比例金额(目标返利x比例)
if (argument.getSumAddFlag().equals(0)){ if (argument.getSumAddFlag().equals(0)){
argAmount = argument.getReturnRate().multiply(maxPeriodAmt) argAmount = argument.getReturnRate().multiply(maxPeriodAmt)

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

@ -9,6 +9,7 @@ import com.qs.serve.common.utils.CopierUtil;
import com.qs.serve.common.utils.StringUtils; import com.qs.serve.common.utils.StringUtils;
import com.qs.serve.framework.base.model.ResultFlag; import com.qs.serve.framework.base.model.ResultFlag;
import com.qs.serve.framework.base.util.CollectionUtil; import com.qs.serve.framework.base.util.CollectionUtil;
import com.qs.serve.framework.base.util.DebugStrUtil;
import com.qs.serve.framework.redis.utils.CodeGenUtil; import com.qs.serve.framework.redis.utils.CodeGenUtil;
import com.qs.serve.modules.bms.entity.BmsSubject; import com.qs.serve.modules.bms.entity.BmsSubject;
import com.qs.serve.modules.bms.entity.BmsSupplier; import com.qs.serve.modules.bms.entity.BmsSupplier;
@ -233,11 +234,11 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ
BigDecimal maxAmount = tzcRebateApplication4CostService.getMaxLevelsAmount( BigDecimal maxAmount = tzcRebateApplication4CostService.getMaxLevelsAmount(
levelsList, argumentList, configList,maxPeriodTarAmount,hasCompensationFlag); levelsList, argumentList, configList,maxPeriodTarAmount,hasCompensationFlag);
BigDecimal totalAllAmount = maxAmount.multiply(new BigDecimal(param.getPeriodList().size())); BigDecimal totalAllAmount = maxAmount.multiply(new BigDecimal(param.getPeriodList().size()));
String periodMsg = "坎级叠加最高金额为:"+maxAmount; String periodMsg = "坎级叠加金额为:"+maxAmount;
// 判断是否超预算 // 判断是否超预算
if (param.getRebateAmount()!=null){ if (param.getRebateAmount()!=null){
if(totalAllAmount.compareTo(param.getRebateAmount())>0){ if(totalAllAmount.compareTo(param.getRebateAmount())>0){
Assert.throwEx("返利金额超预算"); Assert.throwEx("期间总预算,超过总返利金额上限");
} }
// 计算需要增加的金额 // 计算需要增加的金额
BigDecimal needAddAmt = param.getRebateAmount().subtract(totalAllAmount); BigDecimal needAddAmt = param.getRebateAmount().subtract(totalAllAmount);
@ -246,6 +247,7 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ
maxAmount = maxAmount.add(needAddAvgAmt); maxAmount = maxAmount.add(needAddAvgAmt);
totalAllAmount = param.getRebateAmount(); totalAllAmount = param.getRebateAmount();
periodMsg = periodMsg+";设置最高返利金额:"+param.getRebateAmount()+",补充活动金额:"+needAddAvgAmt+"。活动合计金额:"+maxAmount; periodMsg = periodMsg+";设置最高返利金额:"+param.getRebateAmount()+",补充活动金额:"+needAddAvgAmt+"。活动合计金额:"+maxAmount;
DebugStrUtil.appendStr(periodMsg);
} }
// 期间及补偿参数保存 // 期间及补偿参数保存

Loading…
Cancel
Save