소스 검색

Merge remote-tracking branch 'origin/package' into package

bilingfeng 1 년 전
부모
커밋
3cd77702ff
27개의 변경된 파일269개의 추가작업 그리고 51개의 파일을 삭제
  1. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineOrderLogDTO.java
  2. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentMiniGameOrderDTO.java
  3. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentOrderDTO.java
  4. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineOrderLog.java
  5. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameOrder.java
  6. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentOrder.java
  7. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineOrderLogVO.java
  8. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentMiniGameOrderVO.java
  9. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentOrderVO.java
  10. 12 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentMiniGameBackRpcImpl.java
  11. 12 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentUserActionBackRpcImpl.java
  12. 11 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java
  13. 5 9
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java
  14. 6 9
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameOrderServiceImpl.java
  15. 5 9
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentOrderServiceImpl.java
  16. 7 5
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/utils/BackPolicyUtil.java
  17. 72 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteDayTotalVO.java
  18. 12 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteDayVO.java
  19. 15 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteTotalSumVO.java
  20. 15 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteTotalVO.java
  21. 6 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PlayerRechargeRankingVO.java
  22. 29 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java
  23. 3 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RankingServiceImpl.java
  24. 5 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/AccountTypeEnum.java
  25. 7 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java
  26. 1 2
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/AgentAddParam.java
  27. 22 16
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java

+ 3 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineOrderLogDTO.java

@@ -51,4 +51,7 @@ public class GameOceanengineOrderLogDTO extends BaseListDTO<GameOceanengineOrder
 
     @ApiModelProperty("角色名称")
     private String roleName;
+
+    @ApiModelProperty("是否是首单")
+    private Boolean isFirstOrder;
 }

+ 3 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentMiniGameOrderDTO.java

@@ -77,4 +77,7 @@ public class GameTencentMiniGameOrderDTO extends BaseListDTO<GameTencentMiniGame
 
     @ApiModelProperty("角色名称")
     private String roleName;
+
+    @ApiModelProperty("是否是首单")
+    private Boolean isFirstOrder;
 }

+ 3 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentOrderDTO.java

@@ -83,4 +83,7 @@ public class GameTencentOrderDTO extends BaseListDTO<GameTencentOrder> {
 
     @ApiModelProperty("角色名称")
     private String roleName;
+
+    @ApiModelProperty("是否是首单")
+    private Boolean isFirstOrder;
 }

+ 2 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineOrderLog.java

@@ -91,4 +91,6 @@ public class GameOceanengineOrderLog implements Serializable {
 
     private String roleName;
 
+    private Boolean isFirstOrder;
+
 }

+ 2 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameOrder.java

@@ -104,4 +104,6 @@ public class GameTencentMiniGameOrder implements Serializable {
     private Long roleId;
 
     private String roleName;
+
+    private Boolean isFirstOrder;
 }

+ 2 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentOrder.java

@@ -116,4 +116,6 @@ public class GameTencentOrder implements Serializable {
     private Long roleId;
 
     private String roleName;
+
+    private Boolean isFirstOrder;
 }

+ 3 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineOrderLogVO.java

@@ -69,4 +69,7 @@ public class GameOceanengineOrderLogVO {
 
     @ApiModelProperty("注册到付费的间隔时间")
     private String regPayIntervalTime;
+
+    @ApiModelProperty("是否是首单")
+    private Boolean isFirstOrder;
 }

+ 3 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentMiniGameOrderVO.java

@@ -109,4 +109,7 @@ public class GameTencentMiniGameOrderVO {
 
     @ApiModelProperty("注册到付费的间隔时间")
     private String regPayIntervalTime;
+
+    @ApiModelProperty("是否是首单")
+    private Boolean isFirstOrder;
 }

+ 3 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentOrderVO.java

@@ -125,4 +125,7 @@ public class GameTencentOrderVO {
 
     @ApiModelProperty("注册到付费的间隔时间")
     private String regPayIntervalTime;
+
+    @ApiModelProperty("是否是首单")
+    private Boolean isFirstOrder;
 }

+ 12 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentMiniGameBackRpcImpl.java

@@ -1,7 +1,9 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
 import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
