Переглянути джерело

Merge branch 'package' of GameCenter/game-center into dev

shishaosong 8 місяців тому
батько
коміт
c7807b675b

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

@@ -6,6 +6,7 @@ import com.zanxiang.game.gs.data.serve.pojo.vo.*;
 import com.zanxiang.game.gs.data.serve.service.IAdsGsServerDayParentService;
 import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountDataParentService;
 import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountRateParentService;
+import com.zanxiang.game.gs.data.serve.service.IAdsServerRankingParentService;
 import com.zanxiang.module.util.pojo.ResultVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -27,6 +28,8 @@ public class GameParentController {
     private IAdsRoleAmountRateParentService adsRoleAmountRateParentService;
     @Resource
     private IAdsGsServerDayParentService gsServerDayParentService;
+    @Resource
+    private IAdsServerRankingParentService serverRankingParentService;
 
     @ApiOperation(value = "大R每日充值比")
 //    @PreAuthorize(permissionKey = "gameGs:bigR:list")
@@ -77,4 +80,11 @@ public class GameParentController {
         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));
+    }
+
 }

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

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

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

@@ -1,8 +1,12 @@
 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管理) 服务层。
@@ -12,4 +16,5 @@ import com.mybatisflex.core.service.IService;
  */
 public interface IAdsServerRankingParentService extends IService<AdsServerRankingParent> {
 
+    PageVO<ServeManageVO, Row> serveManage(ServeManageDTO dto);
 }

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

@@ -149,7 +149,7 @@ public class AdsGsServerDayParentServiceImpl extends ServiceImpl<AdsGsServerDayP
                 // 小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;
+            totalDa +=  "/" + totalRDa;
             String[] totalSplit = totalDa.split("/");
             ServerPayVO.DayN retentionTotal = ServerPayVO.DayN.builder()
                     .activeNum(Long.parseLong(totalSplit[0]))
@@ -192,7 +192,7 @@ public class AdsGsServerDayParentServiceImpl extends ServiceImpl<AdsGsServerDayP
                         // 小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 += "/" + rDa;
+                    da = removeLastPart(da) + "/" + rDa;
                     String[] split = da.split("/");
                     ServerPayVO.DayN retentionVO = ServerPayVO.DayN.builder()
                             .activeNum(Long.parseLong(split[0]))
@@ -277,6 +277,23 @@ public class AdsGsServerDayParentServiceImpl extends ServiceImpl<AdsGsServerDayP
         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);
     }
@@ -394,7 +411,7 @@ public class AdsGsServerDayParentServiceImpl extends ServiceImpl<AdsGsServerDayP
             daySplit(currDayN, dayN);
         }
         String total = "total";
-        daySplit(currDayN, total);
+        dayTotalSplit(currDayN, total);
         // 移除最后一个逗号和空格
         if (currDayN.length() > 0) {
             currDayN.setLength(currDayN.length() - 2);
@@ -404,6 +421,23 @@ public class AdsGsServerDayParentServiceImpl extends ServiceImpl<AdsGsServerDayP
     }
 
     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), ")

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

@@ -1,11 +1,32 @@
 package com.zanxiang.game.gs.data.serve.service.impl;
 
 
-import org.springframework.stereotype.Service;
-import com.zanxiang.game.gs.data.serve.service.IAdsServerRankingParentService;
-import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsServerRankingParent;
-import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsServerRankingParentMapper;
+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管理) 服务层实现。
@@ -15,5 +36,177 @@ import com.mybatisflex.spring.service.impl.ServiceImpl;
  */
 @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");
+        }
+    }
 }