diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailDetailServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailDetailServiceImpl.java index 46291351..e59bc8a9 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailDetailServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailDetailServiceImpl.java @@ -32,11 +32,17 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl()); + } + if (null == cuMemberRetailRangeExt.getTwoDetailMap()) { + cuMemberRetailRangeExt.setTwoDetailMap(new LinkedHashMap<>()); + } + if (null == cuMemberRetailRangeExt.getThreeDetailMap()) { + cuMemberRetailRangeExt.setThreeDetailMap(new LinkedHashMap<>()); + } if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) { // 阶段一点位列表(使用有序map,为了后续业务处理方便) - if (null == cuMemberRetailRangeExt.getOneDetailMap()) { - cuMemberRetailRangeExt.setOneDetailMap(new LinkedHashMap<>()); - } cuMemberRetailRangeExt.getOneDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail); } } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/dto/BonusStageData.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/dto/BonusStageData.java new file mode 100644 index 00000000..36cdcbbe --- /dev/null +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/dto/BonusStageData.java @@ -0,0 +1,41 @@ +package com.hzs.bonus.bonus.dto; + +import com.hzs.common.domain.member.achieve.CuMemberRetailDetail; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 阶段奖金数据 + */ +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +public class BonusStageData { + + /** + * 阶段奖金 + */ + private BigDecimal bonusIncome; + /** + * 奖金获取会员 + */ + private Long targetPkMember; + /** + * 奖金达标子点位 + */ + private Integer targetChildNode; + /** + * 第几阶段 + */ + private Integer stage; + /** + * 第几个点位 + */ + private Integer stageNum; + +} diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberBonusStageService.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberBonusStageService.java index 72592edd..3cc8468c 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberBonusStageService.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/ICuMemberBonusStageService.java @@ -1,15 +1,15 @@ package com.hzs.bonus.bonus.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.hzs.bonus.bonus.dto.BonusStageData; +import com.hzs.common.core.enums.EBonusStage; import com.hzs.common.domain.member.achieve.CuMemberRetailDetail; import com.hzs.common.domain.member.achieve.ext.CuMemberRetailRangeExt; import com.hzs.common.domain.member.bonus.CuMemberBonus; import com.hzs.common.domain.member.bonus.CuMemberBonusStage; import com.hzs.common.domain.sale.ext.SaOrderExt; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * 会员奖金-阶段收益明细表 服务类 @@ -40,29 +40,57 @@ public interface ICuMemberBonusStageService extends IService /** * 填充指定点位 */ - void fillRetailDetail(CuMemberRetailDetail targetRetailDetail, String point, - Long pkMember, Integer childNode); + boolean fillRetailDetail(CuMemberRetailDetail targetRetailDetail, String point, + CuMemberRetailDetail sourceRetailDetail, Date settleDate, EBonusStage eBonusStage, + List bonusStageDataList); /** * 处理新点位是推荐第一层 */ void handlePointFirst(Map memberRangeExtMap, CuMemberRetailDetail newRetailDetail, CuMemberRetailDetail newParentRetailDetail, - String rangeTableName, String rangeDetailTableName, String newNode); + String rangeTableName, String rangeDetailTableName, String newNode, + Date settleDate, EBonusStage eBonusStage, List bonusStageDataList); /** * 处理新点位是推荐第二层 */ void handlePointSecond(Map memberRangeExtMap, CuMemberRetailDetail newRetailDetail, CuMemberRetailDetail newParentRetailDetail, - String rangeTableName, String rangeDetailTableName, String newNode); + String rangeTableName, String rangeDetailTableName, String newNode, + Date settleDate, EBonusStage eBonusStage, List bonusStageDataList); /** * 处理新点位是推荐第三层 */ void handlePointThird(Map memberRangeExtMap, CuMemberRetailDetail newRetailDetail, CuMemberRetailDetail newParentRetailDetail, - String rangeTableName, String rangeDetailTableName, String newNode); + String rangeTableName, String rangeDetailTableName, String newNode, + Date settleDate, EBonusStage eBonusStage, List bonusStageDataList); + + /** + * 处理填充第一层 + */ + boolean firstLevelhandle(LinkedHashMap parentDetailList, CuMemberRetailDetail newRetailDetail, + String rangeTableName, String rangeDetailTableName, + Map memberRangeExtMap, Date settleDate, EBonusStage eBonusStage, + List bonusStageDataList); + + /** + * 处理填充第二层 + */ + boolean secondLevelhandle(LinkedHashMap parentDetailList, CuMemberRetailDetail newRetailDetail, + String rangeTableName, String rangeDetailTableName, + Map memberRangeExtMap, Date settleDate, EBonusStage eBonusStage, + List bonusStageDataList); + + /** + * 处理填充第三层 + */ + boolean thirdLevelhandle(LinkedHashMap parentDetailList, CuMemberRetailDetail newRetailDetail, + String rangeTableName, String rangeDetailTableName, + Map memberRangeExtMap, Date settleDate, EBonusStage eBonusStage, + List bonusStageDataList); } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleHandle.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleHandle.java index f9ca8ea7..c00f9fb9 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleHandle.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleHandle.java @@ -1,6 +1,5 @@ package com.hzs.bonus.bonus.service.impl; -import com.hzs.bonus.achieve.service.ICuMemberSettlePeriodService; import com.hzs.bonus.achieve.service.ICuMemberTreeService; import com.hzs.common.core.constant.BonusFieldConstants; import com.hzs.common.core.constant.MagicNumberConstants; @@ -143,7 +142,7 @@ public abstract class BonusSettleHandle { cuMemberBonusRange.setRemark(remark); } - protected CuMemberBonus getCuMemberBonus(Integer period, Map cuMemberBonusMap, + public CuMemberBonus getCuMemberBonus(Integer period, Map cuMemberBonusMap, Long pkMember, Integer incomeStatus, Integer pkCountry, Integer pkRate) { if (cuMemberBonusMap.containsKey(pkMember)) { return cuMemberBonusMap.get(pkMember); diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleRangeHandle.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleRangeHandle.java index 50b3f5de..d25286d4 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleRangeHandle.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleRangeHandle.java @@ -1,14 +1,12 @@ package com.hzs.bonus.bonus.service.impl; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReflectUtil; import com.hzs.bonus.achieve.service.ICuMemberRetailDetailService; import com.hzs.bonus.achieve.service.ICuMemberRetailRangeService; import com.hzs.bonus.base.service.ICuMemberService; +import com.hzs.bonus.bonus.dto.BonusStageData; import com.hzs.bonus.bonus.service.ICuMemberBonusStageService; import com.hzs.bonus.bonus.vo.BonusRecordDetailVO; -import com.hzs.bonus.constant.BonusConstants; import com.hzs.bonus.detail.service.ICuMemberAwardsService; import com.hzs.bonus.order.service.IBonusOrderService; import com.hzs.common.core.constant.MagicNumberConstants; @@ -31,7 +29,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.temporal.ChronoUnit; @@ -328,29 +325,33 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { List cuMemberBonusDetailList = new ArrayList<>(); for (SaOrderExt saOrderExt : orderList) { - if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType()) { - // 精品专区 + if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType() + || EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType()) { + // 精品专区、甄选专区 // 直推收益 -- 来源订单金额,直推拿金额的10% this.calculateDirectIncome(cuMemberBonusPushList, memberRangeExtMap, saOrderExt, bonusConfigDTO, period, cuMemberBonusMap); // TODO 阶段收益 -- 来源订单金额 - this.calculateStageIncome(cuMemberBonusStageList, memberRangeExtMap, saOrderExt, - settleStartDate, rangeTableName, rangeDetailTableName); + this.calculateStageIncome(cuMemberBonusStageList, cuMemberBonusMap, bonusConfigDTO, period, + memberRangeExtMap, saOrderExt, settleStartDate, rangeTableName, rangeDetailTableName, EBonusStage.ONE); // TODO 领导级差收益 -- 来源PV // TODO 领导平差收益 -- 来源PV } else if (EOrderType.RETAIL_REPURCHASE.getValue() == saOrderExt.getOrderType()) { // 商城专区 - // TODO 见点收益 -- 来源订单业绩,血缘上20代,每代拿业绩的10% + // 见点收益 -- 来源订单业绩,血缘上20代,每代拿业绩的10% this.calculateRepurDirectIncome(cuMemberBonusPushList, memberRangeExtMap, saOrderExt, bonusConfigDTO, period, cuMemberBonusMap); // TODO 阶段收益 -- 来源订单业绩 + } } + // TODO 统一处理第二阶段还是 fillRetailDetail 方法进行处理 + if (cuMemberBonusPushList.size() > 0) { bonusRecordDetailVO.setCuMemberBonusPushList(cuMemberBonusPushList); } @@ -371,7 +372,6 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { } // 更新日结数据 iCuMemberRetailRangeService.updateCuMemberRetailRange(rangeTableName, memberRangeExtMap); - CuMemberRetailRangeExt tt = memberRangeExtMap.get(20363L); // 更新日结明细数据 iCuMemberRetailRangeService.updateCuMemberRetailDetail(rangeDetailTableName, memberRangeExtMap); } @@ -932,8 +932,10 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { /** * 计算阶段收益 -- 精品专区 */ - private void calculateStageIncome(List cuMemberBonusStageList, Map memberRangeExtMap, SaOrderExt saOrderExt, - Date settleDate, String rangeTableName, String rangeDetailTableName) { + private void calculateStageIncome(List cuMemberBonusStageList, Map cuMemberBonusMap, + BonusConfigDTO bonusConfigDTO, Integer period, + Map memberRangeExtMap, SaOrderExt saOrderExt, + Date settleDate, String rangeTableName, String rangeDetailTableName, EBonusStage eBonusStage) { // 订单金额除50取整,为新増点位数量 int newPointInt = saOrderExt.getOrderAmount().divide(RetailConstants.POINT_VAL, 0, RoundingMode.DOWN).intValue(); if (newPointInt == 0) { @@ -951,8 +953,6 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { } // 当前会员子点位总数 int pointCount = sourceMember.getPointCount(); - - newPointInt: for (int i = 1; i <= newPointInt; i++) { // 订单会员生成的新点位 CuMemberRetailDetail newRetailDetail = CuMemberRetailDetail.builder() @@ -968,6 +968,8 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { .build(); detailList.put(newRetailDetail.getChildNode(), newRetailDetail); + // 阶段奖金处理列表 + List bonusStageDataList = new ArrayList<>(); // 推荐人 Long pkParent = sourceMember.getPkParent(); while (true) { @@ -984,143 +986,58 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 推荐人没有未完成点位,继续往上找 continue; } - for (Map.Entry integerCuMemberRetailDetailEntry : parentDetailList.entrySet()) { - // 第一层填充 - CuMemberRetailDetail parentRetailDetail = integerCuMemberRetailDetailEntry.getValue(); - // 遍历推荐人点位,使用第一个未完成的点位,进行填充 - if (EBonusStageStatus.NO.getValue() == parentRetailDetail.getStageStatus()) { - if (null == parentRetailDetail.getPointMember11()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_11, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第一层 - iCuMemberBonusStageService.handlePointFirst(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_11); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember12()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_12, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第一层 - iCuMemberBonusStageService.handlePointFirst(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_12); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } - } + + // 推荐人第一层点位处理 + boolean forBool = iCuMemberBonusStageService.firstLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName, + memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList); + if (forBool) { + // 在第一层找到并填充点位,就开始下一个点位的处理 + break; } - for (Map.Entry integerCuMemberRetailDetailEntry : parentDetailList.entrySet()) { - // 第二层填充 - CuMemberRetailDetail parentRetailDetail = integerCuMemberRetailDetailEntry.getValue(); - // 遍历推荐人点位,使用第一个未完成的点位,进行填充 - if (EBonusStageStatus.NO.getValue() == parentRetailDetail.getStageStatus()) { - if (null == parentRetailDetail.getPointMember21()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_21, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第二层 - iCuMemberBonusStageService.handlePointSecond(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_21); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember22()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_22, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第二层 - iCuMemberBonusStageService.handlePointSecond(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_22); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember23()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_23, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第二层 - iCuMemberBonusStageService.handlePointSecond(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_23); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember24()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_24, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第二层 - iCuMemberBonusStageService.handlePointSecond(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_24); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } - } + + // 推荐人第二层点位处理 + forBool = iCuMemberBonusStageService.secondLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName, + memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList); + if (forBool) { + // 在第二层找到并填充点位,就开始下一个点位的处理 + break; } - for (Map.Entry integerCuMemberRetailDetailEntry : parentDetailList.entrySet()) { - // 第三层填充 - CuMemberRetailDetail parentRetailDetail = integerCuMemberRetailDetailEntry.getValue(); - // 遍历推荐人点位,使用第一个未完成的点位,进行填充 - if (EBonusStageStatus.NO.getValue() == parentRetailDetail.getStageStatus()) { - if (null == parentRetailDetail.getPointMember31()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_31, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第三层 - iCuMemberBonusStageService.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_31); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember32()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_32, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第三层 - iCuMemberBonusStageService.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_32); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember33()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_33, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第三层 - iCuMemberBonusStageService.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_33); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember34()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_34, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第三层 - iCuMemberBonusStageService.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_34); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember35()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_35, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第三层 - iCuMemberBonusStageService.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_35); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember36()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_36, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第三层 - iCuMemberBonusStageService.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_36); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember37()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_37, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第三层 - iCuMemberBonusStageService.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_37); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } else if (null == parentRetailDetail.getPointMember38()) { - iCuMemberBonusStageService.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_38, - newRetailDetail.getPkMember(), newRetailDetail.getChildNode()); - // 新点位是推荐人点位的第三层 - iCuMemberBonusStageService.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, - rangeTableName, rangeDetailTableName, BonusConstants.POINT_38); - // 当前新子点位填充完成,进入下一个新子点位 - continue newPointInt; - } - } + + // 推荐人第三层点位处理 + forBool = iCuMemberBonusStageService.thirdLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName, + memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList); + if (forBool) { + // 在第三层找到并填充点位,就开始下一个点位的处理 + break; } } + + if (CollectionUtil.isNotEmpty(bonusStageDataList)) { + // 有需要生成奖金的数据 + for (BonusStageData bonusStageData : bonusStageDataList) { + CuMemberRetailRangeExt targetMember = memberRangeExtMap.get(bonusStageData.getTargetPkMember()); + // 会员奖金数据 + CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, targetMember.getPkMember(), targetMember.getIncomeStatus(), + targetMember.getPkSettleCountry(), targetMember.getPkRate() == null ? saOrderExt.getPkRate() : targetMember.getPkRate()); + + // 阶段奖金 + int pkBonusItem = getPkBonusItems(bonusConfigDTO, targetMember.getPkSettleCountry(), EBonusItems.STAGE_INCOME.getValue()); + // 阶段收益明细 + CuMemberBonusStage cuMemberBonusStage = iCuMemberBonusStageService.getCuMemberBonusStage(saOrderExt, targetMember, cuMemberBonus, pkBonusItem); + cuMemberBonusStage.setPretaxIncome(bonusStageData.getBonusIncome()); + cuMemberBonusStage.setChildNode(bonusStageData.getTargetChildNode()); + cuMemberBonusStage.setStage(bonusStageData.getStage()); + cuMemberBonusStage.setStageNum(bonusStageData.getStageNum()); + stageIncomeRemark(saOrderExt, cuMemberBonusStage, sourceMember, targetMember); + BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusStage, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate()); + if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusStage.getIncomeStatus()) { + cuMemberBonus.setStoreIncome(ComputeUtil.computeAdd(cuMemberBonus.getStoreIncome(), cuMemberBonusStage.getPretaxIncome())); + setRetailTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusStage); + } + cuMemberBonusStageList.add(cuMemberBonusStage); + } + } + } } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusStageServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusStageServiceImpl.java index 7a923d3b..a5d4d8de 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusStageServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusStageServiceImpl.java @@ -6,13 +6,13 @@ import cn.hutool.core.util.ReflectUtil; import com.hzs.bonus.achieve.mapper.CuMemberRetailRangeMapper; import com.hzs.bonus.achieve.service.ICuMemberRetailDetailService; import com.hzs.bonus.achieve.service.impl.CuMemberBonusSettle; +import com.hzs.bonus.bonus.dto.BonusStageData; import com.hzs.bonus.bonus.mapper.CuMemberBonusStageMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hzs.bonus.bonus.service.ICuMemberBonusStageService; import com.hzs.bonus.constant.BonusConstants; import com.hzs.common.core.constant.MagicNumberConstants; -import com.hzs.common.core.enums.EBonusStage; -import com.hzs.common.core.enums.ECalType; +import com.hzs.common.core.enums.*; import com.hzs.common.domain.member.achieve.CuMemberRetailDetail; import com.hzs.common.domain.member.achieve.ext.CuMemberRetailRangeExt; import com.hzs.common.domain.member.bonus.CuMemberBonus; @@ -109,7 +109,8 @@ public class CuMemberBonusStageServiceImpl extends ServiceImpl bonusStageDataList) { if (null == targetRetailDetail) { return; } @@ -122,60 +123,80 @@ public class CuMemberBonusStageServiceImpl extends ServiceImpl bonusStageDataList) { if (null == targetRetailDetail) { return; } @@ -199,28 +221,34 @@ public class CuMemberBonusStageServiceImpl extends ServiceImpl bonusStageDataList) { + ReflectUtil.setFieldValue(targetRetailDetail, BonusConstants.POINT_MEMBER_FIELD_NAME + point, sourceRetailDetail.getPkMember()); + ReflectUtil.setFieldValue(targetRetailDetail, BonusConstants.POINT_FIELD_NAME + point, sourceRetailDetail.getChildNode()); ReflectUtil.setFieldValue(targetRetailDetail, BonusConstants.UPDATE_FLAG, 0); + + switch (point) { + case BonusConstants.POINT_31: + case BonusConstants.POINT_32: + case BonusConstants.POINT_33: + case BonusConstants.POINT_34: + case BonusConstants.POINT_35: + case BonusConstants.POINT_36: + case BonusConstants.POINT_37: + case BonusConstants.POINT_38: + // 如果填充的点位是第三层,理论上有可能已经全部填满,需要判断是否已经完成 + boolean isFinish = true; + for (String suffix : BonusConstants.FIELD_LIST) { + if (null == ReflectUtil.getFieldValue(targetRetailDetail, BonusConstants.POINT_MEMBER_FIELD_NAME + suffix)) { + isFinish = false; + break; + } + } + if (isFinish) { + targetRetailDetail.setStageStatus(EBonusStageStatus.YES.getValue()); + targetRetailDetail.setStageDate(settleDate); + // TODO 统一处理第二阶段还是 fillRetailDetail 方法进行处理 + if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) { + // 一阶段,全满发放阶段奖 + // 返回奖金收益处理数据 + bonusStageDataList.add(BonusStageData.builder() + .bonusIncome(BonusConstants.ONE_BONUS) + .targetPkMember(targetRetailDetail.getPkMember()) + .targetChildNode(targetRetailDetail.getChildNode()) + .stage(eBonusStage.getValue()) + .stageNum(14) + .build()); + } else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) { + // 二阶段,全满发放阶段奖 + // 返回奖金收益处理数据 + bonusStageDataList.add(BonusStageData.builder() + .bonusIncome(BonusConstants.TWO_BONUS) + .targetPkMember(targetRetailDetail.getPkMember()) + .targetChildNode(targetRetailDetail.getChildNode()) + .stage(eBonusStage.getValue()) + .stageNum(14) + .build()); + } + return true; + } + break; + } + return false; } @Override public void handlePointFirst(Map memberRangeExtMap, CuMemberRetailDetail newRetailDetail, CuMemberRetailDetail newParentRetailDetail, - String rangeTableName, String rangeDetailTableName, String newNode) { + String rangeTableName, String rangeDetailTableName, String newNode, + Date settleDate, EBonusStage eBonusStage, List bonusStageDataList) { // 新点位的上第一层 newRetailDetail.setPointMemberFirst(newParentRetailDetail.getPkMember()); newRetailDetail.setPointFirst(newParentRetailDetail.getChildNode()); @@ -273,7 +351,8 @@ public class CuMemberBonusStageServiceImpl extends ServiceImpl memberRangeExtMap, CuMemberRetailDetail newRetailDetail, CuMemberRetailDetail newParentRetailDetail, - String rangeTableName, String rangeDetailTableName, String newNode) { + String rangeTableName, String rangeDetailTableName, String newNode, + Date settleDate, EBonusStage eBonusStage, List bonusStageDataList) { // 新点位的上第二层 newRetailDetail.setPointMemberSecond(newParentRetailDetail.getPkMember()); newRetailDetail.setPointSecond(newParentRetailDetail.getChildNode()); @@ -341,7 +422,8 @@ public class CuMemberBonusStageServiceImpl extends ServiceImpl memberRangeExtMap, CuMemberRetailDetail newRetailDetail, CuMemberRetailDetail newParentRetailDetail, - String rangeTableName, String rangeDetailTableName, String newNode) { + String rangeTableName, String rangeDetailTableName, String newNode, + Date settleDate, EBonusStage eBonusStage, List bonusStageDataList) { // 新点位的上第三层 newRetailDetail.setPointMemberThird(newParentRetailDetail.getPkMember()); newRetailDetail.setPointThird(newParentRetailDetail.getChildNode()); @@ -431,7 +515,8 @@ public class CuMemberBonusStageServiceImpl extends ServiceImpl parentDetailList, CuMemberRetailDetail newRetailDetail, + String rangeTableName, String rangeDetailTableName, + Map memberRangeExtMap, Date settleDate, EBonusStage eBonusStage, + List bonusStageDataList) { + for (Map.Entry integerCuMemberRetailDetailEntry : parentDetailList.entrySet()) { + // 第一层填充 + CuMemberRetailDetail parentRetailDetail = integerCuMemberRetailDetailEntry.getValue(); + // 遍历推荐人点位,使用第一个未完成的点位,进行填充 + if (EBonusStageStatus.NO.getValue() == parentRetailDetail.getStageStatus()) { + if (null == parentRetailDetail.getPointMember11()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_11, + newRetailDetail, settleDate, eBonusStage, + bonusStageDataList); + // 新点位是推荐人点位的第一层 + this.handlePointFirst(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_11, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember12()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_12, + newRetailDetail, settleDate, eBonusStage, + bonusStageDataList); + // 新点位是推荐人点位的第一层 + this.handlePointFirst(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_12, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } + } + } + return false; + } + + @Override + public boolean secondLevelhandle(LinkedHashMap parentDetailList, CuMemberRetailDetail newRetailDetail, + String rangeTableName, String rangeDetailTableName, + Map memberRangeExtMap, Date settleDate, EBonusStage eBonusStage, + List bonusStageDataList) { + for (Map.Entry integerCuMemberRetailDetailEntry : parentDetailList.entrySet()) { + // 第二层填充 + CuMemberRetailDetail parentRetailDetail = integerCuMemberRetailDetailEntry.getValue(); + // 遍历推荐人点位,使用第一个未完成的点位,进行填充 + if (EBonusStageStatus.NO.getValue() == parentRetailDetail.getStageStatus()) { + if (null == parentRetailDetail.getPointMember21()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_21, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第二层 + this.handlePointSecond(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_21, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember22()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_22, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第二层 + this.handlePointSecond(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_22, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember23()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_23, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第二层 + this.handlePointSecond(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_23, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember24()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_24, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第二层 + this.handlePointSecond(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_24, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } + } + } + return false; + } + + @Override + public boolean thirdLevelhandle(LinkedHashMap parentDetailList, CuMemberRetailDetail newRetailDetail, + String rangeTableName, String rangeDetailTableName, + Map memberRangeExtMap, Date settleDate, EBonusStage eBonusStage, + List bonusStageDataList) { + for (Map.Entry integerCuMemberRetailDetailEntry : parentDetailList.entrySet()) { + // 第三层填充 + CuMemberRetailDetail parentRetailDetail = integerCuMemberRetailDetailEntry.getValue(); + // 遍历推荐人点位,使用第一个未完成的点位,进行填充 + if (EBonusStageStatus.NO.getValue() == parentRetailDetail.getStageStatus()) { + if (null == parentRetailDetail.getPointMember31()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_31, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第三层 + this.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_31, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember32()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_32, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第三层 + this.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_32, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember33()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_33, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第三层 + this.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_33, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember34()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_34, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第三层 + this.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_34, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember35()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_35, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第三层 + this.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_35, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember36()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_36, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第三层 + this.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_36, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember37()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_37, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第三层 + this.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_37, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } else if (null == parentRetailDetail.getPointMember38()) { + this.fillRetailDetail(parentRetailDetail, BonusConstants.POINT_38, + newRetailDetail, settleDate, eBonusStage, bonusStageDataList); + // 新点位是推荐人点位的第三层 + this.handlePointThird(memberRangeExtMap, newRetailDetail, parentRetailDetail, + rangeTableName, rangeDetailTableName, BonusConstants.POINT_38, settleDate, eBonusStage, + bonusStageDataList); + // 当前新子点位填充完成,进入下一个新子点位 + return true; + } + } + } + return false; + } } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/constant/BonusConstants.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/constant/BonusConstants.java index 1fd4a965..e0ea54b8 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/constant/BonusConstants.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/constant/BonusConstants.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ReflectUtil; import com.hzs.common.domain.member.achieve.CuMemberRetailDetail; import java.lang.reflect.Field; +import java.math.BigDecimal; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -11,6 +12,15 @@ import java.util.Map; public class BonusConstants { + /** + * 一阶段奖金 -- 满14,发35 + */ + public static final BigDecimal ONE_BONUS = new BigDecimal("35"); + /** + * 二阶段奖金 -- 满14,发220 + */ + public static final BigDecimal TWO_BONUS = new BigDecimal("220"); + public static final String POINT_11 = "11"; public static final String POINT_12 = "12"; public static final String POINT_21 = "21"; diff --git a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusStageMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusStageMapper.xml index fb2c6d16..42f3c685 100644 --- a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusStageMapper.xml +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusStageMapper.xml @@ -26,8 +26,7 @@ values ( #{item.pkBonus}, #{item.pkOrder}, #{item.pkBonusItems}, #{item.incomeStatus}, #{item.calType}, #{item.calAchieve}, #{item.calValue}, - #{item.pretaxIncome}, #{item.incomeTax}, #{item.realIncome}, - #{item.round}, #{item.second}, #{item.remark}, + #{item.pretaxIncome}, #{item.incomeTax}, #{item.realIncome}, #{item.remark}, #{item.incomeRatio}, #{item.incomeDialRatio}, #{item.orderDialRatio}, #{item.pkCreator}, #{item.childNode}, #{item.stage}, #{item.stageNum}) diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/structure/controller/manage/MemberStructureController.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/structure/controller/manage/MemberStructureController.java index f7d1205f..43eaee5d 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/structure/controller/manage/MemberStructureController.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/structure/controller/manage/MemberStructureController.java @@ -229,7 +229,7 @@ public class MemberStructureController extends BaseController { log.info("日结表名称{}",settleTableName); // 校验当前日结表是否存在 Integer isFind = iCumemberRetailDetail.getFindCumemberRetailDetail(settleTableName); - if (isFind != 1) { + if (isFind == null || isFind != 1) { log.error("当前表名不存在{}",settleTableName); return AjaxResult.error("当前日结信息表不存在",settleTableName); } @@ -261,7 +261,7 @@ public class MemberStructureController extends BaseController { log.info("日结表名称{}",settleTableName); // 校验当前日结表是否存在 Integer isFind = iCumemberRetailDetail.getFindCumemberRetailDetail(settleTableName); - if (isFind != 1) { + if (isFind == null || isFind != 1) { log.error("当前表名不存在{}",settleTableName); return AjaxResult.error("当前日结信息表不存在",settleTableName); } diff --git a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/achieve/ext/CuMemberRetailRangeExt.java b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/achieve/ext/CuMemberRetailRangeExt.java index 2bd50421..b9e2a69e 100644 --- a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/achieve/ext/CuMemberRetailRangeExt.java +++ b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/achieve/ext/CuMemberRetailRangeExt.java @@ -130,8 +130,16 @@ public class CuMemberRetailRangeExt extends CuMemberRetailRange { // 秒结 end /** - * 阶段一点位列表 + * 一阶段点位列表 */ private LinkedHashMap oneDetailMap; + /** + * 二阶段点位列表 + */ + private LinkedHashMap twoDetailMap; + /** + * 三阶段点位列表 + */ + private LinkedHashMap threeDetailMap; } diff --git a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/bonus/CuMemberBonus.java b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/bonus/CuMemberBonus.java index 6ac6da2b..3e8d8ded 100644 --- a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/bonus/CuMemberBonus.java +++ b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/bonus/CuMemberBonus.java @@ -188,7 +188,7 @@ public class CuMemberBonus extends BaseEntity { private BigDecimal carAwardPoints; /** - * 注册阶段收益-众康 + * 阶段收益-众康 */ @TableField("STORE_INCOME") private BigDecimal storeIncome;