Kaynağa Gözat

feat:角色IP监控信息列表

zhangxianyu 1 ay önce
ebeveyn
işleme
f46fcda87d

+ 7 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/RoleManageController.java

@@ -58,6 +58,13 @@ public class RoleManageController {
         return ResultVO.ok(roleManageService.levelListOfPage(dto));
     }
 
+    @ApiOperation(value = "角色IP监控信息列表")
+    @PreAuthorize(permissionKey = "roleManage:ipInfo:listOfPage")
+    @PostMapping("/ipInfo/listOfPage")
+    public ResultVO<Page<Map>> ipInfoListOfPage(@RequestBody RoleIpInfoParamDTO dto) {
+        return ResultVO.ok(roleManageService.ipInfoListOfPage(dto));
+    }
+
 
 
     @ApiOperation(value = "创建发送消息任务")

+ 63 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/RoleIpInfoParamDTO.java

@@ -0,0 +1,63 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+  * @author ZhangXianyu
+  * @date 2025/2/20
+  * @description 角色ip信息参数DTO
+ */
+@Data
+public class RoleIpInfoParamDTO extends BasePage {
+
+   @ApiModelProperty(value = "玩家id")
+   private List<Long> userId;
+
+   @ApiModelProperty(value = "玩家名称")
+   private String userName;
+
+   @ApiModelProperty(value = "游戏角色id")
+   private String roleId;
+
+   @ApiModelProperty(value = "角色名称")
+   private String roleName;
+
+   @ApiModelProperty(value = "游戏id")
+   private List<Long> gameId;
+
+   @ApiModelProperty(value = "游戏名称")
+   private String gameName;
+
+   @ApiModelProperty(value = "区服id")
+   private List<String> serverId;
+
+   @ApiModelProperty(value = "区服名称")
+   private String serverName;
+
+   @ApiModelProperty(value = "角色创建时间最小值")
+   private LocalDate createTimeMin;
+
+   @ApiModelProperty(value = "角色创建时间最大值")
+   private LocalDate createTimeMax;
+
+   @ApiModelProperty(value = "角色等级最小值")
+   private Long roleLevelMin;
+
+   @ApiModelProperty(value = "角色等级最大值")
+   private Long roleLevelMax;
+
+   @ApiModelProperty(value = "角色注册IP")
+   private String regIp;
+
+   @ApiModelProperty(notes = "排序字段")
+   private String sortFiled;
+
+   @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+   private String sortType;
+
+}

+ 7 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IRoleManageService.java

@@ -51,4 +51,11 @@ public interface IRoleManageService {
      * @return
      */
     Page<Map> levelListOfPage(RoleLevelParamDTO dto);
+
+    /**
+     * 角色IP监控信息列表
+     * @param dto
+     * @return
+     */
+    Page<Map> ipInfoListOfPage(RoleIpInfoParamDTO dto);
 }

+ 200 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -967,6 +967,206 @@ public class RoleManageServiceImpl implements IRoleManageService {
         return new Page<>(list, pager);
     }
 
