From 564fb2bf12a7feee844d0c60bb35c7ae860d8343 Mon Sep 17 00:00:00 2001 From: cabbage <281119120@qq.com> Date: Thu, 12 Jun 2025 13:28:52 +0800 Subject: [PATCH] =?UTF-8?q?##=20=E5=8C=BA=E5=9F=9F=E6=94=B6=E7=9B=8A?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=95=86=E5=93=81=E4=BB=B7=E6=A0=BC=E7=9A=84?= =?UTF-8?q?5%=EF=BC=9B=E7=9B=92=E6=95=B0=E5=A4=A7=E5=B0=8F=E5=8C=BA?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E8=B0=83=E6=95=B4=EF=BC=9B=E7=A7=92=E7=BB=93?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E7=AD=89=E7=BA=A7=E4=BB=A5=E4=BC=9A=E5=91=98?= =?UTF-8?q?=E8=A1=A8=E5=85=B3=E7=B3=BB=E4=B8=BA=E4=B8=BB=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/CuMemberRetailRangeServiceImpl.java | 5 +- .../service/impl/BonusSettleRangeHandle.java | 226 ++++++++++++------ .../achieve/CuMemberRetailRangeMapper.xml | 21 +- .../api/RetailMemberController.java | 7 +- .../common/core/constant/RetailConstants.java | 8 +- 5 files changed, 188 insertions(+), 79 deletions(-) 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 fa66d6e9..24ec4e15 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 @@ -86,6 +86,7 @@ public class CuMemberRetailRangeServiceImpl extends ServiceImpl queryCuMemberSecondRangeParent(String rangeTableName, String secondTableName, Long pkMember) { + // 查询伞上 return baseMapper.queryCuMemberSecondRangeParent(rangeTableName, secondTableName, pkMember); } @@ -169,9 +170,9 @@ public class CuMemberRetailRangeServiceImpl extends ServiceImpl cuMemberBonusMap, List cuMemberBonusDetailList) { // 会员级差表 String rangeTableName = TableNameConstants.CU_MEMBER_RETAIL_RANGE + beforePeriod; - // 更新极差秒接表,用昨天的结算表(从当前会员往上找到顶) + // 更新极差秒接表,用昨天的结算表(血缘伞上) iCuMemberRetailRangeService.mergeMemberSecondRetailRangeByRange(rangeTableName, secondRangeTableName, saOrderExt.getPkMember()); // 处理会员等级(查询会员最新手动升级记录,更新秒结表会员等级小于手动升级的会员等级) - // TODO new 秒结只影响上面,更新等级只更新血缘上就可以?不需要全网更新?? + // TODO new 秒结只影响上面,更新等级应该只更新血缘上就可以,不需要全网更新 -- 是否需要修改??? iCuMemberGradeService.updateCuMemberGradeSecond(secondRangeTableName, currentPeriod); - // 按照血缘,查询该会员所有伞上会员(昨天日结表累计值 + 今天秒结表新増值) + // 按照血缘,查询该会员血缘伞上(昨天日结表累计值 + 今天秒结表新増值) List memberRetailRangeExtList = iCuMemberRetailRangeService.queryCuMemberSecondRangeParent(rangeTableName, secondRangeTableName, saOrderExt.getPkMember()); // 会员结算map(key:会员ID,value:结算扩展) @@ -227,7 +228,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { iCuMemberRetailRangeService.mergeMemberRetailGradeByMember(secondRangeTableName, saOrderExt.getPkMember()); // 恢复秒结表奖衔 iCuMemberAwardsService.mergeCuMemberBackAwards(secondRangeTableName, saOrderExt.getPkMember(), currentPeriod); - // 查询 昨天日结 + 今天秒结 血缘上会员结算数据 + // 查询 昨天日结 + 今天秒结 血缘伞上+直推 memberRetailRangeExtList = iCuMemberRetailRangeService.queryCuMemberSecondRangeParent(rangeTableName, secondRangeTableName, saOrderExt.getPkMember()); } else { // 非当天撤单 @@ -915,7 +916,8 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { targetMemberRangeExt.setMonthBoxNum(targetMemberRangeExt.getMonthBoxNum() + boxNum); targetMemberRangeExt.setTeamNewBoxNum(targetMemberRangeExt.getTeamNewBoxNum() + boxNum); // 计算等级 - calculateGradeAwards(period, memberRangeExtMap, rangeTableName, saOrderExt, retailTeamGradeMap, retailAwardsMap, secondRangeTableName, cuMemberGradeList, cuMemberAwardsList, targetMemberRangeExt); + calculateGradeAwards(period, memberRangeExtMap, rangeTableName, saOrderExt, retailTeamGradeMap, retailAwardsMap, + secondRangeTableName, cuMemberGradeList, cuMemberAwardsList, targetMemberRangeExt); } targetMemberRangeExt = memberRangeExtMap.get(targetMemberRangeExt.getPkParent()); } @@ -943,37 +945,35 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { cuMemberRangeExtList = iCuMemberRetailRangeService.queryCuMemberRetailRangeExtByParent(rangeTableName, targetMemberRangeExt.getPkMember()); } - // TODO new 秒结处理这块应该有问题,自己消费的盒数直接当成大区,如果昨天直推会员有数据,查询秒结表可能没有这些会员,此处就可能出现问题 - // 有注水的,大区无限大,新增全算小区 - // 大区盒数 + // new 新逻辑确认:注水 2 个虚拟区,自己消费 1 个虚拟区,伞下直推,所有的最大 + // 大区盒数(默认为自己累计消费盒数) int bigBoxNum = targetMemberRangeExt.getConsumeBoxNum(); - if (targetMemberRangeExt.getBigBoxNum() > 0) { - // 大区存在注水盒数,直接使用大区注水盒数 + if (targetMemberRangeExt.getBigBoxNum() > bigBoxNum) { + // 注水大区如果大则使用注水盒数为大区 bigBoxNum = targetMemberRangeExt.getBigBoxNum(); - } else { - // 秒结 cuMemberRangeExtList 为直推会员数据, memberRangeExtMap 为会员伞上数据,这块应该永远不会处理 - // 日结这块处理直推判断大小区没问题 - for (CuMemberRetailRangeExt cuMemberRetailRangeExt : cuMemberRangeExtList) { - if (memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) { - cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailRangeExt.getPkMember()); - } - // 伞下团队累计盒数 + 自己消费盒数 - 大区注水 - 小区注水 - int areaBoxNum = cuMemberRetailRangeExt.getTeamBoxNum() + cuMemberRetailRangeExt.getConsumeBoxNum() - - cuMemberRetailRangeExt.getBigBoxNum() - cuMemberRetailRangeExt.getSmallBoxNum(); - if (areaBoxNum > bigBoxNum) { - // 实际订单累计盒数 大于 累计消费盒数,实际订单累计盒数为大区 - bigBoxNum = areaBoxNum; - } + } + // 秒结补全直推数据,此处秒结和日结可以使用同一逻辑 + for (CuMemberRetailRangeExt cuMemberRetailRangeExt : cuMemberRangeExtList) { + if (memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) { + cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailRangeExt.getPkMember()); + } + // 最新确认逻辑,计算大小区时,不需要去掉注水 + // 伞下团队累计盒数 + 自己消费盒数 + int areaBoxNum = cuMemberRetailRangeExt.getTeamBoxNum() + cuMemberRetailRangeExt.getConsumeBoxNum(); + if (areaBoxNum > bigBoxNum) { + // 实际订单累计盒数 大于 累计消费盒数,实际订单累计盒数为大区 + bigBoxNum = areaBoxNum; } } + // 小区盒数 int smallBoxNum = targetMemberRangeExt.getTeamBoxNum() + targetMemberRangeExt.getConsumeBoxNum() - bigBoxNum; if (smallBoxNum >= bdGrade.getBoxSmallTotal()) { // 小区盒数 大于等于 升级小区盒数 CuMemberGrade cuMemberGrade = getCuMemberGrade(period, targetMemberRangeExt, bdGrade); cuMemberGradeList.add(cuMemberGrade); - targetMemberRangeExt.setGradeValue(bdGrade.getGradeValue()); targetMemberRangeExt.setPkGrade(bdGrade.getPkId()); + targetMemberRangeExt.setGradeValue(bdGrade.getGradeValue()); targetMemberRangeExt.setGradeName(bdGrade.getGradeName()); } } @@ -1131,28 +1131,27 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { cuMemberRangeExtList = iCuMemberRetailRangeService.queryCuMemberRetailRangeExtByParent(rangeTableName, targetMemberRangeExt.getPkMember()); } - // 有注水的,大区无限大,新增全算小区 - // 大区盒数 + // new 新逻辑确认:注水 2 个虚拟区,自己消费 1 个虚拟区,伞下直推,所有的最大 + // 大区盒数(默认为自己累计消费盒数) int bigBoxNum = targetMemberRangeExt.getConsumeBoxNum(); - if (targetMemberRangeExt.getBigBoxNum() > 0) { - // 大区存在注水盒数,直接使用大区注水盒数 + if (targetMemberRangeExt.getBigBoxNum() > bigBoxNum) { + // 注水大区如果大则使用注水盒数为大区 bigBoxNum = targetMemberRangeExt.getBigBoxNum(); - } else { - // 秒结 cuMemberRangeExtList 为直推会员数据, memberRangeExtMap 为会员伞上数据,这块应该永远不会处理 - // 日结这块处理直推判断大小区没问题 - for (CuMemberRetailRangeExt cuMemberRetailRangeExt : cuMemberRangeExtList) { - if (memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) { - cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailRangeExt.getPkMember()); - } - // 伞下团队累计盒数 + 自己消费盒数 - 大区注水 - 小区注水 - int areaBoxNum = cuMemberRetailRangeExt.getTeamBoxNum() + cuMemberRetailRangeExt.getConsumeBoxNum() - - cuMemberRetailRangeExt.getBigBoxNum() - cuMemberRetailRangeExt.getSmallBoxNum(); - if (areaBoxNum > bigBoxNum) { - // 实际订单累计盒数 大于 累计消费盒数,实际订单累计盒数为大区 - bigBoxNum = areaBoxNum; - } + } + // 秒结补全直推数据,此处秒结和日结可以使用同一逻辑 + for (CuMemberRetailRangeExt cuMemberRetailRangeExt : cuMemberRangeExtList) { + if (memberRangeExtMap.containsKey(cuMemberRetailRangeExt.getPkMember())) { + cuMemberRetailRangeExt = memberRangeExtMap.get(cuMemberRetailRangeExt.getPkMember()); + } + // 最新确认逻辑,计算大小区时,不需要去掉注水 + // 伞下团队累计盒数 + 自己消费盒数 + int areaBoxNum = cuMemberRetailRangeExt.getTeamBoxNum() + cuMemberRetailRangeExt.getConsumeBoxNum(); + if (areaBoxNum > bigBoxNum) { + // 实际订单累计盒数 大于 累计消费盒数,实际订单累计盒数为大区 + bigBoxNum = areaBoxNum; } } + // 小区盒数 int smallBoxNum = targetMemberRangeExt.getTeamBoxNum() + targetMemberRangeExt.getConsumeBoxNum() - bigBoxNum; if (smallBoxNum >= bdGrade.getBoxSmallTotal()) { @@ -1310,6 +1309,11 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 推荐人 long pkParent = sourceMemberRangeExt.getPkParent(); // 商品价格(没有乘商品数量) + BigDecimal waresPrice = saOrderItems.getWaresPrice(); + // 商品数量 + Integer waresQuantity = saOrderItems.getWaresQuantity(); + + // 商品价格 BigDecimal beginBuyPrice = saOrderItems.getWaresPrice(); BigDecimal comBuyPrice = saOrderItems.getWaresPrice(); @@ -1318,8 +1322,12 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 直推级差收益 BigDecimal calBonusIncome = BigDecimal.ZERO; - // 临时等级 - int tmpGradeValue = 0; + // 前一个会员等级 + int beforeGradeValue = 0; + // 前一个会员等级的平级收益人数 + int beforeSameAlgebra = 0; + // 前一个会员等级的平级收益 + BigDecimal beforeSameBonus = BigDecimal.ZERO; // 计算直推级差 while (true) { // 推荐人 @@ -1330,8 +1338,6 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 推荐人的推荐人 pkParent = targetMemberRangeExt.getPkParent(); - // TODO new 新处理奖金 - if (EAccountStatus.STOP_INCOME.getValue() == targetMemberRangeExt.getAccountStatus() || ECategory.NORMAL.getValue() != targetMemberRangeExt.getCategory() || targetMemberRangeExt.getEnableStatus() == EYesNo.NO.getIntValue() @@ -1343,35 +1349,107 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 当前会员等级值 int calGradeValue = targetMemberRangeExt.getGradeValue(); - // 税前收益 - BigDecimal pretaxIncome; - if (tmpGradeValue == 0) { - // 临时等级为0 - tmpGradeValue = calGradeValue; + // 直推级差税前收益 + BigDecimal rangeBonusIncome = null; + // 平级税前收益 + BigDecimal sameBonusIncome = null; + if (beforeGradeValue == 0) { + // 前一个会员等级为0,肯定为第一次处理,直接处理直推级差收益 if (EGrade.HAI_FAN.getValue() == calGradeValue) { // VIP,拿1份40 - pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS; + rangeBonusIncome = RetailConstants.RANGE_BONUS; } else if (EGrade.YOU_KE.getValue() == calGradeValue) { // SVIP,拿2份40 - pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("2")); + rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal("2")); } else if (EGrade.MAKER.getValue() == calGradeValue) { // 卓越,拿3份40 - pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("3")); + rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal("3")); } else if (EGrade.VIP.getValue() == calGradeValue) { // 首席,拿4份40 - pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("4")); + rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal("4")); } else if (EGrade.S_VIP.getValue() == calGradeValue) { // 合伙人,拿5份40 - pretaxIncome = RetailConstants.LEVEL_RANGE_BONUS.multiply(new BigDecimal("5")); + rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal("5")); } - } else if (calGradeValue == tmpGradeValue) { - // 当前会员等级 + // 赋值前一个会员等级 + beforeGradeValue = calGradeValue; + } else if (calGradeValue == beforeGradeValue) { + // 当前会员等级 = 前一个会员等级 + if (EGrade.HAI_FAN.getValue() == calGradeValue) { + // V1 没有平级收益 + continue; + } + if (beforeSameAlgebra >= RetailConstants.SAME_ALGEBRA) { + // 平级收益已经满10代,不继续处理平级收益 + continue; + } + // 平级收益(商品价格 * 千分之五) -- 2位小数,四舍五入 + sameBonusIncome = waresPrice.multiply(RetailConstants.SAME_RATIO).setScale(2, BigDecimal.ROUND_HALF_UP); + // 平级收益累计 + beforeSameBonus = beforeSameBonus.add(sameBonusIncome); + // 平级等级代数等级 + beforeSameAlgebra += 1; + } else if (calGradeValue > beforeGradeValue) { + // 当前会员等级 > 前一个会员等级 + int tmpGradeVal = (calGradeValue - beforeGradeValue) / 10; - } else if (calGradeValue > tmpGradeValue) { + // 新等级的直推级差收益 + rangeBonusIncome = RetailConstants.RANGE_BONUS.multiply(new BigDecimal(tmpGradeVal)); + // 直推级差收益 = 新等级的直推级差收益 - 上一等级的平级收益 + rangeBonusIncome = rangeBonusIncome.subtract(beforeSameBonus); + // 赋值前一个会员等级 + beforeGradeValue = calGradeValue; + // 平级收益记录从新开始计算 + beforeSameAlgebra = 0; + beforeSameBonus = BigDecimal.ZERO; + } else { + // 当前会员等级 < 前一个会员等级,直接跳过 + continue; } + if (null != rangeBonusIncome) { + // 处理直推级差收益 + CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, targetMemberRangeExt.getPkMember(), + targetMemberRangeExt.getIncomeStatus(), targetMemberRangeExt.getPkSettleCountry(), targetMemberRangeExt.getPkRate() == null ? saOrderExt.getPkRate() : targetMemberRangeExt.getPkRate()); + int pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_RANGE_INCOME.getValue()); + CuMemberBonusRange cuMemberBonusRange = getCuMemberRetailBonusRange(saOrderExt, targetMemberRangeExt, cuMemberBonus, pkBonusItems); + cuMemberBonusRange.setCalValue(BigDecimal.ZERO); + cuMemberBonusRange.setPretaxIncome(rangeBonusIncome.multiply(new BigDecimal(waresQuantity))); + cuMemberBonusRange.setPkRange(targetMemberRangeExt.getPkGrade()); + cuMemberBonusRange.setPkBeforeRange(sourceMemberRangeExt.getPkGrade()); + cuMemberBonusRange.setPkOrderItems(saOrderItems.getPkId()); + rangeRetailRemark(saOrderExt, cuMemberBonusRange, sourceMemberRangeExt, targetMemberRangeExt); + BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusRange, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate()); + if (EBonusIncomeStatus.NORMAL.getValue() == cuMemberBonusRange.getIncomeStatus()) { + cuMemberBonus.setRetailRangeIncome(ComputeUtil.computeAdd(cuMemberBonus.getRetailRangeIncome(), cuMemberBonusRange.getPretaxIncome())); + setRetailTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusRange); + } + memberBonusRangeList.add(cuMemberBonusRange); + } + if (null != sameBonusIncome) { + // 处理平级收益 + CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, targetMemberRangeExt.getPkMember(), + targetMemberRangeExt.getIncomeStatus(), targetMemberRangeExt.getPkSettleCountry(), targetMemberRangeExt.getPkRate() == null ? saOrderExt.getPkRate() : targetMemberRangeExt.getPkRate()); + int pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_SAME_LEVEL_INCOME.getValue()); + CuMemberBonusRange oriMemberBonusRange = getCuMemberRetailBonusRange(saOrderExt, targetMemberRangeExt, cuMemberBonus, pkBonusItems); + oriMemberBonusRange.setCalValue(BigDecimal.valueOf(2)); + oriMemberBonusRange.setPretaxIncome(sameBonusIncome.multiply(new BigDecimal(waresQuantity))); + oriMemberBonusRange.setPkRange(targetMemberRangeExt.getPkGrade()); + oriMemberBonusRange.setPkBeforeRange(sourceMemberRangeExt.getPkGrade()); + oriMemberBonusRange.setPkOrderItems(saOrderItems.getPkId()); + oriRetailRangeRemark(saOrderExt, oriMemberBonusRange, sourceMemberRangeExt, targetMemberRangeExt); + BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, oriMemberBonusRange, saOrderExt.getOrderAmount(), saOrderExt.getInExchangeRate()); + if (EBonusIncomeStatus.NORMAL.getValue() == oriMemberBonusRange.getIncomeStatus()) { + cuMemberBonus.setRetailSameLevelIncome(ComputeUtil.computeAdd(cuMemberBonus.getRetailSameLevelIncome(), oriMemberBonusRange.getPretaxIncome())); + setRetailTotal(bdBonusDeduct, cuMemberBonus, oriMemberBonusRange); + } + memberBonusRangeList.add(oriMemberBonusRange); + } + + /////////////////////////////////////////////////////////////// + // 如果价格是209,代表是第一单激活,只有平级收益,只有V5有平级收益 if (beginBuyPrice.equals(BigDecimal.valueOf(209))) { @@ -1386,6 +1464,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { // 有极差或者有平级 if (ComputeUtil.compareGreaterThan(beginBuyPrice, buyPrice)) { // 计算极差 + CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, targetMemberRangeExt.getPkMember(), targetMemberRangeExt.getIncomeStatus(), targetMemberRangeExt.getPkSettleCountry(), targetMemberRangeExt.getPkRate() == null ? saOrderExt.getPkRate() : targetMemberRangeExt.getPkRate()); int pkBonusItems = getPkBonusItems(bonusConfigDTO, targetMemberRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_RANGE_INCOME.getValue()); @@ -1402,6 +1481,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { setRetailTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusRange); } memberBonusRangeList.add(cuMemberBonusRange); + beginBuyPrice = buyPrice; comBuyPrice = buyPrice; beginGradeValue = calGradeValue; @@ -1514,7 +1594,7 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { */ CuMemberBonusDetail calculateRetailAreaBonus(Map countyRangeExtMap, BonusConfigDTO bonusConfigDTO, Integer period, Map memberRangeExtMap, - Map cuMemberBonusMap, SaOrder saOrder) { + Map cuMemberBonusMap, SaOrderExt saOrder) { // 重消订单没有区域分红 if (saOrder.getOrderType().equals(EOrderType.RETAIL_CONSUME.getValue())) { return null; @@ -1545,13 +1625,24 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { if (validatePkBonusItems(bonusConfigDTO, cuMemberRetailRangeExt.getPkSettleCountry(), EBonusItems.RETAIL_AREA_INCOME.getValue())) { return null; } + // 没有盒数商品,直接返回空 + if (CollectionUtil.isEmpty(saOrder.getOrderWaresExtList())) { + return null; + } - BigDecimal boxNumBig = new BigDecimal(saOrder.getBoxNum()); - // 处理区域收益(每盒2元) - BigDecimal benefitIncome = RetailConstants.AREA_BOX_BONUS.multiply(boxNumBig); - CuMemberBonusDetail cuMemberBonusDetail = packageBenefitIncome(bonusConfigDTO, period, cuMemberBonusMap, null, BigDecimal.ZERO, benefitIncome, + // 区域收益,商品价格 * 0.5% * 商品数量 + // 处理区域收益 -- 计算比例为 0.5% + BigDecimal benefitIncome = BigDecimal.ZERO; + // 计算业绩(此处作为比例) + BigDecimal calAchieve = BigDecimal.ZERO; + for (SaOrderWaresExt saOrderWaresExt : saOrder.getOrderWaresExtList()) { + benefitIncome = benefitIncome.add(saOrderWaresExt.getWaresPrice().multiply(RetailConstants.SAME_RATIO)).setScale(2, BigDecimal.ROUND_HALF_UP); + calAchieve = calAchieve.add(saOrderWaresExt.getWaresPrice()); + } + CuMemberBonusDetail cuMemberBonusDetail = packageBenefitIncome(bonusConfigDTO, period, cuMemberBonusMap, null, RetailConstants.SAME_RATIO, benefitIncome, cuMemberRetailRangeExt, EBonusItems.RETAIL_AREA_INCOME.getValue(), BonusMsgConstants.RETAIL_AREA_INCOME); - cuMemberBonusDetail.setCalAchieve(boxNumBig); + // 计算业绩以盒数做为基础 + cuMemberBonusDetail.setCalAchieve(new BigDecimal(saOrder.getBoxNum())); cuMemberBonusDetail.setPkOrder(saOrder.getPkId()); String remark = String.format(BonusMsgConstants.RETAIL_AREA_INCOME, saOrder.getOrderCode(), memberRangeExtMap.get(saOrder.getPkMember()).getMemberCode() + memberRangeExtMap.get(saOrder.getPkMember()).getMemberName(), @@ -1888,15 +1979,14 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { private CuMemberBonusDetail packageBenefitIncome(BonusConfigDTO bonusConfigDTO, Integer period, Map cuMemberBonusMap, String month, BigDecimal benefitAvgRatio, BigDecimal benefitAvgIncome, CuMemberRetailRangeExt cuMemberRetailRangeExt, Integer bonusItemsValue, String msg) { - // 福利平均 CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, cuMemberRetailRangeExt.getPkMember(), cuMemberRetailRangeExt.getIncomeStatus(), cuMemberRetailRangeExt.getPkSettleCountry(), cuMemberRetailRangeExt.getPkRate()); SaOrder saOrderExt = SaOrder.builder().pkId(0L).orderAchieve(BigDecimal.ZERO).build(); CuMemberBonusDetail cuMemberBonusDetail = getCuMemberBonusDetail(saOrderExt, cuMemberRetailRangeExt.getIncomeStatus(), cuMemberRetailRangeExt.getPkSettleCountry(), cuMemberBonus); // 计算比例 cuMemberBonusDetail.setCalValue(benefitAvgRatio); - cuMemberBonusDetail.setPkBonusItems(getPkBonusItems(bonusConfigDTO, cuMemberRetailRangeExt.getPkSettleCountry(), bonusItemsValue)); cuMemberBonusDetail.setPretaxIncome(benefitAvgIncome); + cuMemberBonusDetail.setPkBonusItems(getPkBonusItems(bonusConfigDTO, cuMemberRetailRangeExt.getPkSettleCountry(), bonusItemsValue)); // 收益占比 BdBonusDeduct bdBonusDeduct = setBonusDetailDeduct(bonusConfigDTO, cuMemberBonusDetail, BigDecimal.ZERO, BigDecimal.ONE); if (bonusItemsValue != EBonusItems.RETAIL_AREA_INCOME.getValue()) { 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 e1bfb7e1..a3d4a476 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 @@ -150,7 +150,8 @@ where del_flag = 0 start with pk_id = #{pkMember} - connect by pk_id = prior pk_parent) a + connect by pk_id = prior pk_parent + ) a ) b on (a.pk_member = b.pk_member) when not matched then @@ -172,7 +173,8 @@ where del_flag = 0 start with pk_id = #{pkMember} - connect by pk_id = prior pk_parent) a + connect by pk_id = prior pk_parent + ) a left join ${rangeTableName} b on a.pk_id = b.pk_member where b.enable_status = 0 @@ -652,6 +654,20 @@