Explorar o código

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

lth hai 1 ano
pai
achega
1f05643aeb
Modificáronse 38 ficheiros con 360 adicións e 104 borrados
  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. 64 35
      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. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  26. 7 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java
  27. 1 2
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/AgentAddParam.java
  28. 6 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameUserListParam.java
  29. 6 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameUserRoleListParam.java
  30. 6 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/OrderParam.java
  31. 6 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/UserListParam.java
  32. 28 23
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java
  33. 2 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameUserRoleServiceImpl.java
  34. 2 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameUserServiceImpl.java
  35. 2 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/OrderServiceImpl.java
  36. 2 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserServiceImpl.java
  37. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  38. 16 9
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserVisitLogServiceImpl.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;
 }

+ 64 - 35
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);
@@ -731,12 +741,19 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 BigDecimal.ZERO : gamePromoteTotalSumVO.getUserRechargeMoney().divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getUserRechargeCount()), 4, RoundingMode.DOWN));
 
         gamePromoteTotalSumVO.setUserRechargeCost(gamePromoteTotalSumVO.getUserRechargeUser() == 0 ?
-                BigDecimal.ZERO : gamePromoteTotalSumVO.getCost().divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getUserRechargeUser()), 2, RoundingMode.DOWN));
+                BigDecimal.ZERO : gamePromoteTotalSumVO.getCost().divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getUserRechargeUser()), 4, RoundingMode.DOWN));
 
         gamePromoteTotalSumVO.setRepeatRechargeRate(gamePromoteTotalSumVO.getUserRechargeUser() == 0 ?
                 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
@@ -956,27 +977,27 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	sum(click_count) as click_count,
                 	sum(change_count) as convert_count,
                 	round(if(sum(click_count) > 0, sum(change_count) / sum(click_count), 0), 4) as convert_rate,
-                	round(if(sum(change_count) > 0, sum(cost) / sum(change_count), 0), 2) as avg_convert_cost,
+                	round(if(sum(change_count) > 0, sum(cost) / sum(change_count), 0), 4) as avg_convert_cost,
                 	sum(depth_change_count) as deep_convert_count,
                 	round(if(sum(change_count) > 0, sum(depth_change_count) / sum(change_count), 0), 4) as deep_convert_rate,
-                	round(if(sum(depth_change_count) > 0, sum(cost) / sum(depth_change_count), 0), 2) as deep_convert_cost,
-                	round(if(sum(view_count) > 0, sum(cost) / sum(view_count) * 1000, 0), 2) as thousand_view_cost,
+                	round(if(sum(depth_change_count) > 0, sum(cost) / sum(depth_change_count), 0), 4) as deep_convert_cost,
+                	round(if(sum(view_count) > 0, sum(cost) / sum(view_count) * 1000, 0), 4) as thousand_view_cost,
                 	round(if(sum(view_count) > 0, sum(click_count) / sum(view_count), 0), 4) as click_rate,
                 	round(if(sum(click_count) > 0, sum(cost) / sum(click_count), 0), 2) as avg_click_cost,
                 	sum(download_start) as app_download_count,
-                	round(if(sum(download_start) > 0, sum(cost) / sum(download_start), 0), 2) as app_download_cost,
+                	round(if(sum(download_start) > 0, sum(cost) / sum(download_start), 0), 4) as app_download_cost,
                 	round(if(sum(click_count) > 0, sum(download_start) / sum(click_count), 0), 4) as app_download_rate,
                 	sum(download_finish) as download_finish,
-                	round(if(sum(download_finish) > 0, sum(cost) / sum(download_finish), 0), 2) as download_finish_cost,
+                	round(if(sum(download_finish) > 0, sum(cost) / sum(download_finish), 0), 4) as download_finish_cost,
                 	round(if(sum(download_start) > 0, sum(download_finish) / sum(download_start), 0), 4) as download_finish_rate,
                 	sum(install_finish) as app_install_count,
-                	round(if(sum(install_finish) > 0, sum(cost) / sum(install_finish), 0), 2) as app_install_cost,
+                	round(if(sum(install_finish) > 0, sum(cost) / sum(install_finish), 0), 4) as app_install_cost,
                 	round(if(sum(download_finish) > 0, sum(install_finish) / sum(download_finish), 0), 4) as app_install_rate,
                 	sum(active) as app_active_count,
-                	round(if(sum(active) > 0, sum(cost) / sum(active), 0), 2) as app_active_cost,
+                	round(if(sum(active) > 0, sum(cost) / sum(active), 0), 4) as app_active_cost,
                 	round(if(sum(click_count) > 0, sum(active) / sum(click_count), 0), 4) as app_active_rate,
                 	sum(register_num) as reg_user_count,
-                	round(if(sum(register_num) > 0, sum(cost) / sum(register_num), 0), 2) as reg_cost,
+                	round(if(sum(register_num) > 0, sum(cost) / sum(register_num), 0), 4) as reg_cost,
                 	sum(first_new_user_amount_count) as first_user_recharge_count,
                 	sum(first_new_user_amount_num) as first_user_recharge_user,
                 	sum(first_new_user_amount) as first_user_recharge_money,
@@ -1007,15 +1028,19 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	round(if(sum(first_new_user_amount_count) > 0, sum(first_new_user_amount) / sum(first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
                 	round(if(sum(buy_new_user_total_amount_count) > 0, sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_count), 0), 4) as avg_buy_user_recharge,
                 	round(if(sum(amount_count) > 0, sum(amount) / sum(amount_count), 0), 4) as avg_show_user_recharge,
-                	round(if(sum(first_new_user_amount_num) > 0, sum(cost) / sum(first_new_user_amount_num), 0), 2) as first_recharge_cost,
-                	round(if(sum(buy_new_user_total_amount_num) > 0, sum(cost) / sum(buy_new_user_total_amount_num), 0), 2) as buy_user_recharge_cost,
+                	round(if(sum(first_new_user_amount_num) > 0, sum(cost) / sum(first_new_user_amount_num), 0), 4) as first_recharge_cost,
+                	round(if(sum(buy_new_user_total_amount_num) > 0, sum(cost) / sum(buy_new_user_total_amount_num), 0), 4) as buy_user_recharge_cost,
                 	round(if(sum(new_user_total_amount_num) > 0, sum(reg_order_user_again) / sum(new_user_total_amount_num), 0), 4) as repeat_recharge_rate,
                 	round(if(sum(register_num) > 0, sum(new_user_total_amount) / sum(register_num), 0), 4) as new_reg_arpu,
                 	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), 2) as hundred_user_num_cost
+                	round(if(sum(hundred_user_num) > 0, sum(cost) / sum(hundred_user_num), 0), 4) as hundred_user_num_cost
                 from
                 	ads_account_agent_day
                 """;
@@ -1049,27 +1074,27 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	sum(a.click_count) as click_count,
                 	sum(a.change_count) as convert_count,
                 	round(if(sum(a.click_count) > 0, sum(a.change_count) / sum(a.click_count), 0), 4) as convert_rate,
-                	round(if(sum(a.change_count) > 0, sum(a.cost) / sum(a.change_count), 0), 2) as avg_convert_cost,
+                	round(if(sum(a.change_count) > 0, sum(a.cost) / sum(a.change_count), 0), 4) as avg_convert_cost,
                 	sum(a.depth_change_count) as deep_convert_count,
                 	round(if(sum(a.change_count) > 0, sum(a.depth_change_count) / sum(a.change_count), 0), 4) as deep_convert_rate,
-                	round(if(sum(a.depth_change_count) > 0, sum(a.cost) / sum(a.depth_change_count), 0), 2) as deep_convert_cost,
-                	round(if(sum(a.view_count) > 0, sum(a.cost) / sum(a.view_count) * 1000, 0), 2) as thousand_view_cost,
+                	round(if(sum(a.depth_change_count) > 0, sum(a.cost) / sum(a.depth_change_count), 0), 4) as deep_convert_cost,
+                	round(if(sum(a.view_count) > 0, sum(a.cost) / sum(a.view_count) * 1000, 0), 4) as thousand_view_cost,
                 	round(if(sum(a.view_count) > 0, sum(a.click_count) / sum(a.view_count), 0), 4) as click_rate,
                 	round(if(sum(a.click_count) > 0, sum(a.cost) / sum(a.click_count), 0), 2) as avg_click_cost,
                 	sum(a.download_start) as app_download_count,
-                	round(if(sum(a.download_start) > 0, sum(a.cost) / sum(a.download_start), 0), 2) as app_download_cost,
+                	round(if(sum(a.download_start) > 0, sum(a.cost) / sum(a.download_start), 0), 4) as app_download_cost,
                 	round(if(sum(a.click_count) > 0, sum(a.download_start) / sum(a.click_count), 0), 4) as app_download_rate,
                 	sum(a.download_finish) as download_finish,
-                	round(if(sum(a.download_finish) > 0, sum(a.cost) / sum(a.download_finish), 0), 2) as download_finish_cost,
+                	round(if(sum(a.download_finish) > 0, sum(a.cost) / sum(a.download_finish), 0), 4) as download_finish_cost,
                 	round(if(sum(a.download_start) > 0, sum(a.download_finish) / sum(a.download_start), 0), 4) as download_finish_rate,
                 	sum(a.install_finish) as app_install_count,
-                	round(if(sum(a.install_finish) > 0, sum(a.cost) / sum(a.install_finish), 0), 2) as app_install_cost,
+                	round(if(sum(a.install_finish) > 0, sum(a.cost) / sum(a.install_finish), 0), 4) as app_install_cost,
                 	round(if(sum(a.download_finish) > 0, sum(a.install_finish) / sum(a.download_finish), 0), 4) as app_install_rate,
                 	sum(a.active) as app_active_count,
-                	round(if(sum(a.active) > 0, sum(a.cost) / sum(a.active), 0), 2) as app_active_cost,
+                	round(if(sum(a.active) > 0, sum(a.cost) / sum(a.active), 0), 4) as app_active_cost,
                 	round(if(sum(a.click_count) > 0, sum(a.active) / sum(a.click_count), 0), 4) as app_active_rate,
                 	sum(a.register_num) as reg_user_count,
-                	round(if(sum(a.register_num) > 0, sum(a.cost) / sum(a.register_num), 0), 2) as reg_cost,
+                	round(if(sum(a.register_num) > 0, sum(a.cost) / sum(a.register_num), 0), 4) as reg_cost,
                 	sum(a.first_new_user_amount_count) as first_user_recharge_count,
                 	sum(a.first_new_user_amount_num) as first_user_recharge_user,
                 	sum(a.first_new_user_amount) as first_user_recharge_money,
@@ -1097,14 +1122,16 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount_num) / sum(a.register_num), 0), 4) as today_recharge_rate,
                 	round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
                 	round(if(sum(a.new_user_total_amount_count) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_count), 0), 4) as avg_today_recharge,
-                	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.cost) / sum(a.first_new_user_amount_num), 0), 2) as first_recharge_cost,
-                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.cost) / sum(a.new_user_total_amount_num), 0), 2) as today_recharge_cost,
+                	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.cost) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_cost,
+                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.cost) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_cost,
                 	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.reg_order_user_again) / sum(a.new_user_total_amount_num), 0), 4) as today_repeat_recharge_rate,
                 	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), 2) as hundred_user_num_cost
+                	round(if(sum(a.hundred_user_num) > 0, sum(a.cost) / sum(a.hundred_user_num), 0), 4) as hundred_user_num_cost
                 from
                 	ads_account_agent_day a
                 """;
@@ -1135,27 +1162,27 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	sum(a.click_count) as click_count,
                 	sum(a.change_count) as convert_count,
                 	round(if(sum(a.click_count) > 0, sum(a.change_count) / sum(a.click_count), 0), 4) as convert_rate,
-                	round(if(sum(a.change_count) > 0, sum(a.cost) / sum(a.change_count), 0), 2) as avg_convert_cost,
+                	round(if(sum(a.change_count) > 0, sum(a.cost) / sum(a.change_count), 0), 4) as avg_convert_cost,
                 	sum(a.depth_change_count) as deep_convert_count,
                 	round(if(sum(a.change_count) > 0, sum(a.depth_change_count) / sum(a.change_count), 0), 4) as deep_convert_rate,
-                	round(if(sum(a.depth_change_count) > 0, sum(a.cost) / sum(a.depth_change_count), 0), 2) as deep_convert_cost,
-                	round(if(sum(a.view_count) > 0, sum(a.cost) / sum(a.view_count) * 1000, 0), 2) as thousand_view_cost,
+                	round(if(sum(a.depth_change_count) > 0, sum(a.cost) / sum(a.depth_change_count), 0), 4) as deep_convert_cost,
+                	round(if(sum(a.view_count) > 0, sum(a.cost) / sum(a.view_count) * 1000, 0), 4) as thousand_view_cost,
                 	round(if(sum(a.view_count) > 0, sum(a.click_count) / sum(a.view_count), 0), 4) as click_rate,
-                	round(if(sum(a.click_count) > 0, sum(a.cost) / sum(a.click_count), 0), 2) as avg_click_cost,
+                	round(if(sum(a.click_count) > 0, sum(a.cost) / sum(a.click_count), 0), 4) as avg_click_cost,
                 	sum(a.download_start) as app_download_count,
-                	round(if(sum(a.download_start) > 0, sum(a.cost) / sum(a.download_start), 0), 2) as app_download_cost,
+                	round(if(sum(a.download_start) > 0, sum(a.cost) / sum(a.download_start), 0), 4) as app_download_cost,
                 	round(if(sum(a.click_count) > 0, sum(a.download_start) / sum(a.click_count), 0), 4) as app_download_rate,
                 	sum(a.download_finish) as download_finish,
-                	round(if(sum(a.download_finish) > 0, sum(a.cost) / sum(a.download_finish), 0), 2) as download_finish_cost,
+                	round(if(sum(a.download_finish) > 0, sum(a.cost) / sum(a.download_finish), 0), 4) as download_finish_cost,
                 	round(if(sum(a.download_start) > 0, sum(a.download_finish) / sum(a.download_start), 0), 4) as download_finish_rate,
                 	sum(a.install_finish) as app_install_count,
-                	round(if(sum(a.install_finish) > 0, sum(a.cost) / sum(a.install_finish), 0), 2) as app_install_cost,
+                	round(if(sum(a.install_finish) > 0, sum(a.cost) / sum(a.install_finish), 0), 4) as app_install_cost,
                 	round(if(sum(a.download_finish) > 0, sum(a.install_finish) / sum(a.download_finish), 0), 4) as app_install_rate,
                 	sum(a.active) as app_active_count,
-                	round(if(sum(a.active) > 0, sum(a.cost) / sum(a.active), 0), 2) as app_active_cost,
+                	round(if(sum(a.active) > 0, sum(a.cost) / sum(a.active), 0), 4) as app_active_cost,
                 	round(if(sum(a.click_count) > 0, sum(a.active) / sum(a.click_count), 0), 4) as app_active_rate,
                 	sum(a.register_num) as reg_user_count,
-                	round(if(sum(a.register_num) > 0, sum(a.cost) / sum(a.register_num), 0), 2) as reg_cost,
+                	round(if(sum(a.register_num) > 0, sum(a.cost) / sum(a.register_num), 0), 4) as reg_cost,
                 	sum(a.first_new_user_amount_count) as first_user_recharge_count,
                 	sum(a.first_new_user_amount_num) as first_user_recharge_user,
                 	sum(a.first_new_user_amount) as first_user_recharge_money,
@@ -1183,14 +1210,16 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount_num) / sum(a.register_num), 0), 4) as today_recharge_rate,
                 	round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
                 	round(if(sum(a.new_user_total_amount_count) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_count), 0), 4) as avg_today_recharge,
