diff --git a/bd-api/bd-api-report/src/main/java/com/hzs/report/order/IPerformanceSummaryServiceApi.java b/bd-api/bd-api-report/src/main/java/com/hzs/report/order/IPerformanceSummaryServiceApi.java new file mode 100644 index 00000000..357fe024 --- /dev/null +++ b/bd-api/bd-api-report/src/main/java/com/hzs/report/order/IPerformanceSummaryServiceApi.java @@ -0,0 +1,19 @@ +package com.hzs.report.order; + +import com.hzs.common.core.domain.R; +import com.hzs.system.sys.dto.ApprovalBusinessResultDTO; + +/** + * 订单服务对外提供接口 + */ +public interface IPerformanceSummaryServiceApi { + + /** + * 按天创建统计数据 + * + * @param day + * @return + */ + R createDataByDay(String day); + +} diff --git a/bd-business/bd-business-bonus/pom.xml b/bd-business/bd-business-bonus/pom.xml index 21cf1ac9..caad04c9 100644 --- a/bd-business/bd-business-bonus/pom.xml +++ b/bd-business/bd-business-bonus/pom.xml @@ -39,11 +39,17 @@ com.bd bd-common-aop + com.bd bd-api-bonus + + com.bd + bd-api-report + + org.springframework.amqp 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/mapper/CuMemberBonusStageMapper.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberBonusStageMapper.java index cffb0062..a3e1dec7 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberBonusStageMapper.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/mapper/CuMemberBonusStageMapper.java @@ -1,7 +1,10 @@ package com.hzs.bonus.bonus.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hzs.bonus.bonus.param.BonusParam; import com.hzs.common.domain.member.bonus.CuMemberBonusStage; +import com.hzs.common.domain.member.ext.CuMemberBonusDetailExt; +import com.hzs.common.domain.member.ext.CuMemberBonusPushExt; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -21,4 +24,13 @@ public interface CuMemberBonusStageMapper extends BaseMapper */ void batchInsertCuMemberBonusStage(@Param("cuMemberBonusStageList") List cuMemberBonusStageList); + + + + /** + * 根据查询条件查询固定的奖金明细(阶段收益) + * + * @param bonusParam 查询条件 + */ + List queryMemberBonusStageByBonusItemsFoServer(@Param("bonusParam") BonusParam bonusParam); } 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/BonusSettleServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java index f6c7ff35..6065dcb6 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java @@ -18,6 +18,7 @@ import com.hzs.common.domain.member.base.CuMember; import com.hzs.common.domain.member.bonus.*; import com.hzs.common.domain.member.ext.CuMemberExt; import com.hzs.common.domain.sale.ext.SaOrderExt; +import com.hzs.report.order.IPerformanceSummaryServiceApi; import com.hzs.system.config.IBonusItemsServiceApi; import com.hzs.system.config.dto.BonusConfigDTO; import lombok.extern.slf4j.Slf4j; @@ -39,6 +40,8 @@ public class BonusSettleServiceImpl implements IBonusSettleService { @DubboReference IBonusItemsServiceApi iBonusItemsServiceApi; + @DubboReference + IPerformanceSummaryServiceApi iPerformanceSummaryServiceApi; @Autowired private IBonusOrderService iBonusOrderService; @@ -107,6 +110,12 @@ public class BonusSettleServiceImpl implements IBonusSettleService { log.error("奖金结算异常", e); throw new RuntimeException(e); } + try { + // 调用统计业绩汇总接口 + iPerformanceSummaryServiceApi.createDataByDay(settleDate); + } catch (Exception e) { + log.error("每日数据业绩汇总异常", e); + } } @Override diff --git a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java index 8f3edff8..1d45ed1a 100644 --- a/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java +++ b/bd-business/bd-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java @@ -62,6 +62,8 @@ public class CuMemberBonusServiceImpl extends ServiceImpl cuMemberBonusDetailList = cuMemberBonusStageMapper.queryMemberBonusStageByBonusItemsFoServer(bonusParam); + dataTable = getDataTable(cuMemberBonusDetailList); + cuMemberBonusDetailList.forEach(cuMemberBonusDetail -> { + MemberBonusDetailSerVO memberBonusDetailVO = BeanUtil.copyProperties(cuMemberBonusDetail, MemberBonusDetailSerVO.class); + memberBonusDetailSerVoS.add(memberBonusDetailVO); + }); } else { // 其他收益 区域分红、月度分红平均、月度分红加权 List cuMemberBonusDetailList = cuMemberBonusDetailMapper.queryMemberBonusDetailByBonusItemsForServer(bonusParam); 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/bootstrap.yml b/bd-business/bd-business-bonus/src/main/resources/bootstrap.yml index e354fed0..415e76f1 100644 --- a/bd-business/bd-business-bonus/src/main/resources/bootstrap.yml +++ b/bd-business/bd-business-bonus/src/main/resources/bootstrap.yml @@ -67,7 +67,7 @@ dubbo: port: -1 cloud: # 订阅服务 - subscribed-services: bd-system, bd-third, bd-sale, bd-member + subscribed-services: bd-system, bd-third, bd-sale, bd-member, bd-report scan: # dubbo 服务扫描包(开启之后才会对外提供服务) base-packages: com.hzs.bonus 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/bonus/CuMemberBonusDetailMapper.xml b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusDetailMapper.xml index 7dc5b3e3..a7f89558 100644 --- a/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusDetailMapper.xml +++ b/bd-business/bd-business-bonus/src/main/resources/mapper/bonus/bonus/CuMemberBonusDetailMapper.xml @@ -326,6 +326,26 @@ and cd.pk_bonus_items = #{bonusParam.pkBonusItems} + union all + select + cb.pk_member,cs.pk_order,cb.period,cb.pk_country,cs.pk_bonus_items,cs.income_status,cs.CAL_ACHIEVE,cs.pretax_income,cs.income_tax,cs.real_income, + cs.remark,cs.income_ratio,cs.income_dial_ratio,cs.order_dial_ratio + from cu_member_bonus cb + inner join CU_MEMBER_BONUS_STAGE cs + on cb.pk_id = cs.pk_bonus + where 1=1 + + and cs.pk_bonus = #{bonusParam.pkBonus} + + + and cs.pk_range = #{bonusParam.pkGrade} + + + and cb.period = #{bonusParam.period} + + + and cd.pk_bonus_items = #{bonusParam.pkBonusItems} + ) x where 1=1 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 42f3c685..34f3bbdd 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 @@ -33,4 +33,130 @@ SELECT 1 FROM dual + 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..c73b43ae 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,13 @@ 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 + + #{items} + and so.order_type in diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberBusinessServiceImpl.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberBusinessServiceImpl.java index fa14d091..090b39db 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberBusinessServiceImpl.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberBusinessServiceImpl.java @@ -587,10 +587,11 @@ public class CuMemberBusinessServiceImpl implements ICuMemberBusinessService { deductCancelOrderCost(businessCommissionDTO); CuMemberAccount payMemberAccount = iCuMemberAccountService.queryCuMemberAccountByPkMember(saOrder.getPkCreator()); - - if (EOrderType.RETAIL_REGISTER.getValue() == saOrder.getOrderType()) { - // 会员账号 验证会员账户是否存在金额 - CuMember member = cuMemberService.getMemberById(saOrder.getPkMember()); + // 会员账号 验证会员账户是否存在金额 + CuMember member = cuMemberService.getMemberById(saOrder.getPkMember()); + if (EOrderType.RETAIL_REGISTER.getValue() == saOrder.getOrderType() + ||(ObjectUtil.isNotEmpty(member) && EOrderType.RETAIL_REPURCHASE.getValue() == saOrder.getOrderType() && saOrder.getPayTime().equals(member.getPayTime())) + ) { // 会员变为死点 member.setCategory(ECategory.LOGGED_OUT.getValue()); member.setCustomerType(ECustomerType.DEAD_POINT.getValue()); diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/structure/controller/api/ApiMemberStructureController.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/structure/controller/api/ApiMemberStructureController.java index 08daf99d..fa356dbf 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/structure/controller/api/ApiMemberStructureController.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/structure/controller/api/ApiMemberStructureController.java @@ -69,7 +69,7 @@ public class ApiMemberStructureController extends BaseController { Integer isFind = iCumemberRetailDetailService.getFindCumemberRetailDetail(settleTableName); if (isFind == null || isFind != 1) { log.error("当前表名不存在{}",settleTableName); - return AjaxResult.error("当前日结信息表不存在",settleTableName); + return AjaxResult.error("数据查询错误,请联系客服处理"); } CuMemberRetailDetail cuMemberRetailDetail = iCumemberRetailDetailService.getCuMemberRetailDetailByUserId(userId,stage,stageStatus,childNode,settleTableName); log.info("日结表会员信息{}",cuMemberRetailDetail); diff --git a/bd-business/bd-business-report/src/main/java/com/hzs/report/order/controller/CuMemberPerformanceSummaryController.java b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/controller/CuMemberPerformanceSummaryController.java new file mode 100644 index 00000000..22b076a4 --- /dev/null +++ b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/controller/CuMemberPerformanceSummaryController.java @@ -0,0 +1,20 @@ +package com.hzs.report.order.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 销售业绩统计表 前端控制器 + *

+ * + * @author sangelxiu1 + * @since 2025-09-22 + */ +@RestController +@RequestMapping("/order/performance-summary") +public class CuMemberPerformanceSummaryController { + +} diff --git a/bd-business/bd-business-report/src/main/java/com/hzs/report/order/mapper/CuMemberPerformanceSummaryMapper.java b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/mapper/CuMemberPerformanceSummaryMapper.java new file mode 100644 index 00000000..2e78435c --- /dev/null +++ b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/mapper/CuMemberPerformanceSummaryMapper.java @@ -0,0 +1,21 @@ +package com.hzs.report.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hzs.common.domain.report.CuMemberPerformanceSummary; +import com.hzs.common.domain.sale.order.SaOrder; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + *

+ * 销售业绩统计表 Mapper 接口 + *

+ * + * @author sangelxiu1 + * @since 2025-09-22 + */ +public interface CuMemberPerformanceSummaryMapper extends BaseMapper { + List getOrderByDay(@Param("startDate") Date startDate, @Param("endDate") Date endDate, @Param("orderTypeList") List orderTypeList); +} diff --git a/bd-business/bd-business-report/src/main/java/com/hzs/report/order/provider/PerformanceSummaryProvider.java b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/provider/PerformanceSummaryProvider.java new file mode 100644 index 00000000..d258a9e9 --- /dev/null +++ b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/provider/PerformanceSummaryProvider.java @@ -0,0 +1,24 @@ +package com.hzs.report.order.provider; + +import com.hzs.common.core.domain.R; +import com.hzs.report.order.IPerformanceSummaryServiceApi; +import com.hzs.report.order.service.ICuMemberPerformanceSummaryService; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; + +import javax.annotation.Resource; + +/** + * 销售业绩统计 + */ +@DubboService +@Slf4j +public class PerformanceSummaryProvider implements IPerformanceSummaryServiceApi { + @Resource + ICuMemberPerformanceSummaryService iCuMemberPerformanceSummaryService; + @Override + public R createDataByDay(String day) { + iCuMemberPerformanceSummaryService.createDataByDay(day); + return R.ok(); + } +} diff --git a/bd-business/bd-business-report/src/main/java/com/hzs/report/order/service/ICuMemberPerformanceSummaryService.java b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/service/ICuMemberPerformanceSummaryService.java new file mode 100644 index 00000000..da1e2887 --- /dev/null +++ b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/service/ICuMemberPerformanceSummaryService.java @@ -0,0 +1,16 @@ +package com.hzs.report.order.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.hzs.common.domain.report.CuMemberPerformanceSummary; + +/** + *

+ * 销售业绩统计表 服务类 + *

+ * + * @author sangelxiu1 + * @since 2025-09-22 + */ +public interface ICuMemberPerformanceSummaryService extends IService { + void createDataByDay(String day); +} 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 new file mode 100644 index 00000000..b7695955 --- /dev/null +++ b/bd-business/bd-business-report/src/main/java/com/hzs/report/order/service/impl/CuMemberPerformanceSummaryServiceImpl.java @@ -0,0 +1,85 @@ +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; +import com.hzs.common.domain.sale.order.SaOrder; +import com.hzs.report.order.mapper.CuMemberPerformanceSummaryMapper; +import com.hzs.report.order.service.ICuMemberPerformanceSummaryService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 销售业绩统计表 服务实现类 + *

+ * + * @author sangelxiu1 + * @since 2025-09-22 + */ +@Service +@Slf4j +public class CuMemberPerformanceSummaryServiceImpl extends ServiceImpl implements ICuMemberPerformanceSummaryService { + + @Override + public void createDataByDay(String day) { + Date startDate = DateUtils.getStartOfDay(day); + Date endDate = DateUtils.getEndOfDay(day); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(CuMemberPerformanceSummary::getSummaryDate, startDate); + baseMapper.delete(queryWrapper); + List orderTypeList = Arrays.asList(EOrderType.RETAIL_REGISTER.getValue(), EOrderType.RETAIL_UPGRADE.getValue(), EOrderType.RETAIL_REPURCHASE.getValue()); + List orderList = baseMapper.getOrderByDay(startDate, endDate, orderTypeList); + Map> groupedOrders = orderList.stream().collect(Collectors.groupingBy(SaOrder::getOrderType)); + CuMemberPerformanceSummary summary = CuMemberPerformanceSummary.getInitCuMemberPerformanceSummary(startDate); + if(ObjectUtil.isNotEmpty(groupedOrders.get(EOrderType.RETAIL_REGISTER.getValue()))) { + for (SaOrder saOrder : groupedOrders.get(EOrderType.RETAIL_REGISTER.getValue())) { + summary.setRetailRegisterAmount(summary.getRetailDiscountAmount().add(saOrder.getOrderAmount())); + summary.setRetailRegisterPv(summary.getRetailDiscountPv().add(saOrder.getOrderAchieve())); + + summary.setTotalAmount(summary.getTotalAmount().add(saOrder.getOrderAmount())); + summary.setTotalPv(summary.getTotalPv().add(saOrder.getOrderAmount())); + } + } + if(ObjectUtil.isNotEmpty(groupedOrders.get(EOrderType.RETAIL_UPGRADE.getValue()))) { + for (SaOrder saOrder : groupedOrders.get(EOrderType.RETAIL_UPGRADE.getValue())) { + summary.setRetailUpgradeAmount(summary.getRetailUpgradeAmount().add(saOrder.getOrderAmount())); + summary.setRetailUpgradePv(summary.getRetailUpgradePv().add(saOrder.getOrderAchieve())); + + summary.setTotalAmount(summary.getTotalAmount().add(saOrder.getOrderAmount())); + summary.setTotalPv(summary.getTotalPv().add(saOrder.getOrderAmount())); + } + } + if(ObjectUtil.isNotEmpty(groupedOrders.get(EOrderType.RETAIL_REPURCHASE.getValue()))) { + for (SaOrder saOrder : groupedOrders.get(EOrderType.RETAIL_REPURCHASE.getValue())) { + summary.setRetailRepurchaseAmount(summary.getRetailRepurchaseAmount().add(saOrder.getOrderAmount())); + summary.setRetailRepurchasePv(summary.getRetailRepurchasePv().add(saOrder.getOrderAchieve())); + + summary.setTotalAmount(summary.getTotalAmount().add(saOrder.getOrderAmount())); + summary.setTotalPv(summary.getTotalPv().add(saOrder.getOrderAmount())); + } + } + if(ObjectUtil.isNotEmpty(groupedOrders.get(EOrderType.RETAIL_CONSUME.getValue()))){ + for (SaOrder saOrder : groupedOrders.get(EOrderType.RETAIL_CONSUME.getValue())) { + summary.setRetailDiscountAmount(summary.getRetailDiscountAmount().add(saOrder.getOrderAmount())); + summary.setDividendPv(summary.getDividendPv().add(saOrder.getOrderAchieve())); + + summary.setTotalAmount(summary.getTotalAmount().add(saOrder.getOrderAmount())); + summary.setTotalPv(summary.getTotalPv().add(saOrder.getOrderAmount())); + } + } + summary.setDividendPv(summary.getTotalPv().multiply(new BigDecimal("0.015"))); + summary.setPkCreator(MagicNumberConstants.PK_ADMIN); + baseMapper.insert(summary); + } +} diff --git a/bd-business/bd-business-report/src/main/resources/mapper/report/order/CuMemberPerformanceSummaryMapper.xml b/bd-business/bd-business-report/src/main/resources/mapper/report/order/CuMemberPerformanceSummaryMapper.xml new file mode 100644 index 00000000..492f82bf --- /dev/null +++ b/bd-business/bd-business-report/src/main/resources/mapper/report/order/CuMemberPerformanceSummaryMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEL_FLAG, + PK_COUNTRY, + CREATION_TIME, + MODIFIED_TIME, + PK_CREATOR, + PK_MODIFIED, + PK_ID, SUMMARY_DATE, RETAIL_REGISTER_AMOUNT, RETAIL_REGISTER_PV, RETAIL_UPGRADE_AMOUNT, RETAIL_UPGRADE_PV, RETAIL_REPURCHASE_AMOUNT, RETAIL_REPURCHASE_PV, RETAIL_DISCOUNT_AMOUNT, RETAIL_DISCOUNT_PV, TOTAL_AMOUNT, TOTAL_PV, DIVIDEND_PV + + + + diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java index ed814c32..5466ab56 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java @@ -2,6 +2,7 @@ package com.hzs.sale.order.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; @@ -662,6 +663,7 @@ public class SaOrderServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) public void revokeSaOrderByOrderCode(Long pkApprove, OrderCancelParam orderCancelParam, ValidateCancelOrderVO validateCancelOrderVO) { SaOrderExt saOrderExt = validateCancelOrderVO.getSaOrderExt(); + CuMemberExt memberExt = memberServiceApi.getMemberById(saOrderExt.getPkMember()).getData(); BusinessCommissionDTO businessCommissionDTO = null; if (orderCancelParam.getCancelRoad() == 1) { EApprovalBusiness approveBusiness = EApprovalBusiness.ORDER_CANCEL; @@ -750,7 +752,9 @@ public class SaOrderServiceImpl extends ServiceImpl impl } // 撤销注册订单 单点撤单 - if (ECancelOrderType.SINGLE_CANCEL_ORDER.getValue() == orderCancelParam.getCancelType()) { + if (ECancelOrderType.SINGLE_CANCEL_ORDER.getValue() == orderCancelParam.getCancelType() + ||(ObjectUtil.isNotEmpty(memberExt) && ECancelOrderType.OTHER_CANCEL_ORDER.getValue() == orderCancelParam.getCancelType() && saOrderExt.getPayTime().equals(memberExt.getPayTime())) + ) { // 单点撤单,变死点 R tmpR = memberServiceApi.singleRevokeMemberByRegisterOrder(pkApprove, saOrderExt, businessCommissionDTO); if (!tmpR.isSuccess()) { diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/msg/BonusMsgConstants.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/msg/BonusMsgConstants.java index 530a7a40..9424bce2 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/msg/BonusMsgConstants.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/constant/msg/BonusMsgConstants.java @@ -19,6 +19,10 @@ public class BonusMsgConstants { * 阶段 收益说明 */ public static String STAGE_INCOME = "订单编号%s,%s为%s贡献了阶段收益,%s子点位%s阶段。"; + /** + * 二、三阶段 收益说明 + */ + public static String STAGE_INCOME_OTHER = "%s为%s贡献了阶段收益,%s子点位%s阶段。"; /** * 直推级差收益说明 diff --git a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/achieve/CuMemberRetailRange.java b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/achieve/CuMemberRetailRange.java index 2e5c09ca..f5f6ea4a 100644 --- a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/achieve/CuMemberRetailRange.java +++ b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/member/achieve/CuMemberRetailRange.java @@ -195,4 +195,10 @@ public class CuMemberRetailRange extends BaseEntity { @TableField("point_count") private Integer pointCount; + /** + * 复购业绩余额 + */ + @TableField("REP_PV_BALANCE") + private BigDecimal repPvBalance; + } diff --git a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/report/CuMemberPerformanceSummary.java b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/report/CuMemberPerformanceSummary.java new file mode 100644 index 00000000..ebb87317 --- /dev/null +++ b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/report/CuMemberPerformanceSummary.java @@ -0,0 +1,126 @@ +package com.hzs.common.domain.report; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; +import com.hzs.common.core.web.domain.BaseEntity; +import lombok.*; +import lombok.experimental.Accessors; + +/** + *

+ * 销售业绩统计表 + *

+ * + * @author sangelxiu1 + * @since 2025-09-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("CU_MEMBER_PERFORMANCE_SUMMARY") +@KeySequence("C_M_PERFORMANCE_SUMMARY_SEQ") +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CuMemberPerformanceSummary extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId("PK_ID") + private Long pkId; + + /** + * 统计日期 + */ + @TableField("SUMMARY_DATE") + private Date summaryDate; + + /** + * 精品专区销售金额 + */ + @TableField("RETAIL_REGISTER_AMOUNT") + private BigDecimal retailRegisterAmount; + + /** + * 精品专区销售业绩 + */ + @TableField("RETAIL_REGISTER_PV") + private BigDecimal retailRegisterPv; + + /** + * 甄选专区销售金额 + */ + @TableField("RETAIL_UPGRADE_AMOUNT") + private BigDecimal retailUpgradeAmount; + + /** + * 甄选专区销售业绩 + */ + @TableField("RETAIL_UPGRADE_PV") + private BigDecimal retailUpgradePv; + + /** + * 商城专区销售金额 + */ + @TableField("RETAIL_REPURCHASE_AMOUNT") + private BigDecimal retailRepurchaseAmount; + + /** + * 商城专区销售业绩 + */ + @TableField("RETAIL_REPURCHASE_PV") + private BigDecimal retailRepurchasePv; + + /** + * 五折专区销售金额 + */ + @TableField("RETAIL_DISCOUNT_AMOUNT") + private BigDecimal retailDiscountAmount; + + /** + * 五折专区销售业绩 + */ + @TableField("RETAIL_DISCOUNT_PV") + private BigDecimal retailDiscountPv; + + /** + * 当期销售金额合计 + */ + @TableField("TOTAL_AMOUNT") + private BigDecimal totalAmount; + + /** + * 当期销售业绩合计 + */ + @TableField("TOTAL_PV") + private BigDecimal totalPv; + + /** + * 当日分红合计(分红:所有专区PV值的1.5%每天进行记录) + */ + @TableField("DIVIDEND_PV") + private BigDecimal dividendPv; + + + public static CuMemberPerformanceSummary getInitCuMemberPerformanceSummary(Date summaryDate){ + return CuMemberPerformanceSummary.builder() + .summaryDate(summaryDate) + .retailRegisterAmount(BigDecimal.ZERO) + .retailRegisterPv(BigDecimal.ZERO) + .retailUpgradeAmount(BigDecimal.ZERO) + .retailUpgradePv(BigDecimal.ZERO) + .retailRepurchaseAmount(BigDecimal.ZERO) + .retailRepurchasePv(BigDecimal.ZERO) + .retailDiscountAmount(BigDecimal.ZERO) + .retailDiscountPv(BigDecimal.ZERO) + .totalAmount(BigDecimal.ZERO) + .totalPv(BigDecimal.ZERO) + .dividendPv(BigDecimal.ZERO) + .build(); + } +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentServiceImpl.java b/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentServiceImpl.java index 911d8a75..b9bf39d8 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentServiceImpl.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentServiceImpl.java @@ -62,7 +62,7 @@ public class TOnlinePaymentServiceImpl extends ServiceImpl