diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/ICuMemberRetailDetailService.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/ICuMemberRetailDetailService.java index 5358fd25..ab48d9c5 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/ICuMemberRetailDetailService.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/ICuMemberRetailDetailService.java @@ -16,7 +16,8 @@ public interface ICuMemberRetailDetailService extends IService memberRangeExtMap, EBonusStage eBonusStage); + void listMemberRetailDetail(String retailDetailTableName, Map memberRangeExtMap, + EBonusStage eBonusStage, List stageMemberList); /** * 指定会员获取对应的点位数据 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 e59bc8a9..435bcfb9 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 @@ -23,8 +23,14 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl memberRangeExtMap, EBonusStage eBonusStage) { - List> pkMemberList = cuMemberBonusSettle.handleCutList(memberRangeExtMap.keySet(), MagicNumberConstants.BATCH_QUERY_NUM); + public void listMemberRetailDetail(String retailDetailTableName, Map memberRangeExtMap, + EBonusStage eBonusStage, List stageMemberList) { + List> pkMemberList; + if (CollectionUtil.isNotEmpty(stageMemberList)) { + pkMemberList = cuMemberBonusSettle.handleCutList(stageMemberList, MagicNumberConstants.BATCH_QUERY_NUM); + } else { + pkMemberList = cuMemberBonusSettle.handleCutList(memberRangeExtMap.keySet(), MagicNumberConstants.BATCH_QUERY_NUM); + } pkMemberList.forEach(tmpIdList -> { // 查询明细数据(指定阶段,未完成的) List tmpList = baseMapper.listMemberRetailDetail(retailDetailTableName, tmpIdList, eBonusStage.getValue()); @@ -41,9 +47,16 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl()); } + // 使用有序map,为了后续业务处理方便 if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) { - // 阶段一点位列表(使用有序map,为了后续业务处理方便) + // 阶段一点位列表 cuMemberRetailRangeExt.getOneDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail); + } else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) { + // 阶段二点位列表 + cuMemberRetailRangeExt.getTwoDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail); + } else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) { + // 阶段三点位列表 + cuMemberRetailRangeExt.getThreeDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail); } } } @@ -59,12 +72,26 @@ public class CuMemberRetailDetailServiceImpl extends ServiceImpl()); + } + if (null == cuMemberRetailRangeExt.getTwoDetailMap()) { + cuMemberRetailRangeExt.setTwoDetailMap(new LinkedHashMap<>()); + } + if (null == cuMemberRetailRangeExt.getThreeDetailMap()) { + cuMemberRetailRangeExt.setThreeDetailMap(new LinkedHashMap<>()); + } + // 使用有序map,为了后续业务处理方便 if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) { - // 阶段一点位列表(使用有序map,为了后续业务处理方便) - if (null == cuMemberRetailRangeExt.getOneDetailMap()) { - cuMemberRetailRangeExt.setOneDetailMap(new LinkedHashMap<>()); - } + // 阶段一点位列表 cuMemberRetailRangeExt.getOneDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail); + } else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) { + // 阶段二点位列表 + cuMemberRetailRangeExt.getTwoDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail); + } else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) { + // 阶段三点位列表 + cuMemberRetailRangeExt.getThreeDetailMap().put(cuMemberRetailDetail.getChildNode(), cuMemberRetailDetail); } } } diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailRangeServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailRangeServiceImpl.java index 87745682..91841667 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailRangeServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/achieve/service/impl/CuMemberRetailRangeServiceImpl.java @@ -106,6 +106,24 @@ public class CuMemberRetailRangeServiceImpl extends ServiceImpl 0) { + Collection tmpDetailColl = value.getTwoDetailMap().values(); + for (CuMemberRetailDetail cuMemberRetailDetail : tmpDetailColl) { + // 只有需要更新的才进行入库操作 + if (null != cuMemberRetailDetail.getUpdateBool()) { + retailDetailColl.add(cuMemberRetailDetail); + } + } + } + if (null != value.getThreeDetailMap() && value.getThreeDetailMap().size() > 0) { + Collection tmpDetailColl = value.getThreeDetailMap().values(); + for (CuMemberRetailDetail cuMemberRetailDetail : tmpDetailColl) { + // 只有需要更新的才进行入库操作 + if (null != cuMemberRetailDetail.getUpdateBool()) { + retailDetailColl.add(cuMemberRetailDetail); + } + } + } }); List> list = cuMemberBonusSettle.handleCutList(retailDetailColl); list.forEach(tmpList -> { 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 index 36cdcbbe..eb5ff7ea 100644 --- 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 @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; import java.math.BigDecimal; /** - * 阶段奖金数据 + * 阶段数据 */ @Builder @AllArgsConstructor @@ -38,4 +38,13 @@ public class BonusStageData { */ private Integer stageNum; + /** + * 二阶段点位 + */ + private CuMemberRetailDetail twoRetailDetail; + /** + * 三阶段点位 + */ + private CuMemberRetailDetail threeRetailDetail; + } 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 c00f9fb9..106d74a0 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 @@ -83,10 +83,18 @@ public abstract class BonusSettleHandle { */ protected void stageIncomeRemark(SaOrderExt saOrderExt, CuMemberBonusStage cuMemberBonusStage, CuMemberRetailRangeExt sourceMember, CuMemberRetailRangeExt targetMember) { - String remark = String.format(BonusMsgConstants.STAGE_INCOME, saOrderExt.getOrderCode(), - sourceMember.getMemberCode() + sourceMember.getMemberName(), - targetMember.getMemberCode() + targetMember.getMemberName(), - cuMemberBonusStage.getChildNode(), cuMemberBonusStage.getStage()); + String remark; + if (null != saOrderExt) { + remark = String.format(BonusMsgConstants.STAGE_INCOME, saOrderExt.getOrderCode(), + sourceMember.getMemberCode() + sourceMember.getMemberName(), + targetMember.getMemberCode() + targetMember.getMemberName(), + cuMemberBonusStage.getChildNode(), cuMemberBonusStage.getStage()); + } else { + remark = String.format(BonusMsgConstants.STAGE_INCOME_OTHER, + sourceMember.getMemberCode() + sourceMember.getMemberName(), + targetMember.getMemberCode() + targetMember.getMemberName(), + cuMemberBonusStage.getChildNode(), cuMemberBonusStage.getStage()); + } cuMemberBonusStage.setRemark(remark); } @@ -248,7 +256,9 @@ public abstract class BonusSettleHandle { ReflectUtils.invokeSetter(cuMemberDetail, BonusFieldConstants.INCOME_TAX, incomeTax); ReflectUtils.invokeSetter(cuMemberDetail, BonusFieldConstants.REAL_INCOME, realIncome); // 收益占比 - ReflectUtils.invokeSetter(cuMemberDetail, BonusFieldConstants.INCOME_RATIO, ComputeUtil.computeDivide(realIncome, ComputeUtil.computeDivide(orderAmount, exchangeRate))); + if (null != orderAmount && null != exchangeRate) { + ReflectUtils.invokeSetter(cuMemberDetail, BonusFieldConstants.INCOME_RATIO, ComputeUtil.computeDivide(realIncome, ComputeUtil.computeDivide(orderAmount, exchangeRate))); + } return bdBonusDeduct; } 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 d25286d4..cde545bd 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 @@ -275,7 +275,8 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { Date settleEndDate = DateUtils.afterDate(1, ChronoUnit.DAYS, settleStartDate); // 新零售订单(注册、复购) - List orderList = iBonusOrderService.listRetailSaOrder(settleStartDate, settleEndDate, null, Arrays.asList(EOrderType.RETAIL_REGISTER.getValue(), EOrderType.RETAIL_UPGRADE.getValue(), EOrderType.RETAIL_REPURCHASE.getValue())); + List orderList = iBonusOrderService.listRetailSaOrder(settleStartDate, settleEndDate, null, + Arrays.asList(EOrderType.RETAIL_REGISTER.getValue(), EOrderType.RETAIL_UPGRADE.getValue(), EOrderType.RETAIL_REPURCHASE.getValue())); // 更新当月会员, 将昨天业绩更到到今天,更新当月会员考核结果,有消费的考核通过 // 结算期间表 @@ -294,6 +295,9 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 初始化结算明细数据(昨天数据更新到今天数据) iCuMemberRetailRangeService.mergeMemberRetailRangeDetailByYesterday(rangeDetailTableName, yesterdayRangeDetailTableName); + // 升阶段点位列表 + List stageList = new ArrayList<>(); + if (orderList.size() > 0) { // 按照血缘,查询该会员所有伞上会员 List memberRetailRangeExtList = iCuMemberRetailRangeService.queryCuMemberRetailRangeParent(rangeTableName, orderList); @@ -306,7 +310,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { } } // 查询血缘会员明细数据(一阶段) - iCuMemberRetailDetailService.listMemberRetailDetail(rangeDetailTableName, memberRangeExtMap, EBonusStage.ONE); + iCuMemberRetailDetailService.listMemberRetailDetail(rangeDetailTableName, memberRangeExtMap, EBonusStage.ONE, null); // 奖衔 Map retailAwardsMap = new HashMap<>(); @@ -331,11 +335,9 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 直推收益 -- 来源订单金额,直推拿金额的10% this.calculateDirectIncome(cuMemberBonusPushList, memberRangeExtMap, saOrderExt, bonusConfigDTO, period, cuMemberBonusMap); - - // TODO 阶段收益 -- 来源订单金额 - this.calculateStageIncome(cuMemberBonusStageList, cuMemberBonusMap, bonusConfigDTO, period, - memberRangeExtMap, saOrderExt, settleStartDate, rangeTableName, rangeDetailTableName, EBonusStage.ONE); - + // 一阶段收益 -- 来源订单金额 + stageList.addAll(this.calculateStageIncome(cuMemberBonusStageList, cuMemberBonusMap, bonusConfigDTO, period, + memberRangeExtMap, saOrderExt, settleStartDate, rangeTableName, rangeDetailTableName)); // TODO 领导级差收益 -- 来源PV // TODO 领导平差收益 -- 来源PV @@ -344,13 +346,32 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 见点收益 -- 来源订单业绩,血缘上20代,每代拿业绩的10% this.calculateRepurDirectIncome(cuMemberBonusPushList, memberRangeExtMap, saOrderExt, bonusConfigDTO, period, cuMemberBonusMap); - // TODO 阶段收益 -- 来源订单业绩 - + // 一阶段收益 -- 来源订单累计业绩 + stageList.addAll(this.calculateStageIncome(cuMemberBonusStageList, cuMemberBonusMap, bonusConfigDTO, period, + memberRangeExtMap, saOrderExt, settleStartDate, rangeTableName, rangeDetailTableName)); } } - // TODO 统一处理第二阶段还是 fillRetailDetail 方法进行处理 + // TODO 处理升二阶段点位 + if (CollectionUtil.isNotEmpty(stageList)) { + List stageMemberList = stageList.stream().map(CuMemberRetailDetail::getPkMember).collect(Collectors.toList()); + // 查询血缘会员明细数据(二阶段) + iCuMemberRetailDetailService.listMemberRetailDetail(rangeDetailTableName, memberRangeExtMap, EBonusStage.TWO, stageMemberList); + // 二阶段收益 + stageList = this.calculateStageIncomeTwoThree(cuMemberBonusStageList, cuMemberBonusMap, bonusConfigDTO, period, + memberRangeExtMap, settleStartDate, rangeTableName, rangeDetailTableName, EBonusStage.TWO, stageList); + } + + // TODO 处理升三阶段点位 + if (CollectionUtil.isNotEmpty(stageList)) { + List stageMemberList = stageList.stream().map(CuMemberRetailDetail::getPkMember).collect(Collectors.toList()); + // 查询血缘会员明细数据(三段) + iCuMemberRetailDetailService.listMemberRetailDetail(rangeDetailTableName, memberRangeExtMap, EBonusStage.THREE, stageMemberList); + // 二阶段收益 + this.calculateStageIncomeTwoThree(cuMemberBonusStageList, cuMemberBonusMap, bonusConfigDTO, period, + memberRangeExtMap, settleStartDate, rangeTableName, rangeDetailTableName, EBonusStage.THREE, stageList); + } if (cuMemberBonusPushList.size() > 0) { bonusRecordDetailVO.setCuMemberBonusPushList(cuMemberBonusPushList); @@ -930,26 +951,44 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { } /** - * 计算阶段收益 -- 精品专区 + * 计算一阶段收益 -- 精品专区、商城专区 */ - 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) { - // 当前精品专区订单不足生成点位 - return; - } - + private List calculateStageIncome(List cuMemberBonusStageList, Map cuMemberBonusMap, + BonusConfigDTO bonusConfigDTO, Integer period, + Map memberRangeExtMap, SaOrderExt saOrderExt, + Date settleDate, String rangeTableName, String rangeDetailTableName) { + List returnRetailDetailList = new ArrayList<>(); // 订单会员 CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(saOrderExt.getPkMember()); + if (null == sourceMember) { + log.error("阶段收益处理失败,订单会员不存在. orderCode: {}, pkMember: {}", saOrderExt.getOrderCode(), saOrderExt.getPkMember()); + return returnRetailDetailList; + } + + int newPointInt; + if (EOrderType.RETAIL_REGISTER.getValue() == saOrderExt.getOrderType() + || EOrderType.RETAIL_UPGRADE.getValue() == saOrderExt.getOrderType()) { + // 精品专区按订单金额计算 + // 订单金额除50取整,为新増点位数量 + newPointInt = saOrderExt.getOrderAmount().divide(RetailConstants.POINT_VAL, 0, RoundingMode.DOWN).intValue(); + } else { + // 商城专区按累计业绩处理 + BigDecimal repPvBalance = sourceMember.getRepPvBalance().add(saOrderExt.getOrderAchieve()); + newPointInt = repPvBalance.divide(RetailConstants.POINT_VAL, 0, RoundingMode.DOWN).intValue(); + sourceMember.setRepPvBalance(repPvBalance.subtract(RetailConstants.POINT_VAL.multiply(new BigDecimal(newPointInt)))); + } + if (newPointInt == 0) { + // 当前订单不足生成点位 + return returnRetailDetailList; + } + // 会员一阶段子点位列表 LinkedHashMap detailList = sourceMember.getOneDetailMap(); if (null == detailList) { detailList = new LinkedHashMap<>(); sourceMember.setOneDetailMap(detailList); + sourceMember.setTwoDetailMap(new LinkedHashMap<>()); + sourceMember.setThreeDetailMap(new LinkedHashMap<>()); } // 当前会员子点位总数 int pointCount = sourceMember.getPointCount(); @@ -968,76 +1007,136 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { .build(); detailList.put(newRetailDetail.getChildNode(), newRetailDetail); - // 阶段奖金处理列表 - List bonusStageDataList = new ArrayList<>(); - // 推荐人 - Long pkParent = sourceMember.getPkParent(); - while (true) { - CuMemberRetailRangeExt targetMember = memberRangeExtMap.get(pkParent); - if (null == targetMember) { - // 没有推荐人了,则直接结束 - break; - } - pkParent = targetMember.getPkParent(); + this.handleStageIncome(cuMemberBonusStageList, cuMemberBonusMap, bonusConfigDTO, period, + memberRangeExtMap, saOrderExt, settleDate, rangeTableName, rangeDetailTableName, EBonusStage.ONE, + sourceMember, newRetailDetail, returnRetailDetailList); + } + return returnRetailDetailList; + } - // 推荐人一阶段子点位列表 - LinkedHashMap parentDetailList = targetMember.getOneDetailMap(); - if (CollectionUtil.isEmpty(parentDetailList)) { - // 推荐人没有未完成点位,继续往上找 - continue; - } - - // 推荐人第一层点位处理 - boolean forBool = iCuMemberBonusStageService.firstLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName, - memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList); - if (forBool) { - // 在第一层找到并填充点位,就开始下一个点位的处理 - break; - } - - // 推荐人第二层点位处理 - forBool = iCuMemberBonusStageService.secondLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName, - memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList); - if (forBool) { - // 在第二层找到并填充点位,就开始下一个点位的处理 - break; - } - - // 推荐人第三层点位处理 - forBool = iCuMemberBonusStageService.thirdLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName, - memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList); - if (forBool) { - // 在第三层找到并填充点位,就开始下一个点位的处理 - break; - } + /** + * 计算二、三阶段收益 + */ + private List calculateStageIncomeTwoThree(List cuMemberBonusStageList, Map cuMemberBonusMap, + BonusConfigDTO bonusConfigDTO, Integer period, + Map memberRangeExtMap, + Date settleDate, String rangeTableName, String rangeDetailTableName, EBonusStage eBonusStage, + List stageList) { + List returnRetailDetailList = new ArrayList<>(); + for (CuMemberRetailDetail memberRetailDetail : stageList) { + // 订单会员 + CuMemberRetailRangeExt sourceMember = memberRangeExtMap.get(memberRetailDetail.getPkMember()); + if (null == sourceMember) { + log.error("阶段收益处理失败,{}会员不存在. pkMember: {}", eBonusStage.getLabel(), memberRetailDetail.getPkMember()); + return returnRetailDetailList; } - 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()); + this.handleStageIncome(cuMemberBonusStageList, cuMemberBonusMap, bonusConfigDTO, period, + memberRangeExtMap, null, settleDate, rangeTableName, rangeDetailTableName, eBonusStage, + sourceMember, memberRetailDetail, returnRetailDetailList); + } + return returnRetailDetailList; + } - // 阶段奖金 - 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); - } + /** + * 处理阶段收益(一、二、三阶段) + */ + private void handleStageIncome(List cuMemberBonusStageList, Map cuMemberBonusMap, + BonusConfigDTO bonusConfigDTO, Integer period, + Map memberRangeExtMap, SaOrderExt saOrderExt, + Date settleDate, String rangeTableName, String rangeDetailTableName, EBonusStage eBonusStage, + CuMemberRetailRangeExt sourceMember, CuMemberRetailDetail newRetailDetail, + List returnRetailDetailList) { + // 阶段奖金处理列表 + List bonusStageDataList = new ArrayList<>(); + // 推荐人 + Long pkParent = sourceMember.getPkParent(); + while (true) { + CuMemberRetailRangeExt targetMember = memberRangeExtMap.get(pkParent); + if (null == targetMember) { + // 没有推荐人了,则直接结束 + break; + } + pkParent = targetMember.getPkParent(); + + // 推荐人一阶段子点位列表 + LinkedHashMap parentDetailList = null; + if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) { + parentDetailList = targetMember.getOneDetailMap(); + } else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) { + parentDetailList = targetMember.getTwoDetailMap(); + } else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) { + parentDetailList = targetMember.getThreeDetailMap(); + } + if (CollectionUtil.isEmpty(parentDetailList)) { + // 推荐人没有未完成点位,继续往上找 + continue; } + // 推荐人第一层点位处理 + boolean forBool = iCuMemberBonusStageService.firstLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName, + memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList); + if (forBool) { + // 在第一层找到并填充点位,就开始下一个点位的处理 + break; + } + + // 推荐人第二层点位处理 + forBool = iCuMemberBonusStageService.secondLevelhandle(parentDetailList, newRetailDetail, rangeTableName, rangeDetailTableName, + memberRangeExtMap, settleDate, eBonusStage, bonusStageDataList); + if (forBool) { + // 在第二层找到并填充点位,就开始下一个点位的处理 + break; + } + + // 推荐人第三层点位处理 + 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 != null ? saOrderExt.getPkRate() : 0) : 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 != null ? saOrderExt.getOrderAmount() : null, saOrderExt != null ? saOrderExt.getInExchangeRate() : null); + if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusStage.getIncomeStatus()) { + cuMemberBonus.setStoreIncome(ComputeUtil.computeAdd(cuMemberBonus.getStoreIncome(), cuMemberBonusStage.getPretaxIncome())); + setRetailTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusStage); + } + cuMemberBonusStageList.add(cuMemberBonusStage); + + // 升阶段数据 + if (EBonusStage.ONE.getValue() == bonusStageData.getStage()) { + // 一阶段需要处理升阶段 + CuMemberRetailDetail twoRetailDetail = bonusStageData.getTwoRetailDetail(); + targetMember.getTwoDetailMap().put(twoRetailDetail.getChildNode(), twoRetailDetail); + returnRetailDetailList.add(twoRetailDetail); + } else if (EBonusStage.TWO.getValue() == bonusStageData.getStage()) { + // 二阶段需要处理升阶段 + CuMemberRetailDetail threeRetailDetail = bonusStageData.getThreeRetailDetail(); + targetMember.getThreeDetailMap().put(threeRetailDetail.getChildNode(), threeRetailDetail); + returnRetailDetailList.add(threeRetailDetail); + } else if (EBonusStage.THREE.getValue() == bonusStageData.getStage()) { + // TODO 三阶段需要赠送点位 + + } + } } } 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 a5d4d8de..ca20e7fd 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 @@ -284,27 +284,55 @@ public class CuMemberBonusStageServiceImpl extends ServiceImpl getRetailDetailMap(CuMemberRetailRangeExt memberRetail, EBonusStage eBonusStage) { + if (EBonusStage.ONE.getValue() == eBonusStage.getValue()) { + return memberRetail.getOneDetailMap(); + } else if (EBonusStage.TWO.getValue() == eBonusStage.getValue()) { + return memberRetail.getTwoDetailMap(); + } else if (EBonusStage.THREE.getValue() == eBonusStage.getValue()) { + return memberRetail.getThreeDetailMap(); + } + return new LinkedHashMap<>(); + } + } diff --git a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberRetailRangeMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberRetailRangeMapper.xml index d6667d93..6762c774 100644 --- a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberRetailRangeMapper.xml +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberRetailRangeMapper.xml @@ -51,6 +51,7 @@ + @@ -92,7 +93,9 @@ rep_consume_new_amount = 0, rep_consume_new_pv = 0, rep_team_new_amount = 0, - rep_team_new_pv = 0 + rep_team_new_pv = 0, + point_count = 0, + rep_pv_balance = 0 @@ -103,7 +106,8 @@ consume_amount, month_consume_amount, team_consume_pv, team_month_pv, team_consume_amount, team_month_amount, - recommend_num, team_num, big_team_pv, small_team_pv + recommend_num, team_num, big_team_pv, small_team_pv, + point_count, rep_pv_balance from ${yesterdayRangeTableName} ) b on (a.pk_member = b.pk_member) @@ -115,7 +119,8 @@ a.team_consume_pv = b.team_consume_pv, a.team_consume_amount = b.team_consume_amount, a.recommend_num = b.recommend_num, a.team_num = b.team_num, - a.big_team_pv = b.big_team_pv, a.small_team_pv = b.small_team_pv + a.big_team_pv = b.big_team_pv, a.small_team_pv = b.small_team_pv, + a.point_count = b.point_count, a.rep_pv_balance = b.rep_pv_balance ,a.month_consume_pv = b.month_consume_pv ,a.month_consume_amount = b.month_consume_amount @@ -322,7 +327,8 @@ #{item.regConsumeNewAmount} reg_consume_new_amount, #{item.regConsumeNewPv} reg_consume_new_pv, #{item.regTeamNewAmount} reg_team_new_amount, #{item.regTeamNewPv} reg_team_new_pv, #{item.repConsumeNewAmount} rep_consume_new_amount, #{item.repConsumeNewPv} rep_consume_new_pv, - #{item.repTeamNewAmount} rep_team_new_amount, #{item.repTeamNewPv} rep_team_new_pv + #{item.repTeamNewAmount} rep_team_new_amount, #{item.repTeamNewPv} rep_team_new_pv, + #{item.pointCount} point_count, #{item.repPvBalance} rep_pv_balance from dual ) b @@ -337,7 +343,8 @@ a.reg_consume_new_amount = b.reg_consume_new_amount, a.reg_consume_new_pv = b.reg_consume_new_pv, a.reg_team_new_amount = b.reg_team_new_amount, a.reg_team_new_pv = b.reg_team_new_pv, a.rep_consume_new_amount = b.rep_consume_new_amount, a.rep_consume_new_pv = b.rep_consume_new_pv, - a.rep_team_new_amount = b.rep_team_new_amount, a.rep_team_new_pv = b.rep_team_new_pv + a.rep_team_new_amount = b.rep_team_new_amount, a.rep_team_new_pv = b.rep_team_new_pv, + a.point_count = b.point_count, a.rep_pv_balance = b.rep_pv_balance @@ -647,6 +654,7 @@ rep_team_new_amount, rep_team_new_pv, point_count, + rep_pv_balance, bw.awards_value, bw.awards_name from ( @@ -701,6 +709,8 @@ rep_consume_new_pv, rep_team_new_amount, rep_team_new_pv, + point_count, + rep_pv_balance, bw.awards_value, bw.awards_name from ${tableName} a diff --git a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberTreeMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberTreeMapper.xml index dd57f034..5a304b4c 100644 --- a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberTreeMapper.xml +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/achieve/CuMemberTreeMapper.xml @@ -298,43 +298,43 @@ stage NUMBER(1) default 1 not null, stage_status NUMBER(1) default 1 not null, stage_date DATE, - point_11 NUMBER(8), point_member_11 NUMBER(20), - point_12 NUMBER(8), + point_11 NUMBER(8), point_member_12 NUMBER(20), - point_21 NUMBER(8), + point_12 NUMBER(8), point_member_21 NUMBER(20), - point_22 NUMBER(8), + point_21 NUMBER(8), point_member_22 NUMBER(20), - point_23 NUMBER(8), + point_22 NUMBER(8), point_member_23 NUMBER(20), - point_24 NUMBER(8), + point_23 NUMBER(8), point_member_24 NUMBER(20), - point_31 NUMBER(8), + point_24 NUMBER(8), point_member_31 NUMBER(20), - point_32 NUMBER(8), + point_31 NUMBER(8), point_member_32 NUMBER(20), - point_33 NUMBER(8), + point_32 NUMBER(8), point_member_33 NUMBER(20), - point_34 NUMBER(8), + point_33 NUMBER(8), point_member_34 NUMBER(20), - point_35 NUMBER(8), + point_34 NUMBER(8), point_member_35 NUMBER(20), - point_36 NUMBER(8), + point_35 NUMBER(8), point_member_36 NUMBER(20), - point_37 NUMBER(8), + point_36 NUMBER(8), point_member_37 NUMBER(20), - point_38 NUMBER(8), + point_37 NUMBER(8), point_member_38 NUMBER(20), + point_38 NUMBER(8), point_type NUMBER(1) default 0 not null, point_gift NUMBER(1) default 0 not null, creation_time DATE, - point_first NUMBER(8), point_member_first NUMBER(20), - point_second NUMBER(8), + point_first NUMBER(8), point_member_second NUMBER(20), - point_third NUMBER(8), - point_member_third NUMBER(20) + point_second NUMBER(8), + point_member_third NUMBER(20), + point_third NUMBER(8) ) @@ -572,7 +572,8 @@ rep_consume_new_pv number(17,6) default 0 not null, rep_team_new_amount number(17,6) default 0 not null, rep_team_new_pv number(17,6) default 0 not null, - point_count number(8) default 0 not null + point_count number(8) default 0 not null, + rep_pv_balance number(17,6) default 0 not null ) diff --git a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/order/BonusOrderMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/order/BonusOrderMapper.xml index 7d93e0e3..1a2fc7a0 100644 --- a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/order/BonusOrderMapper.xml +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/order/BonusOrderMapper.xml @@ -80,7 +80,7 @@ where so.del_flag = 0 and so.order_status = 1 - and so.order_code=#{orderCode} + and so.order_code = #{orderCode} and so.order_type in diff --git a/bd-business/bd-business-report/src/main/java/com/hzs/report/order/service/impl/CuMemberPerformanceSummaryServiceImpl.java b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/service/impl/CuMemberPerformanceSummaryServiceImpl.java index b41f97e5..b7695955 100644 --- a/bd-business/bd-business-report/src/main/java/com/hzs/report/order/service/impl/CuMemberPerformanceSummaryServiceImpl.java +++ b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/service/impl/CuMemberPerformanceSummaryServiceImpl.java @@ -2,6 +2,7 @@ package com.hzs.report.order.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hzs.common.core.constant.MagicNumberConstants; import com.hzs.common.core.enums.EOrderType; import com.hzs.common.core.utils.DateUtils; import com.hzs.common.domain.report.CuMemberPerformanceSummary; @@ -78,6 +79,7 @@ public class CuMemberPerformanceSummaryServiceImpl extends ServiceImpl