3
0
Fork 0

## 注册、升级、复购、重消订单业绩、盒数都算自己小区;

This commit is contained in:
cabbage 2025-06-11 19:30:13 +08:00
parent 816aa2fdb6
commit afe5a82e6e
6 changed files with 122 additions and 84 deletions

View File

@ -8,7 +8,7 @@ import com.hzs.bonus.detail.service.ICuMemberAwardsService;
import com.hzs.bonus.detail.service.ICuMemberGradeService;
import com.hzs.bonus.order.service.IBonusOrderService;
import com.hzs.common.core.constant.MagicNumberConstants;
import com.hzs.common.core.constant.RetailProductConstants;
import com.hzs.common.core.constant.RetailConstants;
import com.hzs.common.core.constant.TableNameConstants;
import com.hzs.common.core.constant.msg.BonusMsgConstants;
import com.hzs.common.core.enums.*;
@ -133,27 +133,21 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 订单指定产品盒数
int boxNum = 0;
for (SaOrderWaresExt saOrderItems : saOrderExt.getOrderWaresExtList()) {
for (String waresCode : RetailProductConstants.ALL_BOX_WARES_LIST) {
if (saOrderItems.getWaresCode().equals(waresCode)) {
boxNum += saOrderItems.getWaresQuantity();
break;
}
if (RetailConstants.ALL_BOX_WARES_LIST.contains(saOrderItems.getWaresCode())) {
boxNum += saOrderItems.getWaresQuantity();
break;
}
}
saOrderExt.setBoxNum(boxNum);
// 订单业绩
BigDecimal orderAchieve = saOrderExt.getOrderAchieve();
if (EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()
|| EOrderType.RETAIL_CONSUME.getValue() == saOrderExt.getOrderType()
) {
// 复购重消盒数业绩算个人累计数据盒数业绩
sourceMemberRangeExt.setNewBoxNum(sourceMemberRangeExt.getNewBoxNum() + boxNum);
sourceMemberRangeExt.setConsumeBoxNum(sourceMemberRangeExt.getConsumeBoxNum() + boxNum);
sourceMemberRangeExt.setNewConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getNewConsumePv(), orderAchieve));
sourceMemberRangeExt.setConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getConsumePv(), orderAchieve));
sourceMemberRangeExt.setMonthConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getMonthConsumePv(), orderAchieve));
}
// 注册升级复购重消盒数业绩算个人累计数据盒数业绩
sourceMemberRangeExt.setNewBoxNum(sourceMemberRangeExt.getNewBoxNum() + boxNum);
sourceMemberRangeExt.setConsumeBoxNum(sourceMemberRangeExt.getConsumeBoxNum() + boxNum);
sourceMemberRangeExt.setNewConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getNewConsumePv(), orderAchieve));
sourceMemberRangeExt.setConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getConsumePv(), orderAchieve));
sourceMemberRangeExt.setMonthConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getMonthConsumePv(), orderAchieve));
// 会员等级升级记录
List<CuMemberGrade> cuMemberGradeList = new ArrayList<>();
@ -166,25 +160,30 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// TODO new 奖金处理
List<CuMemberBonusRange> cuMemberBonusRangeList = new ArrayList<>();
// 计算奖金 计算平级收益
for (SaOrderWaresExt saOrderItems : saOrderExt.getOrderWaresExtList()) {
for (String waresCode : RetailProductConstants.ALL_BOX_WARES_LIST) {
if (saOrderItems.getWaresCode().equals(waresCode)) {
// 计算级差收益平级收益
if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType()
|| EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType()
) {
// 注册升级订单计算奖金 直推级差收益 + 平级收益
for (SaOrderWaresExt saOrderItems : saOrderExt.getOrderWaresExtList()) {
if (RetailConstants.ALL_BOX_WARES_LIST.contains(saOrderItems.getWaresCode())) {
// 指定盒数商品
// 计算直推级差收益 + 平级收益
cuMemberBonusRangeList.addAll(calculateRetailRangeBonus(memberRangeExtMap, cuMemberBonusMap, gradeMap, bonusConfigDTO, currentPeriod, saOrderItems, saOrderExt));
if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType() ||
EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType() ||
EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()) {
if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType()
|| EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType()) {
// 注册升级计算是否激活
sourceMemberRangeExt.setEnableStatus(EYesNo.YES.getIntValue());
}
}
}
}
// 查询区域配置
Map<String, CuMemberRetailRangeExt> countyRangeExtMap = new HashMap<>();
List<CuMemberRetailRangeExt> countyRangeExtList = iCuMemberRetailRangeService.batchQueryMemberRetailSecondRangeByCounty(rangeTableName, secondRangeTableName, saOrderExt.getRecCounty());
countyRangeExtList.forEach(cuMemberRetailRangeExt ->
countyRangeExtMap.put(cuMemberRetailRangeExt.getSystemType() + "_" + cuMemberRetailRangeExt.getRegionAddress(), cuMemberRetailRangeExt));
// 计算区域奖
CuMemberBonusDetail cuMemberBonusDetail = calculateRetailAreaBonus(countyRangeExtMap, bonusConfigDTO, currentPeriod, memberRangeExtMap, cuMemberBonusMap, saOrderExt);
if (cuMemberBonusDetail != null) {
@ -277,27 +276,21 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 先算等级 注册升级计算等级
int boxNum = 0;
for (SaOrderWaresExt saOrderItems : saOrderExt.getOrderWaresExtList()) {
for (String waresCode : RetailProductConstants.ALL_BOX_WARES_LIST) {
if (saOrderItems.getWaresCode().equals(waresCode)) {
boxNum += saOrderItems.getWaresQuantity();
break;
}
if (RetailConstants.ALL_BOX_WARES_LIST.contains(saOrderItems.getWaresCode())) {
boxNum += saOrderItems.getWaresQuantity();
break;
}
}
saOrderExt.setBoxNum(boxNum);
// 订单业绩
BigDecimal orderAchieve = saOrderExt.getOrderAchieve();
if (EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()
|| EOrderType.RETAIL_CONSUME.getValue() == saOrderExt.getOrderType()
) {
// 复购重消盒数业绩算个人累计数据盒数业绩
sourceMemberRangeExt.setConsumeBoxNum(sourceMemberRangeExt.getConsumeBoxNum() - boxNum);
sourceMemberRangeExt.setNewBoxNum(sourceMemberRangeExt.getNewBoxNum() - boxNum);
sourceMemberRangeExt.setConsumePv(ComputeUtil.computeSubtract(sourceMemberRangeExt.getConsumePv(), orderAchieve));
sourceMemberRangeExt.setMonthConsumePv(ComputeUtil.computeSubtract(sourceMemberRangeExt.getMonthConsumePv(), orderAchieve));
sourceMemberRangeExt.setNewConsumePv(ComputeUtil.computeSubtract(sourceMemberRangeExt.getNewConsumePv(), orderAchieve));
}
// 复购重消盒数业绩算个人累计数据盒数业绩
sourceMemberRangeExt.setConsumeBoxNum(sourceMemberRangeExt.getConsumeBoxNum() - boxNum);
sourceMemberRangeExt.setNewBoxNum(sourceMemberRangeExt.getNewBoxNum() - boxNum);
sourceMemberRangeExt.setConsumePv(ComputeUtil.computeSubtract(sourceMemberRangeExt.getConsumePv(), orderAchieve));
sourceMemberRangeExt.setMonthConsumePv(ComputeUtil.computeSubtract(sourceMemberRangeExt.getMonthConsumePv(), orderAchieve));
sourceMemberRangeExt.setNewConsumePv(ComputeUtil.computeSubtract(sourceMemberRangeExt.getNewConsumePv(), orderAchieve));
// 会员等级map
Map<String, CuMemberGrade> cuMemberGradeMap = new HashMap<>();
@ -527,28 +520,21 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// 计算自消费奖衔
CuMemberRetailRangeExt sourceMemberRangeExt = memberRangeExtMap.get(saOrderExt.getPkMember());
// 订单指定产品盒数计算等级使用
int boxNum = saOrderExt.getBoxNum();
// int boxNum = 0;
// for (SaOrderWaresExt saOrderItems : saOrderExt.getOrderWaresExtList()) {
// for (String waresCode : RetailProductConstants.ALL_BOX_WARES_LIST) {
// if (saOrderItems.getWaresCode() != null && saOrderItems.getWaresCode().equals(waresCode)) {
// boxNum += saOrderItems.getWaresQuantity();
// break;
// }
// }
// }
int boxNum = 0;
for (SaOrderWaresExt saOrderItems : saOrderExt.getOrderWaresExtList()) {
if (RetailConstants.ALL_BOX_WARES_LIST.contains(saOrderItems.getWaresCode())) {
boxNum += saOrderItems.getWaresQuantity();
break;
}
}
// 个人累计消费pv
BigDecimal orderAchieve = saOrderExt.getOrderAchieve();
if (EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()
|| EOrderType.RETAIL_CONSUME.getValue() == saOrderExt.getOrderType()
) {
// 复购重消盒数业绩算个人累计数据盒数业绩
sourceMemberRangeExt.setConsumeBoxNum(sourceMemberRangeExt.getConsumeBoxNum() + boxNum);
sourceMemberRangeExt.setNewBoxNum(sourceMemberRangeExt.getNewBoxNum() + boxNum);
sourceMemberRangeExt.setConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getConsumePv(), orderAchieve));
sourceMemberRangeExt.setMonthConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getMonthConsumePv(), orderAchieve));
sourceMemberRangeExt.setNewConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getNewConsumePv(), orderAchieve));
}
// 复购重消盒数业绩算个人累计数据盒数业绩
sourceMemberRangeExt.setConsumeBoxNum(sourceMemberRangeExt.getConsumeBoxNum() + boxNum);
sourceMemberRangeExt.setNewBoxNum(sourceMemberRangeExt.getNewBoxNum() + boxNum);
sourceMemberRangeExt.setConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getConsumePv(), orderAchieve));
sourceMemberRangeExt.setMonthConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getMonthConsumePv(), orderAchieve));
sourceMemberRangeExt.setNewConsumePv(ComputeUtil.computeAdd(sourceMemberRangeExt.getNewConsumePv(), orderAchieve));
// 计算自己等级奖衔等
calculateGradeAwards(period, memberRangeExtMap, rangeTableName, saOrderExt, retailTeamGradeMap, retailAwardsMap, null, cuMemberGradeList, cuMemberAwardsList, sourceMemberRangeExt);
// 计算团队业绩盒数计算等级奖衔
@ -1310,35 +1296,83 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
// }
/**
* 计算极差收益根据极差收益计算平级收益
* 计算直推级差收益根据直推级差收益计算平级收益
*/
List<CuMemberBonusRange> calculateRetailRangeBonus(Map<Long, CuMemberRetailRangeExt> memberRangeExtMap, Map<Long, CuMemberBonus> cuMemberBonusMap,
Map<Integer, BdGrade> gradeMap, BonusConfigDTO bonusConfigDTO, Integer period,
SaOrderWaresExt saOrderItems, SaOrderExt saOrderExt) {
// 直推级差返回数据
List<CuMemberBonusRange> memberBonusRangeList = new ArrayList<>();
// 用等级计算按照一级级算
// 订单下单人自己
CuMemberRetailRangeExt sourceMemberRangeExt = memberRangeExtMap.get(saOrderExt.getPkMember());
// 推荐人
long pkParent = sourceMemberRangeExt.getPkParent();
// 商品价格没有乘商品数量
BigDecimal beginBuyPrice = saOrderItems.getWaresPrice();
BigDecimal comBuyPrice = saOrderItems.getWaresPrice();
// 开始计算等级值
int beginGradeValue = sourceMemberRangeExt.getGradeValue();
// 直推级差收益
BigDecimal calBonusIncome = BigDecimal.ZERO;
// 计算极差
// 临时等级
int tmpGradeValue = 0;
// 计算直推级差
while (true) {
// 推荐人
CuMemberRetailRangeExt targetMemberRangeExt = memberRangeExtMap.get(pkParent);
if (targetMemberRangeExt == null) {
break;
}
// 推荐人的推荐人
pkParent = targetMemberRangeExt.getPkParent();
if (EAccountStatus.STOP_INCOME.getValue() == targetMemberRangeExt.getAccountStatus() ||
ECategory.NORMAL.getValue() != targetMemberRangeExt.getCategory() ||
targetMemberRangeExt.getEnableStatus() == EYesNo.NO.getIntValue() ||
targetMemberRangeExt.getGradeValue() == EGrade.START_UP.getValue() ||
EIncomeStatus.STOP_INCOME.getValue() == targetMemberRangeExt.getIncomeStatus()) {
// TODO new 新处理奖金
if (EAccountStatus.STOP_INCOME.getValue() == targetMemberRangeExt.getAccountStatus()
|| ECategory.NORMAL.getValue() != targetMemberRangeExt.getCategory()
|| targetMemberRangeExt.getEnableStatus() == EYesNo.NO.getIntValue()
|| targetMemberRangeExt.getGradeValue() == EGrade.START_UP.getValue()
|| EIncomeStatus.STOP_INCOME.getValue() == targetMemberRangeExt.getIncomeStatus()) {
// 停算收益非正常会员未激活等级为顾客停止收益直接跳过
continue;
}
// 推荐V1 有额外100
// 当前会员等级值
int calGradeValue = targetMemberRangeExt.getGradeValue();
// 税前收益
BigDecimal pretaxIncome;
if (tmpGradeValue == 0) {
// 临时等级为0
tmpGradeValue = calGradeValue;
if (EGrade.HAI_FAN.getValue() == calGradeValue) {
// VIP拿1份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS;
} else if (EGrade.YOU_KE.getValue() == calGradeValue) {
// SVIP拿2份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("2"));
} else if (EGrade.MAKER.getValue() == calGradeValue) {
// 卓越拿3份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("3"));
} else if (EGrade.VIP.getValue() == calGradeValue) {
// 首席拿4份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("4"));
} else if (EGrade.S_VIP.getValue() == calGradeValue) {
// 合伙人拿5份40
pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("5"));
}
} else if (calGradeValue == tmpGradeValue) {
// 当前会员等级
} else if (calGradeValue > tmpGradeValue) {
}
// 如果价格是209代表是第一单激活只有平级收益只有V5有平级收益
if (beginBuyPrice.equals(BigDecimal.valueOf(209))) {
calGradeValue = EGrade.S_VIP.getValue();
@ -1514,7 +1548,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle {
BigDecimal boxNumBig = new BigDecimal(saOrder.getBoxNum());
// 处理区域收益每盒2元
BigDecimal benefitIncome = RetailProductConstants.AREA_BOX_BONUS.multiply(boxNumBig);
BigDecimal benefitIncome = RetailConstants.AREA_BOX_BONUS.multiply(boxNumBig);
CuMemberBonusDetail cuMemberBonusDetail = packageBenefitIncome(bonusConfigDTO, period, cuMemberBonusMap, null, BigDecimal.ZERO, benefitIncome,
cuMemberRetailRangeExt, EBonusItems.RETAIL_AREA_INCOME.getValue(), BonusMsgConstants.RETAIL_AREA_INCOME);
cuMemberBonusDetail.setCalAchieve(boxNumBig);

View File

@ -18,7 +18,6 @@ import com.hzs.common.domain.sale.ext.BdWaresDetailExt;
import com.hzs.common.domain.sale.ext.SaOrderExt;
import com.hzs.common.domain.sale.ext.SaOrderWaresLimitExt;
import com.hzs.common.domain.sale.order.*;
import com.hzs.common.domain.sale.product.BdProduct;
import com.hzs.common.domain.sale.wares.BdWaresRange;
import com.hzs.common.domain.system.base.BdStorehouse;
import com.hzs.common.domain.system.config.BdGrade;
@ -82,8 +81,6 @@ public class RetailOrderServiceImpl implements IRetailOrderService {
private ISaOrderTempService iSaOrderTempService;
@Autowired
private ISaOrderWaresLimitService iSaOrderWaresLimitService;
@Autowired
private IBdProductService iBdProductService;
@Autowired
private RedisService redisService;
@ -820,7 +817,9 @@ public class RetailOrderServiceImpl implements IRetailOrderService {
// 指定商品拆分 并且 非赠品
if (boxProductList.contains(saOrderItems.getWareCode())
&& EYesNo.NO.getIntValue() == saOrderItems.getIsGift()) {
orderWaresMap.merge(saOrderItems.getPkWares() + "-" + saOrderItems.getPrice(), saOrderItems.getWaresQuantity(), Integer::sum);
// key: 商品ID-商品价格产品价格*产品数量
String key = saOrderItems.getPkWares() + "-" + (saOrderItems.getPrice().multiply(new BigDecimal(saOrderItems.getQuantity())));
orderWaresMap.merge(key, saOrderItems.getWaresQuantity(), Integer::sum);
waresLimitMap.merge(saOrderItems.getPkWares(), saOrderItems.getWaresQuantity(), Integer::sum);
}

View File

@ -7,7 +7,16 @@ import java.util.List;
/**
* 新零售商品常量类
*/
public class RetailProductConstants {
public class RetailConstants {
/**
* 直推级差等级收益每个等级为40元
*/
public static final BigDecimal LEVEL_RANGE_BONUS = new BigDecimal("40");
/**
* 直推平级收益比例每代拿商品价格的千分之五
*/
public static final BigDecimal LEVEL_RATIO = new BigDecimal("0.005");
/**
* 区域分红每盒2元

View File

@ -5,17 +5,13 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Description: 会员收益状态 会员表会员网体表奖金汇总表
* @Author: sui q
* @Time: 2022/11/4 11:03
* @Classname: EIncomeStatus
* @PackageName: com.hzs.common.core.enums
* 会员收益状态 会员表会员网体表奖金汇总表
*/
@AllArgsConstructor
@Getter
public enum EIncomeStatus {
/**
*正常
* 正常
*/
NORMAL(0, "正常", 0, EnumsPrefixConstants.INCOME_STATUS + "0"),

View File

@ -1,6 +1,6 @@
package com.hzs.common.core.utils;
import com.hzs.common.core.constant.RetailProductConstants;
import com.hzs.common.core.constant.RetailConstants;
import com.hzs.common.core.enums.ESystemType;
import java.util.ArrayList;
@ -18,13 +18,13 @@ public class BoxProductUtil {
List<String> productList = new ArrayList<>(0);
if (null == systemType || ESystemType.ALL.getValue() == systemType) {
productList.addAll(RetailProductConstants.ALL_BOX_WARES_LIST);
productList.addAll(RetailConstants.ALL_BOX_WARES_LIST);
return productList;
}
if (ESystemType.DEFAULT.getValue() == systemType) {
// 新零售
productList = RetailProductConstants.BOX_PRODUCT_LIST;
productList = RetailConstants.BOX_PRODUCT_LIST;
}
return productList;
}

View File

@ -11,7 +11,7 @@ import lombok.*;
import lombok.experimental.Accessors;
/**
* 会员奖金-奖金收益明细表(复购极差)
* 会员奖金-奖金收益明细表(复购极差) -- 新直推级差
*/
@Data
@EqualsAndHashCode(callSuper = true)