+import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.base.rpc.ITencentMiniGameBackRpc;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
@@ -28,6 +30,15 @@ public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
     @Override
     public ResultVO<Boolean> backOrder(TencentOrderDTO dto) {
         log.error("腾讯小游戏订单回传收到:{}", JsonUtil.toString(dto));
+        boolean isFirstOrder = gameTencentMiniGameOrderService.getOne(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+                .select(GameTencentMiniGameOrder::getOrderId)
+                .eq(GameTencentMiniGameOrder::getGameId, dto.getGameId())
+                .eq(GameTencentMiniGameOrder::getWechatAppId, dto.getWechatAppId())
+                .eq(GameTencentMiniGameOrder::getAdAccountId, dto.getAdAccountId())
+                .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                .eq(GameTencentMiniGameOrder::getWechatOpenid, dto.getWechatOpenid())
+                .last("limit 1")
+        ) == null;
         GameTencentMiniGameOrder orderLog = GameTencentMiniGameOrder.builder()
                 .adAccountId(dto.getAdAccountId())
                 .gameId(dto.getGameId())
@@ -47,6 +58,7 @@ public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
                 .clickId(dto.getClickId())
                 .roleId(dto.getRoleId())
                 .roleName(dto.getRoleName())
+                .isFirstOrder(isFirstOrder)
                 .build();
         gameTencentMiniGameOrderService.save(orderLog);
         return ResultVO.ok(gameTencentMiniGameOrderService.orderBack(orderLog, false));

+ 12 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentUserActionBackRpcImpl.java

@@ -1,8 +1,10 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
 import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
+import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.base.rpc.ITencentUserActionBackRpc;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser;
@@ -30,6 +32,15 @@ public class TencentUserActionBackRpcImpl implements ITencentUserActionBackRpc {
     @Override
     public ResultVO<Boolean> backOrder(TencentOrderDTO dto) {
         log.error("腾讯H5订单回传收到:{}", JsonUtil.toString(dto));
+        boolean isFirstOrder = gameTencentOrderService.getOne(new LambdaQueryWrapper<GameTencentOrder>()
+                .select(GameTencentOrder::getOrderId)
+                .eq(GameTencentOrder::getGameId, dto.getGameId())
+                .eq(GameTencentOrder::getAdAccountId, dto.getAdAccountId())
+                .eq(GameTencentOrder::getWechatAppId, dto.getWechatAppId())
+                .eq(GameTencentOrder::getWechatOpenid, dto.getWechatOpenid())
+                .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                .last("limit 1")
+        ) == null;
         //订单保存
         GameTencentOrder gameTencentOrder = GameTencentOrder.builder()
                 .adAccountId(dto.getAdAccountId())
@@ -50,6 +61,7 @@ public class TencentUserActionBackRpcImpl implements ITencentUserActionBackRpc {
                 .userActionSetId(dto.getUserActionSetId())
                 .roleId(dto.getRoleId())
                 .roleName(dto.getRoleName())
+                .isFirstOrder(isFirstOrder)
                 .build();
         gameTencentOrderService.save(gameTencentOrder);
         return ResultVO.ok(gameTencentOrderService.orderBack(gameTencentOrder, false));

+ 11 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java

@@ -1,7 +1,9 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TtUserActiveRpcDTO;
+import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.base.rpc.ITtMiniGameBackRpc;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
@@ -71,6 +73,15 @@ public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
                 .roleId(dto.getRoleId())
                 .roleName(dto.getRoleName())
                 .build();
+        boolean isFirstOrder = gameOceanengineOrderLogService.getOne(new LambdaQueryWrapper<GameOceanengineOrderLog>()
+                .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
+                .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
+                .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
+                .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                .eq(GameOceanengineOrderLog::getOpenId, orderLog.getOpenId())
+                .last("limit 1")
+        ) == null;
+        orderLog.setIsFirstOrder(isFirstOrder);
         gameOceanengineOrderLogService.save(orderLog);
         return ResultVO.ok(gameOceanengineOrderLogService.callback(orderLog, false));
     }

+ 5 - 9
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java

@@ -73,21 +73,16 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
             } else {
                 GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
                 doBack = BackPolicyUtil.backOrder(orderLog.getOrderNo(), gameBackPolicy, orderLog.getAmount(),
+                        orderLog.getIsFirstOrder(),
                         orderLog.getPayTime(), orderLog.getRegTime(),
-                        () -> getOne(new LambdaQueryWrapper<GameOceanengineOrderLog>()
-                                .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
-                                .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
-                                .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
-                                .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
-                                .eq(GameOceanengineOrderLog::getOpenId, orderLog.getOpenId())
-                                .last("limit 1")
-                        ) == null,
-                        backUnit -> Long.valueOf(list(new LambdaQueryWrapper<GameOceanengineOrderLog>()
+                        (backUnit, isFirstOrder) -> Long.valueOf(list(new LambdaQueryWrapper<GameOceanengineOrderLog>()
                                         .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
                                         .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
                                         .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
                                         .eq(GameOceanengineOrderLog::getBackPolicyId, gameBackPolicy.getId())
                                         .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                        .eq(GameOceanengineOrderLog::getIsFirstOrder, isFirstOrder)
+                                        .ne(GameOceanengineOrderLog::getOrderNo, orderLog.getOrderNo())
                                         .orderByDesc(GameOceanengineOrderLog::getCreateTime)
                                         .last("limit " + backUnit)
                                 ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count()
@@ -116,6 +111,7 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                 .eq(StringUtils.isNotBlank(dto.getOpenId()), GameOceanengineOrderLog::getOpenId, dto.getOpenId())
                 .eq(StringUtils.isNotBlank(dto.getOrderNo()), GameOceanengineOrderLog::getOrderNo, dto.getOrderNo())
                 .eq(null != dto.getBackStatus(), GameOceanengineOrderLog::getBackStatus, dto.getBackStatus())
+                .eq(dto.getIsFirstOrder() != null, GameOceanengineOrderLog::getIsFirstOrder, dto.getIsFirstOrder())
                 .eq(null != dto.getOrderStatus(), GameOceanengineOrderLog::getOrderStatus, dto.getOrderStatus())
                 .like(StringUtils.isNotBlank(dto.getRoleName()), GameOceanengineOrderLog::getRoleName, dto.getRoleName())
                 .apply(dto.getRegPayIntervalTimeMin() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, reg_time, pay_time), null) >= {0}", dto.getRegPayIntervalTimeMin())

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

@@ -78,21 +78,17 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
                 doBack = true;
             } else {
                 GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
+                // 此处是否是首单用 limit 2。因为在执行判断之前订单已入库,所以库里只有一笔才是首单
                 doBack = BackPolicyUtil.backOrder(orderLog.getOrderId(), gameBackPolicy, orderLog.getRechargeMoney(),
-                        orderLog.getPayTime(), orderLog.getRegisterTime(),
-                        () -> getOne(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
-                                .eq(GameTencentMiniGameOrder::getGameId, orderLog.getGameId())
-                                .eq(GameTencentMiniGameOrder::getWechatAppId, orderLog.getWechatAppId())
-                                .eq(GameTencentMiniGameOrder::getAdAccountId, orderLog.getAdAccountId())
-                                .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
-                                .eq(GameTencentMiniGameOrder::getWechatOpenid, orderLog.getWechatOpenid())
-                                .last("limit 1")
-                        ) == null, backUnit -> Long.valueOf(list(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+                        orderLog.getIsFirstOrder(), orderLog.getPayTime(), orderLog.getRegisterTime(),
+                        (backUnit, isFirstOrder) -> Long.valueOf(list(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
                                         .eq(GameTencentMiniGameOrder::getGameId, orderLog.getGameId())
                                         .eq(GameTencentMiniGameOrder::getWechatAppId, orderLog.getWechatAppId())
                                         .eq(GameTencentMiniGameOrder::getAdAccountId, orderLog.getAdAccountId())
                                         .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
                                         .eq(GameTencentMiniGameOrder::getBackPolicyId, gameBackPolicy.getId())
+                                        .eq(GameTencentMiniGameOrder::getIsFirstOrder, isFirstOrder)
+                                        .ne(GameTencentMiniGameOrder::getOrderId, orderLog.getOrderId())
                                         .orderByDesc(GameTencentMiniGameOrder::getCreateTime)
                                         .last("limit " + backUnit)
                                 ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count()
@@ -123,6 +119,7 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
                 .eq(StringUtils.isNotBlank(dto.getOrderId()), GameTencentMiniGameOrder::getOrderId, dto.getOrderId())
                 .eq(null != dto.getBackStatus(), GameTencentMiniGameOrder::getBackStatus, dto.getBackStatus())
                 .eq(null != dto.getOrderStatus(), GameTencentMiniGameOrder::getOrderStatus, dto.getOrderStatus())
+                .eq(dto.getIsFirstOrder() != null, GameTencentMiniGameOrder::getIsFirstOrder, dto.getIsFirstOrder())
                 .like(StringUtils.isNotBlank(dto.getRoleName()), GameTencentMiniGameOrder::getRoleName, dto.getRoleName())
                 .apply(dto.getRegPayIntervalTimeMin() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, register_time, pay_time), null) >= {0}", dto.getRegPayIntervalTimeMin())
                 .apply(dto.getRegPayIntervalTimeMax() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, register_time, pay_time), null) <= {0}", dto.getRegPayIntervalTimeMax())

+ 5 - 9
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentOrderServiceImpl.java

@@ -90,20 +90,15 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
             } else {
                 GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
                 doBack = BackPolicyUtil.backOrder(orderLog.getOrderId(), gameBackPolicy, orderLog.getRechargeMoney(),
-                        orderLog.getPayTime(), orderLog.getRegisterTime(),
-                        () -> getOne(new LambdaQueryWrapper<GameTencentOrder>()
-                                .eq(GameTencentOrder::getGameId, orderLog.getGameId())
-                                .eq(GameTencentOrder::getAdAccountId, orderLog.getAdAccountId())
-                                .eq(GameTencentOrder::getWechatAppId, orderLog.getWechatAppId())
-                                .eq(GameTencentOrder::getWechatOpenid, orderLog.getWechatOpenid())
-                                .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
-                                .last("limit 1")
-                        ) == null, backUnit -> Long.valueOf(list(new LambdaQueryWrapper<GameTencentOrder>()
+                        orderLog.getIsFirstOrder(), orderLog.getPayTime(), orderLog.getRegisterTime(),
+                        (backUnit, isFirstOrder) -> Long.valueOf(list(new LambdaQueryWrapper<GameTencentOrder>()
                                         .eq(GameTencentOrder::getGameId, orderLog.getGameId())
                                         .eq(GameTencentOrder::getWechatAppId, orderLog.getWechatAppId())
                                         .eq(GameTencentOrder::getAdAccountId, orderLog.getAdAccountId())
                                         .eq(GameTencentOrder::getBackPolicyId, gameBackPolicy.getId())
                                         .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                        .eq(GameTencentOrder::getIsFirstOrder, isFirstOrder)
+                                        .ne(GameTencentOrder::getOrderId, orderLog.getOrderId())
                                         .orderByDesc(GameTencentOrder::getCreateTime)
                                         .last("limit " + backUnit)
                                 ).stream().filter(log -> log.getIsBack().equals(BackStatusEnum.SUCCESS.getBackStatus())).count()
@@ -134,6 +129,7 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
                 .eq(StringUtils.isNotBlank(dto.getOrderId()), GameTencentOrder::getOrderId, dto.getOrderId())
                 .eq(null != dto.getIsBack(), GameTencentOrder::getIsBack, dto.getIsBack())
                 .eq(null != dto.getOrderStatus(), GameTencentOrder::getOrderStatus, dto.getOrderStatus())
+                .eq(dto.getIsFirstOrder() != null, GameTencentOrder::getIsFirstOrder, dto.getIsFirstOrder())
                 .like(StringUtils.isNotBlank(dto.getRoleName()), GameTencentOrder::getRoleName, dto.getRoleName())
                 .apply(dto.getRegPayIntervalTimeMin() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, register_time, pay_time), null) >= {0}", dto.getRegPayIntervalTimeMin())
                 .apply(dto.getRegPayIntervalTimeMax() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, register_time, pay_time), null) <= {0}", dto.getRegPayIntervalTimeMax())

+ 7 - 5
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/utils/BackPolicyUtil.java

@@ -31,7 +31,7 @@ public class BackPolicyUtil {
      * @param lastBackFunction 在指定最近订单数量内是否有订单回传过
      * @return <是否回传, 回传金额>
      */
-    public static boolean backOrder(String orderId, GameBackPolicy gameBackPolicy, long rechargeMoney, LocalDateTime payTime, LocalDateTime regTime, FirstOrder firstOrder, Function<Integer, Integer> lastBackFunction) {
+    public static boolean backOrder(String orderId, GameBackPolicy gameBackPolicy, long rechargeMoney, boolean isFirstOrder, LocalDateTime payTime, LocalDateTime regTime, LastBackFunction lastBackFunction) {
         if (null == gameBackPolicy) {
             log.error("订单 id[{}]通过回传策略[null]判断后,是否回传:{}.", orderId, true);
             return true;
@@ -69,6 +69,7 @@ public class BackPolicyUtil {
             rechargeType = gameBackPolicy.getRechargeOtherMoneyType();
             rechargeRate = gameBackPolicy.getRechargeOtherMoneyRate();
         }
+        boolean firstPolicy = false;
         Integer backType;
         String backRate;
         if (firstType.equals(rechargeType) && firstRate.equalsIgnoreCase(rechargeRate)) {
@@ -76,10 +77,11 @@ public class BackPolicyUtil {
             backType = firstType;
             backRate = firstRate;
         } else {
-            if (firstOrder.isFirstOrder()) {
+            if (isFirstOrder) {
                 log.error("订单{}是首单", orderId);
                 backType = firstType;
                 backRate = firstRate;
+                firstPolicy = true;
             } else {
                 log.error("订单{}不是首单", orderId);
                 backType = rechargeType;
@@ -99,7 +101,7 @@ public class BackPolicyUtil {
                 log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{}.", orderId, gameBackPolicy.getId(), true);
                 return true;
             }
-            int isBackCount = lastBackFunction.apply(backCount + ignoreCount - 1);
+            int isBackCount = lastBackFunction.getLastBackCount(backCount + ignoreCount - 1, firstPolicy);
             log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{}.", orderId, gameBackPolicy.getId(), (isBackCount < backCount));
             return isBackCount < backCount;
         } else if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_RANDOM_RATE)) {
@@ -148,7 +150,7 @@ public class BackPolicyUtil {
         return RECHARGE_LEVEL[level];
     }
 
-    public interface FirstOrder {
-        boolean isFirstOrder();
+    public interface LastBackFunction {
+        int getLastBackCount(int backUnit, boolean isFirstOrder);
     }
 }

+ 72 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteDayTotalVO.java

@@ -206,9 +206,81 @@ public class GamePromoteDayTotalVO {
     @ApiModelProperty(notes = "账面Arpu=账面充值金额/账面充值人数")
     private BigDecimal showRechargeArpu;
 
+    @ApiModelProperty(notes = "不展示--付费趋势:1天")
+    private String trendDay1;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:3天")
+    private String trendDay3;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:5天")
+    private String trendDay5;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:7天")
+    private String trendDay7;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:15天")
+    private String trendDay15;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:1个月")
+    private String trendMonth1;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:2个月")
+    private String trendMonth2;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:3个月")
+    private String trendMonth3;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:6个月")
+    private String trendMonth6;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:总")
+    private String trendTotal;
+
+    @ApiModelProperty(notes = "付费趋势:1天")
+    private RechargeTrendVO rechargeTrendDay1;
+
+    @ApiModelProperty(notes = "付费趋势:3天")
+    private RechargeTrendVO rechargeTrendDay3;
+
+    @ApiModelProperty(notes = "付费趋势:5天")
+    private RechargeTrendVO rechargeTrendDay5;
+
+    @ApiModelProperty(notes = "付费趋势:7天")
+    private RechargeTrendVO rechargeTrendDay7;
+
+    @ApiModelProperty(notes = "付费趋势:15天")
+    private RechargeTrendVO rechargeTrendDay15;
+
+    @ApiModelProperty(notes = "付费趋势:1个月")
+    private RechargeTrendVO rechargeTrendMonth1;
+
+    @ApiModelProperty(notes = "付费趋势:2个月")
+    private RechargeTrendVO rechargeTrendMonth2;
+
+    @ApiModelProperty(notes = "付费趋势:3个月")
+    private RechargeTrendVO rechargeTrendMonth3;
+
+    @ApiModelProperty(notes = "付费趋势:6个月")
+    private RechargeTrendVO rechargeTrendMonth6;
+
+    @ApiModelProperty(notes = "付费趋势:总")
+    private RechargeTrendVO rechargeTrendTotal;
+
     @ApiModelProperty(notes = "单日付费100+人数")
     private String hundredUserNum;
 
     @ApiModelProperty(notes = "单日付费100+成本")
     private String hundredUserNumCost;
+
+    @ApiModelProperty(notes = "首日充值次数成本=实际消耗/首日新用户充值次数")
+    private BigDecimal firstRechargeCountCost;
+
+    @ApiModelProperty(notes = "老用户充值次数成本 = 消耗/老用户充值次数")
+    private BigDecimal oldUserRechargeCountCost;
+
+    @ApiModelProperty(notes = "账面充值次数成本=消耗/账面充值次数")
+    private BigDecimal showRechargeCountCost;
+
+    @ApiModelProperty(notes = "新用户累计充值次数成本 = 消耗/新用户累计充值次数")
+    private BigDecimal newUserRechargeCountCost;
 }

+ 12 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteDayVO.java

@@ -149,6 +149,9 @@ public class GamePromoteDayVO {
     @ApiModelProperty(notes = "老用户充值金额")
     private BigDecimal oldUserRechargeMoney;
 
+    @ApiModelProperty(notes = "老用户充值次数成本 = 消耗/老用户充值次数")
+    private BigDecimal oldUserRechargeCountCost;
+
     @ApiModelProperty(notes = "账面充值次数")
     private Long showRechargeCount;
 
@@ -158,6 +161,9 @@ public class GamePromoteDayVO {
     @ApiModelProperty(notes = "账面充值金额")
     private BigDecimal showRechargeMoney;
 
+    @ApiModelProperty(notes = "账面充值次数成本=消耗/账面充值次数")
+    private BigDecimal showRechargeCountCost;
+
     @ApiModelProperty(notes = "新用户累计充值次数")
     private Long newUserRechargeCount;
 
@@ -167,6 +173,9 @@ public class GamePromoteDayVO {
     @ApiModelProperty(notes = "新用户累计充值金额")
     private BigDecimal newUserRechargeMoney;
 
+    @ApiModelProperty(notes = "新用户累计充值次数成本 = 消耗/新用户累计充值次数")
+    private BigDecimal newUserRechargeCountCost;
+
     @ApiModelProperty(notes = "首日ROI=首日新用户充值金额/实际消耗")
     private BigDecimal firstRecoveryRate;
 
@@ -224,6 +233,9 @@ public class GamePromoteDayVO {
     @ApiModelProperty(notes = "首日充值成本=实际消耗/首日新用户充值人数")
     private BigDecimal firstRechargeCost;
 
+    @ApiModelProperty(notes = "首日充值次数成本=实际消耗/首日新用户充值次数")
+    private BigDecimal firstRechargeCountCost;
+
     @ApiModelProperty(notes = "买量充值成本=实际消耗/新用户累计充值人数")
     private BigDecimal buyUserRechargeCost;
 

+ 15 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteTotalSumVO.java

@@ -241,4 +241,19 @@ public class GamePromoteTotalSumVO {
 
     @ApiModelProperty(notes = "单日付费100+成本")
     private String hundredUserNumCost;
+
+    @ApiModelProperty(notes = "新用户充值次数成本 = 消耗/新用户充值次数")
+    private BigDecimal userRechargeCountCost;
+
+    @ApiModelProperty(notes = "首日充值次数成本=实际消耗/首日新用户充值次数")
+    private BigDecimal firstRechargeCountCost;
+
+    @ApiModelProperty(notes = "老用户充值次数成本 = 消耗/老用户充值次数")
+    private BigDecimal oldUserRechargeCountCost;
+
+    @ApiModelProperty(notes = "账面充值次数成本=消耗/账面充值次数")
+    private BigDecimal showRechargeCountCost;
+
+    @ApiModelProperty(notes = "新用户累计充值次数成本 = 消耗/新用户累计充值次数")
+    private BigDecimal newUserRechargeCountCost;
 }

+ 15 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteTotalVO.java

@@ -273,4 +273,19 @@ public class GamePromoteTotalVO {
 
     @ApiModelProperty(notes = "单日付费100+成本")
     private String hundredUserNumCost;
+
+    @ApiModelProperty(notes = "新用户充值次数成本 = 消耗/新用户充值次数")
+    private BigDecimal userRechargeCountCost;
+
+    @ApiModelProperty(notes = "首日充值次数成本=实际消耗/首日新用户充值次数")
+    private BigDecimal firstRechargeCountCost;
+
+    @ApiModelProperty(notes = "老用户充值次数成本 = 消耗/老用户充值次数")
+    private BigDecimal oldUserRechargeCountCost;
+
+    @ApiModelProperty(notes = "账面充值次数成本=消耗/账面充值次数")
+    private BigDecimal showRechargeCountCost;
+
+    @ApiModelProperty(notes = "新用户累计充值次数成本 = 消耗/新用户累计充值次数")
+    private BigDecimal newUserRechargeCountCost;
 }

+ 6 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PlayerRechargeRankingVO.java

@@ -115,4 +115,10 @@ public class PlayerRechargeRankingVO {
      */
     @ApiModelProperty("累计充值次数")
     private Long totalAmountCount;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("游戏服")
+    private String serverName;
 }

+ 29 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java

@@ -448,6 +448,13 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                         BigDecimal.ZERO:BigDecimal.valueOf(item.getRepeatRechargeUser()).divide(BigDecimal.valueOf(item.getUserRechargeUser()),4, RoundingMode.DOWN));
                 item.setUserRepeatRechargeRate(item.getNewUserRechargeUser() == 0 ?
                         BigDecimal.ZERO:BigDecimal.valueOf(item.getRepeatRechargeUser()).divide(BigDecimal.valueOf(item.getNewUserRechargeUser()),4, RoundingMode.DOWN));
+
+                item.setUserRechargeCountCost(item.getUserRechargeCount() == 0 ?
+                        BigDecimal.ZERO : item.getCost().divide(BigDecimal.valueOf(item.getUserRechargeCount()), 4, RoundingMode.DOWN));
+                item.setOldUserRechargeCountCost(item.getOldUserRechargeCount() == 0 ?
+                        BigDecimal.ZERO : item.getCost().divide(BigDecimal.valueOf(item.getOldUserRechargeCount()), 4, RoundingMode.DOWN));
+                item.setShowRechargeCountCost(item.getShowRechargeCount() == 0 ?
+                        BigDecimal.ZERO : item.getCost().divide(BigDecimal.valueOf(item.getShowRechargeCount()), 4, RoundingMode.DOWN));
             }
             return item;
         }).collect(Collectors.toList());
@@ -588,6 +595,9 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         sql.setEntity(entity).setCondition(cri);
         dao.execute(sql);
         GamePromoteTotalSumVO gamePromoteTotalSumVO = sql.getObject(GamePromoteTotalSumVO.class);
+        if (null == gamePromoteTotalSumVO.getCost()){
+            return gamePromoteTotalSumVO;
+        }
 
         //账面总计
         SimpleCriteria showCri = getSimpleCriteria(dto);
@@ -737,6 +747,13 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 BigDecimal.ZERO : BigDecimal.valueOf(gamePromoteTotalSumVO.getRepeatRechargeUser()).divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getUserRechargeUser()), 4, RoundingMode.DOWN));
         gamePromoteTotalSumVO.setUserRepeatRechargeRate(gamePromoteTotalSumVO.getNewUserRechargeUser() == 0 ?
                 BigDecimal.ZERO : BigDecimal.valueOf(gamePromoteTotalSumVO.getRepeatRechargeUser()).divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getNewUserRechargeUser()), 4, RoundingMode.DOWN));
+
+        gamePromoteTotalSumVO.setUserRechargeCountCost(gamePromoteTotalSumVO.getUserRechargeCount() == 0 ?
+                BigDecimal.ZERO : gamePromoteTotalSumVO.getCost().divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getUserRechargeCount()), 4, RoundingMode.DOWN));
+        gamePromoteTotalSumVO.setOldUserRechargeCountCost(gamePromoteTotalSumVO.getOldUserRechargeCount() == 0 ?
+                BigDecimal.ZERO : gamePromoteTotalSumVO.getCost().divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getOldUserRechargeCount()), 4, RoundingMode.DOWN));
+        gamePromoteTotalSumVO.setShowRechargeCountCost(gamePromoteTotalSumVO.getShowRechargeCount() == 0 ?
+                BigDecimal.ZERO : gamePromoteTotalSumVO.getCost().divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getShowRechargeCount()), 4, RoundingMode.DOWN));
         return gamePromoteTotalSumVO;
     }
 
@@ -936,6 +953,10 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	amount_m3 AS trend_month3,
                 	amount_m6 AS trend_month6,
                 	amount_sum AS trend_total,
+                	round(if(first_new_user_amount_count > 0, cost / first_new_user_amount_count, 0), 4) as first_recharge_count_cost,
+                	round(if(old_amount_count > 0, cost / old_amount_count, 0), 4) as old_user_recharge_count_cost,
+                	round(if(amount_count > 0, cost / amount_count, 0), 4) as show_recharge_count_cost,
+                	round(if(new_user_total_amount_count > 0, cost / new_user_total_amount_count, 0), 4) as new_user_recharge_count_cost,
                 	hundred_user_num,
                 	hundred_user_num_cost
                 from
@@ -1014,6 +1035,10 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	round(if(sum(first_new_user_amount_num) > 0, sum(first_new_user_amount) / sum(first_new_user_amount_num), 0), 4) as first_recharge_arpu,
                 	round(if(sum(new_user_total_amount_num) > 0, sum(new_user_total_amount) / sum(new_user_total_amount_num), 0), 4) as today_recharge_arpu,
                 	round(if(sum(amount_num) > 0, sum(amount) / sum(amount_num), 0), 4) as show_recharge_arpu,
+                	round(if(sum(first_new_user_amount_count) > 0, sum(cost) / sum(first_new_user_amount_count), 0), 4) as first_recharge_count_cost,
+                	round(if(sum(old_amount_count) > 0, sum(cost) / sum(old_amount_count), 0), 4) as old_user_recharge_count_cost,
+                	round(if(sum(amount_count) > 0, sum(cost) / sum(amount_count), 0), 4) as show_recharge_count_cost,
+                	round(if(sum(new_user_total_amount_count) > 0, sum(cost) / sum(new_user_total_amount_count), 0), 4) as new_user_recharge_count_cost,
                 	sum(hundred_user_num) as hundred_user_num,
                 	round(if(sum(hundred_user_num) > 0, sum(cost) / sum(hundred_user_num), 0), 4) as hundred_user_num_cost
                 from
@@ -1103,6 +1128,8 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount) / sum(a.register_num), 0), 4) as new_reg_arpu,
                 	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_arpu,
                 	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_arpu,
+                	round(if(sum(first_new_user_amount_count) > 0, sum(cost) / sum(first_new_user_amount_count), 0), 4) as first_recharge_count_cost,
+                	round(if(sum(new_user_total_amount_count) > 0, sum(cost) / sum(new_user_total_amount_count), 0), 4) as new_user_recharge_count_cost,
                 	sum(a.hundred_user_num) as hundred_user_num,
                 	round(if(sum(a.hundred_user_num) > 0, sum(a.cost) / sum(a.hundred_user_num), 0), 4) as hundred_user_num_cost
                 from
@@ -1189,6 +1216,8 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount) / sum(a.register_num), 0), 4) as new_reg_arpu,
                 	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_arpu,
                 	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_arpu,