+    @Override
+    public Page<Map> ipInfoListOfPage(RoleIpInfoParamDTO dto) {
+        //创建查询条件
+        Criteria criA = getSqlByQuery(dto);
+        //分页对象
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        //查询总记录数
+        Sql countSql = Sqls.create(getIpInfoListCountSql(criA));
+        countSql.setCallback(Sqls.callback.integer());
+        dao.execute(countSql);
+        pager.setRecordCount(countSql.getInt());
+        //主表添加排序条件
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            criA.getOrderBy().orderBy("a.create_time", dto.getSortType());
+        } else {
+            criA.getOrderBy().orderBy(dto.getSortFiled(), dto.getSortType());
+        }
+        //列表sql
+        String ipInfoListSql = getIpInfoListSql(criA);
+        Sql sql = Sqls.create(ipInfoListSql);
+        sql.setCallback(Sqls.callback.maps());
+        sql.setPager(pager);
+        dao.execute(sql);
+        //查询结果
+        List<Map> list = sql.getList(Map.class);
+        return new Page<>(list, pager);
+    }
+
+    private String getIpInfoListSql(Criteria criA) {
+        return """
+                    WITH
+                login_data AS (
+                  SELECT
+                    role_id, game_id, user_id, ip
+                  FROM dm_game_order.t_user_login_log
+                  WHERE
+                    game_id IN (35,36,10035)
+                    AND role_id != 'null'
+                    AND ip IS NOT NULL AND ip != 'null' AND ip != ''
+                ),
+                user_role_counts AS (
+                  SELECT user_id, COUNT(DISTINCT role_id) AS user_role_count
+                  FROM login_data
+                  GROUP BY user_id
+                ),
+                ip_relationships AS (
+                  SELECT
+                    a.role_id,
+                    COUNT(DISTINCT b.user_id) AS user_count,
+                    COUNT(DISTINCT b.role_id) AS role_count
+                  FROM login_data a
+                  LEFT JOIN login_data b ON a.ip = b.ip
+                  GROUP BY a.role_id
+                ),
+                role_ip_roles AS (
+                  SELECT
+                    r.role_id,
+                    COUNT(DISTINCT all_roles.role_id) AS role_count
+                  FROM login_data r
+                  JOIN login_data all_roles ON r.ip = all_roles.ip
+                  GROUP BY r.role_id
+                )
+                                
+                                
+                                
+                SELECT
+                  a.*,
+                  GREATEST(e.role_count - urc.user_role_count, 0) AS ip_role_count_filter,
+                  GREATEST(f.role_count - urc.user_role_count, 0) AS role_user_ip_count_filter,
+                  game.game_name
+                FROM game_ads.role_ip_monitor a
+                LEFT JOIN (
+                  SELECT role_id, game_id, user_id, COUNT(DISTINCT ip) AS ip_count
+                  FROM login_data
+                  GROUP BY role_id, game_id, user_id
+                ) c ON a.role_id = c.role_id AND a.game_id = c.game_id AND a.user_id = c.user_id
+                LEFT JOIN ip_relationships d ON a.role_id = d.role_id
+                LEFT JOIN ip_relationships e ON a.role_id = e.role_id
+                LEFT JOIN role_ip_roles f ON a.role_id = f.role_id
+                LEFT JOIN user_role_counts urc ON a.user_id = urc.user_id
+                LEFT JOIN dm_game_order.t_game game ON a.game_id = game.id AND game.source_system = 'ZX_ONE'
+                """ + criA;
+    }
+
+    private Criteria getSqlByQuery(RoleIpInfoParamDTO dto) {
+        Criteria criA = Cnd.cri();
+        if (CollectionUtils.isNotEmpty(dto.getUserId())) {
+            //玩家id
+            criA.where().andInList("a.user_id", dto.getUserId());
+        }
+        if (StringUtils.isNotEmpty(dto.getUserName())) {
+            //玩家名称
+            criA.where().andLike("a.user_name", dto.getUserName());
+        }
+        if (StringUtils.isNotEmpty(dto.getServerName())) {
+            //区服名称
+            criA.where().andLike("a.server_name", dto.getServerName());
+        }
+        if (CollectionUtils.isNotEmpty(dto.getServerId())) {
+            //区服id
+            criA.where().andInStrList("a.server_id", dto.getServerId());
+        }
+        if (StringUtils.isNotEmpty(dto.getGameName())) {
+            //游戏名称
+            criA.where().andLike("a.game_name", dto.getGameName());
+        }
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
+            //游戏id
+            criA.where().andInList("a.game_id", dto.getGameId());
+        }else {
+            //游戏id
+            criA.where().andInList("a.game_id", Arrays.asList(35L,36L,10035L));
+        }
+        if (StringUtils.isNotEmpty(dto.getRoleId())) {
+            //角色id
+            criA.where().andEquals("a.role_id", dto.getRoleId());
+        }
+        if (StringUtils.isNotEmpty(dto.getRoleName())) {
+            //角色名称
+            criA.where().andLike("a.role_name", dto.getRoleName());
+        }
+        //角色等级区间筛选
+        if (dto.getRoleLevelMin() != null) {
+            criA.where().andGTE("a.role_level", dto.getRoleLevelMin());
+        }
+        if (dto.getRoleLevelMax() != null) {
+            criA.where().andLTE("a.role_level", dto.getRoleLevelMax());
+        }
+        //角色创建时间
+        if (dto.getCreateTimeMin() != null && dto.getCreateTimeMax() != null) {
+            criA.where().andBetween("a.create_time", dto.getCreateTimeMin().atTime(LocalTime.MIN), dto.getCreateTimeMax().atTime(LocalTime.MAX));
+        }
+        //注册ip
+        if (StringUtils.isNotEmpty(dto.getRegIp())) {
+            criA.where().andEquals("a.ip", dto.getRegIp());
+        }
+        return criA;
+    }
+
+    private String getIpInfoListCountSql(Criteria criA) {
+        return """
+                SELECT COUNT(1) FROM (
+                WITH
+                login_data AS (
+                  SELECT
+                    role_id, game_id, user_id, ip
+                  FROM dm_game_order.t_user_login_log
+                  WHERE
+                    game_id IN (35,36,10035)
+                    AND role_id != 'null'
+                    AND ip IS NOT NULL AND ip != 'null' AND ip != ''
+                ),
+                user_role_counts AS (
+                  SELECT user_id, COUNT(DISTINCT role_id) AS user_role_count
+                  FROM login_data
+                  GROUP BY user_id
+                ),
+                ip_relationships AS (
+                  SELECT
+                    a.role_id,
+                    COUNT(DISTINCT b.user_id) AS user_count,
+                    COUNT(DISTINCT b.role_id) AS role_count
+                  FROM login_data a
+                  LEFT JOIN login_data b ON a.ip = b.ip
+                  GROUP BY a.role_id
+                ),
+                role_ip_roles AS (
+                  SELECT
+                    r.role_id,
+                    COUNT(DISTINCT all_roles.role_id) AS role_count
+                  FROM login_data r
+                  JOIN login_data all_roles ON r.ip = all_roles.ip
+                  GROUP BY r.role_id
+                )
+                                
+                                
+                                
+                SELECT
+                  a.*,
+                  GREATEST(e.role_count - urc.user_role_count, 0) AS ip_role_count_filter,
+                  GREATEST(f.role_count - urc.user_role_count, 0) AS role_user_ip_count_filter,
+                  game.game_name
+                FROM game_ads.role_ip_monitor a
+                LEFT JOIN (
+                  SELECT role_id, game_id, user_id, COUNT(DISTINCT ip) AS ip_count
+                  FROM login_data
+                  GROUP BY role_id, game_id, user_id
+                ) c ON a.role_id = c.role_id AND a.game_id = c.game_id AND a.user_id = c.user_id
+                LEFT JOIN ip_relationships d ON a.role_id = d.role_id
+                LEFT JOIN ip_relationships e ON a.role_id = e.role_id
+                LEFT JOIN role_ip_roles f ON a.role_id = f.role_id
+                LEFT JOIN user_role_counts urc ON a.user_id = urc.user_id
+                LEFT JOIN dm_game_order.t_game game ON a.game_id = game.id AND game.source_system = 'ZX_ONE'
+                ) a
+                """ + criA;
+    }
+
     private Criteria getSqlByQuery(RoleLevelParamDTO dto) {
         Criteria criA = Cnd.cri();
         if(dto.getGsId()!=null){