瀏覽代碼

头条回传策略调整

wcc 1 年之前
父節點
當前提交
823cab5d56

+ 0 - 3
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineBackLog.java

@@ -22,9 +22,6 @@ import java.time.LocalDateTime;
 public class GameOceanengineBackLog implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    public static final Integer BACK_STATUS_SUCCESS = 0;
-    public static final Integer BACK_STATUS_FAILED = -1;
-
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
     /**

+ 17 - 7
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java

@@ -64,8 +64,18 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                         gameBackPolicy = temp;
                     }
                 }
-                doBack = BackPolicyUtil.isBackOrder(gameBackPolicy, orderLog.getAmount());
+                doBack = BackPolicyUtil.backOrder(gameBackPolicy, orderLog.getAmount(), backUnit -> {
+                    return getOne(new LambdaQueryWrapper<GameOceanengineOrderLog>()
+                            .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
+                            .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
+                            .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
+                            .eq(GameOceanengineOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
+                            .last("limit 1")
+                    ) != null;
+                });
+                orderLog.setAmount(BackPolicyUtil.lowRechargeLevel(orderLog.getAmount(), gameBackPolicy.getLevelDown()));
             }
+
         }
         if (doBack) {
             BackStatusEnum backStatus = doCallback(orderLog);
@@ -97,7 +107,7 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                     .eventType(String.valueOf(MiniGameCallback.EventType.ACTIVE_PAY.getEventType()))
                     .eventLogId(orderLog.getId())
                     .createTime(LocalDateTime.now())
-                    .backStatus(GameOceanengineBackLog.BACK_STATUS_FAILED)
+                    .backStatus(BackStatusEnum.FAILED.getBackStatus())
                     .errMsg("找不到用户注册信息")
                     .build());
             return BackStatusEnum.FAILED;
@@ -111,15 +121,15 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                         .pay_amount(orderLog.getAmount())
                         .build())
                 .build();
-        Integer backStatus = GameOceanengineBackLog.BACK_STATUS_SUCCESS;
+        BackStatusEnum backStatus = BackStatusEnum.SUCCESS;
         String errMsg = null;
         try {
             miniGameCallback.doCallback(userLog.getAccountReportUrl(), userLog.getAccountReportToken(), request);
         } catch (OceanengineCallbackException e) {
-            backStatus = GameOceanengineBackLog.BACK_STATUS_FAILED;
+            backStatus = BackStatusEnum.FAILED;
             errMsg = e.getMsg();
         } catch (Exception e) {
-            backStatus = GameOceanengineBackLog.BACK_STATUS_FAILED;
+            backStatus = BackStatusEnum.FAILED;
             errMsg = "系统异常:" + e.getMessage();
         }
         gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
@@ -132,9 +142,9 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                 .eventType(request.getEvent_type())
                 .eventLogId(orderLog.getId())
                 .createTime(LocalDateTime.now())
-                .backStatus(backStatus)
+                .backStatus(backStatus.getBackStatus())
                 .errMsg(errMsg)
                 .build());
-        return backStatus.equals(GameOceanengineBackLog.BACK_STATUS_SUCCESS) ? BackStatusEnum.SUCCESS : BackStatusEnum.FAILED;
+        return backStatus;
     }
 }

+ 6 - 6
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineUserLogServiceImpl.java

@@ -46,7 +46,7 @@ public class GameOceanengineUserLogServiceImpl extends ServiceImpl<GameOceanengi
                 .eq(GameOceanengineBackLog::getAppId, userLog.getAppId())
                 .eq(GameOceanengineBackLog::getOpenId, userLog.getOpenId())
                 .eq(GameOceanengineBackLog::getAccountId, userLog.getAccountId())
-                .eq(GameOceanengineBackLog::getBackStatus, GameOceanengineBackLog.BACK_STATUS_SUCCESS)
+                .eq(GameOceanengineBackLog::getBackStatus, BackStatusEnum.SUCCESS)
         ) > 0;
         if (isBack) {
             return BackStatusEnum.NO;
@@ -57,15 +57,15 @@ public class GameOceanengineUserLogServiceImpl extends ServiceImpl<GameOceanengi
                 .union_id(userLog.getUnionId())
                 .event_type(String.valueOf(MiniGameCallback.EventType.ACTIVE.getEventType()))
                 .build();
-        Integer backStatus = GameOceanengineBackLog.BACK_STATUS_SUCCESS;
+        BackStatusEnum backStatus = BackStatusEnum.SUCCESS;
         String errMsg = null;
         try {
             miniGameCallback.doCallback(userLog.getAccountReportUrl(), userLog.getAccountReportToken(), request);
         } catch (OceanengineCallbackException e) {
-            backStatus = GameOceanengineBackLog.BACK_STATUS_FAILED;
+            backStatus = BackStatusEnum.FAILED;
             errMsg = e.getMsg();
         } catch (Exception e) {
-            backStatus = GameOceanengineBackLog.BACK_STATUS_FAILED;
+            backStatus = BackStatusEnum.FAILED;
             errMsg = "系统异常:" + e.getMessage();
         }
         gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
@@ -78,9 +78,9 @@ public class GameOceanengineUserLogServiceImpl extends ServiceImpl<GameOceanengi
                 .eventType(request.getEvent_type())
                 .eventLogId(userLog.getId())
                 .createTime(LocalDateTime.now())
-                .backStatus(backStatus)
+                .backStatus(backStatus.getBackStatus())
                 .errMsg(errMsg)
                 .build());
-        return backStatus.equals(GameOceanengineBackLog.BACK_STATUS_SUCCESS) ? BackStatusEnum.SUCCESS : BackStatusEnum.FAILED;
+        return backStatus;
     }
 }

+ 63 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/utils/BackPolicyUtil.java

@@ -1,11 +1,21 @@
 package com.zanxiang.game.back.serve.utils;
 
+import com.github.sd4324530.jtuple.Tuple2;
+import com.github.sd4324530.jtuple.Tuples;
 import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Arrays;
 import java.util.Random;
+import java.util.function.Function;
 
 public class BackPolicyUtil {
+    private static final long[] RECHARGE_LEVEL = {198 * 100L, 6 * 100L};
+
+    static {
+        Arrays.sort(RECHARGE_LEVEL);
+    }
 
     public static boolean isBackOrder(GameBackPolicy gameBackPolicy, Long rechargeMoney) {
         if (null == gameBackPolicy) {
@@ -28,4 +38,57 @@ public class BackPolicyUtil {
         // 如果随机数小于成功概率,则返回true,否则返回false
         return successProbability.compareTo(BigDecimal.valueOf(randomValue)) > 0;
     }
+
+    /**
+     * 订单回传
+     *
+     * @param gameBackPolicy   回传策略
+     * @param rechargeMoney    充值金额
+     * @param lastBackFunction 在指定最近订单数量内是否有订单回传过
+     * @return <是否回传, 回传金额>
+     */
+    public static boolean backOrder(GameBackPolicy gameBackPolicy, long rechargeMoney, Function<Integer, Boolean> lastBackFunction) {
+        if (null == gameBackPolicy) {
+            return true;
+        }
+        BigDecimal percentage;
+        if (rechargeMoney <= gameBackPolicy.getFirstRechargeMoney()) {
+            // 小于首充金额
+            percentage = gameBackPolicy.getFirstRechargeBackPercentage();
+        } else if (rechargeMoney >= gameBackPolicy.getBigRechargeMoney()) {
+            percentage = gameBackPolicy.getBigRechargeBackPercentage();
+        } else {
+            percentage = gameBackPolicy.getOtherRechargeBackPercentage();
+        }
+        if (percentage == null || percentage.compareTo(BigDecimal.ONE) >= 0) {
+            return true;
+        }
+        // 平均每 [backUnit] 笔订单上报一笔
+        int backUnit = BigDecimal.ONE.divide(percentage, 0, RoundingMode.HALF_UP).intValue();
+        if (lastBackFunction.apply(backUnit)) {
+            // 之前有订单上报过,这笔订单不上报了
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * 降档
+     */
+    public static long lowRechargeLevel(long rechargeMoney, Integer levelDown) {
+        if (levelDown == null || levelDown == 0) {
+            return rechargeMoney;
+        }
+        int level = RECHARGE_LEVEL.length - 1;
+        for (int i = 0; i < RECHARGE_LEVEL.length; i++) {
+            if (rechargeMoney <= RECHARGE_LEVEL[i]) {
+                level = i;
+                break;
+            }
+        }
+        level = level - levelDown;
+        level = level < 0 ? 0 : Math.min(level, RECHARGE_LEVEL.length - 1);
+        return RECHARGE_LEVEL[level];
+    }
 }