|
@@ -1,14 +1,19 @@
|
|
|
package com.zanxiang.game.data.serve.service.impl;
|
|
|
|
|
|
import com.zanxiang.game.data.serve.component.DataPowerComponent;
|
|
|
+import com.zanxiang.game.data.serve.pojo.dto.PlayerBannedListDTO;
|
|
|
import com.zanxiang.game.data.serve.pojo.dto.PlayerDataListDTO;
|
|
|
+import com.zanxiang.game.data.serve.pojo.dto.PlayerLoginLogDataListDTO;
|
|
|
import com.zanxiang.game.data.serve.pojo.dto.PlayerRoleDataListDTO;
|
|
|
+import com.zanxiang.game.data.serve.pojo.enums.DeviceTypeEnum;
|
|
|
import com.zanxiang.game.data.serve.pojo.enums.GameCategoryEnum;
|
|
|
+import com.zanxiang.game.data.serve.pojo.enums.LogTypeEnum;
|
|
|
import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
|
|
|
import com.zanxiang.game.data.serve.pojo.vo.PlayerDataVO;
|
|
|
import com.zanxiang.game.data.serve.pojo.vo.PlayerRoleDataVO;
|
|
|
import com.zanxiang.game.data.serve.service.IPlayerDataService;
|
|
|
import com.zanxiang.game.data.serve.utils.Page;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.BooleanUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.nutz.dao.Cnd;
|
|
@@ -20,8 +25,10 @@ import org.nutz.dao.sql.Sql;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.util.Collection;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -30,6 +37,7 @@ import java.util.stream.Collectors;
|
|
|
* @Description 玩家数据的逻辑实现层
|
|
|
**/
|
|
|
@Service
|
|
|
+@Slf4j
|
|
|
public class PlayerDataServiceImpl implements IPlayerDataService {
|
|
|
|
|
|
@Autowired
|
|
@@ -326,6 +334,141 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
|
|
|
return new Page<>(list, pager);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 玩家登陆日志列表
|
|
|
+ * @param dto PlayerLoginLogDataListDTO
|
|
|
+ * @return Page<Map>
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Page<Map> getPlayerLoginLogDataList(PlayerLoginLogDataListDTO dto) {
|
|
|
+ //查询条件
|
|
|
+ Criteria cri = Cnd.cri();
|
|
|
+ if (StringUtils.isNotBlank(dto.getSourceSystem())) {
|
|
|
+ cri.where().andEquals("source_system", dto.getSourceSystem());
|
|
|
+ }
|
|
|
+ if (dto.getBeginDate() != null && dto.getEndDate() != null) {
|
|
|
+ //日期查询条件
|
|
|
+ cri.where().andBetween("DATE(dt)", dto.getBeginDate(), dto.getEndDate());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getUsername())) {
|
|
|
+ cri.where().andEquals("username", dto.getUsername());
|
|
|
+ }
|
|
|
+ if (dto.getUserId() != null) {
|
|
|
+ cri.where().andEquals("user_id", dto.getUserId());
|
|
|
+ }
|
|
|
+ if (dto.getGameId() != null) {
|
|
|
+ cri.where().andEquals("game_id", dto.getGameId());
|
|
|
+ }
|
|
|
+ if (dto.getGameClassify() != null) {
|
|
|
+ cri.where().andEquals("classify", dto.getGameClassify());
|
|
|
+ }
|
|
|
+ if (dto.getParentGameId() != null) {
|
|
|
+ cri.where().andEquals("parent_game_id", dto.getParentGameId());
|
|
|
+ }
|
|
|
+ if (dto.getRoleId() != null) {
|
|
|
+ cri.where().andEquals("role_id", dto.getRoleId());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getRoleName())) {
|
|
|
+ cri.where().andEquals("role_name", dto.getRoleName());
|
|
|
+ }
|
|
|
+ if (dto.getServerId() != null) {
|
|
|
+ cri.where().andEquals("server_id", dto.getServerId());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getOs())) {
|
|
|
+ cri.where().andEquals("os", dto.getOs());
|
|
|
+ }
|
|
|
+ if (dto.getDeviceType() != null) {
|
|
|
+ cri.where().andEquals("device_type", dto.getDeviceType());
|
|
|
+ }
|
|
|
+ if (dto.getType() != null) {
|
|
|
+ cri.where().andEquals("log_type", dto.getType());
|
|
|
+ }
|
|
|
+ //分页
|
|
|
+ Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
|
|
|
+ //获取记录数
|
|
|
+ Sql countSql = Sqls.create(getPlayerLoginLogDataCountSql() + cri);
|
|
|
+ countSql.setCallback(Sqls.callback.integer());
|
|
|
+ dao.execute(countSql);
|
|
|
+ pager.setRecordCount(countSql.getInt());
|
|
|
+
|
|
|
+ //添加默认排序
|
|
|
+ cri.getOrderBy().orderBy("dt", OrderByEnum.DESC.getOrderType());
|
|
|
+ //创建SQL语句
|
|
|
+ Sql sql = Sqls.create(getPlayerLoginLogDataSql() + cri);
|
|
|
+ sql.setCallback(Sqls.callback.maps());
|
|
|
+ sql.setPager(pager);
|
|
|
+ //获取结果
|
|
|
+ dao.execute(sql);
|
|
|
+ List<Map> list = sql.getList(Map.class).stream().map( map -> {
|
|
|
+ //获取游戏类型
|
|
|
+ String gameClassify = GameCategoryEnum.getNameByCategory(Long.valueOf((Integer)map.get("classify")));
|
|
|
+ if (StringUtils.isNotBlank(gameClassify)) {
|
|
|
+ map.put("classify", gameClassify);
|
|
|
+ }
|
|
|
+ //获取客户端类型
|
|
|
+ String deviceType = DeviceTypeEnum.getName((Integer) map.get("device_type"));
|
|
|
+ if (StringUtils.isNotBlank(deviceType)) {
|
|
|
+ map.put("device_type", deviceType);
|
|
|
+ }
|
|
|
+ //获取登陆类型
|
|
|
+ String logTypeName = LogTypeEnum.getLogTypeName((Integer) map.get("log_type"));
|
|
|
+ if (StringUtils.isNotBlank(logTypeName)) {
|
|
|
+ map.put("log_type", logTypeName);
|
|
|
+ }
|
|
|
+
|
|
|
+ return map;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ return new Page<>(list, pager);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 登陆IP玩家列表
|
|
|
+ * @param dto PlayerBannedListDTO
|
|
|
+ * @return Page<Map>
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Page<Map> getPlayerBannedDataList(PlayerBannedListDTO dto) {
|
|
|
+ Criteria cri = Cnd.cri();
|
|
|
+ if (StringUtils.isBlank(dto.getIp())) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ cri.where().andEquals("ip", dto.getIp());
|
|
|
+ cri.where().andEquals("source_system", "ZX_ONE");
|
|
|
+ //查询出所有玩家的ID
|
|
|
+ Sql findUserIdSql = Sqls.create("""
|
|
|
+ SELECT
|
|
|
+ DISTINCT user_id
|
|
|
+ FROM dm_game_order.t_user_login_log
|
|
|
+ """ + cri);
|
|
|
+ findUserIdSql.setCallback(Sqls.callback.longs());
|
|
|
+ dao.execute(findUserIdSql);
|
|
|
+ //执行结果
|
|
|
+ Collection userIds = findUserIdSql.getObject(Collection.class);
|
|
|
+ //分页
|
|
|
+ Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
|
|
|
+ //查询出用户列表
|
|
|
+ Criteria userMapCri = Cnd.cri();
|
|
|
+ userMapCri.where().andEquals("source_system", "ZX_ONE");
|
|
|
+ userMapCri.where().andInList("user_id", userIds.stream().toList());
|
|
|
+
|
|
|
+ //查询记录数
|
|
|
+ Sql userMapCountSql = Sqls.create(getUserMapCountSql() + userMapCri);
|
|
|
+ userMapCountSql.setCallback(Sqls.callback.integer());
|
|
|
+ dao.execute(userMapCountSql);
|
|
|
+ pager.setRecordCount(userMapCountSql.getInt());
|
|
|
+
|
|
|
+ //查询结果
|
|
|
+ Sql userMapSql = Sqls.create(getUserMapSql() + userMapCri);
|
|
|
+ userMapSql.setCallback(Sqls.callback.maps());
|
|
|
+ userMapSql.setPager(pager);
|
|
|
+ dao.execute(userMapSql);
|
|
|
+ List<Map> list = userMapSql.getList(Map.class);
|
|
|
+
|
|
|
+ return new Page<>(list, pager);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 查询玩家列表数据SQL
|
|
|
* @return String
|
|
@@ -746,4 +889,155 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
|
|
|
""";
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 玩家登陆日志查询列表
|
|
|
+ * @return String
|
|
|
+ */
|
|
|
+ private String getPlayerLoginLogDataSql() {
|
|
|
+ return """
|
|
|
+ SELECT
|
|
|
+ *
|
|
|
+ FROM (
|
|
|
+ SELECT
|
|
|
+ a.source_system , -- SDK来源
|
|
|
+ a.id , -- 主键id
|
|
|
+ a.create_time as dt, -- 时间
|
|
|
+ c.username , -- 玩家账号
|
|
|
+ a.user_id , -- 用户id
|
|
|
+ a.game_id , -- 登陆游戏id
|
|
|
+ b.game_name , -- 登陆游戏名
|
|
|
+ b.classify , -- 游戏类型
|
|
|
+ IFNULL(b.parent_id, a.game_id ) as parent_game_id , -- 父游戏id
|
|
|
+ IFNULL(e.game_name, b.game_name) as parent_game_name, -- 父游戏名
|
|
|
+ b.super_game_id , -- 超父游戏id
|
|
|
+ a.role_id , -- 角色id
|
|
|
+ a.role_name , -- 角色名
|
|
|
+ d.server_id , -- 区服id
|
|
|
+ d.server_name , -- 区服名
|
|
|
+ f.server_name as source_server_name, -- 原始区服名
|
|
|
+ a.os , -- 操作系统
|
|
|
+ a.ip , -- 登陆ip
|
|
|
+ a.device_type , -- 客户端类型
|
|
|
+ a.`type` as log_type -- 登陆类型 0-注册;1-登陆;2-退出
|
|
|
+ FROM dm_game_order.t_user_login_log a
|
|
|
+ LEFT JOIN dm_game_order.t_game b on a.source_system = b.source_system AND a.game_id = b.id
|
|
|
+ LEFT JOIN dm_game_order.t_game_user c on a.source_system = c.source_system AND a.user_id = c.id
|
|
|
+ LEFT JOIN dm_game_order.t_game_user_role d on a.source_system = d.source_system AND a.user_id = d.user_id AND a.role_id = d.role_id
|
|
|
+ LEFT JOIN dm_game_order.t_game e on b.source_system = e.source_system AND b.parent_id = e.id
|
|
|
+ LEFT JOIN dm_game_order.t_game_server_merge f on a.source_system = f.source_system AND b.super_game_id = f.game_id AND d.server_id = f.server_id
|
|
|
+ ) a
|
|
|
+ """;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 玩家登陆日志记录数
|
|
|
+ * @return String
|
|
|
+ */
|
|
|
+ private String getPlayerLoginLogDataCountSql() {
|
|
|
+ return """
|
|
|
+ SELECT
|
|
|
+ COUNT(1)
|
|
|
+ FROM (
|
|
|
+ SELECT
|
|
|
+ *
|
|
|
+ FROM (
|
|
|
+ SELECT
|
|
|
+ a.source_system , -- SDK来源
|
|
|
+ a.id , -- 主键id
|
|
|
+ a.create_time as dt, -- 时间
|
|
|
+ c.username , -- 玩家账号
|
|
|
+ a.user_id , -- 用户id
|
|
|
+ a.game_id , -- 登陆游戏id
|
|
|
+ b.game_name , -- 登陆游戏名
|
|
|
+ b.classify , -- 游戏类型
|
|
|
+ IFNULL(b.parent_id, a.game_id ) as parent_game_id , -- 父游戏id
|
|
|
+ IFNULL(e.game_name, b.game_name) as parent_game_name, -- 父游戏名
|
|
|
+ b.super_game_id , -- 超父游戏id
|
|
|
+ a.role_id , -- 角色id
|
|
|
+ a.role_name , -- 角色名
|
|
|
+ d.server_id , -- 区服id
|
|
|
+ d.server_name , -- 区服名
|
|
|
+ f.server_name , -- 原始区服名
|
|
|
+ a.os , -- 操作系统
|
|
|
+ a.ip , -- 登陆ip
|
|
|
+ a.device_type , -- 客户端类型
|
|
|
+ a.`type` as log_type -- 登陆类型 0-注册;1-登陆;2-退出
|
|
|
+ FROM dm_game_order.t_user_login_log a
|
|
|
+ LEFT JOIN dm_game_order.t_game b on a.source_system = b.source_system AND a.game_id = b.id
|
|
|
+ LEFT JOIN dm_game_order.t_game_user c on a.source_system = c.source_system AND a.user_id = c.id
|
|
|
+ LEFT JOIN dm_game_order.t_game_user_role d on a.source_system = d.source_system AND a.user_id = d.user_id AND a.role_id = d.role_id
|
|
|
+ LEFT JOIN dm_game_order.t_game e on b.source_system = e.source_system AND b.parent_id = e.id
|
|
|
+ LEFT JOIN dm_game_order.t_game_server_merge f on a.source_system = f.source_system AND b.super_game_id = f.game_id AND d.server_id = f.server_id
|
|
|
+ ) a
|
|
|
+ ) a
|
|
|
+ """;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有用户sql
|
|
|
+ * @return String
|
|
|
+ */
|
|
|
+ private String getUserMapSql() {
|
|
|
+ return """
|
|
|
+ SELECT
|
|
|
+ *
|
|
|
+ FROM (
|
|
|
+ SELECT
|
|
|
+ a.source_system ,
|
|
|
+ a.id as user_id,
|
|
|
+ a.username ,
|
|
|
+ a.nickname ,
|
|
|
+ b.role_id ,
|
|
|
+ b.role_name
|
|
|
+ FROM dm_game_order.t_game_user a
|
|
|
+ LEFT JOIN (
|
|
|
+ SELECT
|
|
|
+ source_system ,
|
|
|
+ user_id ,
|
|
|
+ role_id ,
|
|
|
+ role_name ,
|
|
|
+ ROW_NUMBER() OVER(PARTITION BY user_id,source_system order by create_time desc) as num
|
|
|
+ FROM dm_game_order.t_user_login_log
|
|
|
+ WHERE NOT role_id = 'null'
|
|
|
+ ) b on a.source_system = b.source_system AND a.id = b.user_id AND b.num = 1
|
|
|
+ ) a
|
|
|
+ """;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有用户记录数sql
|
|
|
+ * @return String
|
|
|
+ */
|
|
|
+ private String getUserMapCountSql() {
|
|
|
+ return """
|
|
|
+ SELECT
|
|
|
+ COUNT(1)
|
|
|
+ FROM (
|
|
|
+ SELECT
|
|
|
+ *
|
|
|
+ FROM (
|
|
|
+ SELECT
|
|
|
+ a.source_system ,
|
|
|
+ a.id as user_id,
|
|
|
+ a.username ,
|
|
|
+ a.nickname ,
|
|
|
+ b.role_id ,
|
|
|
+ b.role_name
|
|
|
+ FROM dm_game_order.t_game_user a
|
|
|
+ LEFT JOIN (
|
|
|
+ SELECT
|
|
|
+ source_system ,
|
|
|
+ user_id ,
|
|
|
+ role_id ,
|
|
|
+ role_name ,
|
|
|
+ ROW_NUMBER() OVER(PARTITION BY user_id,source_system order by create_time desc) as num
|
|
|
+ FROM dm_game_order.t_user_login_log
|
|
|
+ WHERE NOT role_id = 'null'
|
|
|
+ ) b on a.source_system = b.source_system AND a.id = b.user_id AND b.num = 1
|
|
|
+ ) a
|
|
|
+ ) a
|
|
|
+ """;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|