Browse Source

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

wcc 8 months ago
parent
commit
b6f9e33b11
45 changed files with 4818 additions and 23 deletions
  1. 2 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsOrderDetailServiceImpl.java
  2. 0 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameServerServiceImpl.java
  3. 43 5
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/controller/GameParentController.java
  4. 17 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/dw/DwGsServerAmountDayParentMapper.java
  5. 17 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/dw/DwGsServerRoleDayParentMapper.java
  6. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsGameServerGsActiveRDayParentMapper.java
  7. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsGsServerDayParentMapper.java
  8. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsServerRankingParentMapper.java
  9. 49 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/RoleManageDTO.java
  10. 50 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/RoleRemoveGameMonitorDTO.java
  11. 49 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/ServeManageDTO.java
  12. 47 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/ServerPayDTO.java
  13. 665 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/dw/DwGsServerAmountDayParent.java
  14. 664 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/dw/DwGsServerRoleDayParent.java
  15. 88 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsGameServerGsActiveRDayParent.java
  16. 773 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsGsServerDayParent.java
  17. 2 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsRoleAmountDataParent.java
  18. 251 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsServerRankingParent.java
  19. 63 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/GsRTotalVO.java
  20. 91 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/RoleManageVO.java
  21. 110 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/RoleRemoveGameMonitorVO.java
  22. 185 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/ServeManageVO.java
  23. 381 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/ServerPayVO.java
  24. 15 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsGameServerGsActiveRDayParentService.java
  25. 22 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsGsServerDayParentService.java
  26. 8 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsRoleAmountDataParentService.java
  27. 20 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsServerRankingParentService.java
  28. 15 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IDwGsServerAmountDayParentService.java
  29. 15 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IDwGsServerRoleDayParentService.java
  30. 1 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IGameServerSonMergeService.java
  31. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsGameServerGsActiveRDayParentServiceImpl.java
  32. 592 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsGsServerDayParentServiceImpl.java
  33. 206 2
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsRoleAmountDataParentServiceImpl.java
  34. 212 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsServerRankingParentServiceImpl.java
  35. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/DwGsServerAmountDayParentServiceImpl.java
  36. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/DwGsServerRoleDayParentServiceImpl.java
  37. 10 1
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/GameServerSonMergeServiceImpl.java
  38. 8 0
      game-gs-data/game-gs-data-serve/src/main/resources/bootstrap.yml
  39. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  40. 1 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/api/CpServerApiService.java
  41. 2 8
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameAuthRoleServiceImpl.java
  42. 21 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfAppletMsgServiceImpl.java
  43. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameAuthRole.java
  44. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  45. 2 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/WxPayService.java

+ 2 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsOrderDetailServiceImpl.java

@@ -431,8 +431,8 @@ public class AdsOrderDetailServiceImpl implements IAdsOrderDetailService {
                 		TIMESTAMPDIFF(SECOND, b.create_time, a.pay_time) as reg_until_pay, -- 注册充值时间差
                 		TIMESTAMPDIFF(SECOND, b.create_time, a.pay_time) as reg_until_pay, -- 注册充值时间差
                 		TIMESTAMPDIFF(SECOND, a.pay_time, NOW()) as pay_until_now, -- 最近充值时间距今(秒)
                 		TIMESTAMPDIFF(SECOND, a.pay_time, NOW()) as pay_until_now, -- 最近充值时间距今(秒)
                 		IF(a.status = 2, IF(a.create_time = i.create_time, 1, 0), 0) as is_first_recharge, -- 是否首充
                 		IF(a.status = 2, IF(a.create_time = i.create_time, 1, 0), 0) as is_first_recharge, -- 是否首充
-                		IF(a.promotion_id = 'null', NULL, a.promotion_id) as promotion_id , -- 计划ID
-                  		IF(a.project_id = 'null' , NULL, a.project_id) as project_id, -- 项目ID(广告ID)
+                		IF(b.promotion_id = 'null', NULL, b.promotion_id) as promotion_id , -- 计划ID
+                  		IF(b.project_id = 'null' , NULL, b.project_id) as project_id, -- 项目ID(广告ID)
                  		IFNULL(l.back_status, 2) as back_status, -- 回传状态:-1-回传失败;0-未回传;1-已回传;2-没有回传数据
                  		IFNULL(l.back_status, 2) as back_status, -- 回传状态:-1-回传失败;0-未回传;1-已回传;2-没有回传数据
                  		IFNULL(l.back_money / 100, null) as back_money, -- 回传金额
                  		IFNULL(l.back_money / 100, null) as back_money, -- 回传金额
                  		l.back_msg as back_msg, -- 回传信息
                  		l.back_msg as back_msg, -- 回传信息

+ 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])
                         .rTotalRetention(split[14])
                         .build();
                         .build();
                 fieldObjectList.get(i).set(vo, retentionVO);
                 fieldObjectList.get(i).set(vo, retentionVO);
