Explorar o código

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

zhangxianyu hai 7 meses
pai
achega
2092c760c8
Modificáronse 72 ficheiros con 4794 adicións e 250 borrados
  1. 2 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterAppApiRpcDTO.java
  2. 2 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterAppRpcDTO.java
  3. 2 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterRpcDTO.java
  4. 2 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterAppRpcDTO.java
  5. 2 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterRpcDTO.java
  6. 4 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/vo/GameBackPolicyRpcVO.java
  7. 1 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/GameBackApplication.java
  8. 4 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameBackPolicyDTO.java
  9. 4 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameBackPolicy.java
  10. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppRoleRegisterLog.java
  11. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineRoleRegisterLog.java
  12. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentAppApiRoleRegister.java
  13. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentAppRoleRegister.java
  14. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameRoleRegister.java
  15. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentRoleRegister.java
  16. 4 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameBackPolicyVO.java
  17. 64 40
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentAppApiBackRpcImpl.java
  18. 62 38
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentAppBackRpcImpl.java
  19. 48 25
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentMiniGameBackRpcImpl.java
  20. 41 15
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentUserActionBackRpcImpl.java
  21. 69 44
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java
  22. 43 20
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java
  23. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameBackPolicyServiceImpl.java
  24. 11 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppRoleRegisterLogServiceImpl.java
  25. 21 4
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineRoleRegisterLogServiceImpl.java
  26. 18 7
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppApiRoleRegisterServiceImpl.java
  27. 21 5
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameRoleRegisterServiceImpl.java
  28. 14 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentRoleRegisterServiceImpl.java
  29. 0 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameServerServiceImpl.java
  30. 27 10
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/controller/GameParentController.java
  31. 17 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/dw/DwGsServerAmountDayParentMapper.java
  32. 17 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/dw/DwGsServerRoleDayParentMapper.java
  33. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsGameServerGsActiveRDayParentMapper.java
  34. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsGsServerDayParentMapper.java
  35. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsServerRankingParentMapper.java
  36. 49 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/ServeManageDTO.java
  37. 47 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/ServerPayDTO.java
  38. 665 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/dw/DwGsServerAmountDayParent.java
  39. 664 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/dw/DwGsServerRoleDayParent.java
  40. 88 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsGameServerGsActiveRDayParent.java
  41. 773 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsGsServerDayParent.java
  42. 251 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsServerRankingParent.java
  43. 63 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/GsRTotalVO.java
  44. 185 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/ServeManageVO.java
  45. 381 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/ServerPayVO.java
  46. 15 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsGameServerGsActiveRDayParentService.java
  47. 22 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsGsServerDayParentService.java
  48. 20 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsServerRankingParentService.java
  49. 15 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IDwGsServerAmountDayParentService.java
  50. 15 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IDwGsServerRoleDayParentService.java
  51. 1 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IGameServerSonMergeService.java
  52. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsGameServerGsActiveRDayParentServiceImpl.java
  53. 592 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsGsServerDayParentServiceImpl.java
  54. 212 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsServerRankingParentServiceImpl.java
  55. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/DwGsServerAmountDayParentServiceImpl.java
  56. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/DwGsServerRoleDayParentServiceImpl.java
  57. 10 1
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/GameServerSonMergeServiceImpl.java
  58. 8 0
      game-gs-data/game-gs-data-serve/src/main/resources/bootstrap.yml
  59. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  60. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java
  61. 1 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/api/CpServerApiService.java
  62. 13 8
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java
  63. 2 8
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameAuthRoleServiceImpl.java
  64. 21 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfAppletMsgServiceImpl.java
  65. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameAuthRole.java
  66. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  67. 2 2
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/listener/OrderPaySuccessListener.java
  68. 5 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/result/PushCpResult.java
  69. 4 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java
  70. 6 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CpPushDataServiceImpl.java
  71. 11 16
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameUserRoleServiceImpl.java
  72. 2 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/PerformOrderServiceImpl.java

+ 2 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterAppApiRpcDTO.java

