| 
					
				 | 
			
			
				@@ -5,16 +5,19 @@ import com.github.sd4324530.jtuple.Tuple3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.github.sd4324530.jtuple.Tuples; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.enums.BackUnitEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.zanxiang.game.back.serve.pojo.vo.GameBackPolicyVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.module.util.DateUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.module.util.JsonUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.module.util.NumberUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.collections4.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.lang3.RandomUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.math.BigDecimal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.LocalDateTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Arrays; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Objects; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.function.Function; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -47,8 +50,8 @@ public class BackPolicyUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         String backRate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (gameBackPolicy.getRegPayIntervalTime() != null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 && ((DateUtil.localDateTimeToSecond(payTime) - DateUtil.localDateTimeToSecond(regTime)) / 60) > gameBackPolicy.getRegPayIntervalTime()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("订单 id[{}]通过回传策略[{}]判断后,超过注册充值间隔时间,走补单逻辑 {}.", orderId, gameBackPolicy.getId(), gameBackPolicy.getRegPayIntervalTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 补单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.error("订单 id[{}]通过回传策略[{}]判断后,超过注册充值间隔时间,走补单逻辑 {}.", orderId, gameBackPolicy.getId(), gameBackPolicy.getRegPayIntervalTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (gameBackPolicy.getMarkUpOrder() != null && gameBackPolicy.getMarkUpOrder()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 markUpTime = gameBackPolicy.getRegPayIntervalTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (rechargeMoney <= gameBackPolicy.getMarkUpOrderMinMoney()) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -71,17 +74,17 @@ public class BackPolicyUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     int ignoreCount = Integer.parseInt(temp[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (backCount == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         log.error("订单 id[{}]通过回传策略[{}]判断后,不回传,原因:回传比例 {}", orderId, gameBackPolicy.getId(), backRate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return Tuples.tuple(Boolean.FALSE, rechargeMoney, "补单-按比例回传,回传比例为 0,全部不回传"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return Tuples.tuple(Boolean.FALSE, downLevel(rechargeMoney, gameBackPolicy.getMarkUpDownLevel()), "补单-按比例回传,回传比例为 0,全部不回传"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (ignoreCount == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         log.error("订单 id[{}]通过回传策略[{}]判断后,回传,原因:回传比例 {}", orderId, gameBackPolicy.getId(), backRate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return Tuples.tuple(Boolean.TRUE, rechargeMoney, "补单-按比例回传,忽略比例为 0,全部回传"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return Tuples.tuple(Boolean.TRUE, downLevel(rechargeMoney, gameBackPolicy.getMarkUpDownLevel()), "补单-按比例回传,忽略比例为 0,全部回传"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     long isBackCount = backPolicyCheck.markUpOfFixedRate(backCount + ignoreCount, markUpTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     backMsg = "补单-按比例回传,每 " + (backCount + ignoreCount) + "笔回传 " + backCount + "笔,当前第 " + (isBackCount + 1) + "笔"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (isBackCount >= backCount) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         log.error("订单 id[{}]通过回传策略[{}]判断后,不回传,原因:{}", orderId, gameBackPolicy.getId(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return Tuples.tuple(Boolean.FALSE, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return Tuples.tuple(Boolean.FALSE, downLevel(rechargeMoney, gameBackPolicy.getMarkUpDownLevel()), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } else if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_RANDOM_RATE)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     // 随机概率回传 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -89,7 +92,7 @@ public class BackPolicyUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     backMsg = "补单-随机概率回传(" + backRate + ")"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (!isBack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         log.error("订单 id[{}]通过回传策略[{}]判断后,不回传,原因:{}", orderId, gameBackPolicy.getId(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return Tuples.tuple(Boolean.FALSE, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return Tuples.tuple(Boolean.FALSE, downLevel(rechargeMoney, gameBackPolicy.getMarkUpDownLevel()), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     throw new RuntimeException("回传策略[" + gameBackPolicy.getId() + "]配置错误,未知的回传类型:" + backType); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -97,64 +100,65 @@ public class BackPolicyUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (gameBackPolicy.getMarkUpBackCountOfUser() == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     backMsg = backMsg + ",未配置单用户最大回传笔数"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     log.error("订单 id[{}]通过回传策略[{}]判断后,回传,原因:回传概率 {}", orderId, gameBackPolicy.getId(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return Tuples.tuple(Boolean.TRUE, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return Tuples.tuple(Boolean.TRUE, downLevel(rechargeMoney, gameBackPolicy.getMarkUpDownLevel()), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 long userBackCount = backPolicyCheck.markUpForUser(userId, markUpTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 backMsg = backMsg + ",单用户最大回传 " + gameBackPolicy.getMarkUpBackCountOfUser() + "笔,当前已回传 " + userBackCount + "笔"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{},原因:{}", orderId, gameBackPolicy.getId(), userBackCount < gameBackPolicy.getMarkUpBackCountOfUser(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Tuples.tuple(userBackCount < gameBackPolicy.getMarkUpBackCountOfUser(), rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return Tuples.tuple(userBackCount < gameBackPolicy.getMarkUpBackCountOfUser(), downLevel(rechargeMoney, gameBackPolicy.getMarkUpDownLevel()), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 log.error("订单 id[{}]通过回传策略[{}]判断后,不回传,原因:超过注册充值间隔时间但是未开启补单", orderId, gameBackPolicy.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Tuples.tuple(Boolean.FALSE, rechargeMoney, "回传策略未开启补单"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return Tuples.tuple(Boolean.FALSE, downLevel(rechargeMoney, gameBackPolicy.getMarkUpDownLevel()), "回传策略未开启补单"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 正常判断 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (backUnit == BackUnitEnum.UNIT_ONCE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            firstPolicy = isFirstOrder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (backUnit == BackUnitEnum.UNIT_DAY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            long intervalDays = DateUtil.intervalOfDays(regTime.toLocalDate(), payTime.toLocalDate()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            firstPolicy = intervalDays == 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (backUnit == BackUnitEnum.UNIT_TIME_DAY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            long intervalHours = DateUtil.intervalOfHour(regTime, payTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            firstPolicy = intervalHours < 24; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else if (backUnit == BackUnitEnum.UNIT_TIME_2DAY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            long intervalHours = DateUtil.intervalOfHour(regTime, payTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            firstPolicy = intervalHours < 48; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // 正常判断 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (backUnit == BackUnitEnum.UNIT_ONCE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                firstPolicy = isFirstOrder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else if (backUnit == BackUnitEnum.UNIT_DAY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                long intervalDays = DateUtil.intervalOfDays(regTime.toLocalDate(), payTime.toLocalDate()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                firstPolicy = intervalDays == 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else if (backUnit == BackUnitEnum.UNIT_TIME_DAY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                long intervalHours = DateUtil.intervalOfHour(regTime, payTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                firstPolicy = intervalHours < 24; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else if (backUnit == BackUnitEnum.UNIT_TIME_2DAY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                long intervalHours = DateUtil.intervalOfHour(regTime, payTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                firstPolicy = intervalHours < 48; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new RuntimeException("未知的回传单位:" + backUnit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (firstPolicy) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (rechargeMoney <= gameBackPolicy.getFirstMinMoney()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 小额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backType = gameBackPolicy.getFirstMinMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backRate = gameBackPolicy.getFirstMinMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else if (rechargeMoney >= gameBackPolicy.getFirstMaxMoney()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 大额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backType = gameBackPolicy.getFirstMaxMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backRate = gameBackPolicy.getFirstMaxMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                throw new RuntimeException("未知的回传单位:" + backUnit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backType = gameBackPolicy.getFirstOtherMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backRate = gameBackPolicy.getFirstOtherMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (firstPolicy) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (rechargeMoney <= gameBackPolicy.getFirstMinMoney()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 小额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backType = gameBackPolicy.getFirstMinMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backRate = gameBackPolicy.getFirstMinMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else if (rechargeMoney >= gameBackPolicy.getFirstMaxMoney()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 大额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backType = gameBackPolicy.getFirstMaxMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backRate = gameBackPolicy.getFirstMaxMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backType = gameBackPolicy.getFirstOtherMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backRate = gameBackPolicy.getFirstOtherMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.error("订单 id[{}]通过回传策略[{}]判断后走首日逻辑:backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), backType, backRate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.error("订单 id[{}]通过回传策略[{}]判断后走首日逻辑:backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), backType, backRate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (rechargeMoney <= gameBackPolicy.getRechargeMinMoney()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 小额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backType = gameBackPolicy.getRechargeMinMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backRate = gameBackPolicy.getRechargeMinMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else if (rechargeMoney >= gameBackPolicy.getRechargeMaxMoney()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 大额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backType = gameBackPolicy.getRechargeMaxMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backRate = gameBackPolicy.getRechargeMaxMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (rechargeMoney <= gameBackPolicy.getRechargeMinMoney()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 小额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backType = gameBackPolicy.getRechargeMinMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backRate = gameBackPolicy.getRechargeMinMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else if (rechargeMoney >= gameBackPolicy.getRechargeMaxMoney()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 大额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backType = gameBackPolicy.getRechargeMaxMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backRate = gameBackPolicy.getRechargeMaxMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backType = gameBackPolicy.getRechargeOtherMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    backRate = gameBackPolicy.getRechargeOtherMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.error("订单 id[{}]通过回传策略[{}]判断后走次日逻辑, backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), backType, backRate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backType = gameBackPolicy.getRechargeOtherMoneyType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                backRate = gameBackPolicy.getRechargeOtherMoneyRate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.error("订单 id[{}]通过回传策略[{}]判断后走次日逻辑, backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), backType, backRate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Integer maxBackCountOfUser = firstPolicy ? gameBackPolicy.getFirstBackCountOfUser() : gameBackPolicy.getRechargeBackCountOfUser(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         String backMsg = firstPolicy ? "首-" : "次-"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String downLevelString = firstPolicy ? gameBackPolicy.getFirstDownLevel() : gameBackPolicy.getRechargeDownLevel(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_FIXED_RATE)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 固定比例回传 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             String[] temp = backRate.split(":"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -163,18 +167,18 @@ public class BackPolicyUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (backCount == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 backMsg = backMsg + "按比例回传,回传比例为 0,全部不回传"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 log.error("订单 id[{}]通过回传策略[{}]判断后,不回传,原因:{}", orderId, gameBackPolicy.getId(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Tuples.tuple(Boolean.FALSE, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return Tuples.tuple(Boolean.FALSE, downLevel(rechargeMoney, downLevelString), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (ignoreCount == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 backMsg = backMsg + "按比例回传,忽略比例为 0,全部回传"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 log.error("订单 id[{}]通过回传策略[{}]判断后,回传,原因:{}", orderId, gameBackPolicy.getId(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Tuples.tuple(Boolean.TRUE, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return Tuples.tuple(Boolean.TRUE, downLevel(rechargeMoney, downLevelString), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             long isBackCount = backPolicyCheck.backCountForFixedRate(backCount + ignoreCount, backUnit, firstPolicy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             backMsg = backMsg + "按比例回传,每 " + (backCount + ignoreCount) + "笔回传 " + backCount + "笔,当前第 " + (isBackCount + 1) + "笔"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (isBackCount >= backCount) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 log.error("订单 id[{}]通过回传策略[{}]判断后,不回传,原因:{}", orderId, gameBackPolicy.getId(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Tuples.tuple(Boolean.FALSE, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return Tuples.tuple(Boolean.FALSE, downLevel(rechargeMoney, downLevelString), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_RANDOM_RATE)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 随机概率回传 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -182,7 +186,7 @@ public class BackPolicyUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             backMsg = backMsg + "补单-随机概率回传(" + backRate + ")"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!isBack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 log.error("订单 id[{}]通过回传策略[{}]判断后,不回传,原因:{}", orderId, gameBackPolicy.getId(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return Tuples.tuple(Boolean.FALSE, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return Tuples.tuple(Boolean.FALSE, downLevel(rechargeMoney, downLevelString), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw new RuntimeException("回传策略[" + gameBackPolicy.getId() + "]配置错误,未知的回传类型:" + backType); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -191,12 +195,12 @@ public class BackPolicyUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (maxBackCountOfUser == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             backMsg = backMsg + ",未配置单用户最大回传笔数"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             log.error("订单 id[{}]通过回传策略[{}]判断后,回传,原因:回传概率 {}", orderId, gameBackPolicy.getId(), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return Tuples.tuple(Boolean.TRUE, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Tuples.tuple(Boolean.TRUE, downLevel(rechargeMoney, downLevelString), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         long userBackCount = backPolicyCheck.backCountForUser(backUnit, userId, firstPolicy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         backMsg = backMsg + ",单用户最大回传 " + maxBackCountOfUser + "笔,当前已回传 " + userBackCount + "笔"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{},原因:{}", orderId, gameBackPolicy.getId(), userBackCount < maxBackCountOfUser, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return Tuples.tuple(userBackCount < maxBackCountOfUser, rechargeMoney, backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Tuples.tuple(userBackCount < maxBackCountOfUser, downLevel(rechargeMoney, downLevelString), backMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /*if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_FIXED_RATE)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 固定比例回传 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             String[] temp = backRate.split(":"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -223,6 +227,23 @@ public class BackPolicyUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static Long downLevel(Long rechargeMoney, String downLevelStr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isBlank(downLevelStr)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return rechargeMoney; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String[] downLevelList = downLevelStr.split(","); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (String downLevel : downLevelList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String[] tmp = downLevel.split("_"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            long minMoney = Long.parseLong(tmp[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            long maxMoney = Long.parseLong(tmp[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Long backMoney = Long.parseLong(tmp[2]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (rechargeMoney >= minMoney && rechargeMoney <= maxMoney) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return backMoney; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return rechargeMoney; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private static Tuple2<Integer, Integer> approximate(int molecular, int denominator) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (molecular % denominator == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             int temp = molecular / denominator; 
			 |