-//                field.set(vo, value + "/" + rData);
             } catch (IllegalAccessException e) {
             } catch (IllegalAccessException e) {
                 throw new RuntimeException(e);
                 throw new RuntimeException(e);
             }
             }

+ 43 - 5
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;
 package com.zanxiang.game.gs.data.serve.controller;
 
 
 import com.mybatisflex.core.row.Row;
 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.RolePayDTO;
-import com.zanxiang.game.gs.data.serve.pojo.vo.BigRVO;
-import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
-import com.zanxiang.game.gs.data.serve.pojo.vo.RolePayVO;
+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.IAdsRoleAmountDataParentService;
 import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountRateParentService;
 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 com.zanxiang.module.util.pojo.ResultVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
@@ -27,6 +26,10 @@ public class GameParentController {
     private IAdsRoleAmountDataParentService adsRoleAmountDataParentService;
     private IAdsRoleAmountDataParentService adsRoleAmountDataParentService;
     @Resource
     @Resource
     private IAdsRoleAmountRateParentService adsRoleAmountRateParentService;
     private IAdsRoleAmountRateParentService adsRoleAmountRateParentService;
+    @Resource
+    private IAdsGsServerDayParentService gsServerDayParentService;
+    @Resource
+    private IAdsServerRankingParentService serverRankingParentService;
 
 
     @ApiOperation(value = "大R每日充值比")
     @ApiOperation(value = "大R每日充值比")
 //    @PreAuthorize(permissionKey = "gameGs:bigR:list")
 //    @PreAuthorize(permissionKey = "gameGs:bigR:list")
@@ -49,4 +52,39 @@ public class GameParentController {
         return ResultVO.ok(adsRoleAmountRateParentService.rolePayTotal(dto));
         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")
+    public ResultVO<PageVO<RoleRemoveGameMonitorVO, Row>> roleRemoveGameMonitor(@Validated @RequestBody RoleRemoveGameMonitorDTO dto) {
+        return ResultVO.ok(adsRoleAmountDataParentService.roleRemoveGameMonitor(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/RoleManageDTO.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 RoleManageDTO 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("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("角色创建日期开始")
+    private LocalDate roleCreateDayBegin;
+    @ApiModelProperty("角色创建日期结束")
+    private LocalDate roleCreateDayEnd;
+
+    @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;
+
+}

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

@@ -0,0 +1,50 @@
+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 RoleRemoveGameMonitorDTO 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("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("角色创建日期开始")
+    private LocalDate roleCreateDayBegin;
+    @ApiModelProperty("角色创建日期结束")
+    private LocalDate roleCreateDayEnd;
+
+    @ApiModelProperty("超父游戏id")
+    private Integer superGameId;
+    @ApiModelProperty("角色当前所在区服id列表")
+    private List<String> serverIdList;
+
+    @ApiModelProperty("服务日期开始")
+    private LocalDate serveDayBegin;
+    @ApiModelProperty("服务日期开始")
+    private LocalDate serveDayEnd;
+
+    @NotNull(message = "角色来源必填")
+    @ApiModelProperty("必填:角色来源:1:区服指派;2:角色指派")
+    private Integer roleSource;
+
+}

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

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

@@ -228,4 +228,6 @@ public class AdsRoleAmountDataParent {
     @Column(value = "is_remove_game")
     @Column(value = "is_remove_game")
     private Integer isRemoveGame;
     private Integer isRemoveGame;
 
 
+    private Integer systemRemoveGameStatus;
+
 }
 }

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

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

@@ -0,0 +1,91 @@
+package com.zanxiang.game.gs.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+public class RoleManageVO {
+    @ApiModelProperty("游戏ID")
+    private Integer gameId;
+    @ApiModelProperty("角色ID")
+    private String roleId;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+    @ApiModelProperty("超父游戏id")
+    private Long superGameId;
+    @ApiModelProperty("当前区服ID")
+    private String endServerId;
+
+    @ApiModelProperty("当前区服名称")
+    private String endServerName;
+
+    @ApiModelProperty("父游戏ID")
+    private Integer parentGameId;
+    @ApiModelProperty("父游戏名称")
+    private String parentGameName;
+
+    @ApiModelProperty("父用户ID")
+    private Long associationUserId;
+
+    @ApiModelProperty("角色vip")
+    private Integer roleVip;
+
+    @ApiModelProperty("角色等级")
+    private Integer roleLevel;
+
+    @ApiModelProperty("角色攻击力")
+    private Long combatNum;
+
+    @ApiModelProperty("国家")
+    private String country;
+
+    @ApiModelProperty("角色创建时间")
+    private LocalDateTime roleTime;
+    @ApiModelProperty("角色创角天数")
+    private Long roleCreateDayDiff;
+    @ApiModelProperty("角色最近充值时间距今")
+    private Long lastOrderDayDiff;
+    @ApiModelProperty("角色最近活跃时间距今")
+    private Long roleActiveDayDiff;
+    @ApiModelProperty("角色创角充值时间差")
+    private Long roleCreatePayDayDiff;
+
+    @ApiModelProperty("角色最近充值时间")
+    private LocalDateTime lastOrderTime;
+
+    @ApiModelProperty("角色累计充值金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty("角色最近活跃时间")
+    private LocalDateTime activeTime;
+
+    @ApiModelProperty("GS名称")
+    private String gsName;
+    @ApiModelProperty("GS ID")
+    private Long gsId;
+
+    @ApiModelProperty("GS服务时间-开始")
+    private LocalDate gsStartTime;
+    @ApiModelProperty("GS服务时间-结束")
+    private LocalDate gsEndTime;
+
+    @ApiModelProperty("GS服务天数")
+    private Long gsServeDays;
+
+    @ApiModelProperty("GS服务状态:0:服务中;1:服务完成")
+    private Boolean serveStatus;
+
+    @ApiModelProperty("GS服务中的付费金额")
+    private BigDecimal gsAmount;
+    @ApiModelProperty("GS服务中的付费次数")
+    private Long gsCount;
+    @ApiModelProperty("区服指派GS充值金额")
+    private BigDecimal serverAmount;
+    @ApiModelProperty("区服指派GS充值次数")
+    private Integer serverCount;
+}

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

@@ -0,0 +1,110 @@
+package com.zanxiang.game.gs.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+public class RoleRemoveGameMonitorVO {
+    @ApiModelProperty("游戏ID")
+    private Integer gameId;
+    @ApiModelProperty("角色ID")
+    private String roleId;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+    @ApiModelProperty("超父游戏id")
+    private Long superGameId;
+    @ApiModelProperty("当前区服ID")
+    private String endServerId;
+
+    @ApiModelProperty("当前区服名称")
+    private String endServerName;
+
+    @ApiModelProperty("父游戏ID")
+    private Integer parentGameId;
+    @ApiModelProperty("父游戏名称")
+    private String parentGameName;
+
+    @ApiModelProperty("父用户ID")
+    private Long associationUserId;
+
+    @ApiModelProperty("角色vip")
+    private Integer roleVip;
+
+    @ApiModelProperty("角色等级")
+    private Integer roleLevel;
+
+    @ApiModelProperty("角色攻击力")
+    private Long combatNum;
+
+    @ApiModelProperty("国家")
+    private String country;
+
+    @ApiModelProperty("角色创建时间")
+    private LocalDateTime roleTime;
+    @ApiModelProperty("角色创角天数")
+    private Long roleCreateDayDiff;
+    @ApiModelProperty("角色最近充值时间距今")
+    private Long lastOrderDayDiff;
+    @ApiModelProperty("角色最近活跃时间距今")
+    private Long roleActiveDayDiff;
+
+    @ApiModelProperty("角色首充金额")
+    private BigDecimal firstAmount;
+
+    @ApiModelProperty("创角24小时付费金额")
+    private BigDecimal roleHourAmount;
+
+    @ApiModelProperty("角色最近充值金额")
+    private BigDecimal lastAmount;
+
+    @ApiModelProperty("角色最近充值时间")
+    private LocalDateTime lastOrderTime;
+
+    @ApiModelProperty("角色最近充值产品")
+    private String productName;
+
+    @ApiModelProperty("角色累计充值金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty("角色累计充值次数")
+    private Integer totalCnt;
+
+    @ApiModelProperty("角色最近活跃时间")
+    private LocalDateTime activeTime;
+
+    @ApiModelProperty("小程序充值金额")
+    private BigDecimal appAmount;
+
+    @ApiModelProperty("角色转端充值比")
+    private BigDecimal proportion;
+
+    @ApiModelProperty("GS名称")
+    private String gsName;
+    @ApiModelProperty("GS ID")
+    private Long gsId;
+
+    @ApiModelProperty("GS服务时间-开始")
+    private LocalDate gsStartTime;
+    @ApiModelProperty("GS服务时间-结束")
+    private LocalDate gsEndTime;
+
+    @ApiModelProperty("GS服务天数")
+    private Long gsServeDays;
+
+    @ApiModelProperty("GS服务状态:0:服务中;1:服务完成")
+    private Boolean serveStatus;
+
+    @ApiModelProperty("角色来源:1:区服指派;2:角色指派")
+    private Integer roleSource;
+
+    @ApiModelProperty("角色人工判断退游状态:0:未退游;1:退游")
+    private Integer humanRemoveGameStatus;
+
+    @ApiModelProperty("角色系统判断退游状态:0:未退游;1:退游")
+    private Integer systemRemoveGameStatus;
+}

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

+ 8 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsRoleAmountDataParentService.java

@@ -3,10 +3,14 @@ package com.zanxiang.game.gs.data.serve.service;
 
 
 import com.mybatisflex.core.row.Row;
 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.BigRDTO;
+import com.zanxiang.game.gs.data.serve.pojo.dto.RoleManageDTO;
+import com.zanxiang.game.gs.data.serve.pojo.dto.RoleRemoveGameMonitorDTO;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountDataParent;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountDataParent;
 import com.mybatisflex.core.service.IService;
 import com.mybatisflex.core.service.IService;
 import com.zanxiang.game.gs.data.serve.pojo.vo.BigRVO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.BigRVO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.RoleManageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.RoleRemoveGameMonitorVO;
 
 
 /**
 /**
  * 角色父游戏充值数据 服务层。
  * 角色父游戏充值数据 服务层。
@@ -17,4 +21,8 @@ import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
 public interface IAdsRoleAmountDataParentService extends IService<AdsRoleAmountDataParent> {
 public interface IAdsRoleAmountDataParentService extends IService<AdsRoleAmountDataParent> {
 
 
     PageVO<BigRVO, Row> bigRListOfPage(BigRDTO dto);
     PageVO<BigRVO, Row> bigRListOfPage(BigRDTO dto);
+
+    PageVO<RoleRemoveGameMonitorVO, Row> roleRemoveGameMonitor(RoleRemoveGameMonitorDTO dto);
+
+    PageVO<RoleManageVO, Row> roleManage(RoleManageDTO 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> {
 public interface IGameServerSonMergeService extends IService<GameServerSonMerge> {
     Map<Long, Map<String, String>> gameServerMap(String sourceSystem, Collection<String> serverIdList);
     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;
+    }
+}

+ 206 - 2
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsRoleAmountDataParentServiceImpl.java

@@ -3,15 +3,20 @@ package com.zanxiang.game.gs.data.serve.service.impl;
 
 
 import com.google.common.base.CaseFormat;
 import com.google.common.base.CaseFormat;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryCondition;
 import com.mybatisflex.core.query.QueryWrapper;
 import com.mybatisflex.core.query.QueryWrapper;
 import com.mybatisflex.core.row.Row;
 import com.mybatisflex.core.row.Row;
 import com.mybatisflex.spring.service.impl.ServiceImpl;
 import com.mybatisflex.spring.service.impl.ServiceImpl;
 import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsRoleAmountDataParentMapper;
 import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsRoleAmountDataParentMapper;
 import com.zanxiang.game.gs.data.serve.pojo.dto.BigRDTO;
 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.RoleRemoveGameMonitorDTO;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountDataParent;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountDataParent;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountDataTodayParent;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountDataTodayParent;
 import com.zanxiang.game.gs.data.serve.pojo.vo.BigRVO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.BigRVO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.RoleManageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.RoleRemoveGameMonitorVO;
 import com.zanxiang.game.gs.data.serve.service.*;
 import com.zanxiang.game.gs.data.serve.service.*;
 import com.zanxiang.module.util.DateUtil;
 import com.zanxiang.module.util.DateUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.CollectionUtils;
@@ -98,6 +103,204 @@ public class AdsRoleAmountDataParentServiceImpl extends ServiceImpl<AdsRoleAmoun
         return new PageVO<>(paginate);
         return new PageVO<>(paginate);
     }
     }
 
 
+    @Override
+    public PageVO<RoleRemoveGameMonitorVO, Row> roleRemoveGameMonitor(RoleRemoveGameMonitorDTO dto) {
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT.getName());
+        } else {
+            String column = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled());
+            dto.setSortFiled(column);
+        }
+        QueryWrapper bigRWrapper = getRoleRemoveGameWrapper(dto);
+
+        Page<RoleRemoveGameMonitorVO> paginate = getMapper().paginateAs(dto.getPageNum(), dto.getPageSize(), bigRWrapper, RoleRemoveGameMonitorVO.class);
+        if (0 == paginate.getTotalRow()) {
+            return PageVO.empty(dto);
+        }
+        List<RoleRemoveGameMonitorVO> records = paginate.getRecords();
+        Set<String> serverIdList = records.stream().map(RoleRemoveGameMonitorVO::getEndServerId).collect(Collectors.toSet());
+        Set<Integer> parentGameIdList = records.stream().map(RoleRemoveGameMonitorVO::getParentGameId).collect(Collectors.toSet());
+        Set<Long> gsIdList = records.stream().map(RoleRemoveGameMonitorVO::getGsId).collect(Collectors.toSet());
+        //父游戏名称
+        Map<Integer, String> parentGameMap = gameService.gameNameMap(dto.getSourceSystem(), parentGameIdList);
+        //区服名称
+        Map<Long, Map<String, String>> serverMap = serverSonMergeService.gameServerMap(dto.getSourceSystem(), serverIdList);
+        //GS名称查询
+        Map<Long, String> sysUserMap = CollectionUtils.isEmpty(gsIdList) ? null : sysUserService.getSysUserMap(gsIdList);
+        records.forEach(record -> {
+            Long gsId = record.getGsId();
+            record.setGsName(0 == gsId ? null : sysUserMap != null ? sysUserMap.get(gsId) : null);
+            record.setParentGameName(parentGameMap.get(record.getParentGameId()));
+            record.setEndServerName(null == serverMap.get(record.getSuperGameId()) ? null : serverMap.get(record.getSuperGameId()).get(record.getEndServerId()));
+            if (null != record.getGsStartTime()) {
+                record.setGsServeDays(record.getGsEndTime().isBefore(LocalDate.now()) ? DateUtil.intervalOfDays(record.getGsStartTime(), record.getGsEndTime())
+                        : DateUtil.intervalOfDays(record.getGsStartTime(), LocalDate.now()));
+                record.setServeStatus(record.getGsEndTime().isBefore(LocalDate.now()));
+            }
+            record.setRoleSource(0 == record.getGsId() ? 1 : 2);
+        });
+        return new PageVO<>(paginate);
+    }
+
+    @Override
+    public PageVO<RoleManageVO, Row> roleManage(RoleManageDTO dto) {
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT.getName());
+        } else {
+            String column = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled());
+            dto.setSortFiled(column);
+        }
+        QueryWrapper wrapper = getRoleManageWrapper(dto);
+
+        Page<RoleManageVO> paginate = getMapper().paginateAs(dto.getPageNum(), dto.getPageSize(), wrapper, RoleManageVO.class);
+        if (0 == paginate.getTotalRow()) {
+            return PageVO.empty(dto);
+        }
+        List<RoleManageVO> records = paginate.getRecords();
+        Set<String> serverIdList = records.stream().map(RoleManageVO::getEndServerId).collect(Collectors.toSet());
+        Set<Integer> parentGameIdList = records.stream().map(RoleManageVO::getParentGameId).collect(Collectors.toSet());
+        Set<Long> gsIdList = records.stream().map(RoleManageVO::getGsId).collect(Collectors.toSet());
+        //父游戏名称
+        Map<Integer, String> parentGameMap = gameService.gameNameMap(dto.getSourceSystem(), parentGameIdList);
+        //区服名称
+        Map<Long, Map<String, String>> serverMap = serverSonMergeService.gameServerMap(dto.getSourceSystem(), serverIdList);
+        //GS名称查询
+        Map<Long, String> sysUserMap = CollectionUtils.isEmpty(gsIdList) ? null : sysUserService.getSysUserMap(gsIdList);
+        records.forEach(record -> {
+            Long gsId = record.getGsId();
+            record.setGsName(0 == gsId ? null : sysUserMap != null ? sysUserMap.get(gsId) : null);
+            record.setParentGameName(parentGameMap.get(record.getParentGameId()));
+            record.setEndServerName(null == serverMap.get(record.getSuperGameId()) ? null : serverMap.get(record.getSuperGameId()).get(record.getEndServerId()));
+            if (null != record.getGsStartTime()) {
+                record.setGsServeDays(record.getGsEndTime().isBefore(LocalDate.now()) ? DateUtil.intervalOfDays(record.getGsStartTime(), record.getGsEndTime())
+                        : DateUtil.intervalOfDays(record.getGsStartTime(), LocalDate.now()));
+                record.setServeStatus(record.getGsEndTime().isBefore(LocalDate.now()));
+            }
+        });
+        return new PageVO<>(paginate);
+    }
+
+    private static QueryWrapper getRoleManageWrapper(RoleManageDTO dto) {
+        return QueryWrapper.create()
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID)
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_START_TIME)
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_NAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_NAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PARENT_GAME_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.PARENT_GAME_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ASSOCIATION_USER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.ASSOCIATION_USER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_LEVEL).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_LEVEL.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_VIP).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_VIP.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.COMBAT_NUM).as(ADS_ROLE_AMOUNT_DATA_PARENT.COMBAT_NUM.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.COUNTRY).as(ADS_ROLE_AMOUNT_DATA_PARENT.COUNTRY.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME.getName()))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME)).as("role_create_day_diff"))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME)).as("role_active_day_diff"))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME)).as("last_order_day_diff"))
+                .select(dateDiff(max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME), max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME)).as("role_create_pay_day_diff"))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.FIRST_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.FIRST_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_HOUR_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_HOUR_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PRODUCT_NAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.PRODUCT_NAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_CNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_CNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.APP_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.APP_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PROPORTION).as(ADS_ROLE_AMOUNT_DATA_PARENT.PROPORTION.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.CONCAT_GAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.CONCAT_GAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_COUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_COUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_END_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_END_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SOURCE_SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SOURCE_SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.END_SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.END_SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SUPER_GAME_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SUPER_GAME_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID_SERVER).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID_SERVER.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_COUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_COUNT.getName()))
+                .from(ADS_ROLE_AMOUNT_DATA_PARENT)
+                .ge(AdsRoleAmountDataParent::getRoleTime, null == dto.getRoleCreateDayBegin() ? null : LocalDateTime.of(dto.getRoleCreateDayBegin(), LocalTime.MIDNIGHT), null != dto.getRoleCreateDayBegin())
+                .le(AdsRoleAmountDataParent::getRoleTime, null == dto.getRoleCreateDayEnd() ? null : LocalDateTime.of(dto.getRoleCreateDayEnd(), LocalTime.MAX), null != dto.getRoleCreateDayEnd())
+                .in(AdsRoleAmountDataParent::getGsId, dto.getGsIdList(), CollectionUtils.isNotEmpty(dto.getGsIdList()))
+                .eq(AdsRoleAmountDataParent::getParentGameId, dto.getParentGameId(), null != dto.getParentGameId())
+                .like(AdsRoleAmountDataParent::getRoleName, dto.getRoleName(), StringUtils.isNotBlank(dto.getRoleName()))
+                .eq(AdsRoleAmountDataParent::getSuperGameId, dto.getSuperGameId(), null != dto.getSuperGameId())
+                .in(AdsRoleAmountDataParent::getEndServerId, dto.getServerIdList(), CollectionUtils.isNotEmpty(dto.getServerIdList()))
+                .ge(AdsRoleAmountDataParent::getGsStartTime, dto.getServeDayBegin(), null != dto.getServeDayBegin())
+                .le(AdsRoleAmountDataParent::getGsEndTime, dto.getServeDayEnd(), null != dto.getServeDayEnd())
+                .ne(AdsRoleAmountDataParent::getGsId, 0)
+                .ge(AdsRoleAmountDataParent::getGsEndTime, LocalDate.now(), null != dto.getServeStatus() && 1 == dto.getServeStatus())
+                .le(AdsRoleAmountDataParent::getGsEndTime, LocalDate.now(), null != dto.getServeStatus() && 2 == dto.getServeStatus())
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID)
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_START_TIME)
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
+                .orderBy(dto.getSortFiled(), dto.getSortAsc());
+    }
+
+    private static QueryWrapper getRoleRemoveGameWrapper(RoleRemoveGameMonitorDTO dto) {
+        return QueryWrapper.create()
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID)
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_START_TIME)
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_NAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_NAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PARENT_GAME_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.PARENT_GAME_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ASSOCIATION_USER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.ASSOCIATION_USER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_LEVEL).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_LEVEL.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_VIP).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_VIP.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.COMBAT_NUM).as(ADS_ROLE_AMOUNT_DATA_PARENT.COMBAT_NUM.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.COUNTRY).as(ADS_ROLE_AMOUNT_DATA_PARENT.COUNTRY.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME.getName()))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME)).as("role_create_day_diff"))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME)).as("role_active_day_diff"))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME)).as("last_order_day_diff"))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.FIRST_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.FIRST_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_HOUR_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_HOUR_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PRODUCT_NAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.PRODUCT_NAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_CNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_CNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.APP_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.APP_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PROPORTION).as(ADS_ROLE_AMOUNT_DATA_PARENT.PROPORTION.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.CONCAT_GAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.CONCAT_GAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_COUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_COUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_END_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_END_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SOURCE_SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SOURCE_SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.END_SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.END_SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SUPER_GAME_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SUPER_GAME_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.IS_REMOVE_GAME).as("human_remove_game_status"))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID_SERVER).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID_SERVER.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_COUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_COUNT.getName()))
+                .select("IF(TIMESTAMPDIFF(HOUR, max(ads_role_amount_data_parent.active_time), NOW()) > 72,IF(TIMESTAMPDIFF(HOUR, max(ads_role_amount_data_parent.last_order_time), NOW()) < 72 , 0, 1) , 0) as system_remove_game_status")
+                .from(ADS_ROLE_AMOUNT_DATA_PARENT)
+                .ge(AdsRoleAmountDataParent::getRoleTime, null == dto.getRoleCreateDayBegin() ? null : LocalDateTime.of(dto.getRoleCreateDayBegin(), LocalTime.MIDNIGHT), null != dto.getRoleCreateDayBegin())
+                .le(AdsRoleAmountDataParent::getRoleTime, null == dto.getRoleCreateDayEnd() ? null : LocalDateTime.of(dto.getRoleCreateDayEnd(), LocalTime.MAX), null != dto.getRoleCreateDayEnd())
+                .in(AdsRoleAmountDataParent::getGsId, dto.getGsIdList(), CollectionUtils.isNotEmpty(dto.getGsIdList()))
+                .eq(AdsRoleAmountDataParent::getParentGameId, dto.getParentGameId(), null != dto.getParentGameId())
+                .like(AdsRoleAmountDataParent::getRoleName, dto.getRoleName(), StringUtils.isNotBlank(dto.getRoleName()))
+                .eq(AdsRoleAmountDataParent::getSuperGameId, dto.getSuperGameId(), null != dto.getSuperGameId())
+                .in(AdsRoleAmountDataParent::getEndServerId, dto.getServerIdList(), CollectionUtils.isNotEmpty(dto.getServerIdList()))
+                .ge(AdsRoleAmountDataParent::getGsStartTime, dto.getServeDayBegin(), null != dto.getServeDayBegin())
+                .le(AdsRoleAmountDataParent::getGsEndTime, dto.getServeDayEnd(), null != dto.getServeDayEnd())
+                .ge(AdsRoleAmountDataParent::getGsEndTime, LocalDate.now())
+                .ne(AdsRoleAmountDataParent::getGsId, 0, null != dto.getRoleSource() && 2 == dto.getRoleSource())
+                .isNotNull(AdsRoleAmountDataParent::getGsIdServer, null != dto.getRoleSource() && 1 == dto.getRoleSource())
+                .and(ADS_ROLE_AMOUNT_DATA_PARENT.IS_REMOVE_GAME.ne(1).or(ADS_ROLE_AMOUNT_DATA_PARENT.IS_REMOVE_GAME.isNull()))
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID)
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_START_TIME)
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
+                .having(QueryCondition.createEmpty().and("system_remove_game_status = ?", 1))
+                .orderBy(dto.getSortFiled(), dto.getSortAsc());
+    }
+
     private static QueryWrapper getBigRWrapper(BigRDTO dto) {
     private static QueryWrapper getBigRWrapper(BigRDTO dto) {
         return QueryWrapper.create()
         return QueryWrapper.create()
                 .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
                 .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
@@ -162,12 +365,13 @@ public class AdsRoleAmountDataParentServiceImpl extends ServiceImpl<AdsRoleAmoun
                 .le(AdsRoleAmountDataParent::getGsEndTime, LocalDate.now(), null != dto.getServeStatus() && 2 == dto.getServeStatus())
                 .le(AdsRoleAmountDataParent::getGsEndTime, LocalDate.now(), null != dto.getServeStatus() && 2 == dto.getServeStatus())
                 .ne(AdsRoleAmountDataParent::getGsId, 0, null != dto.getRoleSource() && 2 == dto.getRoleSource())
                 .ne(AdsRoleAmountDataParent::getGsId, 0, null != dto.getRoleSource() && 2 == dto.getRoleSource())
                 .isNotNull(AdsRoleAmountDataParent::getGsIdServer, null != dto.getRoleSource() && 1 == dto.getRoleSource())
                 .isNotNull(AdsRoleAmountDataParent::getGsIdServer, null != dto.getRoleSource() && 1 == dto.getRoleSource())
-                .eq(AdsRoleAmountDataParent::getIsRemoveGame, dto.getHumanRemoveGameStatus(), null != dto.getHumanRemoveGameStatus())
-                .and(wrapper -> wrapper.and("'system_remove_game_status' = ?", dto.getSystemRemoveGameStatus()), null != dto.getSystemRemoveGameStatus())
+                .eq(AdsRoleAmountDataParent::getIsRemoveGame, dto.getHumanRemoveGameStatus(), null != dto.getHumanRemoveGameStatus() && 1 == dto.getHumanRemoveGameStatus())
+                .and(wrapper -> wrapper.ne(AdsRoleAmountDataParent::getIsRemoveGame,1).or(ADS_ROLE_AMOUNT_DATA_PARENT.IS_REMOVE_GAME.isNull()), null != dto.getHumanRemoveGameStatus() && 0 == dto.getHumanRemoveGameStatus())
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID)
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID)
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_START_TIME)
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_START_TIME)
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
+                .having(QueryCondition.createEmpty().and("system_remove_game_status = ?", dto.getSystemRemoveGameStatus()).when(null != dto.getSystemRemoveGameStatus()))
                 .orderBy(dto.getSortFiled(), dto.getSortAsc());
                 .orderBy(dto.getSortFiled(), dto.getSortAsc());
     }
     }
 }
 }

+ 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.mybatisflex.core.query.QueryWrapper;
-import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServer;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.zanxiang.game.gs.data.serve.service.IGameServerSonMergeService;
 import com.zanxiang.game.gs.data.serve.service.IGameServerSonMergeService;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServerSonMerge;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServerSonMerge;
@@ -31,4 +30,14 @@ public class GameServerSonMergeServiceImpl extends ServiceImpl<GameServerSonMerg
                 .stream()
                 .stream()
                 .collect(Collectors.groupingBy(GameServerSonMerge::getGameId, Collectors.toMap(GameServerSonMerge::getServerId, GameServerSonMerge::getServerName)));
                 .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:
       hikari:
         minimum-idle: 5
         minimum-idle: 5
         maximum-pool-size: 50
         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
   type-aliases-package: com.zanxiang.game.gs.data.serve.pojo.entity
   mapper-locations: classpath:mapper/**/*.xml
   mapper-locations: classpath:mapper/**/*.xml
   global-config:
   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) {
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 < (服务器迁移, 修正DUBBO通信问题・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (客服自动回复修改・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

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

+ 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
     @Override
     public boolean isCustomer() {
     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>()
         return super.count(new LambdaQueryWrapper<GameAuthRole>()
-                .eq(GameAuthRole::getAuthType, GameAuthEnum.CUSTOMER.getValue())
                 .eq(GameAuthRole::getUserId, SecurityUtil.getUserId())
                 .eq(GameAuthRole::getUserId, SecurityUtil.getUserId())
+                .and(qw -> qw.eq(GameAuthRole::getAuthType, GameAuthEnum.CUSTOMER.getValue())
+                        .or().eq(GameAuthRole::getCustomerPower, Boolean.TRUE))
         ) > 0;
         ) > 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;
             return;
         }
         }
         //客服休息时间, 发送自动回复
         //客服休息时间, 发送自动回复
-        this.systemReplyHandle(gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoom);
+        this.systemReplyHandleNew(gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoom);
         //消息报警监测
         //消息报警监测
         this.monitorWordHandle(gameApplet, kfAppletMsgDTO);
         this.monitorWordHandle(gameApplet, kfAppletMsgDTO);
         //保存消息, 玩家转入接待状态
         //保存消息, 玩家转入接待状态
@@ -286,6 +286,26 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         gameAuthRoleService.dingTalkCustomer(gameApplet.getGameId(), gameApplet.getAppName(), textContent);
         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) {
     private void systemReplyHandle(Long gameId, String openId, KfRoom kfRoom) {
         //获取自动回复配置
         //获取自动回复配置
         KfSystemReply kfSystemReply = kfSystemReplyService.getById(gameId);
         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 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) {
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <解决微信支付CP方金额精度不正确的问题> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <解决微信支付精度丢失的问题> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +
                 "\\ `--.| | | | |/ / \n" +

+ 2 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/WxPayService.java

@@ -15,6 +15,7 @@ import com.zanxiang.game.module.sdk.util.HttpUtil;
 import com.zanxiang.game.module.sdk.util.WxPayUtil;
 import com.zanxiang.game.module.sdk.util.WxPayUtil;
 import com.zanxiang.game.module.sdk.util.XmlUtil;
 import com.zanxiang.game.module.sdk.util.XmlUtil;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.NumberUtil;
 import com.zanxiang.module.util.exception.BaseException;
 import com.zanxiang.module.util.exception.BaseException;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.IOUtils;
@@ -328,7 +329,7 @@ public class WxPayService extends PayBaseService {
             paramData.put("body", product.getSubject());
             paramData.put("body", product.getSubject());
             paramData.put("out_trade_no", product.getOutTradeNo());
             paramData.put("out_trade_no", product.getOutTradeNo());
             paramData.put("fee_type", "CNY");
             paramData.put("fee_type", "CNY");
-            paramData.put("total_fee", WxPayUtil.subZeroAndDot(String.valueOf(Float.parseFloat(product.getTotalFee()) * 100)));
+            paramData.put("total_fee", String.valueOf(NumberUtil.multiply100(new BigDecimal(product.getTotalFee())).longValue()));
             paramData.put("spbill_create_ip", product.getSpbillCreateIp());
             paramData.put("spbill_create_ip", product.getSpbillCreateIp());
             paramData.put("notify_url", notifyUrl);
             paramData.put("notify_url", notifyUrl);
             paramData.put("trade_type", tradeType);
             paramData.put("trade_type", tradeType);