| 
							
							
							
						 |  |  | @ -1,5 +1,6 @@ | 
		
	
		
			
				|  |  |  |  | package com.hzs.bonus.bonus.service.impl; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | import cn.hutool.core.collection.CollectionUtil; | 
		
	
		
			
				|  |  |  |  | import com.hzs.bonus.achieve.service.ICuMemberRangeService; | 
		
	
		
			
				|  |  |  |  | import com.hzs.bonus.achieve.service.ICuMemberRetailRangeService; | 
		
	
		
			
				|  |  |  |  | import com.hzs.bonus.base.service.ICuMemberService; | 
		
	
	
		
			
				
					|  |  |  | @ -64,13 +65,13 @@ public class BonusSettleRangeHandle extends BonusSettleHandle { | 
		
	
		
			
				|  |  |  |  |                                                                        Map<Long, CuMemberBonus> cuMemberBonusMap, List<CuMemberBonusDetail> cuMemberBonusDetailList) { | 
		
	
		
			
				|  |  |  |  |         // 会员级差表 | 
		
	
		
			
				|  |  |  |  |         String rangeTableName = TableNameConstants.CU_MEMBER_RETAIL_RANGE + beforePeriod; | 
		
	
		
			
				|  |  |  |  |         // 更新极差秒接表,用昨天的结算表(从当前会员往上找到顶) | 
		
	
		
			
				|  |  |  |  |         // 更新极差秒接表,用昨天的结算表(血缘伞上) | 
		
	
		
			
				|  |  |  |  |         iCuMemberRetailRangeService.mergeMemberSecondRetailRangeByRange(rangeTableName, secondRangeTableName, saOrderExt.getPkMember()); | 
		
	
		
			
				|  |  |  |  |         // 处理会员等级(查询会员最新手动升级记录,更新秒结表会员等级小于手动升级的会员等级) | 
		
	
		
			
				|  |  |  |  |         // TODO new 秒结只影响上面,更新等级只更新血缘上就可以?不需要全网更新?? | 
		
	
		
			
				|  |  |  |  |         // TODO new 秒结只影响上面,更新等级应该只更新血缘上就可以,不需要全网更新 -- 是否需要修改??? | 
		
	
		
			
				|  |  |  |  |         iCuMemberGradeService.updateCuMemberGradeSecond(secondRangeTableName, currentPeriod); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         // 按照血缘,查询该会员所有伞上会员(昨天日结表累计值 + 今天秒结表新増值) | 
		
	
		
			
				|  |  |  |  |         // 按照血缘,查询该会员血缘伞上(昨天日结表累计值 + 今天秒结表新増值) | 
		
	
		
			
				|  |  |  |  |         List<CuMemberRetailRangeExt> 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<String, CuMemberRetailRangeExt> countyRangeExtMap, | 
		
	
		
			
				|  |  |  |  |                                                  BonusConfigDTO bonusConfigDTO, Integer period, Map<Long, CuMemberRetailRangeExt> memberRangeExtMap, | 
		
	
		
			
				|  |  |  |  |                                                  Map<Long, CuMemberBonus> cuMemberBonusMap, SaOrder saOrder) { | 
		
	
		
			
				|  |  |  |  |                                                  Map<Long, CuMemberBonus> 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<Long, CuMemberBonus> 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()) { | 
		
	
	
		
			
				
					|  |  |  | 
 |