Browse Source

fix(rebate): 修复金额异常

master
Yen 2 months ago
parent
commit
2a540192a0
  1. 18
      cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcRebateParam.java
  2. 4
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java
  3. 1
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityTemplateController.java
  4. 2
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java
  5. 11
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4CostService.java
  6. 4
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4VerificationService.java
  7. 94
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4CostServiceImpl.java
  8. 57
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplication4VerificationServiceImpl.java
  9. 58
      cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateApplicationServiceImpl.java

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

@ -55,15 +55,15 @@ public class TzcRebateParam{
@NotNull(message = "自动核销日期类型不能为空")
private Integer checkAutoDateType;
/** 核销开始时间 */
@NotNull(message = "核销开始时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate checkStartDate;
/** 核销结束时间 */
@NotNull(message = "核销结束时间不能为空")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate checkEndDate;
// /** 核销开始时间 */
// @NotNull(message = "核销开始时间不能为空")
// @DateTimeFormat(pattern = "yyyy-MM-dd")
// private LocalDate checkStartDate;
//
// /** 核销结束时间 */
// @NotNull(message = "核销结束时间不能为空")
// @DateTimeFormat(pattern = "yyyy-MM-dd")
// private LocalDate checkEndDate;
/** 客户id */
@NotNull(message = "客户id不能为空")

4
cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java

@ -138,6 +138,7 @@ public class OmsOrderApi {
*/
@PostMapping("/createOrder")
public R<OmsOrder> createOrderPC(@RequestBody @Valid OmsOrderBo omsOrderBo){
Assert.throwEx("请在最新订单模块下单");
return R.ok(omsOrderService.createOrder(omsOrderBo));
}
@ -148,6 +149,7 @@ public class OmsOrderApi {
*/
@PostMapping("/modifyOrder")
public R<OmsOrder> modifyOrder(@RequestBody @Valid OmsOrderModifyParam param){
Assert.throwEx("请在最新订单模块下单");
omsOrderService.modifyOrder(param);
return R.ok();
}
@ -159,6 +161,7 @@ public class OmsOrderApi {
*/
@PostMapping("/createOrderOnPC")
public R<OmsOrder> createOrder(@RequestBody @Valid OmsOrderSkuBo omsOrderBo){
Assert.throwEx("请在最新订单模块下单");
return R.ok(omsOrderService.createOrderPc(omsOrderBo));
}
@ -418,6 +421,7 @@ public class OmsOrderApi {
@PostMapping("/buildPriceOrder/{id}/{amount}")
@SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE)
public R<?> buildPriceOrder(@PathVariable("id") String id,@PathVariable("amount") String amount){
Assert.throwEx("请在最新订单模块下单");
omsOrderService.buildPriceOrder(id,amount);
return R.ok();
}

1
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityTemplateController.java

@ -249,6 +249,7 @@ public class TbsActivityTemplateController {
if(contractFlag!=null){
tmpLqw.eq(TbsActivityTemplate::getContractFlag,contractFlag);
}
tmpLqw.orderByDesc(TbsActivityTemplate::getCreateTime);
PageUtil.startPage();
List<TbsActivityTemplate> templates = tbsActivityTemplateService.list(tmpLqw);
return R.byPageHelperList(templates);

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

@ -69,7 +69,7 @@ public class TzcRebateController {
*/
@PostMapping("/getRebateInfoOfYear")
public R<List<TzcRebateCalculateDTO>> getRebateByYear(@RequestBody List<TzcGetActivityRebateQuery> queryList){
return R.ok(tzcRebateApplication4VerificationService.getRebateBatchVerificationList(queryList));
return R.ok(tzcRebateApplication4VerificationService.getRebateBatchVerificationList(queryList,null));
}
/**

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

@ -36,7 +36,16 @@ public interface TzcRebateApplication4CostService {
List<TzcRebateCenter> centerList,
List<TzcRebateLevels> levelsList);
/**
* 计算叠加的最高金额
* @param levelsList
* @param argumentList
* @param configList
* @return
*/
BigDecimal getMaxLevelsAmount(List<TzcRebateLevels> levelsList,
List<TzcRebateLevelsArgument> argumentList,
List<TzcRebateLevelsConfig> configList);
/**
* 获取最高命中返利坎级的信息及坎级列表

4
cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateApplication4VerificationService.java

@ -17,10 +17,12 @@ public interface TzcRebateApplication4VerificationService {
/**
* 获取批量核销列表(总目标达标补偿)
* queryList costId 二选一
* @param queryList
* @param costId
* @return
*/
List<TzcRebateCalculateDTO> getRebateBatchVerificationList(List<TzcGetActivityRebateQuery> queryList);
List<TzcRebateCalculateDTO> getRebateBatchVerificationList(List<TzcGetActivityRebateQuery> queryList,Long costId);
/**
* 获取活动返利金额

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

@ -22,10 +22,7 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -100,6 +97,7 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
TbsCostApply costApply = new TbsCostApply();
costApply.setRebateId(rebateId);
costApply.setCode(rebate.getRebateCode());
costApply.setTemplateId(rebate.getTemplateId());
// 标记为返利类型
costApply.setContractFlag(3);
costApply.setMatchType(1);
@ -294,42 +292,59 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
* @param configList
* @return
*/
@Override
public BigDecimal getMaxLevelsAmount(List<TzcRebateLevels> levelsList,
List<TzcRebateLevelsArgument> argumentList,
List<TzcRebateLevelsConfig> configList){
int level = 0;
String[] configArr = null;
for (TzcRebateLevelsConfig config: configList) {
if(config.getLevelNum()>level){
level = config.getLevelNum();
configArr = config.getLevelConfigs();
BigDecimal maxAmount = BigDecimal.ZERO;
for (TzcRebateLevelsConfig config : configList) {
Set<String> levelNumSet = Arrays.stream(config.getLevelConfigs()).collect(Collectors.toSet());
// 默认包含当前坎级
levelNumSet.add(config.getLevelNum()+"");
BigDecimal currentConfAmount = BigDecimal.ZERO;
for (String levelNumStr : levelNumSet) {
int levelNum = Integer.parseInt(levelNumStr);
// 当前坎级最高返利金额
BigDecimal currentLevelMaxAmount = getCurrentLevelMaxAmount(levelsList, argumentList, levelNum);
if (currentLevelMaxAmount.compareTo(BigDecimal.ZERO)>0){
currentConfAmount = currentConfAmount.add(currentLevelMaxAmount);
}
}
if (currentConfAmount.compareTo(maxAmount)>0){
maxAmount = currentConfAmount;
}
}
BigDecimal maxAmount = BigDecimal.ZERO;
return maxAmount;
}
/**
* 获取当前坎级最高金额
* @param levelsList
* @param argumentList
* @param levelNum
* @return
*/
@NotNull
private BigDecimal getCurrentLevelMaxAmount(List<TzcRebateLevels> levelsList, List<TzcRebateLevelsArgument> argumentList, int levelNum) {
BigDecimal currentLevelMaxAmount = BigDecimal.ZERO;
for (TzcRebateLevels levels : levelsList) {
String lvNum = levels.getLevelNum()+"";
for (String levelNum : configArr) {
if(lvNum.equals(levelNum)){
BigDecimal amt1 = BigDecimal.ZERO;
BigDecimal amt2 = BigDecimal.ZERO;
for (TzcRebateLevelsArgument argument : argumentList) {
if(argument.getLevelId().equals(levels.getId())){
if (argument.getBusinessType().equals(TzcArgTypes.LevelReturn.name())){
amt1 = argument.getMaxReturn();
}else if (argument.getBusinessType().equals(TzcArgTypes.LevelOverallReturn.name())){
amt2 = argument.getMaxReturn();
}
if(levels.getLevelNum()== levelNum){
// 排除返利和补偿返利的最高金额
BigDecimal currentArgAmount = BigDecimal.ZERO;
for (TzcRebateLevelsArgument argument : argumentList) {
if(argument.getLevelId().equals(levels.getId())){
if (argument.getMaxReturn().compareTo(currentArgAmount)>0){
currentArgAmount = argument.getMaxReturn();
}
}
if(amt1.compareTo(amt2)>0){
maxAmount = amt1;
}else {
maxAmount = amt2;
}
}
// 排除同坎级的有同期和无同期的最高金额
if (currentArgAmount.compareTo(currentLevelMaxAmount)>0){
currentLevelMaxAmount = currentArgAmount;
}
}
}
return maxAmount;
return currentLevelMaxAmount;
}
@Override
@ -360,12 +375,12 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
String msg = "";
if (levels.getConditionType().equals(0)){
periodAmount = sameDispatchAmt;
msg = "同期金额:"+periodAmount;
msg = "同期金额:"+periodAmount;
}else if (levels.getConditionType().equals(1)){
periodAmount = tarPeriodAmount;
msg = "目标金额:"+periodAmount;
msg = "目标金额:"+periodAmount;
}
msg = "("+msg+"占比:"+levels.getConditionRate()+"(含)-"+levels.getConditionRateEnd()+"%";
msg = msg+"占比:"+levels.getConditionRate()+"(含)-"+levels.getConditionRateEnd()+"%";
BigDecimal targetAmt = periodAmount.multiply(levels.getConditionRate())
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
BigDecimal targetAmtEnd = periodAmount.multiply(levels.getConditionRateEnd())
@ -374,10 +389,10 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
boolean ok1 = dispatchAmt.compareTo(targetAmt)>=0; // 包含
boolean ok2 = dispatchAmt.compareTo(targetAmtEnd)<0; // 不包含
if (!ok1 || !ok2){
dto.appendDebugMsg("跳过坎级:"+levels.getLevelNum()+",门槛金额:"+targetAmt+msg+",发货金额:"+dispatchAmt);
dto.appendDebugMsg("跳过坎级:"+levels.getLevelNum()+",门槛金额:"+targetAmt+"-"+targetAmtEnd + msg+",发货金额:"+dispatchAmt);
continue;
}
dto.appendDebugMsg("命中坎级:"+levels.getLevelNum()+",条件金额:"+targetAmt+msg+",发货金额:"+dispatchAmt);
dto.appendDebugMsg("命中坎级:"+levels.getLevelNum()+",门槛金额:"+targetAmt+"-"+targetAmtEnd + msg+",发货金额:"+dispatchAmt);
dto.setMaxLevels(levels);
return dto;
}else if (levels.getConditionSelect().equals(1)){
@ -464,7 +479,6 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
dto.appendDebugMsg("读取坎级("+rebateLevels.getLevelNum()+")配置 ,返利参数:"+currentArgument.getBusinessType());
TzcRebateLevelAmountDTO rebateLevelsDTO = CopierUtil.copy(rebateLevels,new TzcRebateLevelAmountDTO());
rebateLevelsDTO.setArgument(currentArgument);
rebateLevelsDTO.setMaxReturn(currentArgument.getMaxReturn());
// 选择的策略:0-百分比;1-固定金额
if (currentArgument.getRateAmtFlag().equals(1)){
rebateLevelsDTO.setReturnAmt(currentArgument.getReturnFixed());
@ -474,8 +488,11 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
if (currentArgument.getSumAddFlag().equals(0)){
BigDecimal rs = dispatchAmt.multiply(currentArgument.getReturnRate())
.divide(BigDecimal.valueOf(100),2,RoundingMode.HALF_UP);
if (rs.compareTo(currentArgument.getMaxReturn())>0){
rs = currentArgument.getMaxReturn();
}
rebateLevelsDTO.setReturnAmt(rs);
rebateLevelsDTO.setDebugMsg("基于总量("+rs+")=返货金额("+dispatchAmt+")*返利百分比("+currentArgument.getReturnRate()+"%)");
rebateLevelsDTO.setDebugMsg("基于总量("+rs+")=返货金额("+dispatchAmt+")*返利百分比("+currentArgument.getReturnRate()+"%);最高返利:"+currentArgument.getMaxReturn());
}else if (currentArgument.getSumAddFlag().equals(1)){
// 增量 = (发货金额 - 同比发货金额) * 返利比例 / 100
BigDecimal rs = dispatchAmt.subtract(sameDispatchAmt)
@ -483,7 +500,10 @@ public class TzcRebateApplication4CostServiceImpl implements TzcRebateApplicatio
.divide(BigDecimal.valueOf(100),2,RoundingMode.HALF_UP);
if (rs.compareTo(BigDecimal.ZERO)>0){
rebateLevelsDTO.setDebugMsg("基于增量("+rs+") " +
"= (发货金额["+dispatchAmt+"] - 同比发货金额["+sameDispatchAmt+"]) * 返利比例["+currentArgument.getReturnRate()+"%]");
"= (发货金额["+dispatchAmt+"] - 同比发货金额["+sameDispatchAmt+"]) * 返利比例["+currentArgument.getReturnRate()+"%];最高返利"+currentArgument.getMaxReturn());
if (rs.compareTo(currentArgument.getMaxReturn())>0){
rs = currentArgument.getMaxReturn();
}
rebateLevelsDTO.setReturnAmt(rs);
}else {
rebateLevelsDTO.setReturnAmt(BigDecimal.ZERO);

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

@ -62,11 +62,27 @@ public class TzcRebateApplication4VerificationServiceImpl implements TzcRebateAp
private final TzcRebateLevelsService tzcRebateLevelsService;
private final ErpDispatchDataMapper erpDispatchDataMapper;
@Override
public List<TzcRebateCalculateDTO> getRebateBatchVerificationList(List<TzcGetActivityRebateQuery> queryList) {
public List<TzcRebateCalculateDTO> getRebateBatchVerificationList(List<TzcGetActivityRebateQuery> queryList,Long costId) {
// 方法类型:0 :通过前端传参,1:通过数据库查询
int methodType = 1;
List<Long> activityIds = null;
if (CollUtil.isEmpty(queryList)){
methodType = 0;
activityIds = queryList.stream()
.map(TzcGetActivityRebateQuery::getActivityId).collect(Collectors.toList());
}else {
methodType = 1;
activityIds = tbsActivityMapper.selectList(
new LambdaQueryWrapper<TbsActivity>()
.select(TbsActivity::getId)
.eq(TbsActivity::getCostApplyId, costId)
).stream().map(TbsActivity::getId).collect(Collectors.toList());
}
List<Long> activityIds = queryList.stream()
.map(TzcGetActivityRebateQuery::getActivityId).collect(Collectors.toList());
List<TbsActivity> activityList = tbsActivityMapper.selectBatchIds(activityIds);
if (CollUtil.isEmpty(activityList)){
@ -100,23 +116,30 @@ public class TzcRebateApplication4VerificationServiceImpl implements TzcRebateAp
if (activity == null){
Assert.throwEx("缺少有效的活动id");
}
// 实际发货金额,方式一(前端传参)
BigDecimal dispatchAmt = null;
for (TzcGetActivityRebateQuery query : queryList) {
if (query.getActivityId().equals(activity.getId())){
// 获取发货金额
dispatchAmt = query.getDispatchAmount();
// 实际发货金额,方式一(前端传参)
if (methodType==0){
for (TzcGetActivityRebateQuery query : queryList) {
if (query.getActivityId().equals(activity.getId())){
// 获取发货金额
dispatchAmt = query.getDispatchAmount();
}
}
if (dispatchAmt == null){
Assert.throwEx("缺少有效的发货金额");
}
}else {
// 实际发货金额,方式二(通过数据库查询)
dispatchAmt = this.getPeriodDispatch(
supplierCode,
period.getPeriodStartDate(),
period.getPeriodEndDate(),
goodsMap);
if (dispatchAmt==null){
dispatchAmt = BigDecimal.ZERO;
}
}
if (dispatchAmt == null){
Assert.throwEx("缺少有效的发货金额");
}
// 实际发货金额,方式二(通过数据库查询)
// BigDecimal dispatchAmt = this.getPeriodDispatch(
// supplierCode,
// period.getPeriodStartDate(),
// period.getPeriodEndDate(),
// goodsMap);
// 区间目标合计金额
BigDecimal periodAmt = period.getPeriodAmount();
// 同期进货合计金额

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

@ -169,12 +169,6 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ
// 校验返利参数(取消判断金额)
this.validRebateParam(param);
// 获取最高坎级返回的金额
BigDecimal maxAmount = this.getMaxLevelsAmount(param);
// 计算和平摊到科目和成本中心(不再读取前端的金额)
List<TzcRebateSubjectParam> subjectParamList = param.getSubjectList();
this.calculateSubjectAndCenter(subjectParamList, maxAmount);
if (isUpdate){
//删除旧数据
this.removeOldRebateDataById(rebateId);
@ -197,24 +191,20 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ
// 返利的商品
List<TzcRebateGoods> tzcRebateGoodsList = this.buildRebateGoodsList(param.getGoodsType(),param.getGoodsList());
// 返利的商品,关联主表id和code
for (TzcRebateGoods rebateGoods : tzcRebateGoodsList) {
rebateGoods.setRebateId(rebate.getId());
rebateGoods.setRebateCode(rebate.getRebateCode());
}
tzcRebateGoodsService.saveBatch(tzcRebateGoodsList);
// 返利的成本中心(引用类型赋值)
List<TzcRebateCenter> rebateCenterList = new ArrayList<>();
// 返利的科目
List<TzcRebateSubject> tzcRebateSubjectList = this.buildRebateSubjectList(rebateId,param.getSubjectList(),rebateCenterList);
// 期间及补偿参数保存
List<TzcRebatePeriod> periodList = this.savePeriodList(param.getPeriodList(), rebateId);
// 保存坎级和设置参数
List<TzcRebateLevelsArgument> argumentList = new ArrayList<>();
List<TzcRebateLevels> levelsList = this.saveLevelListAndArgs(param, rebateId,argumentList);
List<TzcRebateLevels> levelsList = this.saveLevelListAndArgs(param.getLevelsList(), rebateId,argumentList);
// 返利的商品,关联主表id和code
for (TzcRebateGoods rebateGoods : tzcRebateGoodsList) {
rebateGoods.setRebateId(rebate.getId());
rebateGoods.setRebateCode(rebate.getRebateCode());
}
tzcRebateGoodsService.saveBatch(tzcRebateGoodsList);
// 保存坎级叠加配置
List<TzcRebateLevelsConfig> configList = new ArrayList<>();
@ -227,6 +217,18 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ
tzcRebateLevelsConfigService.save(config);
configList.add(config);
}
// 获取最高坎级返回的金额
BigDecimal maxAmount = tzcRebateApplication4CostService.getMaxLevelsAmount(levelsList, argumentList, configList);
// 计算和平摊到科目和成本中心(不再读取前端的金额)
List<TzcRebateSubjectParam> subjectParamList = param.getSubjectList();
this.calculateSubjectAndCenter(subjectParamList, maxAmount);
// 返利的成本中心(引用类型赋值)
List<TzcRebateCenter> rebateCenterList = new ArrayList<>();
// 返利的科目
List<TzcRebateSubject> tzcRebateSubjectList = this.buildRebateSubjectList(rebateId,param.getSubjectList(),rebateCenterList);
// 建立费用
Long costApplyId = tzcRebateApplication4CostService.buildCostAndActivity(
rebate,
@ -345,12 +347,15 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ
/**
* 保存坎级和设置参数
* @param param
* @param levelsParamList
* @param rebateId
* @param argumentList
*/
private List<TzcRebateLevels> saveLevelListAndArgs(TzcRebateParam param, Long rebateId,List<TzcRebateLevelsArgument> argumentList) {
private List<TzcRebateLevels> saveLevelListAndArgs(List<TzcRebateLevelsParam> levelsParamList,
Long rebateId,
List<TzcRebateLevelsArgument> argumentList) {
List<TzcRebateLevels> levelsList = new ArrayList<>();
for (TzcRebateLevelsParam levelsParam : param.getLevelsList()) {
for (TzcRebateLevelsParam levelsParam : levelsParamList) {
TzcRebateLevels levels = new TzcRebateLevels();
levels.setRebateId(rebateId);
levels.setLevelNum(levelsParam.getLevelNum());
@ -417,8 +422,15 @@ public class TzcRebateApplicationServiceImpl implements TzcRebateApplicationServ
rebate.setCheckModel(param.getCheckModel());
rebate.setCheckMaxAmount(param.getCheckMaxAmount());
rebate.setCheckAutoDateType(param.getCheckAutoDateType());
rebate.setCheckStartDate(param.getCheckStartDate());
rebate.setCheckEndDate(param.getCheckEndDate());
// 自动核销日期类型:0-手动设置;1-自然月;2-自然周
int days = 15;
if (param.getCheckAutoDateType().equals(1)){
days = 30;
}else if (param.getCheckAutoDateType().equals(2)){
days = 7;
}
rebate.setCheckStartDate(param.getActivityStartTime().plusDays(days));
rebate.setCheckEndDate(param.getActivityEndTime().plusDays(days));
rebate.setSupplierId(param.getSupplierId());
rebate.setSupplierCode(supplier.getCode());
rebate.setSupplierName(supplier.getName());

Loading…
Cancel
Save