|
@@ -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){
|