+                	round(if(sum(first_new_user_amount_count) > 0, sum(cost) / sum(first_new_user_amount_count), 0), 4) as first_recharge_count_cost,
+                	round(if(sum(new_user_total_amount_count) > 0, sum(cost) / sum(new_user_total_amount_count), 0), 4) as new_user_recharge_count_cost,
                 	sum(a.hundred_user_num) as hundred_user_num,
                 	round(if(sum(a.hundred_user_num) > 0, sum(a.cost) / sum(a.hundred_user_num), 0), 4) as hundred_user_num_cost
                 from

+ 3 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RankingServiceImpl.java

@@ -134,7 +134,9 @@ public class RankingServiceImpl implements IRankingService {
                 max(total_amount_count) as total_amount_count,
                 max(last_amount_game_id) as last_amount_game_id,
                 max(last_amount_game_name) as last_amount_game_name,
-                max(last_amount_time) as last_amount_time
+                max(last_amount_time) as last_amount_time,
+                max(role_name) as role_name,
+                max(server_name) as server_name
                 from ads_player_recharge_ranking
                 """;
     }

+ 5 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/AccountTypeEnum.java

@@ -4,8 +4,13 @@ import lombok.Getter;
 
 @Getter
 public enum AccountTypeEnum {
+    // 不投放
+    UN_PUT(0),
+    // 腾讯 H5
     TENCENT_H5(1),
+    // 头条小游戏
     BYTE(2),
+    // 腾讯小游戏
     TENCENT_MINI_GAME(3);
 
     private final Integer value;

+ 7 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java

@@ -40,6 +40,13 @@ public class AgentController {
         if (accountType == null) {
             throw new BaseException("错误的账号类型:" + dto.getAccountType());
         }
+        if (accountType == AccountTypeEnum.UN_PUT) {
+            dto.setAccountId(null);
+        } else {
+            if (dto.getAccountId() == null) {
+                throw new BaseException("广告账号不能为空!");
+            }
+        }
         if (accountType == AccountTypeEnum.TENCENT_H5) {
             if (dto.getUserActionSetId() == null) {
                 throw new BaseException("腾讯广告账号必须选回传的数据源");

+ 1 - 2
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/AgentAddParam.java

@@ -24,7 +24,7 @@ public class AgentAddParam {
     /**
      * 推广账号类型(1:腾讯、2:头条)
      */
-    @ApiModelProperty(notes = "推广账号类型(1:腾讯H5、2:头条、3:腾讯小游戏)")
+    @ApiModelProperty(notes = "推广账号类型(0:不投、1:腾讯H5、2:头条、3:腾讯小游戏)")
     @NotNull(message = "渠道类型不能为空")
     private Integer accountType;
 
@@ -32,7 +32,6 @@ public class AgentAddParam {
      * 账号类型
      */
     @ApiModelProperty(notes = "账号Id")
-    @NotNull(message = "账号不能为空")
     private Long accountId;
 
     /**

+ 22 - 16
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java

@@ -98,27 +98,31 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean add(AgentAddParam param) {
-        if (count(new LambdaQueryWrapper<Agent>()
-                .eq(Agent::getAccountType, param.getAccountType())
-                .eq(Agent::getAccountId, param.getAccountId())
-        ) > 0) {
-            throw new BaseException("一个账号只能建一个渠道,投一个游戏!!!");
+    public boolean add(AgentAddParam dto) {
+        AccountTypeEnum accountType = AccountTypeEnum.getByValue(dto.getAccountType());
+        if (accountType != AccountTypeEnum.UN_PUT) {
+            if (count(new LambdaQueryWrapper<Agent>()
+                    .eq(Agent::getAccountType, dto.getAccountType())
+                    .eq(Agent::getAccountId, dto.getAccountId())
+            ) > 0) {
+                throw new BaseException("一个账号只能建一个渠道,投一个游戏!!!");
+            }
         }
         return save(Agent.builder()
-                .agentName(param.getAgentName())
+                .agentName(dto.getAgentName())
                 .agentKey(UUID.randomUUID().toString().replaceAll("-", ""))
-                .accountType(param.getAccountType())
-                .accountId(param.getAccountId())
-                .gameId(param.getGameId())
-                .userActionSetId(param.getUserActionSetId())
-                .reportToken(param.getReportToken())
-                .reportUrl(param.getReportUrl())
-                .backPolicyId(param.getBackPolicyId())
-                .putStatus(param.getPutStatus())
+                .accountType(dto.getAccountType())
+                .accountId(dto.getAccountId())
+                .gameId(dto.getGameId())
+                .userActionSetId(dto.getUserActionSetId())
+                .reportToken(dto.getReportToken())
+                .reportUrl(dto.getReportUrl())
+                .backPolicyId(dto.getBackPolicyId())
+                .putStatus(dto.getPutStatus())
                 .createTime(LocalDateTime.now())
                 .createBy(SecurityUtil.getUserId())
-                .build());
+                .build()
+        );
     }
 
     @Override
@@ -200,6 +204,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
             vo.setAgentKey("?agentKey=" + agent.getAgentKey());
         } else if (accountType == AccountTypeEnum.TENCENT_H5 || accountType == AccountTypeEnum.TENCENT_MINI_GAME) {
             vo.setAgentKey("?state=" + agent.getAgentKey());
+        } else {
+            vo.setAgentKey("?agentKey=" + agent.getAgentKey());
         }
         return vo;
     }