-                	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.cost) / sum(a.first_new_user_amount_num), 0), 2) as first_recharge_cost,
-                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.cost) / sum(a.new_user_total_amount_num), 0), 2) as today_recharge_cost,
+                	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.cost) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_cost,
+                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.cost) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_cost,
                 	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.reg_order_user_again) / sum(a.new_user_total_amount_num), 0), 4) as today_repeat_recharge_rate,
                 	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), 2) as hundred_user_num_cost
+                	round(if(sum(a.hundred_user_num) > 0, sum(a.cost) / sum(a.hundred_user_num), 0), 4) as hundred_user_num_cost
                 from
                 	ads_account_agent_day a
                 """;

+ 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;

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -21,7 +21,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <dubbo升级3.0, 一大波修改上线> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <dubbo升级3.0, 注册充值时间差筛选> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 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;
 
     /**

+ 6 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameUserListParam.java

@@ -108,4 +108,10 @@ public class GameUserListParam extends BaseListDTO<GameUser> {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "结束时间")
     private LocalDate endDate;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMin;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMax;
 }

+ 6 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameUserRoleListParam.java

@@ -162,4 +162,10 @@ public class GameUserRoleListParam extends BaseListDTO<GameUserRole> {
      */
     @ApiModelProperty(value = "注册结束时间")
     private LocalDate regTimeEndDate;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMin;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMax;
 }

+ 6 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/OrderParam.java

@@ -109,4 +109,10 @@ public class OrderParam extends BaseListDTO<Order> {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(notes = "支付时间-结束")
     private LocalDate payTimeEnd;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMin;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMax;
 }

+ 6 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/UserListParam.java

@@ -168,4 +168,10 @@ public class UserListParam extends BaseListDTO<User> {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "结束时间")
     private LocalDate endDate;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMin;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMax;
 }

+ 28 - 23
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,21 +204,24 @@ 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;
     }
 
     @Override
     public Tuple2<List<Long>, List<AgentDTO>> getUserAgent(String account, String pitcherId, Long agentId) {
+        //组成员列表
+        List<Long> memberUserIdList = sysUserGroupRpc.memberUserId(SecurityUtil.getCompanyId(), SecurityUtil.getUserId()).getData();
         //自然量查询
         if (Objects.equals(agentId, Agent.DEFAULT_AGENT)) {
-            //管理员
-            if (SecurityUtil.isManager()) {
+            //判断管理员或者组长
+            if (SecurityUtil.isManager() || CollectionUtils.isNotEmpty(memberUserIdList)) {
                 return Tuples.of(Collections.singletonList(Agent.DEFAULT_AGENT), Collections.emptyList());
-            } else {
-                //非管理员不允许查询自然量
-                return Tuples.of(Collections.emptyList(), Collections.emptyList());
             }
+            //非管理员或者组长不允许查询自然量
+            return Tuples.of(Collections.emptyList(), Collections.emptyList());
         }
         //渠道列表
         List<Agent> agentList;
@@ -227,8 +234,6 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
                     .eq(Strings.isNotBlank(pitcherId), Agent::getCreateBy, pitcherId)
                     .eq(agentId != null, Agent::getId, agentId));
         } else {
-            //判断是否是组长
-            List<Long> memberUserIdList = sysUserGroupRpc.memberUserId(SecurityUtil.getCompanyId(), SecurityUtil.getUserId()).getData();
             //组长, 可查看自己或者组员数据
             if (CollectionUtils.isNotEmpty(memberUserIdList)) {
                 groupLeader = true;

+ 2 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameUserRoleServiceImpl.java

@@ -143,6 +143,8 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
                 .le(param.getRechargeEndDate() != null, GameUserRole::getLastRechargeTime, param.getRechargeEndDate() == null ? null : LocalDateTime.of(param.getRechargeEndDate(), LocalTime.MAX))
                 .ge(param.getRoleLevelMin() != null, GameUserRole::getRoleLevel, param.getRoleLevelMin())
                 .le(param.getRoleLevelMax() != null, GameUserRole::getRoleLevel, param.getRoleLevelMax())
+                .apply(param.getRegPayIntervalTimeMin() != null, "if(last_recharge_time is not null, TIMESTAMPDIFF(minute, reg_time, last_recharge_time), null) >= {0}", param.getRegPayIntervalTimeMin())
+                .apply(param.getRegPayIntervalTimeMax() != null, "if(last_recharge_time is not null, TIMESTAMPDIFF(minute, reg_time, last_recharge_time), null) <= {0}", param.getRegPayIntervalTimeMax())
                 .orderByDesc(GameUserRole::getCreateTime)
         ).convert(u -> this.toVo(u, userMap, gameMap, cpMap, agentMap));
     }

+ 2 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameUserServiceImpl.java

@@ -94,6 +94,8 @@ public class GameUserServiceImpl extends ServiceImpl<GameUserMapper, GameUser> i
                 .le(param.getRechargeEndDate() != null, GameUser::getLastRechargeTime, param.getRechargeEndDate() == null ? null : LocalDateTime.of(param.getRechargeEndDate(), LocalTime.MAX))
                 .gt(Objects.equals(param.getIsRecharge(), Boolean.TRUE), GameUser::getRechargeCount, 0)
                 .eq(Objects.equals(param.getIsRecharge(), Boolean.FALSE), GameUser::getRechargeCount, 0)
+                .apply(param.getRegPayIntervalTimeMin() != null, "if(last_recharge_time is not null, TIMESTAMPDIFF(minute, reg_time, last_recharge_time), null) >= {0}", param.getRegPayIntervalTimeMin())
+                .apply(param.getRegPayIntervalTimeMax() != null, "if(last_recharge_time is not null, TIMESTAMPDIFF(minute, reg_time, last_recharge_time), null) <= {0}", param.getRegPayIntervalTimeMax())
                 .orderByDesc(GameUser::getCreateTime)
         ).convert(u -> this.toVo(u, userMap, gameMap, agentMap, cpMap));
     }

+ 2 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/OrderServiceImpl.java

@@ -228,6 +228,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 .le(param.getRegTimeEnd() != null, Order::getRegTime, param.getRegTimeEnd() == null ? null : LocalDateTime.of(param.getRegTimeEnd(), LocalTime.MAX))
                 .ge(param.getPayTimeStart() != null, Order::getPayTime, param.getPayTimeStart() == null ? null : LocalDateTime.of(param.getPayTimeStart(), LocalTime.MIN))
                 .le(param.getPayTimeEnd() != null, Order::getPayTime, param.getPayTimeEnd() == null ? null : LocalDateTime.of(param.getPayTimeEnd(), LocalTime.MAX))
+                .apply(param.getRegPayIntervalTimeMin() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, reg_time, pay_time), null) >= {0}", param.getRegPayIntervalTimeMin())
+                .apply(param.getRegPayIntervalTimeMax() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, reg_time, pay_time), null) <= {0}", param.getRegPayIntervalTimeMax())
                 .orderByDesc(Order::getCreateTime);
     }
 

+ 2 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserServiceImpl.java

@@ -128,6 +128,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 .eq(Objects.equals(param.getIsRecharge(), Boolean.FALSE), User::getRechargeCount, 0)
                 .eq(param.getStatus() != null, User::getStatus, param.getStatus())
                 .in(CollectionUtils.isNotEmpty(agentIdList), User::getAgentId, agentIdList)
+                .apply(param.getRegPayIntervalTimeMin() != null, "if(last_recharge_time is not null, TIMESTAMPDIFF(minute, create_time, last_recharge_time), null) >= {0}", param.getRegPayIntervalTimeMin())
+                .apply(param.getRegPayIntervalTimeMax() != null, "if(last_recharge_time is not null, TIMESTAMPDIFF(minute, create_time, last_recharge_time), null) <= {0}", param.getRegPayIntervalTimeMax())
                 .orderByDesc(User::getCreateTime)
         ).convert(u -> this.toVo(u, gameMap, cpMap, agentDTOList));
     }

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java

@@ -23,7 +23,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <dubbo升级3.0, 米大师支付回调上线4> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <dubbo升级3.0, APP下载地址访问上报修改> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 16 - 9
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserVisitLogServiceImpl.java

@@ -7,6 +7,7 @@ import com.zanxiang.game.module.mybatis.entity.UserVisitLog;
 import com.zanxiang.game.module.mybatis.mapper.UserVisitLogMapper;
 import com.zanxiang.game.module.sdk.service.IAgentService;
 import com.zanxiang.game.module.sdk.service.IUserVisitLogService;
+import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.web.util.IpUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
@@ -36,19 +37,25 @@ public class UserVisitLogServiceImpl extends ServiceImpl<UserVisitLogMapper, Use
     public boolean visitLogCreate(String url, String userAgent, HttpServletRequest httpServletRequest) {
         //解析url
         Map<String, String> urlParamMap = this.getUrlParameter(url);
+        log.error("下载地址访问上报参数 urlParamMap : {}", JsonUtil.toString(urlParamMap));
         //获取渠道标识
-        String state = urlParamMap.get("agentId");
-        if (Strings.isBlank(state)) {
-            state = urlParamMap.get("agentKey");
+        Agent agent = null;
+        String agentId = urlParamMap.get("agentId");
+        String agentKey = urlParamMap.get("agentKey");
+        if (Strings.isNotBlank(agentId)) {
+            agent = agentService.getById(agentId);
+        }
+        if (agent == null && Strings.isNotBlank(agentKey)) {
+            agent = agentService.getOne(new LambdaQueryWrapper<Agent>().eq(Agent::getAgentKey, agentKey));
+        }
+        //判断是否存在渠道
+        if (agent == null) {
+            return Boolean.FALSE;
         }
-        final String agentSign = state;
-        //查询渠道信息
-        Agent agent = agentService.getOne(new LambdaQueryWrapper<Agent>()
-                .and(qw -> qw.eq(Agent::getAgentKey, agentSign).or().eq(Agent::getId, agentSign)));
         //保存访问记录
         return super.save(UserVisitLog.builder()
-                .gameId(agent == null ? null : agent.getGameId())
-                .agentId(agent == null ? null : agent.getId())
+                .gameId(agent.getGameId())
+                .agentId(agent.getId())
                 .ip(IpUtil.getRealIp(httpServletRequest))
                 .ua(userAgent)
                 .url(urlParamMap.get("url"))