@@ -47,6 +47,8 @@ public class TencentRoleRegisterAppApiRpcDTO implements Serializable {
 
     private String roleName;
 
+    private Long roleLevel;
+
     /**
      * 用户设备mac地址
      */

+ 2 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterAppRpcDTO.java

@@ -47,6 +47,8 @@ public class TencentRoleRegisterAppRpcDTO implements Serializable {
 
     private String roleName;
 
+    private Long roleLevel;
+
     /**
      * 数据源ID
      */

+ 2 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterRpcDTO.java

@@ -57,4 +57,6 @@ public class TencentRoleRegisterRpcDTO implements Serializable {
     private String roleId;
 
     private String roleName;
+
+    private Long roleLevel;
 }

+ 2 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterAppRpcDTO.java

@@ -41,6 +41,8 @@ public class TtRoleRegisterAppRpcDTO implements Serializable {
     private String roleId;
 
     private String roleName;
+
+    private Long roleLevel;
     /**
      * 激活/注册时间
      */

+ 2 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterRpcDTO.java

@@ -49,6 +49,8 @@ public class TtRoleRegisterRpcDTO implements Serializable {
     private String roleId;
 
     private String roleName;
+
+    private Long roleLevel;
     /**
      * 激活/注册时间
      */

+ 4 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/vo/GameBackPolicyRpcVO.java

@@ -97,6 +97,10 @@ public class GameBackPolicyRpcVO implements Serializable {
      * 降档级别
      */
     private Integer levelDown;
+    /**
+     * 最小回传等级
+     */
+    private Long roleLevelMin;
 
     private LocalDateTime createTime;
 

+ 1 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/GameBackApplication.java

@@ -18,7 +18,7 @@ public class GameBackApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(GameBackApplication.class, args);
-        System.out.println("游戏回传服务启动成功, 修改头条APP回传的问题 ( ´・・)ノ(._.`)  \n" +
+        System.out.println("游戏回传服务启动成功, 修改头条APP回传的问题, bug修改123 ( ´・・)ノ(._.`)  \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 4 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameBackPolicyDTO.java

@@ -261,4 +261,8 @@ public class GameBackPolicyDTO implements Serializable {
      * 激活回传开关
      */
     private Boolean activeBackSwitch;
+    /**
+     * 最小回传等级
+     */
+    private Long roleLevelMin;
 }

+ 4 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameBackPolicy.java

@@ -228,4 +228,8 @@ public class GameBackPolicy implements Serializable {
      * 激活回传开关
      */
     private Boolean activeBackSwitch;
+    /**
+     * 最小回传等级
+     */
+    private Long roleLevelMin;
 }

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppRoleRegisterLog.java

@@ -30,6 +30,11 @@ public class GameOceanengineAppRoleRegisterLog implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    /**
+     * 回传策略id
+     */
+    private Long backPolicyId;
+
     private String userId;
 
     /**
@@ -87,6 +92,8 @@ public class GameOceanengineAppRoleRegisterLog implements Serializable {
      */
     private String roleName;
 
+    private Long roleLevel;
+
     /**
      * 创角时间
      */

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineRoleRegisterLog.java

@@ -24,6 +24,11 @@ public class GameOceanengineRoleRegisterLog implements Serializable {
 
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
+
+    /**
+     * 回传策略id
+     */
+    private Long backPolicyId;
     /**
      * 小游戏 id
      */
@@ -64,6 +69,8 @@ public class GameOceanengineRoleRegisterLog implements Serializable {
      * 角色名称
      */
     private String roleName;
+
+    private Long roleLevel;
     /**
      * 支付时间
      */

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

@@ -104,6 +104,8 @@ public class GameTencentAppApiRoleRegister implements Serializable {
 
     private String roleName;
 
+    private Long roleLevel;
+
     /**
      * 回传信息
      */

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

@@ -108,6 +108,8 @@ public class GameTencentAppRoleRegister implements Serializable {
 
     private String roleName;
 
+    private Long roleLevel;
+
     /**
      * 回传信息
      */

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameRoleRegister.java

@@ -29,6 +29,11 @@ public class GameTencentMiniGameRoleRegister implements Serializable {
 
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
+
+    /**
+     * 回传策略id
+     */
+    private Long backPolicyId;
     /**
      * 渠道号
      */
@@ -66,6 +71,8 @@ public class GameTencentMiniGameRoleRegister implements Serializable {
 
     private String roleName;
 
+    private Long roleLevel;
+
     /**
      * 注册时间
      */

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

@@ -85,5 +85,7 @@ public class GameTencentRoleRegister implements Serializable {
 
     private String roleName;
 
+    private Long roleLevel;
+
     private String backMsg;
 }

+ 4 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameBackPolicyVO.java

@@ -251,6 +251,10 @@ public class GameBackPolicyVO implements Serializable {
      * 激活回传开关
      */
     private Boolean activeBackSwitch;
+    /**
+     * 最小回传等级
+     */
+    private Long roleLevelMin;
 
     @Data
     @NoArgsConstructor

+ 64 - 40
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentAppApiBackRpcImpl.java

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.game.back.base.pojo.dto.*;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
@@ -39,22 +40,22 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())
@@ -79,9 +80,9 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
                 .createTime(LocalDateTime.now())
                 .build();
 
-        if(dto.getCallbackId() != null) {
+        if (dto.getCallbackId() != null) {
             userLog.setCallbackId(dto.getCallbackId());
-        } else  {
+        } else {
             GameTencentAppCallback callback = gameTencentAppCallbackService.getUserCallback(userLog.getGameId(), userLog.getImei(), userLog.getOaid(), userLog.getAndroidId(), userLog.getIdfa(), userLog.getCaid(), userLog.getIp(), userLog.getRegisterTime());
             userLog.setCallbackId(callback == null ? -1L : callback.getId());
         }
@@ -97,47 +98,70 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())
                 && StringUtils.isBlank(dto.getCaid())) {
             return ResultVO.fail("找不到用户唯一标识");
         }
-        GameTencentAppApiRoleRegister roleRegister = GameTencentAppApiRoleRegister.builder()
-                .userId(dto.getUserId())
-                .backPolicyId(dto.getBackPolicyId())
-                .channel(dto.getChannel())
-                .gameId(dto.getGameId())
-                .adAccountId(dto.getAdAccountId())
-                .registerTime(dto.getRegisterTime())
-                .mac(dto.getMac())
-                .imei(dto.getImei())
-                .oaid(dto.getOaid())
-                .androidId(dto.getAndroidId())
-                .idfa(dto.getIdfa())
-                .caid(dto.getCaid())
-                .isBack(BackStatusEnum.NO.getBackStatus())
-                .createTime(LocalDateTime.now())
-                .roleId(dto.getRoleId())
-                .roleName(dto.getRoleName())
-                .build();
-        gameTencentAppApiRoleRegisterService.save(roleRegister);
+        GameTencentAppApiRoleRegister roleRegister;
+        GameTencentAppApiRoleRegister oldRole = gameTencentAppApiRoleRegisterService.getOne(new LambdaQueryWrapper<GameTencentAppApiRoleRegister>()
+                .eq(GameTencentAppApiRoleRegister::getGameId, dto.getGameId())
+                .eq(GameTencentAppApiRoleRegister::getUserId, dto.getUserId())
+                .eq(GameTencentAppApiRoleRegister::getRoleId, dto.getRoleId())
+                .last("limit 1")
+        );
+        if (oldRole != null) {
+            roleRegister = oldRole;
+            if (dto.getRoleLevel() != null && (oldRole.getRoleLevel() == null || oldRole.getRoleLevel() < dto.getRoleLevel())) {
+                gameTencentAppApiRoleRegisterService.update(new LambdaUpdateWrapper<GameTencentAppApiRoleRegister>()
+                        .set(GameTencentAppApiRoleRegister::getRoleLevel, dto.getRoleLevel())
+                        .set(GameTencentAppApiRoleRegister::getRoleName, dto.getRoleName())
+                        .eq(GameTencentAppApiRoleRegister::getId, oldRole.getId())
+                );
+            }
+            if (Objects.equals(oldRole.getIsBack(), BackStatusEnum.SUCCESS.getBackStatus())) {
+                // 创角已回传。不重复传了
+                return ResultVO.ok(true);
+            }
+        } else {
+            roleRegister = GameTencentAppApiRoleRegister.builder()
+                    .userId(dto.getUserId())
+                    .backPolicyId(dto.getBackPolicyId())
+                    .channel(dto.getChannel())
+                    .gameId(dto.getGameId())
+                    .adAccountId(dto.getAdAccountId())
+                    .registerTime(dto.getRegisterTime())
+                    .mac(dto.getMac())
+                    .imei(dto.getImei())
+                    .oaid(dto.getOaid())
+                    .androidId(dto.getAndroidId())
+                    .idfa(dto.getIdfa())
+                    .caid(dto.getCaid())
+                    .isBack(BackStatusEnum.NO.getBackStatus())
+                    .createTime(LocalDateTime.now())
+                    .roleId(dto.getRoleId())
+                    .roleName(dto.getRoleName())
+                    .roleLevel(dto.getRoleLevel())
+                    .build();
+            gameTencentAppApiRoleRegisterService.save(roleRegister);
+        }
         return ResultVO.ok(gameTencentAppApiRoleRegisterService.roleRegisterBack(roleRegister));
     }
 
@@ -152,22 +176,22 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())
@@ -215,7 +239,7 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
     @Override
     public ResultVO<Tuple2<String, Long>> queryUserAgentFromCallback(TencentAppApiUserAgentQueryRpcDTO dto) {
         GameTencentAppCallback callback = gameTencentAppCallbackService.getUserCallback(dto.getGameId(), dto.getImei(), dto.getOaid(), dto.getAndroidId(), dto.getIdfa(), dto.getCaid(), dto.getRegIp(), dto.getRegisterTime());
-        if(callback == null) {
+        if (callback == null) {
             return ResultVO.ok(null);
         }
         return ResultVO.ok(Tuple2.with(callback.getAgentKey(), callback.getId()));

+ 62 - 38
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentAppBackRpcImpl.java

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.game.back.base.pojo.dto.*;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.base.rpc.ITencentAppBackRpc;
@@ -38,22 +39,22 @@ public class TencentAppBackRpcImpl implements ITencentAppBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())
@@ -89,48 +90,71 @@ public class TencentAppBackRpcImpl implements ITencentAppBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())
                 && StringUtils.isBlank(dto.getCaid())) {
             return ResultVO.fail("找不到用户唯一标识");
         }
-        GameTencentAppRoleRegister roleRegister = GameTencentAppRoleRegister.builder()
-                .backPolicyId(dto.getBackPolicyId())
-                .channel(dto.getChannel())
-                .userId(dto.getUserId())
-                .gameId(dto.getGameId())
-                .adAccountId(dto.getAdAccountId())
-                .registerTime(dto.getRegisterTime())
-                .mac(dto.getMac())
-                .imei(dto.getImei())
-                .oaid(dto.getOaid())
-                .androidId(dto.getAndroidId())
-                .idfa(dto.getIdfa())
-                .caid(dto.getCaid())
-                .isBack(BackStatusEnum.NO.getBackStatus())
-                .userActionSetId(dto.getUserActionSetId())
-                .createTime(LocalDateTime.now())
-                .roleId(dto.getRoleId())
-                .roleName(dto.getRoleName())
-                .build();
-        gameTencentAppRoleRegisterService.save(roleRegister);
+        GameTencentAppRoleRegister roleRegister;
+        GameTencentAppRoleRegister oldRole = gameTencentAppRoleRegisterService.getOne(new LambdaQueryWrapper<GameTencentAppRoleRegister>()
+                .eq(GameTencentAppRoleRegister::getGameId, dto.getGameId())
+                .eq(GameTencentAppRoleRegister::getUserId, dto.getUserId())
+                .eq(GameTencentAppRoleRegister::getRoleId, dto.getRoleId())
+                .last("limit 1")
+        );
+        if (oldRole != null) {
+            roleRegister = oldRole;
+            if (dto.getRoleLevel() != null && (oldRole.getRoleLevel() == null || oldRole.getRoleLevel() < dto.getRoleLevel())) {
+                gameTencentAppRoleRegisterService.update(new LambdaUpdateWrapper<GameTencentAppRoleRegister>()
+                        .set(GameTencentAppRoleRegister::getRoleLevel, dto.getRoleLevel())
+                        .set(GameTencentAppRoleRegister::getRoleName, dto.getRoleName())
+                        .eq(GameTencentAppRoleRegister::getId, oldRole.getId())
+                );
+            }
+            if (Objects.equals(oldRole.getIsBack(), BackStatusEnum.SUCCESS.getBackStatus())) {
+                // 创角已回传。不重复传了
+                return ResultVO.ok(true);
+            }
+        } else {
+            roleRegister = GameTencentAppRoleRegister.builder()
+                    .backPolicyId(dto.getBackPolicyId())
+                    .channel(dto.getChannel())
+                    .userId(dto.getUserId())
+                    .gameId(dto.getGameId())
+                    .adAccountId(dto.getAdAccountId())
+                    .registerTime(dto.getRegisterTime())
+                    .mac(dto.getMac())
+                    .imei(dto.getImei())
+                    .oaid(dto.getOaid())
+                    .androidId(dto.getAndroidId())
+                    .idfa(dto.getIdfa())
+                    .caid(dto.getCaid())
+                    .isBack(BackStatusEnum.NO.getBackStatus())
+                    .userActionSetId(dto.getUserActionSetId())
+                    .createTime(LocalDateTime.now())
+                    .roleId(dto.getRoleId())
+                    .roleName(dto.getRoleName())
+                    .roleLevel(dto.getRoleLevel())
+                    .build();
+            gameTencentAppRoleRegisterService.save(roleRegister);
+        }
         // return ResultVO.ok(gameTencentAppRoleRegisterService.roleRegisterBack(roleRegister));
         return ResultVO.ok(true);
     }
@@ -146,22 +170,22 @@ public class TencentAppBackRpcImpl implements ITencentAppBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())

+ 48 - 25
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentMiniGameBackRpcImpl.java

@@ -1,15 +1,13 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
 import com.zanxiang.game.back.base.pojo.dto.TencentRoleRegisterRpcDTO;
 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.GameBackPolicy;
-import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
-import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameRoleRegister;
-import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
+import com.zanxiang.game.back.serve.pojo.entity.*;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
 import com.zanxiang.game.back.serve.service.IGameTencentMiniGameOrderService;
@@ -125,29 +123,54 @@ public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
     @Override
     public ResultVO<Boolean> backRoleRegister(TencentRoleRegisterRpcDTO dto) {
         log.error("腾讯小游戏创角回传收到:{}", JsonUtil.toString(dto));
-        GameTencentMiniGameUser userLog = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
-                .select(GameTencentMiniGameUser::getBackStatus, GameTencentMiniGameUser::getClickId)
-                .eq(GameTencentMiniGameUser::getGameId, dto.getGameId())
-                .eq(GameTencentMiniGameUser::getWechatAppId, dto.getWechatAppId())
-                .eq(GameTencentMiniGameUser::getWechatOpenid, dto.getWechatOpenid())
-                .eq(GameTencentMiniGameUser::getAdAccountId, dto.getAdAccountId())
-                .orderByDesc(GameTencentMiniGameUser::getCreateTime)
+        GameTencentMiniGameRoleRegister roleRegisterLog;
+        GameTencentMiniGameRoleRegister oldRole = gameTencentMiniGameRoleRegisterService.getOne(new LambdaQueryWrapper<GameTencentMiniGameRoleRegister>()
+                .eq(GameTencentMiniGameRoleRegister::getGameId, dto.getGameId())
+                .eq(GameTencentMiniGameRoleRegister::getWechatAppId, dto.getWechatAppId())
+                .eq(GameTencentMiniGameRoleRegister::getWechatOpenid, dto.getWechatOpenid())
+                .eq(GameTencentMiniGameRoleRegister::getRoleId, dto.getRoleId())
                 .last("limit 1")
         );
-        GameTencentMiniGameRoleRegister roleRegisterLog = GameTencentMiniGameRoleRegister.builder()
-                .agentKey(dto.getChannel())
-                .gameId(dto.getGameId())
-                .adAccountId(dto.getAdAccountId())
-                .wechatAppId(dto.getWechatAppId())
-                .wechatOpenid(dto.getWechatOpenid())
-                .clickId(userLog == null ? null : userLog.getClickId())
-                .registerTime(dto.getRegisterTime())
-                .backStatus(BackStatusEnum.NO.getBackStatus())
-                .createTime(LocalDateTime.now())
-                .roleId(dto.getRoleId())
-                .roleName(dto.getRoleName())
-                .build();
-        gameTencentMiniGameRoleRegisterService.save(roleRegisterLog);
+        if (oldRole != null) {
+            roleRegisterLog = oldRole;
+            if (dto.getRoleLevel() != null && (oldRole.getRoleLevel() == null || oldRole.getRoleLevel() < dto.getRoleLevel())) {
+                gameTencentMiniGameRoleRegisterService.update(new LambdaUpdateWrapper<GameTencentMiniGameRoleRegister>()
+                        .set(GameTencentMiniGameRoleRegister::getRoleLevel, dto.getRoleLevel())
+                        .set(GameTencentMiniGameRoleRegister::getRoleName, dto.getRoleName())
+                        .eq(GameTencentMiniGameRoleRegister::getId, oldRole.getId())
+                );
+            }
+            if (Objects.equals(oldRole.getBackStatus(), BackStatusEnum.SUCCESS.getBackStatus())) {
+                // 创角已回传。不重复传了
+                return ResultVO.ok(true);
+            }
+        } else {
+            GameTencentMiniGameUser userLog = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
+                    .select(GameTencentMiniGameUser::getBackStatus, GameTencentMiniGameUser::getClickId)
+                    .eq(GameTencentMiniGameUser::getGameId, dto.getGameId())
+                    .eq(GameTencentMiniGameUser::getWechatAppId, dto.getWechatAppId())
+                    .eq(GameTencentMiniGameUser::getWechatOpenid, dto.getWechatOpenid())
+                    .eq(GameTencentMiniGameUser::getAdAccountId, dto.getAdAccountId())
+                    .orderByDesc(GameTencentMiniGameUser::getCreateTime)
+                    .last("limit 1")
+            );
+            roleRegisterLog = GameTencentMiniGameRoleRegister.builder()
+                    .backPolicyId(dto.getBackPolicyId())
+                    .agentKey(dto.getChannel())
+                    .gameId(dto.getGameId())
+                    .adAccountId(dto.getAdAccountId())
+                    .wechatAppId(dto.getWechatAppId())
+                    .wechatOpenid(dto.getWechatOpenid())
+                    .clickId(userLog == null ? null : userLog.getClickId())
+                    .registerTime(dto.getRegisterTime())
+                    .backStatus(BackStatusEnum.NO.getBackStatus())
+                    .createTime(LocalDateTime.now())
+                    .roleId(dto.getRoleId())
+                    .roleName(dto.getRoleName())
+                    .roleLevel(dto.getRoleLevel())
+                    .build();
+            gameTencentMiniGameRoleRegisterService.save(roleRegisterLog);
+        }
         return ResultVO.ok(gameTencentMiniGameRoleRegisterService.roleRegisterBack(roleRegisterLog));
     }
 }

+ 41 - 15
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentUserActionBackRpcImpl.java

@@ -2,11 +2,13 @@ package com.zanxiang.game.back.serve.rpc.impl;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
 import com.zanxiang.game.back.base.pojo.dto.TencentRoleRegisterRpcDTO;
 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.GameTencentAppApiRoleRegister;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentRoleRegister;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser;
@@ -101,21 +103,45 @@ public class TencentUserActionBackRpcImpl implements ITencentUserActionBackRpc {
     @Override
     public ResultVO<Boolean> backRoleRegister(TencentRoleRegisterRpcDTO dto) {
         log.error("腾讯H5创角回传收到:{}", JsonUtil.toString(dto));
-        GameTencentRoleRegister roleRegister = GameTencentRoleRegister.builder()
-                .backPolicyId(dto.getBackPolicyId())
-                .channel(dto.getChannel())
-                .gameId(dto.getGameId())
-                .adAccountId(dto.getAdAccountId())
-                .registerTime(dto.getRegisterTime())
-                .wechatAppId(dto.getWechatAppId())
-                .wechatOpenid(dto.getWechatOpenid())
-                .isBack(BackStatusEnum.NO.getBackStatus())
-                .userActionSetId(dto.getUserActionSetId())
-                .createTime(LocalDateTime.now())
-                .roleId(dto.getRoleId())
-                .roleName(dto.getRoleName())
-                .build();
-        gameTencentRoleRegisterService.save(roleRegister);
+        GameTencentRoleRegister roleRegister;
+        GameTencentRoleRegister oldRole = gameTencentRoleRegisterService.getOne(new LambdaQueryWrapper<GameTencentRoleRegister>()
+                .eq(GameTencentRoleRegister::getGameId, dto.getGameId())
+                .eq(GameTencentRoleRegister::getWechatAppId, dto.getWechatAppId())
+                .eq(GameTencentRoleRegister::getWechatOpenid, dto.getWechatOpenid())
+                .eq(GameTencentRoleRegister::getRoleId, dto.getRoleId())
+                .last("limit 1")
+        );
+        if (oldRole != null) {
+            roleRegister = oldRole;
+            if (dto.getRoleLevel() != null && (oldRole.getRoleLevel() == null || oldRole.getRoleLevel() < dto.getRoleLevel())) {
+                gameTencentRoleRegisterService.update(new LambdaUpdateWrapper<GameTencentRoleRegister>()
+                        .set(GameTencentRoleRegister::getRoleLevel, dto.getRoleLevel())
+                        .set(GameTencentRoleRegister::getRoleName, dto.getRoleName())
+                        .eq(GameTencentRoleRegister::getId, oldRole.getId())
+                );
+            }
+            if (Objects.equals(oldRole.getIsBack(), BackStatusEnum.SUCCESS.getBackStatus())) {
+                // 创角已回传。不重复传了
+                return ResultVO.ok(true);
+            }
+        } else {
+            roleRegister = GameTencentRoleRegister.builder()
+                    .backPolicyId(dto.getBackPolicyId())
+                    .channel(dto.getChannel())
+                    .gameId(dto.getGameId())
+                    .adAccountId(dto.getAdAccountId())
+                    .registerTime(dto.getRegisterTime())
+                    .wechatAppId(dto.getWechatAppId())
+                    .wechatOpenid(dto.getWechatOpenid())
+                    .isBack(BackStatusEnum.NO.getBackStatus())
+                    .userActionSetId(dto.getUserActionSetId())
+                    .createTime(LocalDateTime.now())
+                    .roleId(dto.getRoleId())
+                    .roleName(dto.getRoleName())
+                    .roleLevel(dto.getRoleLevel())
+                    .build();
+            gameTencentRoleRegisterService.save(roleRegister);
+        }
         return ResultVO.ok(gameTencentRoleRegisterService.roleRegisterBack(roleRegister));
     }
 }

+ 69 - 44
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.game.back.base.pojo.dto.*;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.base.pojo.vo.OrderBackQueryRpcVO;
@@ -57,22 +58,22 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getUserId()) || (StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getUserId()) || (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())
@@ -111,22 +112,22 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getUserId()) || (StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getUserId()) || (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())
@@ -182,46 +183,70 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
-        if(StringUtils.isBlank(dto.getImei())) {
+        if (StringUtils.isBlank(dto.getImei())) {
             dto.setImei("");
         }
-        if(StringUtils.isBlank(dto.getOaid())) {
+        if (StringUtils.isBlank(dto.getOaid())) {
             dto.setOaid("");
         }
-        if(StringUtils.isBlank(dto.getAndroidId())) {
+        if (StringUtils.isBlank(dto.getAndroidId())) {
             dto.setAndroidId("");
         }
-        if(StringUtils.isBlank(dto.getIdfa())) {
+        if (StringUtils.isBlank(dto.getIdfa())) {
             dto.setIdfa("");
         }
-        if(StringUtils.isBlank(dto.getCaid())) {
+        if (StringUtils.isBlank(dto.getCaid())) {
             dto.setCaid("");
         }
-        if(StringUtils.isBlank(dto.getUserId()) || (StringUtils.isBlank(dto.getImei())
+        if (StringUtils.isBlank(dto.getUserId()) || (StringUtils.isBlank(dto.getImei())
                 && StringUtils.isBlank(dto.getOaid())
                 && StringUtils.isBlank(dto.getAndroidId())
                 && StringUtils.isBlank(dto.getIdfa())
                 && StringUtils.isBlank(dto.getCaid()))) {
             return ResultVO.fail("找不到用户唯一标识");
         }
-        GameOceanengineAppRoleRegisterLog roleRegisterLog = GameOceanengineAppRoleRegisterLog.builder()
-                .userId(dto.getUserId())
-                .mac(dto.getMac())
-                .imei(dto.getImei())
-                .oaid(dto.getOaid())
-                .androidId(dto.getAndroidId())
-                .idfa(dto.getIdfa())
-                .caid(dto.getCaid())
-                .gameId(dto.getGameId())
-                .accountId(dto.getAccountReport().getAccountId())
-                .agentKey(dto.getAgentKey())
-                .roleId(dto.getRoleId())
-                .roleName(dto.getRoleName())
-                .registerTime(dto.getRegisterTime())
-                .backStatus(BackStatusEnum.NO.getBackStatus())
-                .createTime(LocalDateTime.now())
-                .build();
-        gameOceanengineAppRoleRegisterLogService.save(roleRegisterLog);
+        GameOceanengineAppRoleRegisterLog roleRegisterLog;
+        GameOceanengineAppRoleRegisterLog oldRole = gameOceanengineAppRoleRegisterLogService.getOne(new LambdaQueryWrapper<GameOceanengineAppRoleRegisterLog>()
+                .eq(GameOceanengineAppRoleRegisterLog::getGameId, dto.getGameId())
+                .eq(GameOceanengineAppRoleRegisterLog::getUserId, dto.getUserId())
+                .eq(GameOceanengineAppRoleRegisterLog::getRoleId, dto.getRoleId())
+                .last("limit 1")
+        );
+        if (oldRole != null) {
+            roleRegisterLog = oldRole;
+            if (dto.getRoleLevel() != null && (oldRole.getRoleLevel() == null || oldRole.getRoleLevel() < dto.getRoleLevel())) {
+                gameOceanengineAppRoleRegisterLogService.update(new LambdaUpdateWrapper<GameOceanengineAppRoleRegisterLog>()
+                        .set(GameOceanengineAppRoleRegisterLog::getRoleLevel, dto.getRoleLevel())
+                        .set(GameOceanengineAppRoleRegisterLog::getRoleName, dto.getRoleName())
+                        .eq(GameOceanengineAppRoleRegisterLog::getId, oldRole.getId())
+                );
+            }
+            if (Objects.equals(oldRole.getBackStatus(), BackStatusEnum.SUCCESS.getBackStatus())) {
+                // 创角已回传。不重复传了
+                return ResultVO.ok(true);
+            }
+        } else {
+            roleRegisterLog = GameOceanengineAppRoleRegisterLog.builder()
+                    .backPolicyId(dto.getBackPolicyId())
+                    .userId(dto.getUserId())
+                    .mac(dto.getMac())
+                    .imei(dto.getImei())
+                    .oaid(dto.getOaid())
+                    .androidId(dto.getAndroidId())
+                    .idfa(dto.getIdfa())
+                    .caid(dto.getCaid())
+                    .gameId(dto.getGameId())
+                    .accountId(dto.getAccountReport().getAccountId())
+                    .agentKey(dto.getAgentKey())
+                    .roleId(dto.getRoleId())
+                    .roleName(dto.getRoleName())
+                    .roleLevel(dto.getRoleLevel())
+                    .registerTime(dto.getRegisterTime())
+                    .backStatus(BackStatusEnum.NO.getBackStatus())
+                    .createTime(LocalDateTime.now())
+                    .build();
+            gameOceanengineAppRoleRegisterLogService.save(roleRegisterLog);
+        }
         return ResultVO.ok(gameOceanengineAppRoleRegisterLogService.callback(roleRegisterLog));
     }
 
@@ -238,16 +263,16 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
         GameOceanengineAppOrderLog orderLog = queryOrder(dto);
         if (orderLog == null) {
             try {
-                Thread.sleep(5 *  1000L);
+                Thread.sleep(15 * 1000L);
             } catch (Exception e) {
                 log.error(e.getMessage(), e);
             }
             orderLog = queryOrder(dto);
         }
-        if  (orderLog == null) {
+        if (orderLog == null) {
             return ResultVO.ok(OrderBackQueryRpcVO.builder()
-                            .doBack(Boolean.FALSE)
-                            .backMsg("回传异常,找不到订单:" + dto.getOrderId())
+                    .doBack(Boolean.FALSE)
+                    .backMsg("回传异常,找不到订单:" + dto.getOrderId())
                     .build());
         }
         List<Long> splitMoney = gameOceanengineAppOrderSplitLogService.list(new LambdaQueryWrapper<GameOceanengineAppOrderSplitLog>()
@@ -255,9 +280,9 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
                 .orderByAsc(GameOceanengineAppOrderSplitLog::getBackIndex)
         ).stream().map(GameOceanengineAppOrderSplitLog::getSplitMoney).collect(Collectors.toList());
         return ResultVO.ok(OrderBackQueryRpcVO.builder()
-                        .doBack(BackStatusEnum.getByValue(orderLog.getBackStatus()) ==  BackStatusEnum.SUCCESS)
-                        .backMoney(CollectionUtils.isEmpty(splitMoney) ? Collections.singletonList(orderLog.getBackMoney()) : splitMoney)
-                        .backMsg(orderLog.getBackMsg())
+                .doBack(BackStatusEnum.getByValue(orderLog.getBackStatus()) == BackStatusEnum.SUCCESS)
+                .backMoney(CollectionUtils.isEmpty(splitMoney) ? Collections.singletonList(orderLog.getBackMoney()) : splitMoney)
+                .backMsg(orderLog.getBackMsg())
                 .build());
     }
 
@@ -270,7 +295,7 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
     @Override
     public ResultVO<String> queryUserAgentFromCallback(TtAppUserAgentQueryRpcDTO dto) {
         GameOceanengineAppUserLog userLog = gameOceanengineAppUserLogService.getOne(new LambdaQueryWrapper<GameOceanengineAppUserLog>()
-                        .eq(GameOceanengineAppUserLog::getGameId, dto.getGameId())
+                .eq(GameOceanengineAppUserLog::getGameId, dto.getGameId())
                 .eq(GameOceanengineAppUserLog::getUserId, dto.getUserId())
         );
         if (userLog == null) {

+ 43 - 20
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java

@@ -1,16 +1,14 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TtRoleRegisterRpcDTO;
 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.GameBackPolicy;
-import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
-import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
-import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
+import com.zanxiang.game.back.serve.pojo.entity.*;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineOrderLogService;
@@ -133,22 +131,47 @@ public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
     @Override
     public ResultVO<Boolean> roleRegisterReport(TtRoleRegisterRpcDTO dto) {
         log.error("头条小游戏创角回传收到:{}", JsonUtil.toString(dto));
-        GameOceanengineRoleRegisterLog roleRegisterLog = GameOceanengineRoleRegisterLog.builder()
-                .appId(dto.getWechatAppId())
-                .openId(dto.getWechatOpenId())
-                .unionId(dto.getWechatUnionId())
-                .gameId(dto.getGameId())
-                .accountId(dto.getAccountReport().getAccountId())
-                .accountReportToken(dto.getAccountReport().getReportToken())
-                .accountReportUrl(dto.getAccountReport().getReportUrl())
-                .agentKey(dto.getAgentKey())
-                .roleId(dto.getRoleId())
-                .roleName(dto.getRoleName())
-                .registerTime(dto.getRegisterTime())
-                .backStatus(BackStatusEnum.NO.getBackStatus())
-                .createTime(LocalDateTime.now())
-                .build();
-        gameOceanengineRoleRegisterLogService.save(roleRegisterLog);
+        GameOceanengineRoleRegisterLog roleRegisterLog;
+        GameOceanengineRoleRegisterLog oldRole = gameOceanengineRoleRegisterLogService.getOne(new LambdaQueryWrapper<GameOceanengineRoleRegisterLog>()
+                .eq(GameOceanengineRoleRegisterLog::getGameId, dto.getGameId())
+                .eq(GameOceanengineRoleRegisterLog::getAppId, dto.getWechatAppId())
+                .eq(GameOceanengineRoleRegisterLog::getOpenId, dto.getWechatOpenId())
+                .eq(GameOceanengineRoleRegisterLog::getRoleId, dto.getRoleId())
+                .last("limit 1")
+        );
+        if (oldRole != null) {
+            roleRegisterLog = oldRole;
+            if (dto.getRoleLevel() != null && (oldRole.getRoleLevel() == null || oldRole.getRoleLevel() < dto.getRoleLevel())) {
+                gameOceanengineRoleRegisterLogService.update(new LambdaUpdateWrapper<GameOceanengineRoleRegisterLog>()
+                        .set(GameOceanengineRoleRegisterLog::getRoleLevel, dto.getRoleLevel())
+                        .set(GameOceanengineRoleRegisterLog::getRoleName, dto.getRoleName())
+                        .eq(GameOceanengineRoleRegisterLog::getId, oldRole.getId())
+                );
+            }
+            if (Objects.equals(oldRole.getBackStatus(), BackStatusEnum.SUCCESS.getBackStatus())) {
+                // 创角已回传。不重复传了
+                return ResultVO.ok(true);
+            }
+        } else  {
+            roleRegisterLog = GameOceanengineRoleRegisterLog.builder()
+                    .backPolicyId(dto.getBackPolicyId())
+                    .appId(dto.getWechatAppId())
+                    .openId(dto.getWechatOpenId())
+                    .unionId(dto.getWechatUnionId())
+                    .gameId(dto.getGameId())
+                    .accountId(dto.getAccountReport().getAccountId())
+                    .accountReportToken(dto.getAccountReport().getReportToken())
+                    .accountReportUrl(dto.getAccountReport().getReportUrl())
+                    .agentKey(dto.getAgentKey())
+                    .roleId(dto.getRoleId())
+                    .roleName(dto.getRoleName())
+                    .roleLevel(dto.getRoleLevel())
+                    .registerTime(dto.getRegisterTime())
+                    .backStatus(BackStatusEnum.NO.getBackStatus())
+                    .createTime(LocalDateTime.now())
+                    .build();
+            gameOceanengineRoleRegisterLogService.save(roleRegisterLog);
+        }
         return ResultVO.ok(gameOceanengineRoleRegisterLogService.callback(roleRegisterLog));
     }
 }

+ 2 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameBackPolicyServiceImpl.java

@@ -121,6 +121,7 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
                 .supperSmallAmount(dto.getSupperSmallAmount() == null ? null : NumberUtil.multiply100(dto.getSupperSmallAmount()).longValue())
                 .splitStrategy(CollectionUtils.isEmpty(dto.getSplitStrategy()) ? null : JsonUtil.toString(dto.getSplitStrategy()))
                 .activeBackSwitch(dto.getActiveBackSwitch())
+                .roleLevelMin(dto.getRoleLevelMin())
                 .build();
         return gameBackPolicyService.save(backPolicy);
     }
@@ -175,6 +176,7 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
                 .supperSmallAmount(dto.getSupperSmallAmount() == null ? null : NumberUtil.multiply100(dto.getSupperSmallAmount()).longValue())
                 .splitStrategy(CollectionUtils.isEmpty(dto.getSplitStrategy()) ? null : JsonUtil.toString(dto.getSplitStrategy()))
                 .activeBackSwitch(dto.getActiveBackSwitch())
+                .roleLevelMin(dto.getRoleLevelMin())
                 .build();
         return gameBackPolicyService.updateById(backPolicy);
     }

+ 11 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppRoleRegisterLogServiceImpl.java

@@ -3,6 +3,7 @@ package com.zanxiang.game.back.serve.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppRoleRegisterLogMapper;
 import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
 import com.zanxiang.game.back.serve.pojo.entity.*;
@@ -28,6 +29,8 @@ implements IGameOceanengineAppRoleRegisterLogService {
     private IGameOceanengineAppBackLogService gameOceanengineAppBackLogService;
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private IAgentRpc agentRpc;
+    @Autowired
+    private IGameBackPolicyService gameBackPolicyService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -77,6 +80,14 @@ implements IGameOceanengineAppRoleRegisterLogService {
             //创角已回传
             return BackStatusEnum.NO;
         }
+
+        if (roleRegisterLog.getBackPolicyId() != null) {
+            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(roleRegisterLog.getBackPolicyId());
+            if (gameBackPolicy.getRoleLevelMin() != null && roleRegisterLog.getRoleLevel() != null
+                    && roleRegisterLog.getRoleLevel() < gameBackPolicy.getRoleLevelMin()) {
+                return BackStatusEnum.NO;
+            }
+        }
         BackStatusEnum backStatus = BackStatusEnum.SUCCESS;
         String errMsg = null;
         gameOceanengineAppBackLogService.save(GameOceanengineAppBackLog.builder()

+ 21 - 4
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineRoleRegisterLogServiceImpl.java

@@ -5,15 +5,18 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineRoleRegisterLogMapper;
 import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
 import com.zanxiang.game.back.serve.oceanengine.OceanengineCallbackException;
 import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineRoleRegisterLogDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineBackLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineRoleRegisterLogVO;
+import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineBackLogService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineRoleRegisterLogService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineUserLogService;
@@ -45,6 +48,8 @@ public class GameOceanengineRoleRegisterLogServiceImpl extends ServiceImpl<GameO
     @Autowired
     private IGameOceanengineUserLogService gameOceanengineUserLogService;
     @Autowired
+    private IGameBackPolicyService gameBackPolicyService;
+    @Autowired
     private IGameOceanengineBackLogService gameOceanengineBackLogService;
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private IAgentRpc agentRpc;
@@ -131,10 +136,7 @@ public class GameOceanengineRoleRegisterLogServiceImpl extends ServiceImpl<GameO
                     .build());
             return BackStatusEnum.FAILED;
         }
-        // 回传用户激活
-        if (Objects.equals(BackStatusEnum.NO.getBackStatus(), userLog.getBackStatus())) {
-            gameOceanengineUserLogService.callback(userLog, true);
-        }
+
         //判断创角是否已回传
         if (gameOceanengineBackLogService.count(new LambdaQueryWrapper<GameOceanengineBackLog>()
                 .eq(GameOceanengineBackLog::getGameId, userLog.getGameId())
@@ -147,6 +149,21 @@ public class GameOceanengineRoleRegisterLogServiceImpl extends ServiceImpl<GameO
             //创角已回传
             return BackStatusEnum.NO;
         }
+
+        //回传策略等级判断
+        if (roleRegisterLog.getBackPolicyId() != null) {
+            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(roleRegisterLog.getBackPolicyId());
+            if (gameBackPolicy.getRoleLevelMin() != null && roleRegisterLog.getRoleLevel() != null
+                    && roleRegisterLog.getRoleLevel() < gameBackPolicy.getRoleLevelMin()) {
+                return BackStatusEnum.NO;
+            }
+        }
+
+        // 回传用户激活
+        if (Objects.equals(BackStatusEnum.NO.getBackStatus(), userLog.getBackStatus())) {
+            gameOceanengineUserLogService.callback(userLog, true);
+        }
+
         //创角回传
         MiniGameCallback.MiniGameCallbackRequest request = MiniGameCallback.MiniGameCallbackRequest.builder()
                 .clue_token(userLog.getClueToken())

+ 18 - 7
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppApiRoleRegisterServiceImpl.java

@@ -30,13 +30,15 @@ import java.util.Map;
 @Slf4j
 @Service
 public class GameTencentAppApiRoleRegisterServiceImpl extends ServiceImpl<GameTencentAppApiRoleRegisterMapper, GameTencentAppApiRoleRegister>
-implements IGameTencentAppApiRoleRegisterService {
+        implements IGameTencentAppApiRoleRegisterService {
 
     @Autowired
     private IGameTencentAppApiBackLogService gameTencentAppApiBackLogService;
     @Autowired
     private IGameTencentAppApiUserService gameTencentAppApiUserService;
     @Autowired
+    private IGameBackPolicyService gameBackPolicyService;
+    @Autowired
     private IGameTencentAppCallbackService gameTencentAppCallbackService;
     @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
     private IUserActionSetV3Rpc userActionSetRpc;
@@ -66,6 +68,14 @@ implements IGameTencentAppApiRoleRegisterService {
     }
 
     private Tuple2<BackStatusEnum, String> doCallback(GameTencentAppApiRoleRegister roleRegisterLog) {
+        if (roleRegisterLog.getBackPolicyId() != null) {
+            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(roleRegisterLog.getBackPolicyId());
+            if (gameBackPolicy.getRoleLevelMin() != null && roleRegisterLog.getRoleLevel() != null
+                    && roleRegisterLog.getRoleLevel() < gameBackPolicy.getRoleLevelMin()) {
+                return Tuple2.with(BackStatusEnum.NO, "等级小于回传策略等级 " + gameBackPolicy.getRoleLevelMin() + "。不回传");
+            }
+        }
+
         GameTencentAppApiUser user = gameTencentAppApiUserService.getOne(new LambdaQueryWrapper<GameTencentAppApiUser>()
                 .eq(GameTencentAppApiUser::getGameId, roleRegisterLog.getGameId())
                 .eq(GameTencentAppApiUser::getUserId, roleRegisterLog.getUserId())
@@ -73,6 +83,7 @@ implements IGameTencentAppApiRoleRegisterService {
                 .orderByDesc(GameTencentAppApiUser::getCreateTime)
                 .last("limit 1")
         );
+
         if (user != null) {
             if (user.getCallbackId() == null || user.getCallbackId() < 1) {
                 return Tuple2.with(BackStatusEnum.FAILED, "用户匹配不到广告");
@@ -83,25 +94,25 @@ implements IGameTencentAppApiRoleRegisterService {
                 // 注册已回传,则默认认为创角也回传了
                 return Tuple2.with(BackStatusEnum.NO, "用户第二+次创角不回传");
             }
-        } else  {
+        } else {
             return Tuple2.with(BackStatusEnum.FAILED, "找不到用户");
         }
 
         GameTencentAppCallback callback = gameTencentAppCallbackService.getById(user.getCallbackId());
 
         UserActionV3RpcDTO.UserIdRpcDTO userId = UserActionV3RpcDTO.UserIdRpcDTO.builder().build();
-        if ("android".equalsIgnoreCase(callback.getDeviceOsType()))  {
-            if(StringUtils.isNotBlank(callback.getMuid())) {
+        if ("android".equalsIgnoreCase(callback.getDeviceOsType())) {
+            if (StringUtils.isNotBlank(callback.getMuid())) {
                 userId.setHashImei(callback.getMuid());
             }
-            if(StringUtils.isNotBlank(callback.getHashOaid())) {
+            if (StringUtils.isNotBlank(callback.getHashOaid())) {
                 userId.setHashOaid(callback.getHashOaid());
             }
-            if(StringUtils.isNotBlank(callback.getHashAndroidId())) {
+            if (StringUtils.isNotBlank(callback.getHashAndroidId())) {
                 userId.setHashAndroidId(callback.getHashAndroidId());
             }
         } else {
-            if(StringUtils.isNotBlank(callback.getMuid())) {
+            if (StringUtils.isNotBlank(callback.getMuid())) {
                 userId.setHashIdfa(callback.getMuid());
             }
         }

+ 21 - 5
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameRoleRegisterServiceImpl.java

@@ -10,12 +10,14 @@ import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
 import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameRoleRegisterMapper;
 import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameRoleRegisterDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameBackLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameRoleRegister;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
 import com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameRoleRegisterVO;
+import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
 import com.zanxiang.game.back.serve.service.IGameTencentMiniGameBackLogService;
 import com.zanxiang.game.back.serve.service.IGameTencentMiniGameRoleRegisterService;
 import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
@@ -50,6 +52,8 @@ public class GameTencentMiniGameRoleRegisterServiceImpl extends ServiceImpl<Game
     private IAgentRpc agentRpc;
     @Autowired
     private IGameTencentMiniGameUserService gameTencentMiniGameUserService;
+    @Autowired
+    private IGameBackPolicyService gameBackPolicyService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -127,11 +131,7 @@ public class GameTencentMiniGameRoleRegisterServiceImpl extends ServiceImpl<Game
                 .orderByDesc(GameTencentMiniGameUser::getCreateTime)
                 .last("limit 1")
         );
-        //判断注册是否回传
-        if (user != null && Objects.equals(BackStatusEnum.NO.getBackStatus(), user.getBackStatus())) {
-            //注册回传
-            gameTencentMiniGameUserService.userBack(user);
-        }
+
         //判断创角是否回传
         if (gameTencentMiniGameBackLogService.count(new LambdaQueryWrapper<GameTencentMiniGameBackLog>()
                 .eq(GameTencentMiniGameBackLog::getGameId, roleRegisterLog.getGameId())
@@ -144,6 +144,22 @@ public class GameTencentMiniGameRoleRegisterServiceImpl extends ServiceImpl<Game
             //创角已回传
             return Tuple2.with(BackStatusEnum.NO, "创角已回传,默认不重复传");
         }
+
+        //回传策略等级控制
+        if (roleRegisterLog.getBackPolicyId() != null) {
+            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(roleRegisterLog.getBackPolicyId());
+            if (gameBackPolicy.getRoleLevelMin() != null && roleRegisterLog.getRoleLevel() != null
+                    && roleRegisterLog.getRoleLevel() < gameBackPolicy.getRoleLevelMin()) {
+                return Tuple2.with(BackStatusEnum.NO, "等级小于回传策略等级 " + gameBackPolicy.getRoleLevelMin() + "。不回传");
+            }
+        }
+
+        //判断注册是否回传
+        if (user != null && Objects.equals(BackStatusEnum.NO.getBackStatus(), user.getBackStatus())) {
+            //注册回传
+            gameTencentMiniGameUserService.userBack(user);
+        }
+
         //创角回传
         return gameTencentMiniGameBackLogService.roleRegisterBack(roleRegisterLog);
     }

+ 14 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentRoleRegisterServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
 import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAppIdRpcDTO;
 import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
@@ -14,12 +15,14 @@ import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.rpc.ISysUserRpc;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentRoleRegisterMapper;
 import com.zanxiang.game.back.serve.pojo.dto.GameTencentRoleRegisterDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentBackLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentRoleRegister;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser;
 import com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.pojo.vo.GameTencentRoleRegisterVO;
+import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
 import com.zanxiang.game.back.serve.service.IGameTencentBackLogService;
 import com.zanxiang.game.back.serve.service.IGameTencentRoleRegisterService;
 import com.zanxiang.game.back.serve.service.IGameTencentUserService;
@@ -57,6 +60,8 @@ public class GameTencentRoleRegisterServiceImpl extends ServiceImpl<GameTencentR
     @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
     private ISysUserRpc sysUserRpc;
     @Autowired
+    private IGameBackPolicyService gameBackPolicyService;
+    @Autowired
     private IGameTencentBackLogService gameTencentBackLogService;
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private IAgentRpc agentRpc;
@@ -130,6 +135,14 @@ public class GameTencentRoleRegisterServiceImpl extends ServiceImpl<GameTencentR
 
 
     private BackStatusEnum doCallback(GameTencentRoleRegister roleRegisterLog) {
+        if (roleRegisterLog.getBackPolicyId() != null) {
+            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(roleRegisterLog.getBackPolicyId());
+            if (gameBackPolicy.getRoleLevelMin() != null && roleRegisterLog.getRoleLevel() != null
+                    && roleRegisterLog.getRoleLevel() < gameBackPolicy.getRoleLevelMin()) {
+                return BackStatusEnum.NO;
+            }
+        }
+
         GameTencentUser user = gameTencentUserService.getOne(new LambdaQueryWrapper<GameTencentUser>()
                 .eq(GameTencentUser::getGameId, roleRegisterLog.getGameId())
                 .eq(GameTencentUser::getWechatAppId, roleRegisterLog.getWechatAppId())
@@ -146,6 +159,7 @@ public class GameTencentRoleRegisterServiceImpl extends ServiceImpl<GameTencentR
                 return BackStatusEnum.NO;
             }
         }
+
         Map<String, Object> actionParam = new HashMap<>(2);
         actionParam.put("claim_type", 0);
         DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()

+ 0 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameServerServiceImpl.java

@@ -718,7 +718,6 @@ public class GameServerServiceImpl implements IGameServerService {
                         .rTotalRetention(split[14])
                         .build();
                 fieldObjectList.get(i).set(vo, retentionVO);
-//                field.set(vo, value + "/" + rData);
             } catch (IllegalAccessException e) {
                 throw new RuntimeException(e);
             }

+ 27 - 10
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/controller/GameParentController.java

@@ -1,13 +1,12 @@
 package com.zanxiang.game.gs.data.serve.controller;
 
 import com.mybatisflex.core.row.Row;
-import com.zanxiang.game.gs.data.serve.pojo.dto.BigRDTO;
-import com.zanxiang.game.gs.data.serve.pojo.dto.RoleManageDTO;
-import com.zanxiang.game.gs.data.serve.pojo.dto.RolePayDTO;
-import com.zanxiang.game.gs.data.serve.pojo.dto.RoleRemoveGameMonitorDTO;
+import com.zanxiang.game.gs.data.serve.pojo.dto.*;
 import com.zanxiang.game.gs.data.serve.pojo.vo.*;
+import com.zanxiang.game.gs.data.serve.service.IAdsGsServerDayParentService;
 import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountDataParentService;
 import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountRateParentService;
+import com.zanxiang.game.gs.data.serve.service.IAdsServerRankingParentService;
 import com.zanxiang.module.util.pojo.ResultVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -27,6 +26,10 @@ public class GameParentController {
     private IAdsRoleAmountDataParentService adsRoleAmountDataParentService;
     @Resource
     private IAdsRoleAmountRateParentService adsRoleAmountRateParentService;
+    @Resource
+    private IAdsGsServerDayParentService gsServerDayParentService;
+    @Resource
+    private IAdsServerRankingParentService serverRankingParentService;
 
     @ApiOperation(value = "大R每日充值比")
 //    @PreAuthorize(permissionKey = "gameGs:bigR:list")
@@ -49,6 +52,20 @@ public class GameParentController {
         return ResultVO.ok(adsRoleAmountRateParentService.rolePayTotal(dto));
     }
 
+    @ApiOperation(value = "GS区服付费留存")
+//    @PreAuthorize(permissionKey = "gameGs:serverPay:list")
+    @PostMapping("/server/pay/retained/listOfPage")
+    public ResultVO<PageVO<ServerPayVO, Row>> serverPay(@Validated @RequestBody ServerPayDTO dto) {
+        return ResultVO.ok(gsServerDayParentService.serverPay(dto));
+    }
+
+    @ApiOperation(value = "GS区服付费留存总计")
+//    @PreAuthorize(permissionKey = "gameGs:serverPay:total")
+    @PostMapping("/server/pay/retained/total")
+    public ResultVO<ServerPayVO> serverPayTotal(@Validated @RequestBody ServerPayDTO dto) {
+        return ResultVO.ok(gsServerDayParentService.serverPayTotal(dto));
+    }
+
     @ApiOperation(value = "角色流失监控")
 //    @PreAuthorize(permissionKey = "gameGs:roleRemoveGame:monitor")
     @PostMapping("/role/remove/game/monitor")
@@ -63,11 +80,11 @@ public class GameParentController {
         return ResultVO.ok(adsRoleAmountDataParentService.roleManage(dto));
     }
 
-//    @ApiOperation(value = "游戏角色管理")
-////    @PreAuthorize(permissionKey = "gameGs:role:manage")
-//    @PostMapping("/role/manage")
-//    public ResultVO<PageVO<RoleManageVO, Row>> roleManage(@Validated @RequestBody RoleManageDTO dto) {
-//        return ResultVO.ok(adsRoleAmountDataParentService.roleManage(dto));
-//    }
+    @ApiOperation(value = "游戏区服管理")
+//    @PreAuthorize(permissionKey = "gameGs:serve:manage")
+    @PostMapping("/serve/manage")
+    public ResultVO<PageVO<ServeManageVO, Row>> serveManage(@Validated @RequestBody ServeManageDTO dto) {
+        return ResultVO.ok(serverRankingParentService.serveManage(dto));
+    }
 
 }

+ 17 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/dw/DwGsServerAmountDayParentMapper.java

@@ -0,0 +1,17 @@
+package com.zanxiang.game.gs.data.serve.dao.mapper.game.dw;
+
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.DwGsServerAmountDayParent;
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * Gs区服付费留存:付费金额,付费人数,累计付费人数 映射层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Mapper
+public interface DwGsServerAmountDayParentMapper extends BaseMapper<DwGsServerAmountDayParent> {
+
+
+}

+ 17 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/dw/DwGsServerRoleDayParentMapper.java

@@ -0,0 +1,17 @@
+package com.zanxiang.game.gs.data.serve.dao.mapper.game.dw;
+
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.DwGsServerRoleDayParent;
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * Gs区服付费留存:创角人数,累计创角人数 映射层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Mapper
+public interface DwGsServerRoleDayParentMapper extends BaseMapper<DwGsServerRoleDayParent> {
+
+
+}

+ 19 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsGameServerGsActiveRDayParentMapper.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.gs.data.serve.dao.mapper.game.parent;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGameServerGsActiveRDayParent;
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 游戏GS区服付费留存(某R人数) 映射层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Mapper
+@UseDataSource("game_ads_parent")
+public interface AdsGameServerGsActiveRDayParentMapper extends BaseMapper<AdsGameServerGsActiveRDayParent> {
+
+
+}

+ 19 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsGsServerDayParentMapper.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.gs.data.serve.dao.mapper.game.parent;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGsServerDayParent;
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * GS区服付费留存(游戏GS管理) 映射层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Mapper
+@UseDataSource("game_ads_parent")
+public interface AdsGsServerDayParentMapper extends BaseMapper<AdsGsServerDayParent> {
+
+
+}

+ 19 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsServerRankingParentMapper.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.gs.data.serve.dao.mapper.game.parent;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsServerRankingParent;
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * GS区服付费留存(游戏GS管理) 映射层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Mapper
+@UseDataSource("game_ads_parent")
+public interface AdsServerRankingParentMapper extends BaseMapper<AdsServerRankingParent> {
+
+
+}

+ 49 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/ServeManageDTO.java

@@ -0,0 +1,49 @@
+package com.zanxiang.game.gs.data.serve.pojo.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ServeManageDTO extends BaseListDTO {
+    @NotNull(message = "SDK来源必填")
+    @ApiModelProperty(notes = "必填:SDK来源;默认ZX_ONE")
+    private String sourceSystem;
+    @ApiModelProperty("排序字段")
+    private String sortFiled;
+    @ApiModelProperty("排序类型:升序 true;降序 false")
+    private Boolean sortAsc = true;
+
+    @ApiModelProperty("gs id 列表")
+    private List<Long> gsIdList;
+
+    @ApiModelProperty("父游戏id")
+    private Long parentGameId;
+
+    @ApiModelProperty("GS运营状态:1:独立运营;2:联合运营")
+    private Integer gsStatus;
+
+    @ApiModelProperty("超父游戏id")
+    private Integer superGameId;
+    @ApiModelProperty("角色当前所在区服id列表")
+    private List<String> serverIdList;
+
+    @ApiModelProperty("开服日期开始")
+    private LocalDate serverStartBegin;
+    @ApiModelProperty("开服日期结束")
+    private LocalDate serverStartEnd;
+
+    @ApiModelProperty("服务日期开始")
+    private LocalDate serveDayBegin;
+    @ApiModelProperty("服务日期开始")
+    private LocalDate serveDayEnd;
+
+    @ApiModelProperty("服务状态:1:服务中;2:服务完成")
+    private Integer serveStatus;
+
+}

+ 47 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/ServerPayDTO.java

@@ -0,0 +1,47 @@
+package com.zanxiang.game.gs.data.serve.pojo.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ServerPayDTO extends BaseListDTO {
+    @NotNull(message = "SDK来源必填")
+    @ApiModelProperty(notes = "必填:SDK来源;默认ZX_ONE")
+    private String sourceSystem;
+    @ApiModelProperty("排序字段")
+    private String sortFiled;
+    @ApiModelProperty("排序类型:升序 true;降序 false")
+    private Boolean sortAsc = true;
+
+    @ApiModelProperty("开服日期开始")
+    private LocalDate serverStartBegin;
+    @ApiModelProperty("开服日期结束")
+    private LocalDate serverStartEnd;
+    @ApiModelProperty("gs id 列表")
+    private List<Long> gsIdList;
+
+    @ApiModelProperty("父游戏id")
+    private Long parentGameId;
+
+    @ApiModelProperty("超父游戏id")
+    private Integer superGameId;
+    @ApiModelProperty("角色当前所在区服id列表")
+    private List<String> serverIdList;
+
+    @ApiModelProperty("服务日期开始")
+    private LocalDate serveDayBegin;
+    @ApiModelProperty("服务日期开始")
+    private LocalDate serveDayEnd;
+
+    @ApiModelProperty("服务状态:1:服务中;2:服务完成")
+    private Integer serveStatus;
+
+    @ApiModelProperty("GS运营状态:1:独立运营;2:联合运营")
+    private Integer gsStatus;
+}

+ 665 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/dw/DwGsServerAmountDayParent.java

@@ -0,0 +1,665 @@
+package com.zanxiang.game.gs.data.serve.pojo.entity.game.dw;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.Builder;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+
+import java.math.BigDecimal;
+import java.lang.Long;
+import java.time.LocalDate;
+import java.lang.String;
+
+/**
+ * Gs区服付费留存:付费金额,付费人数,累计付费人数 实体类。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "dw_gs_server_amount_day_parent")
+public class DwGsServerAmountDayParent {
+
+    /**
+     * 开服时间
+     */
+    @Column(value = "dt")
+    private LocalDate dt;
+
+    /**
+     * SDK来源
+     */
+    @Column(value = "source_system")
+    private String sourceSystem;
+
+    /**
+     * 区服切片ID
+     */
+    @Column(value = "server_id")
+    private String serverId;
+
+    /**
+     * 区服名称
+     */
+    @Column(value = "server_name")
+    private String serverName;
+
+    /**
+     * 父游戏ID
+     */
+    @Column(value = "parent_game_id")
+    private Long parentGameId;
+
+    /**
+     * 父游戏名称
+     */
+    @Column(value = "parent_game_name")
+    private String parentGameName;
+
+    /**
+     * 游戏类别
+     */
+    @Column(value = "classify")
+    private Long classify;
+
+    /**
+     * 区服累计到第1天付费人数
+     */
+    @Column(value = "da1_sum_num")
+    private Long da1SumNum;
+
+    /**
+     * 区服累计到第2天付费人数
+     */
+    @Column(value = "da2_sum_num")
+    private Long da2SumNum;
+
+    /**
+     * 区服累计到第3天付费人数
+     */
+    @Column(value = "da3_sum_num")
+    private Long da3SumNum;
+
+    /**
+     * 区服累计到第4天付费人数
+     */
+    @Column(value = "da4_sum_num")
+    private Long da4SumNum;
+
+    /**
+     * 区服累计到第5天付费人数
+     */
+    @Column(value = "da5_sum_num")
+    private Long da5SumNum;
+
+    /**
+     * 区服累计到第6天付费人数
+     */
+    @Column(value = "da6_sum_num")
+    private Long da6SumNum;
+
+    /**
+     * 区服累计到第7天付费人数
+     */
+    @Column(value = "da7_sum_num")
+    private Long da7SumNum;
+
+    /**
+     * 区服累计到第8天付费人数
+     */
+    @Column(value = "da8_sum_num")
+    private Long da8SumNum;
+
+    /**
+     * 区服累计到第9天付费人数
+     */
+    @Column(value = "da9_sum_num")
+    private Long da9SumNum;
+
+    /**
+     * 区服累计到第10天付费人数
+     */
+    @Column(value = "da10_sum_num")
+    private Long da10SumNum;
+
+    /**
+     * 区服累计到第11天付费人数
+     */
+    @Column(value = "da11_sum_num")
+    private Long da11SumNum;
+
+    /**
+     * 区服累计到第12天付费人数
+     */
+    @Column(value = "da12_sum_num")
+    private Long da12SumNum;
+
+    /**
+     * 区服累计到第13天付费人数
+     */
+    @Column(value = "da13_sum_num")
+    private Long da13SumNum;
+
+    /**
+     * 区服累计到第14天付费人数
+     */
+    @Column(value = "da14_sum_num")
+    private Long da14SumNum;
+
+    /**
+     * 区服累计到第15天付费人数
+     */
+    @Column(value = "da15_sum_num")
+    private Long da15SumNum;
+
+    /**
+     * 区服累计到第16天付费人数
+     */
+    @Column(value = "da16_sum_num")
+    private Long da16SumNum;
+
+    /**
+     * 区服累计到第17天付费人数
+     */
+    @Column(value = "da17_sum_num")
+    private Long da17SumNum;
+
+    /**
+     * 区服累计到第18天付费人数
+     */
+    @Column(value = "da18_sum_num")
+    private Long da18SumNum;
+
+    /**
+     * 区服累计到第19天付费人数
+     */
+    @Column(value = "da19_sum_num")
+    private Long da19SumNum;
+
+    /**
+     * 区服累计到第20天付费人数
+     */
+    @Column(value = "da20_sum_num")
+    private Long da20SumNum;
+
+    /**
+     * 区服累计到第21天付费人数
+     */
+    @Column(value = "da21_sum_num")
+    private Long da21SumNum;
+
+    /**
+     * 区服累计到第22天付费人数
+     */
+    @Column(value = "da22_sum_num")
+    private Long da22SumNum;
+
+    /**
+     * 区服累计到第23天付费人数
+     */
+    @Column(value = "da23_sum_num")
+    private Long da23SumNum;
+
+    /**
+     * 区服累计到第24天付费人数
+     */
+    @Column(value = "da24_sum_num")
+    private Long da24SumNum;
+
+    /**
+     * 区服累计到第25天付费人数
+     */
+    @Column(value = "da25_sum_num")
+    private Long da25SumNum;
+
+    /**
+     * 区服累计到第26天付费人数
+     */
+    @Column(value = "da26_sum_num")
+    private Long da26SumNum;
+
+    /**
+     * 区服累计到第27天付费人数
+     */
+    @Column(value = "da27_sum_num")
+    private Long da27SumNum;
+
+    /**
+     * 区服累计到第28天付费人数
+     */
+    @Column(value = "da28_sum_num")
+    private Long da28SumNum;
+
+    /**
+     * 区服累计到第29天付费人数
+     */
+    @Column(value = "da29_sum_num")
+    private Long da29SumNum;
+
+    /**
+     * 区服累计到第30天付费人数
+     */
+    @Column(value = "da30_sum_num")
+    private Long da30SumNum;
+
+    /**
+     * 区服累计到第31天付费人数
+     */
+    @Column(value = "da31_sum_num")
+    private Long da31SumNum;
+
+    /**
+     * 区服累计到第32天付费人数
+     */
+    @Column(value = "da32_sum_num")
+    private Long da32SumNum;
+
+    /**
+     * 区服累计到第33天付费人数
+     */
+    @Column(value = "da33_sum_num")
+    private Long da33SumNum;
+
+    /**
+     * 区服累计到第34天付费人数
+     */
+    @Column(value = "da34_sum_num")
+    private Long da34SumNum;
+
+    /**
+     * 区服累计到第35天付费人数
+     */
+    @Column(value = "da35_sum_num")
+    private Long da35SumNum;
+
+    /**
+     * 区服累计到第36天付费人数
+     */
+    @Column(value = "da36_sum_num")
+    private Long da36SumNum;
+
+    /**
+     * 区服累计到第37天付费人数
+     */
+    @Column(value = "da37_sum_num")
+    private Long da37SumNum;
+
+    /**
+     * 区服累计到第38天付费人数
+     */
+    @Column(value = "da38_sum_num")
+    private Long da38SumNum;
+
+    /**
+     * 区服累计到第39天付费人数
+     */
+    @Column(value = "da39_sum_num")
+    private Long da39SumNum;
+
+    /**
+     * 区服累计到第40天付费人数
+     */
+    @Column(value = "da40_sum_num")
+    private Long da40SumNum;
+
+    /**
+     * 区服累计到第41天付费人数
+     */
+    @Column(value = "da41_sum_num")
+    private Long da41SumNum;
+
+    /**
+     * 区服累计到第42天付费人数
+     */
+    @Column(value = "da42_sum_num")
+    private Long da42SumNum;
+
+    /**
+     * 区服累计到第43天付费人数
+     */
+    @Column(value = "da43_sum_num")
+    private Long da43SumNum;
+
+    /**
+     * 区服累计到第44天付费人数
+     */
+    @Column(value = "da44_sum_num")
+    private Long da44SumNum;
+
+    /**
+     * 区服累计到第45天付费人数
+     */
+    @Column(value = "da45_sum_num")
+    private Long da45SumNum;
+
+    /**
+     * 区服累计到第46天付费人数
+     */
+    @Column(value = "da46_sum_num")
+    private Long da46SumNum;
+
+    /**
+     * 区服累计到第47天付费人数
+     */
+    @Column(value = "da47_sum_num")
+    private Long da47SumNum;
+
+    /**
+     * 区服累计到第48天付费人数
+     */
+    @Column(value = "da48_sum_num")
+    private Long da48SumNum;
+
+    /**
+     * 区服累计到第49天付费人数
+     */
+    @Column(value = "da49_sum_num")
+    private Long da49SumNum;
+
+    /**
+     * 区服累计到第50天付费人数
+     */
+    @Column(value = "da50_sum_num")
+    private Long da50SumNum;
+
+    /**
+     * 区服累计到第51天付费人数
+     */
+    @Column(value = "da51_sum_num")
+    private Long da51SumNum;
+
+    /**
+     * 区服累计到第52天付费人数
+     */
+    @Column(value = "da52_sum_num")
+    private Long da52SumNum;
+
+    /**
+     * 区服累计到第53天付费人数
+     */
+    @Column(value = "da53_sum_num")
+    private Long da53SumNum;
+
+    /**
+     * 区服累计到第54天付费人数
+     */
+    @Column(value = "da54_sum_num")
+    private Long da54SumNum;
+
+    /**
+     * 区服累计到第55天付费人数
+     */
+    @Column(value = "da55_sum_num")
+    private Long da55SumNum;
+
+    /**
+     * 区服累计到第56天付费人数
+     */
+    @Column(value = "da56_sum_num")
+    private Long da56SumNum;
+
+    /**
+     * 区服累计到第57天付费人数
+     */
+    @Column(value = "da57_sum_num")
+    private Long da57SumNum;
+
+    /**
+     * 区服累计到第58天付费人数
+     */
+    @Column(value = "da58_sum_num")
+    private Long da58SumNum;
+
+    /**
+     * 区服累计到第59天付费人数
+     */
+    @Column(value = "da59_sum_num")
+    private Long da59SumNum;
+
+    /**
+     * 区服累计到第60天付费人数
+     */
+    @Column(value = "da60_sum_num")
+    private Long da60SumNum;
+
+    /**
+     * 区服累计到第61天付费人数
+     */
+    @Column(value = "da61_sum_num")
+    private Long da61SumNum;
+
+    /**
+     * 区服累计到第62天付费人数
+     */
+    @Column(value = "da62_sum_num")
+    private Long da62SumNum;
+
+    /**
+     * 区服累计到第63天付费人数
+     */
+    @Column(value = "da63_sum_num")
+    private Long da63SumNum;
+
+    /**
+     * 区服累计到第64天付费人数
+     */
+    @Column(value = "da64_sum_num")
+    private Long da64SumNum;
+
+    /**
+     * 区服累计到第65天付费人数
+     */
+    @Column(value = "da65_sum_num")
+    private Long da65SumNum;
+
+    /**
+     * 区服累计到第66天付费人数
+     */
+    @Column(value = "da66_sum_num")
+    private Long da66SumNum;
+
+    /**
+     * 区服累计到第67天付费人数
+     */
+    @Column(value = "da67_sum_num")
+    private Long da67SumNum;
+
+    /**
+     * 区服累计到第68天付费人数
+     */
+    @Column(value = "da68_sum_num")
+    private Long da68SumNum;
+
+    /**
+     * 区服累计到第69天付费人数
+     */
+    @Column(value = "da69_sum_num")
+    private Long da69SumNum;
+
+    /**
+     * 区服累计到第70天付费人数
+     */
+    @Column(value = "da70_sum_num")
+    private Long da70SumNum;
+
+    /**
+     * 区服累计到第71天付费人数
+     */
+    @Column(value = "da71_sum_num")
+    private Long da71SumNum;
+
+    /**
+     * 区服累计到第72天付费人数
+     */
+    @Column(value = "da72_sum_num")
+    private Long da72SumNum;
+
+    /**
+     * 区服累计到第73天付费人数
+     */
+    @Column(value = "da73_sum_num")
+    private Long da73SumNum;
+
+    /**
+     * 区服累计到第74天付费人数
+     */
+    @Column(value = "da74_sum_num")
+    private Long da74SumNum;
+
+    /**
+     * 区服累计到第75天付费人数
+     */
+    @Column(value = "da75_sum_num")
+    private Long da75SumNum;
+
+    /**
+     * 区服累计到第76天付费人数
+     */
+    @Column(value = "da76_sum_num")
+    private Long da76SumNum;
+
+    /**
+     * 区服累计到第77天付费人数
+     */
+    @Column(value = "da77_sum_num")
+    private Long da77SumNum;
+
+    /**
+     * 区服累计到第78天付费人数
+     */
+    @Column(value = "da78_sum_num")
+    private Long da78SumNum;
+
+    /**
+     * 区服累计到第79天付费人数
+     */
+    @Column(value = "da79_sum_num")
+    private Long da79SumNum;
+
+    /**
+     * 区服累计到第80天付费人数
+     */
+    @Column(value = "da80_sum_num")
+    private Long da80SumNum;
+
+    /**
+     * 区服累计到第81天付费人数
+     */
+    @Column(value = "da81_sum_num")
+    private Long da81SumNum;
+
+    /**
+     * 区服累计到第82天付费人数
+     */
+    @Column(value = "da82_sum_num")
+    private Long da82SumNum;
+
+    /**
+     * 区服累计到第83天付费人数
+     */
+    @Column(value = "da83_sum_num")
+    private Long da83SumNum;
+
+    /**
+     * 区服累计到第84天付费人数
+     */
+    @Column(value = "da84_sum_num")
+    private Long da84SumNum;
+
+    /**
+     * 区服累计到第85天付费人数
+     */
+    @Column(value = "da85_sum_num")
+    private Long da85SumNum;
+
+    /**
+     * 区服累计到第86天付费人数
+     */
+    @Column(value = "da86_sum_num")
+    private Long da86SumNum;
+
+    /**
+     * 区服累计到第87天付费人数
+     */
+    @Column(value = "da87_sum_num")
+    private Long da87SumNum;
+
+    /**
+     * 区服累计到第88天付费人数
+     */
+    @Column(value = "da88_sum_num")
+    private Long da88SumNum;
+
+    /**
+     * 区服累计到第89天付费人数
+     */
+    @Column(value = "da89_sum_num")
+    private Long da89SumNum;
+
+    /**
+     * 区服累计到第90天付费人数
+     */
+    @Column(value = "da90_sum_num")
+    private Long da90SumNum;
+
+    /**
+     * 区服累计到第4月付费人数
+     */
+    @Column(value = "m4_sum_num")
+    private Long m4SumNum;
+
+    /**
+     * 区服累计到第5月付费人数
+     */
+    @Column(value = "m5_sum_num")
+    private Long m5SumNum;
+
+    /**
+     * 区服累计到第6月付费人数
+     */
+    @Column(value = "m6_sum_num")
+    private Long m6SumNum;
+
+    /**
+     * 区服累计到第7月付费人数
+     */
+    @Column(value = "m7_sum_num")
+    private Long m7SumNum;
+
+    /**
+     * 区服累计到第8月付费人数
+     */
+    @Column(value = "m8_sum_num")
+    private Long m8SumNum;
+
+    /**
+     * 区服累计到第9月付费人数
+     */
+    @Column(value = "m9_sum_num")
+    private Long m9SumNum;
+
+    /**
+     * 区服累计到第10月付费人数
+     */
+    @Column(value = "m10_sum_num")
+    private Long m10SumNum;
+
+    /**
+     * 区服累计到第11月付费人数
+     */
+    @Column(value = "m11_sum_num")
+    private Long m11SumNum;
+
+    /**
+     * 区服累计到第1年付费人数
+     */
+    @Column(value = "y1_sum_num")
+    private Long y1SumNum;
+
+
+}

+ 664 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/dw/DwGsServerRoleDayParent.java

@@ -0,0 +1,664 @@
+package com.zanxiang.game.gs.data.serve.pojo.entity.game.dw;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.Builder;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+
+import java.lang.Long;
+import java.time.LocalDate;
+import java.lang.String;
+
+/**
+ * Gs区服付费留存:创角人数,累计创角人数 实体类。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "dw_gs_server_role_day_parent")
+public class DwGsServerRoleDayParent {
+
+    /**
+     * 开服时间
+     */
+    @Column(value = "dt")
+    private LocalDate dt;
+
+    /**
+     * SDK来源
+     */
+    @Column(value = "source_system")
+    private String sourceSystem;
+
+    /**
+     * 区服切片ID
+     */
+    @Column(value = "server_id")
+    private String serverId;
+
+    /**
+     * 区服名称
+     */
+    @Column(value = "server_name")
+    private String serverName;
+
+    /**
+     * 父游戏ID
+     */
+    @Column(value = "parent_game_id")
+    private Long parentGameId;
+
+    /**
+     * 父游戏名称
+     */
+    @Column(value = "parent_game_name")
+    private String parentGameName;
+
+    /**
+     * 游戏类别
+     */
+    @Column(value = "classify")
+    private Long classify;
+
+    /**
+     * 区服累计到第1天创角人数
+     */
+    @Column(value = "da1_sum_role_num")
+    private Long da1SumRoleNum;
+
+    /**
+     * 区服累计到第2天创角人数
+     */
+    @Column(value = "da2_sum_role_num")
+    private Long da2SumRoleNum;
+
+    /**
+     * 区服累计到第3天创角人数
+     */
+    @Column(value = "da3_sum_role_num")
+    private Long da3SumRoleNum;
+
+    /**
+     * 区服累计到第4天创角人数
+     */
+    @Column(value = "da4_sum_role_num")
+    private Long da4SumRoleNum;
+
+    /**
+     * 区服累计到第5天创角人数
+     */
+    @Column(value = "da5_sum_role_num")
+    private Long da5SumRoleNum;
+
+    /**
+     * 区服累计到第6天创角人数
+     */
+    @Column(value = "da6_sum_role_num")
+    private Long da6SumRoleNum;
+
+    /**
+     * 区服累计到第7天创角人数
+     */
+    @Column(value = "da7_sum_role_num")
+    private Long da7SumRoleNum;
+
+    /**
+     * 区服累计到第8天创角人数
+     */
+    @Column(value = "da8_sum_role_num")
+    private Long da8SumRoleNum;
+
+    /**
+     * 区服累计到第9天创角人数
+     */
+    @Column(value = "da9_sum_role_num")
+    private Long da9SumRoleNum;
+
+    /**
+     * 区服累计到第10天创角人数
+     */
+    @Column(value = "da10_sum_role_num")
+    private Long da10SumRoleNum;
+
+    /**
+     * 区服累计到第11天创角人数
+     */
+    @Column(value = "da11_sum_role_num")
+    private Long da11SumRoleNum;
+
+    /**
+     * 区服累计到第12天创角人数
+     */
+    @Column(value = "da12_sum_role_num")
+    private Long da12SumRoleNum;
+
+    /**
+     * 区服累计到第13天创角人数
+     */
+    @Column(value = "da13_sum_role_num")
+    private Long da13SumRoleNum;
+
+    /**
+     * 区服累计到第14天创角人数
+     */
+    @Column(value = "da14_sum_role_num")
+    private Long da14SumRoleNum;
+
+    /**
+     * 区服累计到第15天创角人数
+     */
+    @Column(value = "da15_sum_role_num")
+    private Long da15SumRoleNum;
+
+    /**
+     * 区服累计到第16天创角人数
+     */
+    @Column(value = "da16_sum_role_num")
+    private Long da16SumRoleNum;
+
+    /**
+     * 区服累计到第17天创角人数
+     */
+    @Column(value = "da17_sum_role_num")
+    private Long da17SumRoleNum;
+
+    /**
+     * 区服累计到第18天创角人数
+     */
+    @Column(value = "da18_sum_role_num")
+    private Long da18SumRoleNum;
+
+    /**
+     * 区服累计到第19天创角人数
+     */
+    @Column(value = "da19_sum_role_num")
+    private Long da19SumRoleNum;
+
+    /**
+     * 区服累计到第20天创角人数
+     */
+    @Column(value = "da20_sum_role_num")
+    private Long da20SumRoleNum;
+
+    /**
+     * 区服累计到第21天创角人数
+     */
+    @Column(value = "da21_sum_role_num")
+    private Long da21SumRoleNum;
+
+    /**
+     * 区服累计到第22天创角人数
+     */
+    @Column(value = "da22_sum_role_num")
+    private Long da22SumRoleNum;
+
+    /**
+     * 区服累计到第23天创角人数
+     */
+    @Column(value = "da23_sum_role_num")
+    private Long da23SumRoleNum;
+
+    /**
+     * 区服累计到第24天创角人数
+     */
+    @Column(value = "da24_sum_role_num")
+    private Long da24SumRoleNum;
+
+    /**
+     * 区服累计到第25天创角人数
+     */
+    @Column(value = "da25_sum_role_num")
+    private Long da25SumRoleNum;
+
+    /**
+     * 区服累计到第26天创角人数
+     */
+    @Column(value = "da26_sum_role_num")
+    private Long da26SumRoleNum;
+
+    /**
+     * 区服累计到第27天创角人数
+     */
+    @Column(value = "da27_sum_role_num")
+    private Long da27SumRoleNum;
+
+    /**
+     * 区服累计到第28天创角人数
+     */
+    @Column(value = "da28_sum_role_num")
+    private Long da28SumRoleNum;
+
+    /**
+     * 区服累计到第29天创角人数
+     */
+    @Column(value = "da29_sum_role_num")
+    private Long da29SumRoleNum;
+
+    /**
+     * 区服累计到第30天创角人数
+     */
+    @Column(value = "da30_sum_role_num")
+    private Long da30SumRoleNum;
+
+    /**
+     * 区服累计到第31天创角人数
+     */
+    @Column(value = "da31_sum_role_num")
+    private Long da31SumRoleNum;
+
+    /**
+     * 区服累计到第32天创角人数
+     */
+    @Column(value = "da32_sum_role_num")
+    private Long da32SumRoleNum;
+
+    /**
+     * 区服累计到第33天创角人数
+     */
+    @Column(value = "da33_sum_role_num")
+    private Long da33SumRoleNum;
+
+    /**
+     * 区服累计到第34天创角人数
+     */
+    @Column(value = "da34_sum_role_num")
+    private Long da34SumRoleNum;
+
+    /**
+     * 区服累计到第35天创角人数
+     */
+    @Column(value = "da35_sum_role_num")
+    private Long da35SumRoleNum;
+
+    /**
+     * 区服累计到第36天创角人数
+     */
+    @Column(value = "da36_sum_role_num")
+    private Long da36SumRoleNum;
+
+    /**
+     * 区服累计到第37天创角人数
+     */
+    @Column(value = "da37_sum_role_num")
+    private Long da37SumRoleNum;
+
+    /**
+     * 区服累计到第38天创角人数
+     */
+    @Column(value = "da38_sum_role_num")
+    private Long da38SumRoleNum;
+
+    /**
+     * 区服累计到第39天创角人数
+     */
+    @Column(value = "da39_sum_role_num")
+    private Long da39SumRoleNum;
+
+    /**
+     * 区服累计到第40天创角人数
+     */
+    @Column(value = "da40_sum_role_num")
+    private Long da40SumRoleNum;
+
+    /**
+     * 区服累计到第41天创角人数
+     */
+    @Column(value = "da41_sum_role_num")
+    private Long da41SumRoleNum;
+
+    /**
+     * 区服累计到第42天创角人数
+     */
+    @Column(value = "da42_sum_role_num")
+    private Long da42SumRoleNum;
+
+    /**
+     * 区服累计到第43天创角人数
+     */
+    @Column(value = "da43_sum_role_num")
+    private Long da43SumRoleNum;
+
+    /**
+     * 区服累计到第44天创角人数
+     */
+    @Column(value = "da44_sum_role_num")
+    private Long da44SumRoleNum;
+
+    /**
+     * 区服累计到第45天创角人数
+     */
+    @Column(value = "da45_sum_role_num")
+    private Long da45SumRoleNum;
+
+    /**
+     * 区服累计到第46天创角人数
+     */
+    @Column(value = "da46_sum_role_num")
+    private Long da46SumRoleNum;
+
+    /**
+     * 区服累计到第47天创角人数
+     */
+    @Column(value = "da47_sum_role_num")
+    private Long da47SumRoleNum;
+
+    /**
+     * 区服累计到第48天创角人数
+     */
+    @Column(value = "da48_sum_role_num")
+    private Long da48SumRoleNum;
+
+    /**
+     * 区服累计到第49天创角人数
+     */
+    @Column(value = "da49_sum_role_num")
+    private Long da49SumRoleNum;
+
+    /**
+     * 区服累计到第50天创角人数
+     */
+    @Column(value = "da50_sum_role_num")
+    private Long da50SumRoleNum;
+
+    /**
+     * 区服累计到第51天创角人数
+     */
+    @Column(value = "da51_sum_role_num")
+    private Long da51SumRoleNum;
+
+    /**
+     * 区服累计到第52天创角人数
+     */
+    @Column(value = "da52_sum_role_num")
+    private Long da52SumRoleNum;
+
+    /**
+     * 区服累计到第53天创角人数
+     */
+    @Column(value = "da53_sum_role_num")
+    private Long da53SumRoleNum;
+
+    /**
+     * 区服累计到第54天创角人数
+     */
+    @Column(value = "da54_sum_role_num")
+    private Long da54SumRoleNum;
+
+    /**
+     * 区服累计到第55天创角人数
+     */
+    @Column(value = "da55_sum_role_num")
+    private Long da55SumRoleNum;
+
+    /**
+     * 区服累计到第56天创角人数
+     */
+    @Column(value = "da56_sum_role_num")
+    private Long da56SumRoleNum;
+
+    /**
+     * 区服累计到第57天创角人数
+     */
+    @Column(value = "da57_sum_role_num")
+    private Long da57SumRoleNum;
+
+    /**
+     * 区服累计到第58天创角人数
+     */
+    @Column(value = "da58_sum_role_num")
+    private Long da58SumRoleNum;
+
+    /**
+     * 区服累计到第59天创角人数
+     */
+    @Column(value = "da59_sum_role_num")
+    private Long da59SumRoleNum;
+
+    /**
+     * 区服累计到第60天创角人数
+     */
+    @Column(value = "da60_sum_role_num")
+    private Long da60SumRoleNum;
+
+    /**
+     * 区服累计到第61天创角人数
+     */
+    @Column(value = "da61_sum_role_num")
+    private Long da61SumRoleNum;
+
+    /**
+     * 区服累计到第62天创角人数
+     */
+    @Column(value = "da62_sum_role_num")
+    private Long da62SumRoleNum;
+
+    /**
+     * 区服累计到第63天创角人数
+     */
+    @Column(value = "da63_sum_role_num")
+    private Long da63SumRoleNum;
+
+    /**
+     * 区服累计到第64天创角人数
+     */
+    @Column(value = "da64_sum_role_num")
+    private Long da64SumRoleNum;
+
+    /**
+     * 区服累计到第65天创角人数
+     */
+    @Column(value = "da65_sum_role_num")
+    private Long da65SumRoleNum;
+
+    /**
+     * 区服累计到第66天创角人数
+     */
+    @Column(value = "da66_sum_role_num")
+    private Long da66SumRoleNum;
+
+    /**
+     * 区服累计到第67天创角人数
+     */
+    @Column(value = "da67_sum_role_num")
+    private Long da67SumRoleNum;
+
+    /**
+     * 区服累计到第68天创角人数
+     */
+    @Column(value = "da68_sum_role_num")
+    private Long da68SumRoleNum;
+
+    /**
+     * 区服累计到第69天创角人数
+     */
+    @Column(value = "da69_sum_role_num")
+    private Long da69SumRoleNum;
+
+    /**
+     * 区服累计到第70天创角人数
+     */
+    @Column(value = "da70_sum_role_num")
+    private Long da70SumRoleNum;
+
+    /**
+     * 区服累计到第71天创角人数
+     */
+    @Column(value = "da71_sum_role_num")
+    private Long da71SumRoleNum;
+
+    /**
+     * 区服累计到第72天创角人数
+     */
+    @Column(value = "da72_sum_role_num")
+    private Long da72SumRoleNum;
+
+    /**
+     * 区服累计到第73天创角人数
+     */
+    @Column(value = "da73_sum_role_num")
+    private Long da73SumRoleNum;
+
+    /**
+     * 区服累计到第74天创角人数
+     */
+    @Column(value = "da74_sum_role_num")
+    private Long da74SumRoleNum;
+
+    /**
+     * 区服累计到第75天创角人数
+     */
+    @Column(value = "da75_sum_role_num")
+    private Long da75SumRoleNum;
+
+    /**
+     * 区服累计到第76天创角人数
+     */
+    @Column(value = "da76_sum_role_num")
+    private Long da76SumRoleNum;
+
+    /**
+     * 区服累计到第77天创角人数
+     */
+    @Column(value = "da77_sum_role_num")
+    private Long da77SumRoleNum;
+
+    /**
+     * 区服累计到第78天创角人数
+     */
+    @Column(value = "da78_sum_role_num")
+    private Long da78SumRoleNum;
+
+    /**
+     * 区服累计到第79天创角人数
+     */
+    @Column(value = "da79_sum_role_num")
+    private Long da79SumRoleNum;
+
+    /**
+     * 区服累计到第80天创角人数
+     */
+    @Column(value = "da80_sum_role_num")
+    private Long da80SumRoleNum;
+
+    /**
+     * 区服累计到第81天创角人数
+     */
+    @Column(value = "da81_sum_role_num")
+    private Long da81SumRoleNum;
+
+    /**
+     * 区服累计到第82天创角人数
+     */
+    @Column(value = "da82_sum_role_num")
+    private Long da82SumRoleNum;
+
+    /**
+     * 区服累计到第83天创角人数
+     */
+    @Column(value = "da83_sum_role_num")
+    private Long da83SumRoleNum;
+
+    /**
+     * 区服累计到第84天创角人数
+     */
+    @Column(value = "da84_sum_role_num")
+    private Long da84SumRoleNum;
+
+    /**
+     * 区服累计到第85天创角人数
+     */
+    @Column(value = "da85_sum_role_num")
+    private Long da85SumRoleNum;
+
+    /**
+     * 区服累计到第86天创角人数
+     */
+    @Column(value = "da86_sum_role_num")
+    private Long da86SumRoleNum;
+
+    /**
+     * 区服累计到第87天创角人数
+     */
+    @Column(value = "da87_sum_role_num")
+    private Long da87SumRoleNum;
+
+    /**
+     * 区服累计到第88天创角人数
+     */
+    @Column(value = "da88_sum_role_num")
+    private Long da88SumRoleNum;
+
+    /**
+     * 区服累计到第89天创角人数
+     */
+    @Column(value = "da89_sum_role_num")
+    private Long da89SumRoleNum;
+
+    /**
+     * 区服累计到第90天创角人数
+     */
+    @Column(value = "da90_sum_role_num")
+    private Long da90SumRoleNum;
+
+    /**
+     * 区服累计到第4月创角人数
+     */
+    @Column(value = "m4_sum_role_num")
+    private Long m4SumRoleNum;
+
+    /**
+     * 区服累计到第5月创角人数
+     */
+    @Column(value = "m5_sum_role_num")
+    private Long m5SumRoleNum;
+
+    /**
+     * 区服累计到第6月创角人数
+     */
+    @Column(value = "m6_sum_role_num")
+    private Long m6SumRoleNum;
+
+    /**
+     * 区服累计到第7月创角人数
+     */
+    @Column(value = "m7_sum_role_num")
+    private Long m7SumRoleNum;
+
+    /**
+     * 区服累计到第8月创角人数
+     */
+    @Column(value = "m8_sum_role_num")
+    private Long m8SumRoleNum;
+
+    /**
+     * 区服累计到第9月创角人数
+     */
+    @Column(value = "m9_sum_role_num")
+    private Long m9SumRoleNum;
+
+    /**
+     * 区服累计到第10月创角人数
+     */
+    @Column(value = "m10_sum_role_num")
+    private Long m10SumRoleNum;
+
+    /**
+     * 区服累计到第11月创角人数
+     */
+    @Column(value = "m11_sum_role_num")
+    private Long m11SumRoleNum;
+
+    /**
+     * 区服累计到第1年创角人数
+     */
+    @Column(value = "y1_sum_role_num")
+    private Long y1SumRoleNum;
+
+
+}

+ 88 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsGameServerGsActiveRDayParent.java

@@ -0,0 +1,88 @@
+package com.zanxiang.game.gs.data.serve.pojo.entity.game.parent;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.Builder;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+
+import java.lang.Long;
+import java.time.LocalDate;
+import java.lang.String;
+
+/**
+ * 游戏GS区服付费留存(某R人数) 实体类。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "ads_game_server_gs_active_r_day_parent")
+public class AdsGameServerGsActiveRDayParent {
+
+    /**
+     * SDK来源
+     */
+    @Column(value = "source_system")
+    private String sourceSystem;
+
+    /**
+     * 开服时间
+     */
+    @Column(value = "dt")
+    private LocalDate dt;
+
+    /**
+     * 充值时间
+     */
+    @Column(value = "order_day")
+    private LocalDate orderDay;
+
+    /**
+     * 区服ID
+     */
+    @Column(value = "server_id")
+    private String serverId;
+
+    /**
+     * 游戏ID
+     */
+    @Column(value = "parent_game_id")
+    private String parentGameId;
+
+    /**
+     * 小R人数
+     */
+    @Column(value = "small_r")
+    private Long smallR;
+
+    /**
+     * 中R人数
+     */
+    @Column(value = "centre_r")
+    private Long centreR;
+
+    /**
+     * 大R人数
+     */
+    @Column(value = "big_r")
+    private Long bigR;
+
+    /**
+     * 超R人数
+     */
+    @Column(value = "super_large_r")
+    private Long superLargeR;
+
+    /**
+     * 总R人数
+     */
+    @Column(value = "total_r")
+    private Long totalR;
+
+
+}

+ 773 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsGsServerDayParent.java

@@ -0,0 +1,773 @@
+package com.zanxiang.game.gs.data.serve.pojo.entity.game.parent;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.Builder;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+
+import java.math.BigDecimal;
+import java.lang.Long;
+import java.time.LocalDate;
+import java.lang.String;
+
+/**
+ * GS区服付费留存(游戏GS管理) 实体类。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "ads_gs_server_day_parent")
+public class AdsGsServerDayParent {
+
+    /**
+     * 开服时间
+     */
+    @Column(value = "start_time")
+    private LocalDate startTime;
+
+    /**
+     * SDK来源
+     */
+    @Column(value = "source_system")
+    private String sourceSystem;
+
+    /**
+     * 父游戏ID
+     */
+    @Column(value = "parent_game_id")
+    private String parentGameId;
+
+    /**
+     * 区服ID
+     */
+    @Column(value = "server_id")
+    private String serverId;
+
+    /**
+     * 超父游戏ID
+     */
+    @Column(value = "super_game_id")
+    private String superGameId;
+
+    /**
+     * 结束时间(无合服记录默认:2099-01-01)
+     */
+    @Column(value = "end_time")
+    private LocalDate endTime;
+
+    /**
+     * 游戏名称
+     */
+    @Column(value = "parent_game_name")
+    private String parentGameName;
+
+    /**
+     * 区服名称
+     */
+    @Column(value = "server_name")
+    private String serverName;
+
+    /**
+     * GsID
+     */
+    @Column(value = "gs_ids")
+    private String gsIds;
+
+    /**
+     * 客服id
+     */
+    @Column(value = "customer_ids")
+    private String customerIds;
+
+    /**
+     * 指派期间创角人数(合服)
+     */
+    @Column(value = "total_role_num")
+    private Long totalRoleNum;
+
+    /**
+     * 指派期间付费人数(合服)
+     */
+    @Column(value = "total_amount_num")
+    private Long totalAmountNum;
+
+    /**
+     * 指派期间付费次数(合服)
+     */
+    @Column(value = "total_amount_count")
+    private Long totalAmountCount;
+
+    /**
+     * 指派期间付费金额(合服)
+     */
+    @Column(value = "total_amount")
+    private BigDecimal totalAmount;
+
+    /**
+     * 指派期间ARPPU (人均付费金额)(合服)
+     */
+    @Column(value = "arppu")
+    private BigDecimal arppu;
+
+    /**
+     * 指派期间客单价(合服)
+     */
+    @Column(value = "avg_amount")
+    private BigDecimal avgAmount;
+
+    /**
+     * 指派期间付费率(合服)
+     */
+    @Column(value = "amount_rate")
+    private BigDecimal amountRate;
+
+    /**
+     * 创角人数(子服)
+     */
+    @Column(value = "son_role_num")
+    private Long sonRoleNum;
+
+    /**
+     * 付费人数(子服)
+     */
+    @Column(value = "son_server_amount_num")
+    private Long sonServerAmountNum;
+
+    /**
+     * 付费次数(子服)
+     */
+    @Column(value = "son_server_amount_count")
+    private Long sonServerAmountCount;
+
+    /**
+     * 付费金额(子服)
+     */
+    @Column(value = "son_server_amount")
+    private BigDecimal sonServerAmount;
+
+    /**
+     * ARPPU (人均付费金额)(子服)
+     */
+    @Column(value = "son_arppu")
+    private BigDecimal sonArppu;
+
+    /**
+     * 客单价(子服)
+     */
+    @Column(value = "son_avg_amount")
+    private BigDecimal sonAvgAmount;
+
+    /**
+     * 付费率(子服)
+     */
+    @Column(value = "son_amount_rate")
+    private BigDecimal sonAmountRate;
+
+    /**
+     * 区服第1天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da1")
+    private String da1;
+
+    /**
+     * 区服在第2天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da2")
+    private String da2;
+
+    /**
+     * 区服在第3天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da3")
+    private String da3;
+
+    /**
+     * 区服在第4天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da4")
+    private String da4;
+
+    /**
+     * 区服在第5天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da5")
+    private String da5;
+
+    /**
+     * 区服在第6天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da6")
+    private String da6;
+
+    /**
+     * 区服在第7天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da7")
+    private String da7;
+
+    /**
+     * 区服在第8天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da8")
+    private String da8;
+
+    /**
+     * 区服在第9天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da9")
+    private String da9;
+
+    /**
+     * 区服在第10天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da10")
+    private String da10;
+
+    /**
+     * 区服在第11天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da11")
+    private String da11;
+
+    /**
+     * 区服在第12天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da12")
+    private String da12;
+
+    /**
+     * 区服在第13天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da13")
+    private String da13;
+
+    /**
+     * 区服在第14天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da14")
+    private String da14;
+
+    /**
+     * 区服在第15天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da15")
+    private String da15;
+
+    /**
+     * 区服在第16天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da16")
+    private String da16;
+
+    /**
+     * 区服在第17天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da17")
+    private String da17;
+
+    /**
+     * 区服在第18天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da18")
+    private String da18;
+
+    /**
+     * 区服在第19天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da19")
+    private String da19;
+
+    /**
+     * 区服在第20天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da20")
+    private String da20;
+
+    /**
+     * 区服在第21天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da21")
+    private String da21;
+
+    /**
+     * 区服在第22天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da22")
+    private String da22;
+
+    /**
+     * 区服在第23天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da23")
+    private String da23;
+
+    /**
+     * 区服在第24天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da24")
+    private String da24;
+
+    /**
+     * 区服在第25天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da25")
+    private String da25;
+
+    /**
+     * 区服在第26天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da26")
+    private String da26;
+
+    /**
+     * 区服在第27天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da27")
+    private String da27;
+
+    /**
+     * 区服在第28天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da28")
+    private String da28;
+
+    /**
+     * 区服在第29天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da29")
+    private String da29;
+
+    /**
+     * 区服在第30天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da30")
+    private String da30;
+
+    /**
+     * 区服在第31天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da31")
+    private String da31;
+
+    /**
+     * 区服在第32天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da32")
+    private String da32;
+
+    /**
+     * 区服在第33天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da33")
+    private String da33;
+
+    /**
+     * 区服在第34天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da34")
+    private String da34;
+
+    /**
+     * 区服在第35天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da35")
+    private String da35;
+
+    /**
+     * 区服在第36天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da36")
+    private String da36;
+
+    /**
+     * 区服在第37天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da37")
+    private String da37;
+
+    /**
+     * 区服在第38天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da38")
+    private String da38;
+
+    /**
+     * 区服在第39天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da39")
+    private String da39;
+
+    /**
+     * 区服在第40天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da40")
+    private String da40;
+
+    /**
+     * 区服在第41天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da41")
+    private String da41;
+
+    /**
+     * 区服在第42天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da42")
+    private String da42;
+
+    /**
+     * 区服在第43天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da43")
+    private String da43;
+
+    /**
+     * 区服在第44天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da44")
+    private String da44;
+
+    /**
+     * 区服在第45天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da45")
+    private String da45;
+
+    /**
+     * 区服在第46天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da46")
+    private String da46;
+
+    /**
+     * 区服在第47天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da47")
+    private String da47;
+
+    /**
+     * 区服在第48天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da48")
+    private String da48;
+
+    /**
+     * 区服在第49天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da49")
+    private String da49;
+
+    /**
+     * 区服在第50天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da50")
+    private String da50;
+
+    /**
+     * 区服在第51天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da51")
+    private String da51;
+
+    /**
+     * 区服在第52天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da52")
+    private String da52;
+
+    /**
+     * 区服在第53天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da53")
+    private String da53;
+
+    /**
+     * 区服在第54天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da54")
+    private String da54;
+
+    /**
+     * 区服在第55天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da55")
+    private String da55;
+
+    /**
+     * 区服在第56天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da56")
+    private String da56;
+
+    /**
+     * 区服在第57天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da57")
+    private String da57;
+
+    /**
+     * 区服在第58天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da58")
+    private String da58;
+
+    /**
+     * 区服在第59天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da59")
+    private String da59;
+
+    /**
+     * 区服在第60天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da60")
+    private String da60;
+
+    /**
+     * 区服在第61天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da61")
+    private String da61;
+
+    /**
+     * 区服在第62天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da62")
+    private String da62;
+
+    /**
+     * 区服在第63天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da63")
+    private String da63;
+
+    /**
+     * 区服在第64天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da64")
+    private String da64;
+
+    /**
+     * 区服在第65天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da65")
+    private String da65;
+
+    /**
+     * 区服在第66天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da66")
+    private String da66;
+
+    /**
+     * 区服在第67天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da67")
+    private String da67;
+
+    /**
+     * 区服在第68天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da68")
+    private String da68;
+
+    /**
+     * 区服在第69天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da69")
+    private String da69;
+
+    /**
+     * 区服在第70天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da70")
+    private String da70;
+
+    /**
+     * 区服在第71天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da71")
+    private String da71;
+
+    /**
+     * 区服在第72天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da72")
+    private String da72;
+
+    /**
+     * 区服在第73天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da73")
+    private String da73;
+
+    /**
+     * 区服在第74天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da74")
+    private String da74;
+
+    /**
+     * 区服在第75天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da75")
+    private String da75;
+
+    /**
+     * 区服在第76天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da76")
+    private String da76;
+
+    /**
+     * 区服在第77天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da77")
+    private String da77;
+
+    /**
+     * 区服在第78天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da78")
+    private String da78;
+
+    /**
+     * 区服在第79天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da79")
+    private String da79;
+
+    /**
+     * 区服在第80天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da80")
+    private String da80;
+
+    /**
+     * 区服在第81天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da81")
+    private String da81;
+
+    /**
+     * 区服在第82天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da82")
+    private String da82;
+
+    /**
+     * 区服在第83天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da83")
+    private String da83;
+
+    /**
+     * 区服在第84天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da84")
+    private String da84;
+
+    /**
+     * 区服在第85天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da85")
+    private String da85;
+
+    /**
+     * 区服在第86天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da86")
+    private String da86;
+
+    /**
+     * 区服在第87天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da87")
+    private String da87;
+
+    /**
+     * 区服在第88天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da88")
+    private String da88;
+
+    /**
+     * 区服在第89天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da89")
+    private String da89;
+
+    /**
+     * 区服在第90天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da90")
+    private String da90;
+
+    /**
+     * 区服在第4月:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m4")
+    private String m4;
+
+    /**
+     * 区服在第5月:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m5")
+    private String m5;
+
+    /**
+     * 区服在第6月:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m6")
+    private String m6;
+
+    /**
+     * 区服在第7月:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m7")
+    private String m7;
+
+    /**
+     * 区服在第8月:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m8")
+    private String m8;
+
+    /**
+     * 区服在第9月:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m9")
+    private String m9;
+
+    /**
+     * 区服在第10月:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m10")
+    private String m10;
+
+    /**
+     * 区服在第11月:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m11")
+    private String m11;
+
+    /**
+     * 区服在第1年:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m12")
+    private String m12;
+
+    /**
+     * 区服至今:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "total")
+    private String total;
+
+
+}

+ 251 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsServerRankingParent.java

@@ -0,0 +1,251 @@
+package com.zanxiang.game.gs.data.serve.pojo.entity.game.parent;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.Builder;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+
+import java.math.BigDecimal;
+import java.lang.Long;
+import java.time.LocalDate;
+import java.lang.String;
+
+/**
+ * GS区服付费留存(游戏GS管理) 实体类。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "ads_server_ranking_parent")
+public class AdsServerRankingParent {
+
+    /**
+     * 主键id
+     */
+    @Column(value = "uuid")
+    private String uuid;
+
+    /**
+     * 开服时间
+     */
+    @Column(value = "start_time")
+    private LocalDate startTime;
+
+    /**
+     * SDK来源
+     */
+    @Column(value = "source_system")
+    private String sourceSystem;
+
+    /**
+     * 父游戏ID
+     */
+    @Column(value = "parent_game_id")
+    private String parentGameId;
+
+    /**
+     * 区服ID
+     */
+    @Column(value = "server_id")
+    private String serverId;
+
+    /**
+     * 超父游戏ID
+     */
+    @Column(value = "super_game_id")
+    private String superGameId;
+
+    /**
+     * 结束时间(无合服记录默认:2099-01-01)
+     */
+    @Column(value = "end_time")
+    private LocalDate endTime;
+
+    /**
+     * 游戏名称
+     */
+    @Column(value = "parent_game_name")
+    private String parentGameName;
+
+    /**
+     * 区服名称
+     */
+    @Column(value = "server_name")
+    private String serverName;
+
+    /**
+     * GsID
+     */
+    @Column(value = "gs_ids")
+    private String gsIds;
+
+    /**
+     * 客服id
+     */
+    @Column(value = "customer_ids")
+    private String customerIds;
+
+    /**
+     * 指派期间创角人数(合服)
+     */
+    @Column(value = "total_role_num")
+    private Long totalRoleNum;
+
+    /**
+     * 指派期间付费人数(合服)
+     */
+    @Column(value = "total_amount_num")
+    private Long totalAmountNum;
+
+    /**
+     * 指派期间付费次数(合服)
+     */
+    @Column(value = "total_amount_count")
+    private Long totalAmountCount;
+
+    /**
+     * 指派期间付费金额(合服)
+     */
+    @Column(value = "total_amount")
+    private BigDecimal totalAmount;
+
+    /**
+     * 指派期间付费率(合服)
+     */
+    @Column(value = "amount_rate")
+    private BigDecimal amountRate;
+
+    /**
+     * 创角人数(子服)
+     */
+    @Column(value = "son_role_num")
+    private Long sonRoleNum;
+
+    /**
+     * 付费人数(子服)
+     */
+    @Column(value = "son_server_amount_num")
+    private Long sonServerAmountNum;
+
+    /**
+     * 付费次数(子服)
+     */
+    @Column(value = "son_server_amount_count")
+    private Long sonServerAmountCount;
+
+    /**
+     * 付费金额(子服)
+     */
+    @Column(value = "son_server_amount")
+    private BigDecimal sonServerAmount;
+
+    /**
+     * 付费率(子服)
+     */
+    @Column(value = "son_amount_rate")
+    private BigDecimal sonAmountRate;
+
+    /**
+     * 区服ID-(无用)
+     */
+    @Column(value = "server_id_ranking")
+    private String serverIdRanking;
+
+    /**
+     * 战力排名-父游戏-(无用)
+     */
+    @Column(value = "parent_game_id_ranking")
+    private String parentGameIdRanking;
+
+    /**
+     * 战力排名-角色ID
+     */
+    @Column(value = "combat_role_id")
+    private String combatRoleId;
+
+    /**
+     * 战力排名-角色名称
+     */
+    @Column(value = "combat_role_name")
+    private String combatRoleName;
+
+    /**
+     * 战力排名-角色国家
+     */
+    @Column(value = "combat_country")
+    private String combatCountry;
+
+    /**
+     * 战力排名-角色战力
+     */
+    @Column(value = "combat_total_role_combat_num")
+    private Long combatTotalRoleCombatNum;
+
+    /**
+     * 战力排名-角色等级
+     */
+    @Column(value = "combat_role_level")
+    private Long combatRoleLevel;
+
+    /**
+     * 战力排名-TOP10
+     */
+    @Column(value = "combat_num")
+    private Long combatNum;
+
+    /**
+     * 战力排名-角色付费金额
+     */
+    @Column(value = "combat_amount")
+    private BigDecimal combatAmount;
+
+    /**
+     * 付费排名-角色ID
+     */
+    @Column(value = "amount_role_id")
+    private String amountRoleId;
+
+    /**
+     * 付费排名-角色名称
+     */
+    @Column(value = "amount_role_name")
+    private String amountRoleName;
+
+    /**
+     * 付费排名-付费金额
+     */
+    @Column(value = "amount_role_total_amount")
+    private BigDecimal amountRoleTotalAmount;
+
+    /**
+     * 付费排名-国家
+     */
+    @Column(value = "amount_country")
+    private String amountCountry;
+
+    /**
+     * 付费排名-角色战力
+     */
+    @Column(value = "amount_total_role_combat_num")
+    private Long amountTotalRoleCombatNum;
+
+    /**
+     * 付费排名-角色等级
+     */
+    @Column(value = "amount_role_level")
+    private Long amountRoleLevel;
+
+    /**
+     * 付费排名-TOP10
+     */
+    @Column(value = "amount_num")
+    private Long amountNum;
+
+
+}

+ 63 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/GsRTotalVO.java

@@ -0,0 +1,63 @@
+package com.zanxiang.game.gs.data.serve.pojo.vo;
+
+import com.mybatisflex.annotation.Column;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class GsRTotalVO {
+
+    /**
+     * SDK来源
+     */
+    private String sourceSystem;
+
+    /**
+     * 开服时间
+     */
+    private LocalDate dt;
+
+    /**
+     * 区服ID
+     */
+    private String serverId;
+
+    /**
+     * 游戏ID
+     */
+    private String parentGameId;
+
+    /**
+     * 小R人数
+     */
+    private String smallR;
+
+    /**
+     * 中R人数
+     */
+    private String centreR;
+
+    /**
+     * 大R人数
+     */
+    private String bigR;
+
+    /**
+     * 超R人数
+     */
+    private String superLargeR;
+
+    /**
+     * 总R人数
+     */
+    private String totalR;
+
+
+}

+ 185 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/ServeManageVO.java

@@ -0,0 +1,185 @@
+package com.zanxiang.game.gs.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+public class ServeManageVO {
+    @ApiModelProperty("超父游戏id")
+    private Long superGameId;
+    @ApiModelProperty("当前区服ID")
+    private String endServerId;
+
+    @ApiModelProperty("是否原始服")
+    private Boolean originServer;
+
+    @ApiModelProperty("父游戏ID")
+    private Integer parentGameId;
+    @ApiModelProperty("父游戏名称")
+    private String parentGameName;
+
+    @ApiModelProperty("GsID")
+    private String gsIds;
+    @ApiModelProperty("gs 名称")
+    private String gsName;
+
+    @ApiModelProperty("GS运营状态:1:独立运营;2:联合运营")
+    private Integer gsStatus;
+
+    @ApiModelProperty("开服时间")
+    private LocalDate startTime;
+    @ApiModelProperty("开服天数")
+    private long startDiff;
+
+    @ApiModelProperty("区服ID")
+    private String serverId;
+    @ApiModelProperty("区服名称")
+    private String serverName;
+
+    @ApiModelProperty("结束时间(无合服记录默认:2099-01-01)")
+    private LocalDate endTime;
+    @ApiModelProperty("服务天数")
+    private long serveDiff;
+
+    @ApiModelProperty("GS服务状态:0:服务中;1:服务完成")
+    private Boolean serveStatus;
+
+    @ApiModelProperty("指派期间创角人数(合服)")
+    private Long totalRoleNum;
+
+    @ApiModelProperty("指派期间付费人数(合服)")
+    private Long totalAmountNum;
+
+    @ApiModelProperty("指派期间付费次数(合服)")
+    private Long totalAmountCount;
+
+    @ApiModelProperty("指派期间付费金额(合服)")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty("指派期间付费率(合服)")
+    private BigDecimal amountRate;
+
+    @ApiModelProperty("创角人数(子服)")
+    private Long sonRoleNum;
+
+    @ApiModelProperty("付费人数(子服)")
+    private Long sonServerAmountNum;
+
+    @ApiModelProperty("付费次数(子服)")
+    private Long sonServerAmountCount;
+
+    @ApiModelProperty("付费金额(子服)")
+    private BigDecimal sonServerAmount;
+
+    @ApiModelProperty("付费率(子服)")
+    private BigDecimal sonAmountRate;
+
+    @ApiModelProperty("使用字段:combatRankList,战力排名-角色ID")
+    private String combatRoleId;
+
+    @ApiModelProperty("战力排名-角色名称")
+    private String combatRoleName;
+
+    @ApiModelProperty("战力排名-角色国家")
+    private String combatCountry;
+
+    @ApiModelProperty("战力排名-角色战力")
+    private Long combatTotalRoleCombatNum;
+
+    @ApiModelProperty("战力排名-角色等级")
+    private Long combatRoleLevel;
+
+    @ApiModelProperty("战力排名-TOP10")
+    private Long combatNum;
+
+    @ApiModelProperty("战力排名-角色付费金额")
+    private BigDecimal combatAmount;
+
+    @ApiModelProperty("使用字段:amountRankList,付费排名-角色ID")
+    private String amountRoleId;
+
+    @ApiModelProperty("付费排名-角色名称")
+    private String amountRoleName;
+
+    @ApiModelProperty("付费排名-付费金额")
+    private BigDecimal amountRoleTotalAmount;
+
+    @ApiModelProperty("付费排名-国家")
+    private String amountCountry;
+
+    @ApiModelProperty("付费排名-角色战力")
+    private Long amountTotalRoleCombatNum;
+
+    @ApiModelProperty("付费排名-角色等级")
+    private Long amountRoleLevel;
+
+    @ApiModelProperty("付费排名-TOP10")
+    private Long amountNum;
+
+    @ApiModelProperty("战力排名-列表")
+    private List<CombatRank> combatRankList;
+
+    @ApiModelProperty("付费排名-列表")
+    private List<AmountRank> amountRankList;
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class CombatRank{
+        @ApiModelProperty("战力排名-角色ID")
+        private String combatRoleId;
+
+        @ApiModelProperty("战力排名-角色名称")
+        private String combatRoleName;
+
+        @ApiModelProperty("战力排名-角色国家")
+        private String combatCountry;
+
+        @ApiModelProperty("战力排名-角色战力")
+        private Long combatTotalRoleCombatNum;
+
+        @ApiModelProperty("战力排名-角色等级")
+        private Long combatRoleLevel;
+
+        @ApiModelProperty("战力排名-TOP10")
+        private Long combatNum;
+
+        @ApiModelProperty("战力排名-角色付费金额")
+        private BigDecimal combatAmount;
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class AmountRank{
+        @ApiModelProperty("付费排名-角色ID")
+        private String amountRoleId;
+
+        @ApiModelProperty("付费排名-角色名称")
+        private String amountRoleName;
+
+        @ApiModelProperty("付费排名-付费金额")
+        private BigDecimal amountRoleTotalAmount;
+
+        @ApiModelProperty("付费排名-国家")
+        private String amountCountry;
+
+        @ApiModelProperty("付费排名-角色战力")
+        private Long amountTotalRoleCombatNum;
+
+        @ApiModelProperty("付费排名-角色等级")
+        private Long amountRoleLevel;
+
+        @ApiModelProperty("付费排名-TOP10")
+        private Long amountNum;
+    }
+}

+ 381 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/ServerPayVO.java

@@ -0,0 +1,381 @@
+package com.zanxiang.game.gs.data.serve.pojo.vo;
+
+import com.mybatisflex.annotation.Column;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ServerPayVO {
+
+    /**
+     * gsID
+     */
+    @ApiModelProperty("gsID")
+    private String gsIds;
+
+    @ApiModelProperty("gs 名称")
+    private String gsName;
+
+    @ApiModelProperty("父游戏 名称")
+    private String parentGameName;
+
+    @ApiModelProperty("父游戏 名称")
+    private String parentGameId;
+
+    private Long superGameId;
+
+    @ApiModelProperty("GS运营状态:1:独立运营;2:联合运营")
+    private Integer gsStatus;
+
+    @ApiModelProperty("区服id")
+    private String serverId;
+
+    @ApiModelProperty("区服名称")
+    private String serverName;
+
+    @ApiModelProperty("是否原始服")
+    private Boolean originServer;
+
+    @ApiModelProperty("开服时间(也是服务开始时间)")
+    private LocalDate startTime;
+
+    @ApiModelProperty("开服天数")
+    private long startDiff;
+
+    @ApiModelProperty("服务结束时间(无合服记录默认:2099-01-01)")
+    private LocalDate endTime;
+
+    @ApiModelProperty("服务天数")
+    private long serveDiff;
+
+    @ApiModelProperty("GS服务状态:0:服务中;1:服务完成")
+    private Boolean serveStatus;
+
+    @ApiModelProperty("指派期间创角人数(合服)")
+    private Long totalRoleNum;
+
+    /**
+     * 指派期间付费人数(合服)
+     */
+    @ApiModelProperty("指派期间付费人数(合服)")
+    private Long totalAmountNum;
+
+    /**
+     * 指派期间付费次数(合服)
+     */
+    @ApiModelProperty("指派期间付费次数(合服)")
+    private Long totalAmountCount;
+
+    /**
+     * 指派期间付费金额(合服)
+     */
+    @ApiModelProperty("指派期间付费金额(合服)")
+    private BigDecimal totalAmount;
+
+    /**
+     * 指派期间ARPPU (人均付费金额)(合服)
+     */
+    @ApiModelProperty("指派期间ARPPU (人均付费金额)(合服)")
+    private BigDecimal arppu;
+
+    /**
+     * 指派期间客单价(合服)
+     */
+    @ApiModelProperty("指派期间客单价(合服)")
+    private BigDecimal avgAmount;
+
+    /**
+     * 指派期间付费率(合服)
+     */
+    @ApiModelProperty("指派期间付费率(合服)")
+    private BigDecimal amountRate;
+
+    /**
+     * 创角人数(子服)
+     */
+    @ApiModelProperty("创角人数(子服)")
+    private Long sonRoleNum;
+
+    /**
+     * 付费人数(子服)
+     */
+    @ApiModelProperty("付费人数(子服)")
+    private Long sonServerAmountNum;
+
+    /**
+     * 付费次数(子服)
+     */
+    @ApiModelProperty("付费次数(子服)")
+    private Long sonServerAmountCount;
+
+    /**
+     * 付费金额(子服)
+     */
+    @ApiModelProperty("付费金额(子服)")
+    private BigDecimal sonServerAmount;
+
+    /**
+     * ARPPU (人均付费金额)(子服)
+     */
+    @ApiModelProperty("ARPPU (人均付费金额)(子服)")
+    private BigDecimal sonArppu;
+
+    /**
+     * 客单价(子服)
+     */
+    @ApiModelProperty("客单价(子服)")
+    private BigDecimal sonAvgAmount;
+
+    /**
+     * 付费率(子服)
+     */
+    @ApiModelProperty("付费率(子服)")
+    private BigDecimal sonAmountRate;
+
+    @ApiModelProperty("非展示字段:区服第1天:活跃人数/付费人数/累计付费人数/付费金额/付费率/活跃留存率/付费留存率")
+    private String da1;
+    private String da2;
+    private String da3;
+    private String da4;
+    private String da5;
+    private String da6;
+    private String da7;
+    private String da8;
+    private String da9;
+    private String da10;
+    private String da11;
+    private String da12;
+    private String da13;
+    private String da14;
+    private String da15;
+    private String da16;
+    private String da17;
+    private String da18;
+    private String da19;
+    private String da20;
+    private String da21;
+    private String da22;
+    private String da23;
+    private String da24;
+    private String da25;
+    private String da26;
+    private String da27;
+    private String da28;
+    private String da29;
+    private String da30;
+    private String da31;
+    private String da32;
+    private String da33;
+    private String da34;
+    private String da35;
+    private String da36;
+    private String da37;
+    private String da38;
+    private String da39;
+    private String da40;
+    private String da41;
+    private String da42;
+    private String da43;
+    private String da44;
+    private String da45;
+    private String da46;
+    private String da47;
+    private String da48;
+    private String da49;
+    private String da50;
+    private String da51;
+    private String da52;
+    private String da53;
+    private String da54;
+    private String da55;
+    private String da56;
+    private String da57;
+    private String da58;
+    private String da59;
+    private String da60;
+    private String da61;
+    private String da62;
+    private String da63;
+    private String da64;
+    private String da65;
+    private String da66;
+    private String da67;
+    private String da68;
+    private String da69;
+    private String da70;
+    private String da71;
+    private String da72;
+    private String da73;
+    private String da74;
+    private String da75;
+    private String da76;
+    private String da77;
+    private String da78;
+    private String da79;
+    private String da80;
+    private String da81;
+    private String da82;
+    private String da83;
+    private String da84;
+    private String da85;
+    private String da86;
+    private String da87;
+    private String da88;
+    private String da89;
+    private String da90;
+    private String total;
+
+    private DayN retainedDa1;
+    private DayN retainedDa2;
+    private DayN retainedDa3;
+    private DayN retainedDa4;
+    private DayN retainedDa5;
+    private DayN retainedDa6;
+    private DayN retainedDa7;
+    private DayN retainedDa8;
+    private DayN retainedDa9;
+    private DayN retainedDa10;
+    private DayN retainedDa11;
+    private DayN retainedDa12;
+    private DayN retainedDa13;
+    private DayN retainedDa14;
+    private DayN retainedDa15;
+    private DayN retainedDa16;
+    private DayN retainedDa17;
+    private DayN retainedDa18;
+    private DayN retainedDa19;
+    private DayN retainedDa20;
+    private DayN retainedDa21;
+    private DayN retainedDa22;
+    private DayN retainedDa23;
+    private DayN retainedDa24;
+    private DayN retainedDa25;
+    private DayN retainedDa26;
+    private DayN retainedDa27;
+    private DayN retainedDa28;
+    private DayN retainedDa29;
+    private DayN retainedDa30;
+    private DayN retainedDa31;
+    private DayN retainedDa32;
+    private DayN retainedDa33;
+    private DayN retainedDa34;
+    private DayN retainedDa35;
+    private DayN retainedDa36;
+    private DayN retainedDa37;
+    private DayN retainedDa38;
+    private DayN retainedDa39;
+    private DayN retainedDa40;
+    private DayN retainedDa41;
+    private DayN retainedDa42;
+    private DayN retainedDa43;
+    private DayN retainedDa44;
+    private DayN retainedDa45;
+    private DayN retainedDa46;
+    private DayN retainedDa47;
+    private DayN retainedDa48;
+    private DayN retainedDa49;
+    private DayN retainedDa50;
+    private DayN retainedDa51;
+    private DayN retainedDa52;
+    private DayN retainedDa53;
+    private DayN retainedDa54;
+    private DayN retainedDa55;
+    private DayN retainedDa56;
+    private DayN retainedDa57;
+    private DayN retainedDa58;
+    private DayN retainedDa59;
+    private DayN retainedDa60;
+    private DayN retainedDa61;
+    private DayN retainedDa62;
+    private DayN retainedDa63;
+    private DayN retainedDa64;
+    private DayN retainedDa65;
+    private DayN retainedDa66;
+    private DayN retainedDa67;
+    private DayN retainedDa68;
+    private DayN retainedDa69;
+    private DayN retainedDa70;
+    private DayN retainedDa71;
+    private DayN retainedDa72;
+    private DayN retainedDa73;
+    private DayN retainedDa74;
+    private DayN retainedDa75;
+    private DayN retainedDa76;
+    private DayN retainedDa77;
+    private DayN retainedDa78;
+    private DayN retainedDa79;
+    private DayN retainedDa80;
+    private DayN retainedDa81;
+    private DayN retainedDa82;
+    private DayN retainedDa83;
+    private DayN retainedDa84;
+    private DayN retainedDa85;
+    private DayN retainedDa86;
+    private DayN retainedDa87;
+    private DayN retainedDa88;
+    private DayN retainedDa89;
+    private DayN retainedDa90;
+    private DayN retainedTotal;
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class DayN{
+        @ApiModelProperty("用户人数:活跃人数")
+        private long activeNum;
+        @ApiModelProperty("用户人数:付费人数")
+        private long payNum;
+        @ApiModelProperty("用户人数:累计付费人数")
+        private long totalPayNum;
+        @ApiModelProperty("用户人数:小R人数")
+        private long sRNum;
+        @ApiModelProperty("用户人数:中R人数")
+        private long mRNum;
+        @ApiModelProperty("用户人数:大R人数")
+        private long bRNum;
+        @ApiModelProperty("用户人数:超R人数")
+        private long superRNum;
+        @ApiModelProperty("用户人数:R总人数")
+        private long totalRNum;
+
+        @ApiModelProperty("付费金额:付费金额")
+        private BigDecimal payMoney;
+
+        @ApiModelProperty("用户占比:付费率=付费人数/活跃人数")
+        private BigDecimal payRate;
+        @ApiModelProperty("用户占比:小R付费比=小R付费人数/付费人数")
+        private BigDecimal sRRate;
+        @ApiModelProperty("用户占比:中R付费比=中R付费人数/付费人数")
+        private BigDecimal mRRate;
+        @ApiModelProperty("用户占比:大R付费比=大R付费人数/付费人数")
+        private BigDecimal bRRate;
+        @ApiModelProperty("用户占比:超R付费比=超R付费人数/付费人数")
+        private BigDecimal superRRate;
+
+        @ApiModelProperty("留存率:活跃留存率=第n天的活跃人数/累计到第n天创角总人数")
+        private BigDecimal activeRetainedRate;
+        @ApiModelProperty("留存率:付费留存率=第n天的付费人数/累计到第n天付费总人数")
+        private BigDecimal payRetainedRate;
+        @ApiModelProperty("留存率:小R留存率=第n天的小R人数/累计到第n天付费总人数")
+        private BigDecimal sRRetainedRate;
+        @ApiModelProperty("留存率:中R留存率=第n天的中R人数/累计到第n天付费总人数")
+        private BigDecimal mRRetainedRate;
+        @ApiModelProperty("留存率:大R留存率=第n天的大R人数/累计到第n天付费总人数")
+        private BigDecimal bRRetainedRate;
+        @ApiModelProperty("留存率:超R留存=第n天的超R人数/累计到第n天付费总人数")
+        private BigDecimal superRRetainedRate;
+        @ApiModelProperty("留存率:R总留存率=R总人数/累计到第那天付费总人数")
+        private BigDecimal totalRRetainedRate;
+    }
+
+}

+ 15 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsGameServerGsActiveRDayParentService.java

@@ -0,0 +1,15 @@
+package com.zanxiang.game.gs.data.serve.service;
+
+
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGameServerGsActiveRDayParent;
+import com.mybatisflex.core.service.IService;
+
+/**
+ * 游戏GS区服付费留存(某R人数) 服务层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+public interface IAdsGameServerGsActiveRDayParentService extends IService<AdsGameServerGsActiveRDayParent> {
+
+}

+ 22 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsGsServerDayParentService.java

@@ -0,0 +1,22 @@
+package com.zanxiang.game.gs.data.serve.service;
+
+
+import com.mybatisflex.core.row.Row;
+import com.zanxiang.game.gs.data.serve.pojo.dto.ServerPayDTO;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGsServerDayParent;
+import com.mybatisflex.core.service.IService;
+import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.ServerPayVO;
+
+/**
+ * GS区服付费留存(游戏GS管理) 服务层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+public interface IAdsGsServerDayParentService extends IService<AdsGsServerDayParent> {
+
+    PageVO<ServerPayVO, Row> serverPay(ServerPayDTO dto);
+
+    ServerPayVO serverPayTotal(ServerPayDTO dto);
+}

+ 20 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsServerRankingParentService.java

@@ -0,0 +1,20 @@
+package com.zanxiang.game.gs.data.serve.service;
+
+
+import com.mybatisflex.core.row.Row;
+import com.zanxiang.game.gs.data.serve.pojo.dto.ServeManageDTO;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsServerRankingParent;
+import com.mybatisflex.core.service.IService;
+import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.ServeManageVO;
+
+/**
+ * GS区服付费留存(游戏GS管理) 服务层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+public interface IAdsServerRankingParentService extends IService<AdsServerRankingParent> {
+
+    PageVO<ServeManageVO, Row> serveManage(ServeManageDTO dto);
+}

+ 15 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IDwGsServerAmountDayParentService.java

@@ -0,0 +1,15 @@
+package com.zanxiang.game.gs.data.serve.service;
+
+
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.DwGsServerAmountDayParent;
+import com.mybatisflex.core.service.IService;
+
+/**
+ * Gs区服付费留存:付费金额,付费人数,累计付费人数 服务层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+public interface IDwGsServerAmountDayParentService extends IService<DwGsServerAmountDayParent> {
+
+}

+ 15 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IDwGsServerRoleDayParentService.java

@@ -0,0 +1,15 @@
+package com.zanxiang.game.gs.data.serve.service;
+
+
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.DwGsServerRoleDayParent;
+import com.mybatisflex.core.service.IService;
+
+/**
+ * Gs区服付费留存:创角人数,累计创角人数 服务层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+public interface IDwGsServerRoleDayParentService extends IService<DwGsServerRoleDayParent> {
+
+}

+ 1 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IGameServerSonMergeService.java

@@ -16,4 +16,5 @@ import java.util.Map;
 public interface IGameServerSonMergeService extends IService<GameServerSonMerge> {
     Map<Long, Map<String, String>> gameServerMap(String sourceSystem, Collection<String> serverIdList);
 
+    Map<Long, Map<String, Integer>> gameServerOriginMap(String sourceSystem, Collection<String> serverIdList);
 }

+ 19 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsGameServerGsActiveRDayParentServiceImpl.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.gs.data.serve.service.impl;
+
+
+import org.springframework.stereotype.Service;
+import com.zanxiang.game.gs.data.serve.service.IAdsGameServerGsActiveRDayParentService;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGameServerGsActiveRDayParent;
+import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsGameServerGsActiveRDayParentMapper;
+import com.mybatisflex.spring.service.impl.ServiceImpl;
+
+/**
+ * 游戏GS区服付费留存(某R人数) 服务层实现。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Service
+public class AdsGameServerGsActiveRDayParentServiceImpl extends ServiceImpl<AdsGameServerGsActiveRDayParentMapper, AdsGameServerGsActiveRDayParent> implements IAdsGameServerGsActiveRDayParentService {
+
+}

+ 592 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsGsServerDayParentServiceImpl.java

@@ -0,0 +1,592 @@
+package com.zanxiang.game.gs.data.serve.service.impl;
+
+
+import com.google.common.base.CaseFormat;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.mybatisflex.core.row.Row;
+import com.zanxiang.game.gs.data.serve.pojo.dto.ServerPayDTO;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGameServerGsActiveRDayParent;
+import com.zanxiang.game.gs.data.serve.pojo.vo.GsRTotalVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.ServerPayVO;
+import com.zanxiang.game.gs.data.serve.service.IAdsGameServerGsActiveRDayParentService;
+import com.zanxiang.game.gs.data.serve.service.IGameServerSonMergeService;
+import com.zanxiang.game.gs.data.serve.service.ISysUserService;
+import com.zanxiang.module.util.DateUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+import com.zanxiang.game.gs.data.serve.service.IAdsGsServerDayParentService;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGsServerDayParent;
+import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsGsServerDayParentMapper;
+import com.mybatisflex.spring.service.impl.ServiceImpl;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.mybatisflex.core.query.QueryMethods.ifNull;
+import static com.mybatisflex.core.query.QueryMethods.sum;
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.table.DwGsServerAmountDayParentTableDef.DW_GS_SERVER_AMOUNT_DAY_PARENT;
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.table.DwGsServerRoleDayParentTableDef.DW_GS_SERVER_ROLE_DAY_PARENT;
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsGameServerGsActiveRDayParentTableDef.ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT;
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsGsServerDayParentTableDef.ADS_GS_SERVER_DAY_PARENT;
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsRoleAmountDataParentTableDef.ADS_ROLE_AMOUNT_DATA_PARENT;
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsRoleAmountRateParentTableDef.ADS_ROLE_AMOUNT_RATE_PARENT;
+
+/**
+ * GS区服付费留存(游戏GS管理) 服务层实现。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Service
+public class AdsGsServerDayParentServiceImpl extends ServiceImpl<AdsGsServerDayParentMapper, AdsGsServerDayParent> implements IAdsGsServerDayParentService {
+    @Resource
+    private ISysUserService sysUserService;
+    @Resource
+    private IGameServerSonMergeService serverSonMergeService;
+    @Resource
+    private IAdsGameServerGsActiveRDayParentService rDayParentService;
+
+    @Override
+    public PageVO<ServerPayVO, Row> serverPay(ServerPayDTO dto) {
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT.getName());
+        } else {
+            String column = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled());
+            dto.setSortFiled(column);
+        }
+        QueryWrapper wrapper = getServePayWrapper(dto);
+
+        Page<ServerPayVO> paginate = getMapper().paginateAs(dto.getPageNum(), dto.getPageSize(), wrapper, ServerPayVO.class);
+        if (0 == paginate.getTotalRow()) {
+            return PageVO.empty(dto);
+        }
+        List<ServerPayVO> records = paginate.getRecords();
+
+        Set<String> serverIdList = records.stream().map(ServerPayVO::getServerId).collect(Collectors.toSet());
+
+        Set<Long> gsIdList = new HashSet<>();
+        records.stream().map(ServerPayVO::getGsIds)
+                .filter(item -> StringUtils.isNotBlank(item) && !"null".equals(item))
+                .forEach(gsIds -> {
+                    List<String> gsIdStr = Arrays.asList(gsIds.split(","));
+                    Set<Long> collect = gsIdStr.stream().map(Long::valueOf).collect(Collectors.toSet());
+                    gsIdList.addAll(collect);
+                });
+        // GS名称查询
+        Map<Long, String> sysUserMap = CollectionUtils.isEmpty(gsIdList) ? null : sysUserService.getSysUserMap(gsIdList);
+        // 是否原始服
+        Map<Long, Map<String, Integer>> serverOriginMap = serverSonMergeService.gameServerOriginMap(dto.getSourceSystem(), serverIdList);
+        // R数据查询
+        String uniqueServeList = records.stream().map(item -> item.getParentGameId() + "_" + item.getServerId())
+                .map(item -> "'" + item + "'")
+                .collect(Collectors.joining(", "));
+        List<AdsGameServerGsActiveRDayParent> rDayParentList = rDayParentService.list(getDayServeRWrapper(uniqueServeList, dto.getSourceSystem()));
+        Map<String, List<AdsGameServerGsActiveRDayParent>> rDayMap = rDayParentList.stream().collect(Collectors.groupingBy(rDayParent -> rDayParent.getParentGameId() + "_" + rDayParent.getServerId()));
+
+        //获取所有的da字段
+        List<Field> fieldList = Arrays.stream(ServerPayVO.class.getDeclaredFields())
+                .filter(field -> field.getName().contains("da"))
+                .peek(field -> field.setAccessible(true))
+                .collect(Collectors.toList());
+
+        //获取所有的da对应的retainedDa
+        List<Field> fieldObjectList = Arrays.stream(ServerPayVO.class.getDeclaredFields())
+                .filter(field -> field.getName().contains("retainedDa"))
+                .peek(field -> field.setAccessible(true))
+                .collect(Collectors.toList());
+        records.forEach(record -> {
+            // 基础信息
+            String gsIds = record.getGsIds();
+            if (StringUtils.isNotBlank(gsIds) && !"null".equals(gsIds)) {
+                List<String> gsIdStr = Arrays.asList(gsIds.split(","));
+                record.setGsStatus(gsIdStr.size() == 1 ? 1 : 2);
+                Set<String> collect = gsIdStr.stream().map(Long::valueOf)
+                        .map(gsId -> sysUserMap != null ? sysUserMap.get(gsId) : null)
+                        .collect(Collectors.toSet());
+                record.setGsName(StringUtils.join(collect, ","));
+            }
+            Integer original = null == serverOriginMap.get(record.getSuperGameId()) ? null : serverOriginMap.get(record.getSuperGameId()).get(record.getServerId());
+            record.setOriginServer(null == original ? null : 1 == original);
+
+            record.setStartDiff(DateUtil.intervalOfDays(record.getStartTime(), LocalDate.now()));
+            record.setServeDiff(record.getEndTime().isBefore(LocalDate.now()) ? DateUtil.intervalOfDays(record.getStartTime(), record.getEndTime())
+                    : DateUtil.intervalOfDays(record.getStartTime(), LocalDate.now()));
+            record.setServeStatus(record.getEndTime().isBefore(LocalDate.now()));
+
+            // R数据计算
+            List<AdsGameServerGsActiveRDayParent> rDataList = rDayMap.get(record.getParentGameId() + "_" + record.getServerId());
+
+            // Da的总计
+            String totalRDa;
+            String totalDa = record.getTotal();
+            if (CollectionUtils.isNotEmpty(rDataList)) {
+                long sumSR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getSmallR).sum();
+                long sumMR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getCentreR).sum();
+                long sumBR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getBigR).sum();
+                long sumSuperR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getSuperLargeR).sum();
+                long sumTotalR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getTotalR).sum();
+
+                AdsGameServerGsActiveRDayParent build = AdsGameServerGsActiveRDayParent.builder()
+                        .smallR(sumSR)
+                        .centreR(sumMR)
+                        .bigR(sumBR)
+                        .superLargeR(sumSuperR)
+                        .totalR(sumTotalR)
+                        .build();
+
+                //累计充值人数
+                String[] split = totalDa.split("/");
+                totalRDa = getRDataStr(build, Long.valueOf(split[2]), Long.valueOf(split[1]));
+            } else {
+                // 小R付费比 7/中R付费比 8/大R付费比 9/超R付费比 10/小R留存率 11/中R留存率 12/大R留存率 13/超R留存率 14/R总留存率 15/小R人数 16/中R人数 17/大R人数 18/超R人数 19/总R人数 20
+                totalRDa = "0/0/0/0/0/0/0/0/0/0/0/0/0/0";
+            }
+            totalDa +=  "/" + totalRDa;
+            String[] totalSplit = totalDa.split("/");
+            ServerPayVO.DayN retentionTotal = ServerPayVO.DayN.builder()
+                    .activeNum(Long.parseLong(totalSplit[0]))
+                    .payNum(Long.parseLong(totalSplit[1]))
+                    .totalPayNum(Long.parseLong(totalSplit[2]))
+                    .sRNum(Long.parseLong(totalSplit[16]))
+                    .mRNum(Long.parseLong(totalSplit[17]))
+                    .bRNum(Long.parseLong(totalSplit[18]))
+                    .superRNum(Long.parseLong(totalSplit[19]))
+                    .totalRNum(Long.parseLong(totalSplit[20]))
+                    .payMoney(new BigDecimal(totalSplit[3]))
+                    .payRate(new BigDecimal(totalSplit[4]))
+                    .sRRate(new BigDecimal(totalSplit[7]))
+                    .mRRate(new BigDecimal(totalSplit[8]))
+                    .bRRate(new BigDecimal(totalSplit[9]))
+                    .superRRate(new BigDecimal(totalSplit[10]))
+                    .activeRetainedRate(new BigDecimal(totalSplit[5]))
+                    .payRetainedRate(new BigDecimal(totalSplit[6]))
+                    .sRRetainedRate(new BigDecimal(totalSplit[11]))
+                    .mRRetainedRate(new BigDecimal(totalSplit[12]))
+                    .bRRetainedRate(new BigDecimal(totalSplit[13]))
+                    .superRRetainedRate(new BigDecimal(totalSplit[14]))
+                    .totalRRetainedRate(new BigDecimal(totalSplit[15]))
+                    .build();
+            record.setRetainedTotal(retentionTotal);
+
+            // Da的90天
+            for (int i = 0; i < fieldList.size(); i++) {
+                try {
+                    Field field = fieldList.get(i);
+                    // 活跃人数 0/付费人数 1/累计付费人数 2/付费金额 3/付费率 4/活跃留存率 5/付费留存率 6
+                    String da = (String) field.get(record);
+                    String rDa;
+                    if (rDataList != null && rDataList.size() >= i + 1) {
+                        //累计充值人数
+                        String[] split = da.split("/");
+                        AdsGameServerGsActiveRDayParent gsGameServerDayRVO = rDataList.get(i);
+                        rDa = getRDataStr(gsGameServerDayRVO, Long.valueOf(split[2]), Long.valueOf(split[1]));
+                    } else {
+                        // 小R付费比 7/中R付费比 8/大R付费比 9/超R付费比 10/小R留存率 11/中R留存率 12/大R留存率 13/超R留存率 14/R总留存率 15/小R人数 16/中R人数 17/大R人数 18/超R人数 19/总R人数 20
+                        rDa = "0/0/0/0/0/0/0/0/0/0/0/0/0/0";
+                    }
+                    da = removeLastPart(da) + "/" + rDa;
+                    String[] split = da.split("/");
+                    ServerPayVO.DayN retentionVO = ServerPayVO.DayN.builder()
+                            .activeNum(Long.parseLong(split[0]))
+                            .payNum(Long.parseLong(split[1]))
+                            .totalPayNum(Long.parseLong(split[2]))
+                            .sRNum(Long.parseLong(split[16]))
+                            .mRNum(Long.parseLong(split[17]))
+                            .bRNum(Long.parseLong(split[18]))
+                            .superRNum(Long.parseLong(split[19]))
+                            .totalRNum(Long.parseLong(split[20]))
+                            .payMoney(new BigDecimal(split[3]))
+                            .payRate(new BigDecimal(split[4]))
+                            .sRRate(new BigDecimal(split[7]))
+                            .mRRate(new BigDecimal(split[8]))
+                            .bRRate(new BigDecimal(split[9]))
+                            .superRRate(new BigDecimal(split[10]))
+                            .activeRetainedRate(new BigDecimal(split[5]))
+                            .payRetainedRate(new BigDecimal(split[6]))
+                            .sRRetainedRate(new BigDecimal(split[11]))
+                            .mRRetainedRate(new BigDecimal(split[12]))
+                            .bRRetainedRate(new BigDecimal(split[13]))
+                            .superRRetainedRate(new BigDecimal(split[14]))
+                            .totalRRetainedRate(new BigDecimal(split[15]))
+                            .build();
+                    fieldObjectList.get(i).set(record, retentionVO);
+                } catch (IllegalAccessException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+        return new PageVO<>(paginate);
+    }
+
+    /**
+     * 拼接R留存率  (R/充值总人数)
+     *
+     * @param rvo
+     * @param payNum
+     * @return
+     */
+    private String getRDataStr(AdsGameServerGsActiveRDayParent rvo, Long totalPayNum, Long payNum) {
+        String rateD = "";
+        String payRateD = "";
+        if (rvo != null && totalPayNum != null && totalPayNum != 0) {
+            //R人数
+            Long smallRCount = rvo.getSmallR();
+            Long mediumRCount = rvo.getCentreR();
+            Long largeRCont = rvo.getBigR();
+            Long superRCount = rvo.getSuperLargeR();
+            //R总
+            long totalRCount = rvo.getTotalR();
+            //R留存率
+            BigDecimal smallRate = rRate(smallRCount, totalPayNum);
+            BigDecimal mediumRate = rRate(mediumRCount, totalPayNum);
+            BigDecimal largeRate = rRate(largeRCont, totalPayNum);
+            BigDecimal superRate = rRate(superRCount, totalPayNum);
+            //R总留存
+            BigDecimal rTotalRate = rRate(totalRCount, totalPayNum);
+            rateD = smallRate + "/" + mediumRate + "/" + largeRate + "/" + superRate + "/" + rTotalRate + "/" + smallRCount + "/" + mediumRCount + "/" + largeRCont + "/" + superRCount + "/" + totalRCount;
+        } else {
+            // 小R留存率/中R留存率/大R留存率/超R留存率/R总留存率/小R人数/中R人数/大R人数/超R人数/总R人数
+            rateD = "0/0/0/0/0/0/0/0/0/0";
+        }
+
+        if (rvo != null && payNum != null && payNum != 0) {
+            //R人数
+            Long smallRCount = rvo.getSmallR();
+            Long mediumRCount = rvo.getCentreR();
+            Long largeRCont = rvo.getBigR();
+            Long superRCount = rvo.getSuperLargeR();
+
+            //R付费比
+            BigDecimal smallPayRate = rRate(smallRCount, payNum);
+            BigDecimal mediumPayRate = rRate(mediumRCount, payNum);
+            BigDecimal largePayRate = rRate(largeRCont, payNum);
+            BigDecimal superPayRate = rRate(superRCount, payNum);
+            payRateD = smallPayRate + "/" + mediumPayRate + "/" + largePayRate + "/" + superPayRate + "/";
+        } else {
+            // 小R付费比/中R付费比/大R付费比/超R付费比
+            payRateD = "0/0/0/0/";
+        }
+        return payRateD + rateD;
+    }
+
+    public String removeLastPart(String str) {
+        if (str.contains("/")) {
+            // 查找最后一个斜杠的索引
+            int lastSlashIndex = str.lastIndexOf("/");
+            // 查找倒数第二个斜杠的索引
+            int secondLastSlashIndex = str.substring(0, lastSlashIndex).lastIndexOf("/");
+
+            // 如果倒数第二个斜杠的索引是-1,说明没有倒数第二个斜杠
+            if (secondLastSlashIndex == -1) {
+                return null;
+            }
+            return str.substring(0, secondLastSlashIndex);
+        } else {
+            return str;
+        }
+    }
+
+    private BigDecimal rRate(Long molecule, Long denominator) {
+        return new BigDecimal(molecule).divide(new BigDecimal(denominator), 4, RoundingMode.HALF_UP).setScale(2, RoundingMode.DOWN);
+    }
+
+    private QueryWrapper getDayServeRWrapper(String uniqueServeList, String sourceSystem) {
+        return QueryWrapper.create()
+                .from(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT)
+                .select(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.ALL_COLUMNS)
+                .eq(AdsGameServerGsActiveRDayParent::getSourceSystem, sourceSystem)
+                .and("CONCAT_WS('_', parent_game_id, server_id) IN (" + uniqueServeList + ")");
+    }
+
+    private QueryWrapper getTotalServeRWrapper(ServerPayDTO dto) {
+        QueryWrapper queryWrapper = QueryWrapper.create()
+                .from(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT)
+                .leftJoin(ADS_GS_SERVER_DAY_PARENT)
+                .on(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SOURCE_SYSTEM.eq(ADS_GS_SERVER_DAY_PARENT.SOURCE_SYSTEM)
+                        .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.DT.eq(ADS_GS_SERVER_DAY_PARENT.START_TIME)
+                                .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.PARENT_GAME_ID.eq(ADS_GS_SERVER_DAY_PARENT.PARENT_GAME_ID))
+                                .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SERVER_ID.eq(ADS_GS_SERVER_DAY_PARENT.SERVER_ID))))
+                .select("GROUP_CONCAT(CONCAT(CAST(small_r AS CHAR))) as small_r")
+                .select("GROUP_CONCAT(CONCAT(CAST(centre_r AS CHAR))) as centre_r")
+                .select("GROUP_CONCAT(CONCAT(CAST(big_r AS CHAR))) as big_r")
+                .select("GROUP_CONCAT(CONCAT(CAST(super_large_r AS CHAR))) as super_large_r")
+                .select("GROUP_CONCAT(CONCAT(CAST(total_r AS CHAR))) as total_r")
+                .groupBy(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.DT)
+                .groupBy(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SOURCE_SYSTEM)
+                .groupBy(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.PARENT_GAME_ID)
+                .groupBy(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SERVER_ID);
+        condition(dto, queryWrapper);
+        return queryWrapper;
+    }
+
+    private QueryWrapper getAllServeRWrapper(ServerPayDTO dto) {
+        QueryWrapper queryWrapper = QueryWrapper.create()
+                .from(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT)
+                .leftJoin(ADS_GS_SERVER_DAY_PARENT)
+                .on(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SOURCE_SYSTEM.eq(ADS_GS_SERVER_DAY_PARENT.SOURCE_SYSTEM)
+                        .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.DT.eq(ADS_GS_SERVER_DAY_PARENT.START_TIME)
+                                .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.PARENT_GAME_ID.eq(ADS_GS_SERVER_DAY_PARENT.PARENT_GAME_ID))
+                                .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SERVER_ID.eq(ADS_GS_SERVER_DAY_PARENT.SERVER_ID))))
+                .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SMALL_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SMALL_R.getName()))
+                .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.CENTRE_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.CENTRE_R.getName()))
+                .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.BIG_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.BIG_R.getName()))
+                .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SUPER_LARGE_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SUPER_LARGE_R.getName()))
+                .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.TOTAL_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.TOTAL_R.getName()));
+        condition(dto, queryWrapper);
+        return queryWrapper;
+    }
+
+    private QueryWrapper getServePayWrapper(ServerPayDTO dto) {
+        QueryWrapper queryWrapper = QueryWrapper.create()
+                .from(ADS_GS_SERVER_DAY_PARENT)
+                .select(ADS_GS_SERVER_DAY_PARENT.ALL_COLUMNS)
+                .orderBy(dto.getSortFiled(), dto.getSortAsc());
+        condition(dto, queryWrapper);
+        return queryWrapper;
+    }
+
+    private QueryWrapper getServePayTotalWrapper(ServerPayDTO dto) {
+        QueryWrapper queryWrapper = QueryWrapper.create()
+                .from(ADS_GS_SERVER_DAY_PARENT)
+                .select(getDayN())
+                .select(sum(ADS_GS_SERVER_DAY_PARENT.TOTAL_ROLE_NUM).as(ADS_GS_SERVER_DAY_PARENT.TOTAL_ROLE_NUM.getName()))
+                .select(sum(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT_NUM).as(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT_NUM.getName()))
+                .select(sum(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT_COUNT).as(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT_COUNT.getName()))
+                .select(sum(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT).as(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT.getName()))
+                .select("ROUND(IF(SUM(total_amount_num) > 0 , SUM(total_amount) / SUM(total_amount_num), 0), 4) AS arppu")
+                .select("ROUND(IF(SUM(total_amount_count) > 0 , SUM(total_amount) / SUM(total_amount_count), 0), 4) AS avg_amount")
+                .select("ROUND(IF(SUM(total_role_num) > 0 , SUM(total_amount_num) / SUM(total_role_num), 0), 4) AS amount_rate")
+                .select(sum(ADS_GS_SERVER_DAY_PARENT.SON_ROLE_NUM).as(ADS_GS_SERVER_DAY_PARENT.SON_ROLE_NUM.getName()))
+                .select(sum(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT_NUM).as(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT_NUM.getName()))
+                .select(sum(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT_COUNT).as(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT_COUNT.getName()))
+                .select(sum(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT).as(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT.getName()))
+                .select("ROUND(IF(SUM(son_server_amount_num) > 0 , SUM(son_server_amount) / SUM(son_server_amount_num), 0), 4) AS son_arppu")
+                .select("ROUND(IF(SUM(son_server_amount_count) > 0 , SUM(son_server_amount) / SUM(son_server_amount_count), 0), 4) AS son_avg_amount")
+                .select("ROUND(IF(SUM(son_role_num) > 0 , SUM(son_server_amount_num) / SUM(son_role_num), 0), 4) AS son_amount_rate");
+        condition(dto, queryWrapper);
+        return queryWrapper;
+    }
+
+    private static void condition(ServerPayDTO dto, QueryWrapper queryWrapper) {
+        queryWrapper.eq(AdsGsServerDayParent::getSourceSystem, dto.getSourceSystem())
+                .ge(AdsGsServerDayParent::getStartTime, dto.getServerStartBegin(), null != dto.getServerStartBegin())
+                .le(AdsGsServerDayParent::getStartTime, dto.getServerStartEnd(), null != dto.getServerStartEnd())
+                .ge(AdsGsServerDayParent::getStartTime, dto.getServeDayBegin(), null != dto.getServeDayBegin())
+                .le(AdsGsServerDayParent::getEndTime, dto.getServeDayEnd(), null != dto.getServeDayEnd())
+                .eq(AdsGsServerDayParent::getSuperGameId, dto.getSuperGameId(), null != dto.getSuperGameId())
+                .eq(AdsGsServerDayParent::getParentGameId, dto.getParentGameId(), null != dto.getParentGameId())
+                .in(AdsGsServerDayParent::getServerId, dto.getServerIdList(), CollectionUtils.isNotEmpty(dto.getServerIdList()))
+                .ge(AdsGsServerDayParent::getEndTime, LocalDate.now(), null != dto.getServeStatus() && 1 == dto.getServeStatus())
+                .le(AdsGsServerDayParent::getEndTime, LocalDate.now(), null != dto.getServeStatus() && 2 == dto.getServeStatus());
+        if (CollectionUtils.isNotEmpty(dto.getGsIdList())) {
+            StringBuilder gsSql = new StringBuilder();
+            dto.getGsIdList().forEach(gsId -> {
+                gsSql.append(String.format(" FIND_IN_SET(%s, gs_ids) > 0", gsId));
+                gsSql.append(" OR ");
+            });
+            gsSql.setLength(gsSql.length() - 4);
+            queryWrapper.and(gsSql.toString());
+        }
+        if (null != dto.getGsStatus() && 1 == dto.getGsStatus()) {
+            queryWrapper.and("gs_ids != 'null' and LENGTH(gs_ids) - LENGTH(REPLACE(gs_ids, ',', '')) + 1 = 1");
+        }
+
+        if (null != dto.getGsStatus() && 2 == dto.getGsStatus()) {
+            queryWrapper.and("gs_ids != 'null' and LENGTH(gs_ids) - LENGTH(REPLACE(gs_ids, ',', '')) + 1 > 1");
+        }
+    }
+
+    private String getDayN() {
+        StringBuilder currDayN = new StringBuilder(StringUtils.EMPTY);
+        for (int day = 1; day <= 90; day++) {
+            String dayN = "da" + day;
+            daySplit(currDayN, dayN);
+        }
+        String total = "total";
+        dayTotalSplit(currDayN, total);
+        // 移除最后一个逗号和空格
+        if (currDayN.length() > 0) {
+            currDayN.setLength(currDayN.length() - 2);
+        }
+        //返回结果
+        return currDayN.toString();
+    }
+
+    private void daySplit(StringBuilder totalDayN, String dayN) {
+        totalDayN.append(" CONCAT_WS('/', ")
+                .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 1)), 0), ")
+                .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 2)), 0), ")
+                .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 3)), 0), ")
+                .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 4)), 0), ")
+                .append("ROUND(IF(SUM(SPLIT_PART(").append(dayN).append(", '/', 1)) > 0, ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 2)) / SUM(SPLIT_PART(").append(dayN).append(", '/', 1)), 0), 4), ")
+
+                .append("ROUND(IF(SUM(SPLIT_PART(").append(dayN).append(", '/', 8)) > 0, ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 1)) / SUM(SPLIT_PART(").append(dayN).append(", '/', 8)), 0), 4), ")
+
+                .append("ROUND(IF(SUM(SPLIT_PART(").append(dayN).append(", '/', 9)) > 0, ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 2)) / SUM(SPLIT_PART(").append(dayN).append(", '/', 9)), 0), 4)) ")
+                .append("as ").append(dayN).append(", ");
+    }
+
+    private void dayTotalSplit(StringBuilder totalDayN, String dayN) {
+        totalDayN.append(" CONCAT_WS('/', ")
+                .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 1)), 0), ")
+                .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 2)), 0), ")
+                .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 3)), 0), ")
+                .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 4)), 0), ")
+                .append("ROUND(IF(SUM(SPLIT_PART(").append(dayN).append(", '/', 1)) > 0, ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 2)) / SUM(SPLIT_PART(").append(dayN).append(", '/', 1)), 0), 4), ")
+                .append("ROUND(IF(SUM(son_role_num) > 0, SUM(SPLIT_PART(").append(dayN).append(", '/', 1)) / SUM(son_role_num), 0), 4), ")
+                .append("ROUND(IF(SUM(son_server_amount_num) > 0, SUM(SPLIT_PART(").append(dayN).append(", '/', 2)) / SUM(son_server_amount_num), 0), 4)) ")
+                .append("as ").append(dayN).append(", ");
+    }
+
+    @Override
+    public ServerPayVO serverPayTotal(ServerPayDTO dto) {
+        QueryWrapper wrapper = getServePayTotalWrapper(dto);
+
+        ServerPayVO serverPayVO = getMapper().selectOneByQueryAs(wrapper, ServerPayVO.class);
+        if (null == serverPayVO) {
+            return ServerPayVO.builder().build();
+        }
+        // R数据查询
+        List<GsRTotalVO> rDayParentList = rDayParentService.listAs(getTotalServeRWrapper(dto), GsRTotalVO.class);
+        AdsGameServerGsActiveRDayParent allRData = rDayParentService.getOne(getAllServeRWrapper(dto));
+
+        //获取所有的da字段
+        List<Field> fieldList = Arrays.stream(ServerPayVO.class.getDeclaredFields())
+                .filter(field -> field.getName().contains("da"))
+                .peek(field -> field.setAccessible(true))
+                .collect(Collectors.toList());
+
+        //获取所有的da对应的retainedDa
+        List<Field> fieldObjectList = Arrays.stream(ServerPayVO.class.getDeclaredFields())
+                .filter(field -> field.getName().contains("retainedDa"))
+                .peek(field -> field.setAccessible(true))
+                .collect(Collectors.toList());
+
+        Map<Integer, AdsGameServerGsActiveRDayParent> dayRVOMap = new HashMap<>();
+        for (GsRTotalVO rData : rDayParentList) {
+            if (StringUtils.isEmpty(rData.getSmallR())) {
+                continue;
+            }
+            String[] smallRs = rData.getSmallR().split(",");
+            String[] mediumRs = rData.getCentreR().split(",");
+            String[] bigRs = rData.getBigR().split(",");
+            String[] superRs = rData.getSuperLargeR().split(",");
+            String[] totalRs = rData.getTotalR().split(",");
+            for (int i = 0; i < fieldList.size(); i++) {
+                if (i >= smallRs.length) {
+                    continue;
+                }
+                String smallR = smallRs[i];
+                String mediumR = mediumRs[i];
+                String largeR = bigRs[i];
+                String superR = superRs[i];
+                String totalR = totalRs[i];
+                if (dayRVOMap.get(i) == null) {
+                    AdsGameServerGsActiveRDayParent gsGameServerDayRVO = new AdsGameServerGsActiveRDayParent();
+                    gsGameServerDayRVO.setSmallR(Long.parseLong(smallR.trim()));
+                    gsGameServerDayRVO.setCentreR(Long.parseLong(mediumR.trim()));
+                    gsGameServerDayRVO.setBigR(Long.parseLong(largeR.trim()));
+                    gsGameServerDayRVO.setSuperLargeR(Long.parseLong(superR.trim()));
+                    gsGameServerDayRVO.setTotalR(Long.parseLong(totalR.trim()));
+                    dayRVOMap.put(i, gsGameServerDayRVO);
+                } else {
+                    AdsGameServerGsActiveRDayParent gsGameServerDayRVO = dayRVOMap.get(i);
+                    gsGameServerDayRVO.setSmallR(gsGameServerDayRVO.getSmallR() + Long.parseLong(smallR.trim()));
+                    gsGameServerDayRVO.setCentreR(gsGameServerDayRVO.getCentreR() + Long.parseLong(mediumR.trim()));
+                    gsGameServerDayRVO.setBigR(gsGameServerDayRVO.getBigR() + Long.parseLong(largeR.trim()));
+                    gsGameServerDayRVO.setSuperLargeR(gsGameServerDayRVO.getSuperLargeR() + Long.parseLong(superR.trim()));
+                    gsGameServerDayRVO.setTotalR(gsGameServerDayRVO.getTotalR() + Long.parseLong(totalR.trim()));
+                }
+            }
+        }
+
+        // DaN数据
+        for (int i = 0; i < fieldList.size(); i++) {
+            Field field = fieldList.get(i);
+            try {
+                String daN = (String) field.get(serverPayVO);
+                //总的累计数据
+                String[] daNSplit = daN.split("/");
+                AdsGameServerGsActiveRDayParent gsGameServerDayRVO = dayRVOMap.get(i);
+                String rData = getRDataStr(gsGameServerDayRVO, Long.valueOf(daNSplit[2]), Long.valueOf(daNSplit[1]));
+                daN += "/" + rData;
+                String[] retention = daN.split("/");
+                ServerPayVO.DayN retentionVO = ServerPayVO.DayN.builder()
+                        .activeNum(Long.parseLong(retention[0]))
+                        .payNum(Long.parseLong(retention[1]))
+                        .totalPayNum(Long.parseLong(retention[2]))
+                        .sRNum(Long.parseLong(retention[16]))
+                        .mRNum(Long.parseLong(retention[17]))
+                        .bRNum(Long.parseLong(retention[18]))
+                        .superRNum(Long.parseLong(retention[19]))
+                        .totalRNum(Long.parseLong(retention[20]))
+                        .payMoney(new BigDecimal(retention[3]))
+                        .payRate(new BigDecimal(retention[4]))
+                        .sRRate(new BigDecimal(retention[7]))
+                        .mRRate(new BigDecimal(retention[8]))
+                        .bRRate(new BigDecimal(retention[9]))
+                        .superRRate(new BigDecimal(retention[10]))
+                        .activeRetainedRate(new BigDecimal(retention[5]))
+                        .payRetainedRate(new BigDecimal(retention[6]))
+                        .sRRetainedRate(new BigDecimal(retention[11]))
+                        .mRRetainedRate(new BigDecimal(retention[12]))
+                        .bRRetainedRate(new BigDecimal(retention[13]))
+                        .superRRetainedRate(new BigDecimal(retention[14]))
+                        .totalRRetainedRate(new BigDecimal(retention[15]))
+                        .build();
+                fieldObjectList.get(i).set(serverPayVO, retentionVO);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        String totalRDa;
+        String totalDa = serverPayVO.getTotal();
+        if (null != allRData) {
+            //累计充值人数
+            String[] split = totalDa.split("/");
+            totalRDa = getRDataStr(allRData, Long.valueOf(split[2]), Long.valueOf(split[1]));
+        } else {
+            // 小R付费比 7/中R付费比 8/大R付费比 9/超R付费比 10/小R留存率 11/中R留存率 12/大R留存率 13/超R留存率 14/R总留存率 15/小R人数 16/中R人数 17/大R人数 18/超R人数 19/总R人数 20
+            totalRDa = "0/0/0/0/0/0/0/0/0/0/0/0/0/0";
+        }
+        totalDa += "/" + totalRDa;
+        String[] totalSplit = totalDa.split("/");
+        ServerPayVO.DayN retentionTotal = ServerPayVO.DayN.builder()
+                .activeNum(Long.parseLong(totalSplit[0]))
+                .payNum(Long.parseLong(totalSplit[1]))
+                .totalPayNum(Long.parseLong(totalSplit[2]))
+                .sRNum(Long.parseLong(totalSplit[16]))
+                .mRNum(Long.parseLong(totalSplit[17]))
+                .bRNum(Long.parseLong(totalSplit[18]))
+                .superRNum(Long.parseLong(totalSplit[19]))
+                .totalRNum(Long.parseLong(totalSplit[20]))
+                .payMoney(new BigDecimal(totalSplit[3]))
+                .payRate(new BigDecimal(totalSplit[4]))
+                .sRRate(new BigDecimal(totalSplit[7]))
+                .mRRate(new BigDecimal(totalSplit[8]))
+                .bRRate(new BigDecimal(totalSplit[9]))
+                .superRRate(new BigDecimal(totalSplit[10]))
+                .activeRetainedRate(new BigDecimal(totalSplit[5]))
+                .payRetainedRate(new BigDecimal(totalSplit[6]))
+                .sRRetainedRate(new BigDecimal(totalSplit[11]))
+                .mRRetainedRate(new BigDecimal(totalSplit[12]))
+                .bRRetainedRate(new BigDecimal(totalSplit[13]))
+                .superRRetainedRate(new BigDecimal(totalSplit[14]))
+                .totalRRetainedRate(new BigDecimal(totalSplit[15]))
+                .build();
+        serverPayVO.setRetainedTotal(retentionTotal);
+        return serverPayVO;
+    }
+}

+ 212 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsServerRankingParentServiceImpl.java

@@ -0,0 +1,212 @@
+package com.zanxiang.game.gs.data.serve.service.impl;
+
+
+import com.google.common.base.CaseFormat;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.mybatisflex.core.row.Row;
+import com.mybatisflex.spring.service.impl.ServiceImpl;
+import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsServerRankingParentMapper;
+import com.zanxiang.game.gs.data.serve.pojo.dto.ServeManageDTO;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsServerRankingParent;
+import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.ServeManageVO;
+import com.zanxiang.game.gs.data.serve.service.IAdsServerRankingParentService;
+import com.zanxiang.game.gs.data.serve.service.IGameServerSonMergeService;
+import com.zanxiang.game.gs.data.serve.service.ISysUserService;
+import com.zanxiang.module.util.DateUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.mybatisflex.core.query.QueryMethods.groupConcat;
+import static com.mybatisflex.core.query.QueryMethods.max;
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsServerRankingParentTableDef.ADS_SERVER_RANKING_PARENT;
+
+/**
+ * GS区服付费留存(游戏GS管理) 服务层实现。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Service
+public class AdsServerRankingParentServiceImpl extends ServiceImpl<AdsServerRankingParentMapper, AdsServerRankingParent> implements IAdsServerRankingParentService {
+    @Resource
+    private ISysUserService sysUserService;
+    @Resource
+    private IGameServerSonMergeService serverSonMergeService;
+
+    @Override
+    public PageVO<ServeManageVO, Row> serveManage(ServeManageDTO dto) {
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled(ADS_SERVER_RANKING_PARENT.SON_SERVER_AMOUNT.getName());
+        } else {
+            String column = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled());
+            dto.setSortFiled(column);
+        }
+        QueryWrapper wrapper = getServeManageWrapper(dto);
+
+        Page<ServeManageVO> paginate = getMapper().paginateAs(dto.getPageNum(), dto.getPageSize(), wrapper, ServeManageVO.class);
+        if (0 == paginate.getTotalRow()) {
+            return PageVO.empty(dto);
+        }
+        List<ServeManageVO> records = paginate.getRecords();
+
+        Set<String> serverIdList = records.stream().map(ServeManageVO::getServerId).collect(Collectors.toSet());
+
+        Set<Long> gsIdList = new HashSet<>();
+        records.stream().map(ServeManageVO::getGsIds)
+                .filter(item -> StringUtils.isNotBlank(item) && !"null".equals(item))
+                .forEach(gsIds -> {
+                    List<String> gsIdStr = Arrays.asList(gsIds.split(","));
+                    Set<Long> collect = gsIdStr.stream().map(Long::valueOf).collect(Collectors.toSet());
+                    gsIdList.addAll(collect);
+                });
+        // 当前页的游戏id+区服id
+        List<String> gameAndServeIdList = records.stream().map(item -> item.getParentGameId() + "_" + item.getServerId()).collect(Collectors.toList());
+        QueryWrapper rankWrapper = getRankWrapper(dto, gameAndServeIdList);
+        Map<Integer, Map<String, List<ServeManageVO>>> rankMap = listAs(rankWrapper, ServeManageVO.class)
+                .stream()
+                .collect(Collectors.groupingBy(ServeManageVO::getParentGameId, Collectors.groupingBy(ServeManageVO::getServerId)));
+        // GS名称查询
+        Map<Long, String> sysUserMap = CollectionUtils.isEmpty(gsIdList) ? null : sysUserService.getSysUserMap(gsIdList);
+        // 是否原始服
+        Map<Long, Map<String, Integer>> serverOriginMap = serverSonMergeService.gameServerOriginMap(dto.getSourceSystem(), serverIdList);
+        records.forEach(record -> {
+            // 基础信息
+            String gsIds = record.getGsIds();
+            if (StringUtils.isNotBlank(gsIds) && !"null".equals(gsIds)) {
+                List<String> gsIdStr = Arrays.asList(gsIds.split(","));
+                record.setGsStatus(gsIdStr.size() == 1 ? 1 : 2);
+                Set<String> collect = gsIdStr.stream().map(Long::valueOf)
+                        .map(gsId -> sysUserMap != null ? sysUserMap.get(gsId) : null)
+                        .collect(Collectors.toSet());
+                record.setGsName(StringUtils.join(collect, ","));
+            }
+            Integer original = null == serverOriginMap.get(record.getSuperGameId()) ? null : serverOriginMap.get(record.getSuperGameId()).get(record.getServerId());
+            record.setOriginServer(null == original ? null : 1 == original);
+
+            record.setStartDiff(DateUtil.intervalOfDays(record.getStartTime(), LocalDate.now()));
+            record.setServeDiff(record.getEndTime().isBefore(LocalDate.now()) ? DateUtil.intervalOfDays(record.getStartTime(), record.getEndTime())
+                    : DateUtil.intervalOfDays(record.getStartTime(), LocalDate.now()));
+            record.setServeStatus(record.getEndTime().isBefore(LocalDate.now()));
+            List<ServeManageVO.CombatRank> combatRankList = rankMap.get(record.getParentGameId()).get(record.getServerId())
+                    .stream()
+                    .filter(vo -> null != vo.getCombatNum())
+                    .map(vo -> ServeManageVO.CombatRank.builder()
+                            .combatAmount(vo.getCombatAmount())
+                            .combatCountry(vo.getCombatCountry())
+                            .combatNum(vo.getCombatNum())
+                            .combatRoleId(vo.getCombatRoleId())
+                            .combatRoleLevel(vo.getCombatRoleLevel())
+                            .combatRoleName(vo.getCombatRoleName())
+                            .combatTotalRoleCombatNum(vo.getCombatTotalRoleCombatNum())
+                            .build())
+                    .sorted(Comparator.comparingLong(ServeManageVO.CombatRank::getCombatNum))
+                    .collect(Collectors.toList());
+
+            record.setCombatRankList(combatRankList);
+
+            List<ServeManageVO.AmountRank> amountRankList = rankMap.get(record.getParentGameId()).get(record.getServerId())
+                    .stream()
+                    .filter(vo -> null != vo.getAmountNum())
+                    .map(vo -> ServeManageVO.AmountRank.builder()
+                            .amountCountry(vo.getAmountCountry())
+                            .amountNum(vo.getAmountNum())
+                            .amountRoleId(vo.getAmountRoleId())
+                            .amountRoleLevel(vo.getAmountRoleLevel())
+                            .amountRoleName(vo.getAmountRoleName())
+                            .amountRoleTotalAmount(vo.getAmountRoleTotalAmount())
+                            .amountTotalRoleCombatNum(vo.getAmountTotalRoleCombatNum())
+                            .build())
+                    .sorted(Comparator.comparingLong(ServeManageVO.AmountRank::getAmountNum))
+                    .collect(Collectors.toList());
+
+            record.setAmountRankList(amountRankList);
+        });
+        return new PageVO<>(paginate);
+    }
+
+    private QueryWrapper getServeManageWrapper(ServeManageDTO dto) {
+        QueryWrapper queryWrapper =  QueryWrapper.create()
+                .from(ADS_SERVER_RANKING_PARENT)
+                .select(ADS_SERVER_RANKING_PARENT.START_TIME)
+                .select(ADS_SERVER_RANKING_PARENT.PARENT_GAME_ID)
+                .select(ADS_SERVER_RANKING_PARENT.SERVER_ID)
+                .select(ADS_SERVER_RANKING_PARENT.SUPER_GAME_ID)
+                .select(ADS_SERVER_RANKING_PARENT.END_TIME)
+                .select(ADS_SERVER_RANKING_PARENT.PARENT_GAME_NAME)
+                .select(ADS_SERVER_RANKING_PARENT.SERVER_NAME)
+                .select(ADS_SERVER_RANKING_PARENT.GS_IDS)
+                .select(ADS_SERVER_RANKING_PARENT.TOTAL_ROLE_NUM)
+                .select(ADS_SERVER_RANKING_PARENT.TOTAL_AMOUNT_NUM)
+                .select(ADS_SERVER_RANKING_PARENT.TOTAL_AMOUNT_COUNT)
+                .select(ADS_SERVER_RANKING_PARENT.TOTAL_AMOUNT)
+                .select(ADS_SERVER_RANKING_PARENT.AMOUNT_RATE)
+                .select(ADS_SERVER_RANKING_PARENT.SON_ROLE_NUM)
+                .select(ADS_SERVER_RANKING_PARENT.SON_SERVER_AMOUNT_COUNT)
+                .select(ADS_SERVER_RANKING_PARENT.SON_SERVER_AMOUNT)
+                .select(ADS_SERVER_RANKING_PARENT.SON_AMOUNT_RATE)
+                .groupBy(ADS_SERVER_RANKING_PARENT.START_TIME)
+                .groupBy(ADS_SERVER_RANKING_PARENT.PARENT_GAME_ID)
+                .groupBy(ADS_SERVER_RANKING_PARENT.SERVER_ID)
+                .groupBy(ADS_SERVER_RANKING_PARENT.SUPER_GAME_ID)
+                .groupBy(ADS_SERVER_RANKING_PARENT.END_TIME)
+                .groupBy(ADS_SERVER_RANKING_PARENT.PARENT_GAME_NAME)
+                .groupBy(ADS_SERVER_RANKING_PARENT.SERVER_NAME)
+                .groupBy(ADS_SERVER_RANKING_PARENT.GS_IDS)
+                .groupBy(ADS_SERVER_RANKING_PARENT.TOTAL_ROLE_NUM)
+                .groupBy(ADS_SERVER_RANKING_PARENT.TOTAL_AMOUNT_NUM)
+                .groupBy(ADS_SERVER_RANKING_PARENT.TOTAL_AMOUNT_COUNT)
+                .groupBy(ADS_SERVER_RANKING_PARENT.TOTAL_AMOUNT)
+                .groupBy(ADS_SERVER_RANKING_PARENT.AMOUNT_RATE)
+                .groupBy(ADS_SERVER_RANKING_PARENT.SON_ROLE_NUM)
+                .groupBy(ADS_SERVER_RANKING_PARENT.SON_SERVER_AMOUNT)
+                .groupBy(ADS_SERVER_RANKING_PARENT.SON_SERVER_AMOUNT_COUNT)
+                .groupBy(ADS_SERVER_RANKING_PARENT.SON_AMOUNT_RATE)
+                .orderBy(dto.getSortFiled(), dto.getSortAsc());
+        condition(dto, queryWrapper);
+        return queryWrapper;
+    }
+
+    private QueryWrapper getRankWrapper(ServeManageDTO dto, List<String> gameAndServeIdList) {
+        return QueryWrapper.create()
+                .from(ADS_SERVER_RANKING_PARENT)
+                .and(ADS_SERVER_RANKING_PARENT.SOURCE_SYSTEM.eq(dto.getSourceSystem()))
+                .in("CONCAT_WS('_', parent_game_id, server_id)", gameAndServeIdList);
+    }
+
+    private static void condition(ServeManageDTO dto, QueryWrapper queryWrapper) {
+        queryWrapper.eq(AdsServerRankingParent::getSourceSystem, dto.getSourceSystem())
+                .ge(AdsServerRankingParent::getStartTime, dto.getServerStartBegin(), null != dto.getServerStartBegin())
+                .le(AdsServerRankingParent::getStartTime, dto.getServerStartEnd(), null != dto.getServerStartEnd())
+                .ge(AdsServerRankingParent::getStartTime, dto.getServeDayBegin(), null != dto.getServeDayBegin())
+                .le(AdsServerRankingParent::getEndTime, dto.getServeDayEnd(), null != dto.getServeDayEnd())
+                .eq(AdsServerRankingParent::getSuperGameId, dto.getSuperGameId(), null != dto.getSuperGameId())
+                .eq(AdsServerRankingParent::getParentGameId, dto.getParentGameId(), null != dto.getParentGameId())
+                .in(AdsServerRankingParent::getServerId, dto.getServerIdList(), CollectionUtils.isNotEmpty(dto.getServerIdList()))
+                .ge(AdsServerRankingParent::getEndTime, LocalDate.now(), null != dto.getServeStatus() && 1 == dto.getServeStatus())
+                .le(AdsServerRankingParent::getEndTime, LocalDate.now(), null != dto.getServeStatus() && 2 == dto.getServeStatus());
+        if (CollectionUtils.isNotEmpty(dto.getGsIdList())) {
+            StringBuilder gsSql = new StringBuilder();
+            dto.getGsIdList().forEach(gsId -> {
+                gsSql.append(String.format(" FIND_IN_SET(%s, gs_ids) > 0", gsId));
+                gsSql.append(" OR ");
+            });
+            gsSql.setLength(gsSql.length() - 4);
+            queryWrapper.and(gsSql.toString());
+        }
+        if (null != dto.getGsStatus() && 1 == dto.getGsStatus()) {
+            queryWrapper.and("gs_ids != 'null' and LENGTH(gs_ids) - LENGTH(REPLACE(gs_ids, ',', '')) + 1 = 1");
+        }
+
+        if (null != dto.getGsStatus() && 2 == dto.getGsStatus()) {
+            queryWrapper.and("gs_ids != 'null' and LENGTH(gs_ids) - LENGTH(REPLACE(gs_ids, ',', '')) + 1 > 1");
+        }
+    }
+}

+ 19 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/DwGsServerAmountDayParentServiceImpl.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.gs.data.serve.service.impl;
+
+
+import org.springframework.stereotype.Service;
+import com.zanxiang.game.gs.data.serve.service.IDwGsServerAmountDayParentService;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.DwGsServerAmountDayParent;
+import com.zanxiang.game.gs.data.serve.dao.mapper.game.dw.DwGsServerAmountDayParentMapper;
+import com.mybatisflex.spring.service.impl.ServiceImpl;
+
+/**
+ * Gs区服付费留存:付费金额,付费人数,累计付费人数 服务层实现。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Service
+public class DwGsServerAmountDayParentServiceImpl extends ServiceImpl<DwGsServerAmountDayParentMapper, DwGsServerAmountDayParent> implements IDwGsServerAmountDayParentService {
+
+}

+ 19 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/DwGsServerRoleDayParentServiceImpl.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.gs.data.serve.service.impl;
+
+
+import org.springframework.stereotype.Service;
+import com.zanxiang.game.gs.data.serve.service.IDwGsServerRoleDayParentService;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.DwGsServerRoleDayParent;
+import com.zanxiang.game.gs.data.serve.dao.mapper.game.dw.DwGsServerRoleDayParentMapper;
+import com.mybatisflex.spring.service.impl.ServiceImpl;
+
+/**
+ * Gs区服付费留存:创角人数,累计创角人数 服务层实现。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Service
+public class DwGsServerRoleDayParentServiceImpl extends ServiceImpl<DwGsServerRoleDayParentMapper, DwGsServerRoleDayParent> implements IDwGsServerRoleDayParentService {
+
+}

+ 10 - 1
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/GameServerSonMergeServiceImpl.java

@@ -2,7 +2,6 @@ package com.zanxiang.game.gs.data.serve.service.impl;
 
 
 import com.mybatisflex.core.query.QueryWrapper;
-import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServer;
 import org.springframework.stereotype.Service;
 import com.zanxiang.game.gs.data.serve.service.IGameServerSonMergeService;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServerSonMerge;
@@ -31,4 +30,14 @@ public class GameServerSonMergeServiceImpl extends ServiceImpl<GameServerSonMerg
                 .stream()
                 .collect(Collectors.groupingBy(GameServerSonMerge::getGameId, Collectors.toMap(GameServerSonMerge::getServerId, GameServerSonMerge::getServerName)));
     }
+
+    @Override
+    public Map<Long, Map<String, Integer>> gameServerOriginMap(String sourceSystem, Collection<String> serverIdList) {
+        return list(new QueryWrapper()
+                .eq(GameServerSonMerge::getSourceSystem, sourceSystem)
+                .in(GameServerSonMerge::getServerId, serverIdList)
+                .and("main_server_id = son_server_ids"))
+                .stream()
+                .collect(Collectors.groupingBy(GameServerSonMerge::getGameId, Collectors.toMap(GameServerSonMerge::getServerId, GameServerSonMerge::getIsSourceServer)));
+    }
 }

+ 8 - 0
game-gs-data/game-gs-data-serve/src/main/resources/bootstrap.yml

@@ -53,6 +53,14 @@ mybatis-flex:
       hikari:
         minimum-idle: 5
         maximum-pool-size: 50
+    game_dw_parent:
+      driver-class-name: com.mysql.cj.jdbc.Driver
+      url: jdbc:mysql://47.97.114.164:9030/game_dw_parent?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+      username: root
+      password: Qc@game123.
+      hikari:
+        minimum-idle: 5
+        maximum-pool-size: 50
   type-aliases-package: com.zanxiang.game.gs.data.serve.pojo.entity
   mapper-locations: classpath:mapper/**/*.xml
   global-config:

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

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 < (服务器迁移, 修正DUBBO通信问题・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (客服自动回复修改・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

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

@@ -35,7 +35,7 @@ public class AgentController {
 
     @PreAuthorize(permissionKey = "manage:agent:newWebUserActionSet")
     @PostMapping("/newWebUserActionSet")
-    public ResultVO<Boolean> newWebUserActionSet(@RequestBody @Validated TencentNewWebUserActionSetDTO dto) {
+    public ResultVO<Boolean> newWebUserActionSet(@Validated @RequestBody TencentNewWebUserActionSetDTO dto) {
         return ResultVO.ok(agentService.newWebUserActionSet(dto));
     }
 

+ 1 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/api/CpServerApiService.java

@@ -45,6 +45,7 @@ public class CpServerApiService {
     private RestTemplate restTemplate;
 
     public boolean chatMsgSubmit(ChatSubmitParam param) {
+        log.error("收到游戏聊天内容, param : {}", JsonUtil.toString(param));
         GameSupper gameSupper = gameSupperService.getById(param.getGameId());
         if (gameSupper == null) {
             throw new BaseException("参数错误");

+ 13 - 8
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java

@@ -40,6 +40,7 @@ import com.zanxiang.game.module.mybatis.mapper.AgentMapper;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.bean.BeanUtil;
 import com.zanxiang.module.util.exception.BaseException;
+import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -115,14 +116,18 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 
     @Override
     public Boolean newWebUserActionSet(TencentNewWebUserActionSetDTO dto) {
-        return userActionSetV3Rpc.create(CreateUserActionSetV3RpcDTO.builder()
-                        .accountId(dto.getAdAccountId())
-                        .type("WEB")
-                        .name(dto.getName())
-                        .description(dto.getDescription())
-                        .enableConversionClaim(true)
-                        .unique(true)
-                .build()).getData() != null;
+        ResultVO<Long> result = userActionSetV3Rpc.create(CreateUserActionSetV3RpcDTO.builder()
+                .accountId(dto.getAdAccountId())
+                .type("WEB")
+                .name(dto.getName())
+                .description(dto.getDescription())
+                .enableConversionClaim(true)
+                .unique(true)
+                .build());
+        if(result.isSuccess()) {
+            return result.getData() != null;
+        }
+        throw new BaseException(result.getMsg());
     }
 
     @Override

+ 2 - 8
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameAuthRoleServiceImpl.java

@@ -89,16 +89,10 @@ public class GameAuthRoleServiceImpl extends ServiceImpl<GameAuthRoleMapper, Gam
 
     @Override
     public boolean isCustomer() {
-        //开后门, 开发调试问题的时候用
-        if (SecurityUtil.isAdmin()) {
-            List<Long> backDoorIds = Arrays.asList(123L, 220L);
-            if (backDoorIds.contains(SecurityUtil.getUserId())) {
-                return Boolean.TRUE;
-            }
-        }
         return super.count(new LambdaQueryWrapper<GameAuthRole>()
-                .eq(GameAuthRole::getAuthType, GameAuthEnum.CUSTOMER.getValue())
                 .eq(GameAuthRole::getUserId, SecurityUtil.getUserId())
+                .and(qw -> qw.eq(GameAuthRole::getAuthType, GameAuthEnum.CUSTOMER.getValue())
+                        .or().eq(GameAuthRole::getCustomerPower, Boolean.TRUE))
         ) > 0;
     }
 

+ 21 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfAppletMsgServiceImpl.java

@@ -172,7 +172,7 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
             return;
         }
         //客服休息时间, 发送自动回复
-        this.systemReplyHandle(gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoom);
+        this.systemReplyHandleNew(gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoom);
         //消息报警监测
         this.monitorWordHandle(gameApplet, kfAppletMsgDTO);
         //保存消息, 玩家转入接待状态
@@ -286,6 +286,26 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         gameAuthRoleService.dingTalkCustomer(gameApplet.getGameId(), gameApplet.getAppName(), textContent);
     }
 
+    private void systemReplyHandleNew(Long gameId, String openId, KfRoom kfRoom) {
+        //获取自动回复配置
+        KfSystemReply kfSystemReply = kfSystemReplyService.getById(gameId);
+        if (kfSystemReply == null) {
+            return;
+        }
+        //未开启自动回复
+        if (Objects.equals(kfSystemReply.getRechargeReplySwitch(), Boolean.FALSE)) {
+            return;
+        }
+        //发送文字消息
+        if (Strings.isNotBlank(kfSystemReply.getRechargeReplyContent())) {
+            this.sysMsgSend(gameId, openId, kfSystemReply.getRechargeReplyContent(), kfRoom);
+        }
+        //发送图片消息
+        if (Strings.isNotBlank(kfSystemReply.getRechargeReplyPicture())) {
+            this.sysImgMsgSend(gameId, openId, kfSystemReply.getRechargeReplyPicture(), kfRoom);
+        }
+    }
+
     private void systemReplyHandle(Long gameId, String openId, KfRoom kfRoom) {
         //获取自动回复配置
         KfSystemReply kfSystemReply = kfSystemReplyService.getById(gameId);

+ 5 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameAuthRole.java

@@ -65,4 +65,9 @@ public class GameAuthRole implements Serializable {
      * 更新时间
      */
     private LocalDateTime updateTime;
+
+    /**
+     * 客服权限
+     */
+    private Boolean customerPower;
 }

+ 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服务启动成功 <解决微信支付精度丢失的问题> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <订单回传优化> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 2 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/listener/OrderPaySuccessListener.java

@@ -61,6 +61,8 @@ public class OrderPaySuccessListener {
         } catch (Exception e) {
             log.error("充值回调CP异常, orderId : {}, e : {}", platformOrderDTO.getOrderId(), e.getMessage());
         }
+        //订单回传
+        callBackService.orderCallBack(platformOrderDTO);
         //用户充值统计更新
         performOrderService.userRechargeTotal(platformOrderDTO);
         //用户首冲统计
@@ -73,8 +75,6 @@ public class OrderPaySuccessListener {
             //商户号额度统计更新
             performOrderService.payMerchantTotal(platformOrderDTO);
         }
-        //订单回传
-        callBackService.orderCallBack(platformOrderDTO);
         //订单支付埋点数据发送到卡夫卡
         kafkaService.eventTrack(KafkaEventTrackEnum.KAFKA_EVENT_TRACK_ORDER_PAY, JsonUtil.toString(platformOrderDTO));
         //订单充值消息推送

+ 5 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/result/PushCpResult.java

@@ -15,6 +15,11 @@ public class PushCpResult {
      */
     public static final String SUCCESS_CODE = "200";
 
+    /**
+     * 返回码
+     */
+    private String code;
+
     /**
      * 返回码
      */

+ 4 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java

@@ -377,6 +377,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 .userActionSetId(agent.getUserActionSetId())
                 .roleId(gameUserRole.getRoleId())
                 .roleName(gameUserRole.getRoleName())
+                .roleLevel(gameUserRole.getRoleLevel())
                 .build();
     }
 
@@ -390,6 +391,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 .agentKey(agent.getAgentKey())
                 .roleId(gameUserRole.getRoleId())
                 .roleName(gameUserRole.getRoleName())
+                .roleLevel(gameUserRole.getRoleLevel())
                 .registerTime(gameUserRole.getCreateTime())
                 .build();
     }
@@ -521,6 +523,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 .agentKey(agent.getAgentKey())
                 .roleId(gameUserRole.getRoleId())
                 .roleName(gameUserRole.getRoleName())
+                .roleLevel(gameUserRole.getRoleLevel())
                 .registerTime(gameUserRole.getCreateTime())
                 .mac(user.getMac())
                 .imei(user.getImei())
@@ -587,6 +590,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 .channel(agent.getAgentKey())
                 .roleId(gameUserRole.getRoleId())
                 .roleName(gameUserRole.getRoleName())
+                .roleLevel(gameUserRole.getRoleLevel())
                 .mac(user.getMac())
                 .imei(user.getImei())
                 .oaid(user.getOaid())

+ 6 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CpPushDataServiceImpl.java

@@ -392,6 +392,8 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
                 0L, 20L, TimeUnit.SECONDS)) {
             return Boolean.TRUE;
         }
+        //判断是否等级变更
+        boolean updateRoleLevel = gameUserRole.getRoleLevel() != null && param.getRoleLevel() > gameUserRole.getRoleLevel();
         //玩家角色信息更新
         if (param.getExtra() != null && Strings.isNotBlank(JsonUtil.toString(param.getExtra()))) {
             gameUserRole.setExtra(JsonUtil.toString(param.getExtra()));
@@ -410,6 +412,10 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
         gameUserRole.setServerName(param.getServerName());
         gameUserRole.setUpdateTime(LocalDateTime.now());
         boolean result = gameUserRoleService.updateById(gameUserRole);
+        //等级更新, 创角回传
+        if (updateRoleLevel) {
+            callBackService.roleCallBack(gameUserRole);
+        }
         //角色更新数据埋点发送到卡夫卡
         kafkaService.eventTrack(KafkaEventTrackEnum.KAFKA_EVENT_TRACK_ROLE_UPDATE, JsonUtil.toString(gameUserRole));
         return result;

+ 11 - 16
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameUserRoleServiceImpl.java

@@ -111,15 +111,8 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
                 .eq(GameUserRole::getRoleId, gameUserRoleParam.getRoleId()));
         //更新游戏角色
         if (gameUserRole != null) {
-            //判断是否等级变更
-            boolean updateRoleLevel = gameUserRoleParam.getRoleLevel() > gameUserRole.getRoleLevel();
             //角色更新
-            this.gameRoleUpdate(gameUserRoleParam, gameUserRole, userData);
-            //玩家消息推送
-            if (updateRoleLevel) {
-                pushMsgService.pushMsgByLevelUpdate(gameUserRoleParam, userData);
-            }
-            return Boolean.TRUE;
+            return this.gameRoleUpdate(gameUserRoleParam, gameUserRole, userData);
         }
         //新建游戏角色
         this.gameRoleCreate(gameUserRoleParam, userData);
@@ -168,15 +161,8 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
         }
         //等级提升更新
         if (gameUserRole != null && Objects.equals(dataType, DataTypeEnum.TYPE_LEVEL_UP.getDateType())) {
-            //判断是否等级变更
-            boolean updateRoleLevel = param.getRoleLevel() > gameUserRole.getRoleLevel();
             //角色更新
-            boolean result = this.gameRoleUpdate(param, gameUserRole, userData);
-            //玩家消息推送
-            if (updateRoleLevel) {
-                pushMsgService.pushMsgByLevelUpdate(param, userData);
-            }
-            return result;
+            return this.gameRoleUpdate(param, gameUserRole, userData);
         }
         //退出游戏
         if (Objects.equals(dataType, DataTypeEnum.TYPE_EXIT_GAME.getDateType())) {
@@ -193,6 +179,8 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
                 0L, 20L, TimeUnit.SECONDS)) {
             return Boolean.TRUE;
         }
+        //判断是否等级变更
+        boolean updateRoleLevel = param.getRoleLevel() > gameUserRole.getRoleLevel();
         //玩家信息
         GameUser gameUser = gameUserService.getOne(new LambdaQueryWrapper<GameUser>()
                 .eq(GameUser::getGameId, userData.getGameId())
@@ -218,6 +206,13 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
         gameUserRole.setServerName(param.getServerName());
         gameUserRole.setUpdateTime(LocalDateTime.now());
         boolean result = super.updateById(gameUserRole);
+        //等级变更
+        if (updateRoleLevel) {
+            //用户创角回传
+            callBackService.roleCallBack(gameUserRole);
+            //玩家消息推送
+            pushMsgService.pushMsgByLevelUpdate(param, userData);
+        }
         //角色更新数据埋点发送到卡夫卡
         kafkaService.eventTrack(KafkaEventTrackEnum.KAFKA_EVENT_TRACK_ROLE_UPDATE, JsonUtil.toString(gameUserRole));
         return result;

+ 2 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/PerformOrderServiceImpl.java

@@ -124,7 +124,8 @@ public class PerformOrderServiceImpl implements IPerformOrderService {
             return false;
         }
         PushCpResult pushCpResult = JsonUtil.toObj(resultStr, PushCpResult.class);
-        boolean pushSuccess = Objects.equals(pushCpResult.getResult(), PushCpResult.SUCCESS_CODE);
+        boolean pushSuccess = Objects.equals(pushCpResult.getResult(), PushCpResult.SUCCESS_CODE)
+                || Objects.equals(pushCpResult.getCode(), PushCpResult.SUCCESS_CODE);
         log.error("通知CP支付回调结果, url : {}, resultStr : {}, pushSuccess : {}", url, resultStr, pushSuccess);
         //更新订单信息
         orderService.update(new LambdaUpdateWrapper<Order>()