Преглед на файлове

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

zhimo преди 1 година
родител
ревизия
1a2c091766

+ 3 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayTotalVO.java

@@ -1114,4 +1114,7 @@ public class GameDataDayTotalVO {
     @ApiModelProperty(value = "新用户累计创角率(总量)")
     private BigDecimal newUserTotalRoleNumRate;
 
+    @ApiModelProperty(value = "da1的用户详情")
+    private FirstNewUserAgainTrendVO userDetails;
+
 }

+ 3 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayVO.java

@@ -1140,4 +1140,7 @@ public class GameDataDayVO {
     @ApiModelProperty(value = "新用户累计创角率(总量)")
     private BigDecimal newUserTotalRoleNumRate;
 
+    @ApiModelProperty(value = "da1的用户详情")
+    private FirstNewUserAgainTrendVO userDetails;
+
 }

+ 12 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataUserDetailsVO.java

@@ -61,4 +61,16 @@ public class GameDataUserDetailsVO {
     @ApiModelProperty(notes = "充值金额")
     private BigDecimal todayTotalAmount;
 
+    /**
+     * 累计充值次数
+     */
+    @ApiModelProperty(notes = "累计充值次数")
+    private Long totalAmountCount;
+
+    /**
+     * 累充排名
+     */
+    @ApiModelProperty(notes = "累充排名")
+    private Long num;
+
 }

+ 314 - 15
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

@@ -18,6 +18,7 @@ import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.nutz.dao.Cnd;
 import org.nutz.dao.Dao;
@@ -287,11 +288,53 @@ public class GameDataServiceImpl implements IGameDataService {
         dao.execute(sqlCount);
         pager.setRecordCount(sqlCount.getInt());
 
+        //查询出每个游戏的注册查询时间内,注册当天且充值的所有用户id
+        //只查询Day1的数据
+        //不选游戏查询的结果 --> (gameId/日期, userId)
+        //选游戏查询的结果 --> (日期, userId)
+        Map<String, String> gameDateUsersIdMap = findUsersIdForGameData(dto);
+
         List<GameDataDayVO> gameDataDayVOList = list.stream().map(vo -> {
+
+            Long[] usersID = ArrayUtils.EMPTY_LONG_OBJECT_ARRAY;
+            //默认查询的数据-不选择游戏
+            if (CollectionUtils.isEmpty(dto.getGameId())) {
+                //将gameId和需要查询的注册时间拼接
+                String gameIdDate = vo.getGameId() + "/" + vo.getCostDate();
+                //取出所有usersId
+                if (gameDateUsersIdMap.containsKey(gameIdDate)) {
+                    //string[] -> Long[]
+                    usersID = Arrays.stream(gameDateUsersIdMap.get(gameIdDate)
+                                    .split("/"))
+                            .map(Long::parseLong)
+                            .toArray(Long[]::new);
+                }
+            } else {
+                //取出所有usersId
+                if (gameDateUsersIdMap.containsKey(vo.getCostDate().toString())) {
+                    //string[] -> Long[]
+                    usersID = Arrays.stream(gameDateUsersIdMap.get(vo.getCostDate().toString())
+                                    .split("/"))
+                            .map(Long::parseLong)
+                            .toArray(Long[]::new);
+                }
+            }
             formatDayNGroupByDt(vo);
+
+            FirstNewUserAgainTrendVO againTrendVO = FirstNewUserAgainTrendVO.builder()
+                    .gameDimension(dto.getGameDimension())
+                    .sourceSystem(dto.getSourceSystem())
+                    .timeType("da1")
+                    .rechargeCount(vo.getAmountD1Trend().getRechargeUserCount())
+                    .usersId(usersID)
+                    .build();
+            vo.setUserDetails(againTrendVO);
+
             return vo;
         }).collect(Collectors.toList());
 
+        //添加数据
+
         //返回list结果 封装到page对象里
         return new Page<>(gameDataDayVOList, pager);
     }
@@ -376,8 +419,48 @@ public class GameDataServiceImpl implements IGameDataService {
         dao.execute(sqlCount);
         pager.setRecordCount(sqlCount.getInt());
 
+        //查询出每个游戏的注册查询时间内,注册当天且充值的所有用户id
+        //只查询Day1的数据
+        //不选游戏查询的结果 --> (gameId/日期, userId)
+        //选游戏查询的结果 --> (日期, userId)
+        Map<String, String> gameDateUsersIdMap = findUsersIdForGameData(dto);
+
         List<GameDataDayVO> gameDataDayVOList = list.stream().map(vo -> {
+
+            Long[] usersID = ArrayUtils.EMPTY_LONG_OBJECT_ARRAY;
+            //默认查询的数据-不选择游戏
+            if (CollectionUtils.isEmpty(dto.getGameId())) {
+                //将gameId和需要查询的注册时间拼接
+                String gameIdDate = vo.getGameId() + "/" + vo.getCostDate();
+                //取出所有usersId
+                if (gameDateUsersIdMap.containsKey(gameIdDate)) {
+                    //string[] -> Long[]
+                    usersID = Arrays.stream(gameDateUsersIdMap.get(gameIdDate)
+                                    .split("/"))
+                            .map(Long::parseLong)
+                            .toArray(Long[]::new);
+                }
+            } else {
+                //取出所有usersId
+                if (gameDateUsersIdMap.containsKey(vo.getCostDate().toString())) {
+                    //string[] -> Long[]
+                    usersID = Arrays.stream(gameDateUsersIdMap.get(vo.getCostDate().toString())
+                                    .split("/"))
+                            .map(Long::parseLong)
+                            .toArray(Long[]::new);
+                }
+            }
             formatDayNGroupByDt(vo);
+
+            FirstNewUserAgainTrendVO againTrendVO = FirstNewUserAgainTrendVO.builder()
+                    .gameDimension(dto.getGameDimension())
+                    .sourceSystem(dto.getSourceSystem())
+                    .timeType("da1")
+                    .rechargeCount(vo.getAmountD1Trend().getRechargeUserCount())
+                    .usersId(usersID)
+                    .build();
+            vo.setUserDetails(againTrendVO);
+
             return vo;
         }).collect(Collectors.toList());
 
@@ -613,7 +696,26 @@ public class GameDataServiceImpl implements IGameDataService {
         GameDataDayTotalVO vo = gameDataDayTotalsql.getObject(GameDataDayTotalVO.class);
         if (vo.getAmountD1() != null) {
             formatDayNTotal(vo);
+
+            //得到所有userID
+            Long[] usersIdTotal = ArrayUtils.EMPTY_LONG_OBJECT_ARRAY;
+            //得到所有用户的id整合字符串
+            String usersIdTotalStr = findUsersIdTotalForGameData(dto);
+            if (StringUtils.isNotBlank(usersIdTotalStr)) {
+                usersIdTotal = Arrays.stream(usersIdTotalStr.split("/"))
+                        .map(Long::parseLong)
+                        .toArray(Long[]::new);
+            }
+            FirstNewUserAgainTrendVO againTrendVO = FirstNewUserAgainTrendVO.builder()
+                    .gameDimension(dto.getGameDimension())
+                    .sourceSystem(dto.getSourceSystem())
+                    .timeType("da1")
+                    .rechargeCount(vo.getAmountD1Trend().getRechargeUserCount())
+                    .usersId(usersIdTotal)
+                    .build();
+            vo.setUserDetails(againTrendVO);
         }
+
         return vo;
     }
 
@@ -2512,6 +2614,7 @@ public class GameDataServiceImpl implements IGameDataService {
                     SELECT
                         dt as cost_date,
                         source_system,
+                        MAX(game_id) as game_id,
                         GROUP_CONCAT(game_name) as game_name,
                         IFNULL(SUM(cost), 0) cost,
                         IFNULL(SUM(buy_reg_num), 0) reg_num,
@@ -2565,6 +2668,7 @@ public class GameDataServiceImpl implements IGameDataService {
                     SELECT
                         dt as cost_date,
                         source_system,
+                        MAX(game_id) as game_id,
                         GROUP_CONCAT(game_name) as game_name,
                         IFNULL(SUM(cost), 0) cost,
                         IFNULL(SUM(nature_reg_num), 0) reg_num,
@@ -2619,6 +2723,7 @@ public class GameDataServiceImpl implements IGameDataService {
                 SELECT
                     dt as cost_date,
                     source_system,
+                    MAX(game_id) as game_id,
                     GROUP_CONCAT(game_name) as game_name,
                     IFNULL(SUM(cost), 0) cost,
                     IFNULL(SUM(reg_num), 0) reg_num,
@@ -2681,6 +2786,7 @@ public class GameDataServiceImpl implements IGameDataService {
                     SELECT
                         dt as cost_date,
                         source_system,
+                        MAX(parent_game_id) as game_id,
                         GROUP_CONCAT(parent_game_name) as game_name,
                         IFNULL(SUM(cost), 0) cost,
                         IFNULL(SUM(buy_reg_num), 0) reg_num,
@@ -2734,6 +2840,7 @@ public class GameDataServiceImpl implements IGameDataService {
                     SELECT
                         dt as cost_date,
                         source_system,
+                        MAX(parent_game_id) as game_id,
                         GROUP_CONCAT(parent_game_name) as game_name,
                         IFNULL(SUM(cost), 0) cost,
                         IFNULL(SUM(nature_reg_num), 0) reg_num,
@@ -2788,6 +2895,7 @@ public class GameDataServiceImpl implements IGameDataService {
                 SELECT
                     dt as cost_date,
                     source_system,
+                    MAX(parent_game_id) as game_id,
                     GROUP_CONCAT(parent_game_name) as game_name,
                     IFNULL(SUM(cost), 0) cost,
                     IFNULL(SUM(reg_num), 0) reg_num,
@@ -5003,6 +5111,9 @@ public class GameDataServiceImpl implements IGameDataService {
     @Override
     public Page<GameDataUserDetailsVO> getUserDetails(GameDataUserDetailsDTO dto) {
 
+        if (dto.getAgainTrendVO() == null || StringUtils.isBlank(dto.getAgainTrendVO().getTimeType())) {
+            return new Page<>(null, dto.toPage());
+        }
         //得到需要查询的usersID内容
         FirstNewUserAgainTrendVO againTrendVO = dto.getAgainTrendVO();
         if (againTrendVO.getGameDimension() == null) {
@@ -5121,7 +5232,7 @@ public class GameDataServiceImpl implements IGameDataService {
         //查询每个游戏的注册首日充值用户id,在玩家充值排行榜里查找
         Criteria findUsersCri = Cnd.cri();
         //拼接游戏ID
-        if (dto.getGameId() != null) {
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
             findUsersCri.where().andInList(gameColumn, dto.getGameId());
         }
         //拼接游戏应用类型
@@ -5142,11 +5253,20 @@ public class GameDataServiceImpl implements IGameDataService {
         } else if ("nature".equals(dto.getTableTypes())) {
             findUsersCri.where().andEquals("reg_agent_id", 0);
         }
+        //拼接分组条件
+        Criteria groupByCri = Cnd.cri();
+        if (dto.getGameDimension() == 2L) {
+            //父维度
+            groupByCri.getGroupBy().groupBy("parent_game_id", "DATE(reg_user_time)");
+        } else {
+            //子维度
+            groupByCri.getGroupBy().groupBy("reg_game_id", "DATE(reg_user_time)");
+        }
         Sql findUsersIdSql;
         if (dto.getGameDimension() == 1L) {
-            findUsersIdSql = Sqls.create(findUsersIdSql(findUsersCri));
+            findUsersIdSql = Sqls.create(findUsersIdSql(findUsersCri, groupByCri));
         } else {
-            findUsersIdSql = Sqls.create(findUsersIdSqlForParent(findUsersCri));
+            findUsersIdSql = Sqls.create(findUsersIdSqlForParent(findUsersCri, groupByCri));
         }
         //自定义回传
         findUsersIdSql.setCallback((connection, resultSet, sql) -> {
@@ -5162,6 +5282,147 @@ public class GameDataServiceImpl implements IGameDataService {
         return findUsersIdSql.getObject(Map.class);
     }
 
+    /**
+     * 查询出每个游戏的注册查询时间内,注册当天且充值的所有用户id-游戏每日
+     *
+     * @param dto 前端查询参数
+     * @return map
+     */
+    private Map findUsersIdForGameData(GameDataDayDTO dto) {
+
+        //默认查询子游戏维度
+        if (dto.getGameDimension() == null) {
+            dto.setGameDimension(1L);
+        }
+        //默认查询字段
+        String gameColumn = "reg_game_id";
+        String classifyColumn = "classify";
+        if (dto.getGameDimension() == 2L) {
+            gameColumn = "parent_game_id";
+            classifyColumn = "parent_game_classify";
+        }
+
+        //查询每个游戏的注册首日充值用户id,在玩家充值排行榜里查找
+        Criteria findUsersCri = Cnd.cri();
+        //拼接游戏ID
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
+            findUsersCri.where().andInList(gameColumn, dto.getGameId());
+        }
+        //拼接游戏应用类型
+        if (dto.getGameClassify() != null) {
+            findUsersCri.where().andEquals(classifyColumn, dto.getGameClassify());
+        }
+        //拼接SDK来源
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            findUsersCri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        //拼接查询时间
+        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            findUsersCri.where().andBetween("DATE(reg_user_time)", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        //不同数据类型 查询条件不同 buy、nature、total
+        if ("buy".equals(dto.getTableTypes())) {
+            findUsersCri.where().andNotEquals("reg_agent_id", 0);
+        } else if ("nature".equals(dto.getTableTypes())) {
+            findUsersCri.where().andEquals("reg_agent_id", 0);
+        }
+
+        Sql findUsersIdSql;
+        Criteria groupByCri = Cnd.cri();
+        //如果是默认查询,需要按游戏、日期分组
+        if (CollectionUtils.isEmpty(dto.getGameId())) {
+            //拼接分组条件
+            if (dto.getGameDimension() == 2L) {
+                //父维度
+                groupByCri.getGroupBy().groupBy("parent_game_id", "DATE(reg_user_time)");
+                findUsersIdSql = Sqls.create(findUsersIdSqlForParent(findUsersCri, groupByCri));
+            } else {
+                //子维度
+                groupByCri.getGroupBy().groupBy("reg_game_id", "DATE(reg_user_time)");
+                findUsersIdSql = Sqls.create(findUsersIdSql(findUsersCri, groupByCri));
+            }
+        } else {
+            //选择游戏后,只按照日期分组
+            //拼接分组条件
+            groupByCri.getGroupBy().groupBy("DATE(reg_user_time)");
+            if (dto.getGameDimension() == 1L) {
+                findUsersIdSql = Sqls.create(findUsersIdSqlForGameData(findUsersCri, groupByCri));
+            } else {
+                findUsersIdSql = Sqls.create(findUsersIdSqlForParentForGameData(findUsersCri, groupByCri));
+            }
+        }
+        //自定义回传
+        findUsersIdSql.setCallback((connection, resultSet, sql) -> {
+            Map<String, String> tempMap = new HashMap<>();
+            while (resultSet.next()) {
+                tempMap.put(resultSet.getString(1), resultSet.getString(2));
+            }
+            return tempMap;
+        });
+        //运行sql
+        dao.execute(findUsersIdSql);
+        //返回结果
+        return findUsersIdSql.getObject(Map.class);
+    }
+
+    /**
+     * 查询出每个游戏的注册查询时间内,注册当天且充值的所有用户id(游戏每日总计)
+     *
+     * @param dto 前端查询参数
+     * @return map
+     */
+    private String findUsersIdTotalForGameData(GameDataDayTotalDTO dto) {
+
+        //默认查询子游戏维度
+        if (dto.getGameDimension() == null) {
+            dto.setGameDimension(1L);
+        }
+        //默认查询字段
+        String gameColumn = "reg_game_id";
+        String classifyColumn = "classify";
+        if (dto.getGameDimension() == 2L) {
+            gameColumn = "parent_game_id";
+            classifyColumn = "parent_game_classify";
+        }
+
+        //查询每个游戏的注册首日充值用户id,在玩家充值排行榜里查找
+        Criteria findUsersCri = Cnd.cri();
+        //拼接游戏ID
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
+            findUsersCri.where().andInList(gameColumn, dto.getGameId());
+        }
+        //拼接游戏应用类型
+        if (dto.getGameClassify() != null) {
+            findUsersCri.where().andEquals(classifyColumn, dto.getGameClassify());
+        }
+        //拼接SDK来源
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            findUsersCri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        //拼接查询时间
+        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            findUsersCri.where().andBetween("DATE(reg_user_time)", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        //不同数据类型 查询条件不同 buy、nature、total
+        if ("buy".equals(dto.getTableTypes())) {
+            findUsersCri.where().andNotEquals("reg_agent_id", 0);
+        } else if ("nature".equals(dto.getTableTypes())) {
+            findUsersCri.where().andEquals("reg_agent_id", 0);
+        }
+        Sql findUsersIdTotalSql;
+        if (dto.getGameDimension() == 1L) {
+            findUsersIdTotalSql = Sqls.create(findUsersIdTotalSql(findUsersCri));
+        } else {
+            findUsersIdTotalSql = Sqls.create(findUsersIdTotalSqlForParent(findUsersCri));
+        }
+        //自定义回传
+        findUsersIdTotalSql.setCallback(Sqls.callback.str());
+        //运行sql
+        dao.execute(findUsersIdTotalSql);
+        //返回结果
+        return findUsersIdTotalSql.getString();
+    }
+
     /**
      * 查询出每个游戏的注册查询时间内,注册当天且充值的所有用户id(总计一栏)
      *
@@ -5185,7 +5446,7 @@ public class GameDataServiceImpl implements IGameDataService {
         //查询每个游戏的注册首日充值用户id,在玩家充值排行榜里查找
         Criteria findUsersCri = Cnd.cri();
         //拼接游戏ID
-        if (dto.getGameId() != null) {
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
             findUsersCri.where().andInList(gameColumn, dto.getGameId());
         }
         //拼接游戏应用类型
@@ -8780,7 +9041,7 @@ public class GameDataServiceImpl implements IGameDataService {
      *
      * @return String
      */
-    private String findUsersIdSql(Criteria cri) {
+    private String findUsersIdSql(Criteria cri, Criteria groupByCri) {
         return """
                 SELECT
                     CONCAT(reg_game_id,'/',DATE(reg_user_time)) as game_id_date,
@@ -8789,9 +9050,8 @@ public class GameDataServiceImpl implements IGameDataService {
                     game_ads.ads_player_recharge_ranking
                 """ + cri +
                 """
-                    AND dt = DATE(reg_user_time)
-                GROUP BY reg_game_id, DATE(reg_user_time)
-                        """;
+                    and dt = DATE(reg_user_time) 
+                """ + groupByCri;
     }
 
     /**
@@ -8799,7 +9059,7 @@ public class GameDataServiceImpl implements IGameDataService {
      *
      * @return String
      */
-    private String findUsersIdSqlForParent(Criteria cri) {
+    private String findUsersIdSqlForParent(Criteria cri, Criteria groupByCri) {
         return """
                 SELECT
                     CONCAT(parent_game_id,'/',DATE(reg_user_time)) as game_id_date,
@@ -8808,13 +9068,48 @@ public class GameDataServiceImpl implements IGameDataService {
                     game_ads_parent.ads_player_recharge_ranking_parent
                 """ + cri +
                 """
-                    AND dt = DATE(reg_user_time)
-                GROUP BY parent_game_id, DATE(reg_user_time)
-                        """;
+                    and dt = DATE(reg_user_time) 
+                """ + groupByCri;
+    }
+
+    /**
+     * 找出每个游戏注册时间内的注册当天且充值的用户id-游戏每日
+     *
+     * @return String
+     */
+    private String findUsersIdSqlForGameData(Criteria cri, Criteria groupByCri) {
+        return """
+                SELECT
+                    DATE(reg_user_time) as reg_user_time,
+                    GROUP_CONCAT(CONVERT (player_id, varchar), "/") as amount_users_id
+                FROM
+                    game_ads.ads_player_recharge_ranking
+                """ + cri +
+                """
+                    and dt = DATE(reg_user_time) 
+                """ + groupByCri;
+    }
+
+    /**
+     * 找出每个游戏注册时间内的注册当天且充值的用户id-游戏每日-父游戏维度
+     *
+     * @return String
+     */
+    private String findUsersIdSqlForParentForGameData(Criteria cri, Criteria groupByCri) {
+        return """
+                SELECT
+                    DATE(reg_user_time) as reg_user_time,
+                    GROUP_CONCAT(CONVERT (parent_player_id, varchar), "/") as amount_users_id
+                FROM
+                    game_ads_parent.ads_player_recharge_ranking_parent
+                """ + cri +
+                """
+                    and dt = DATE(reg_user_time) 
+                """ + groupByCri;
     }
 
     /**
-     * 找出每个游戏注册时间内的注册当天且充值的用户id(总计一栏)
+     * 找出每个游戏注册时间内的注册当天且充值的用户id(总计)
      *
      * @return String
      */
@@ -9416,7 +9711,9 @@ public class GameDataServiceImpl implements IGameDataService {
                     server_name,
                     role_name,
                     $amount as today_total_amount,
-                    player_os
+                    player_os,
+                    total_amount_count,
+                    ROW_NUMBER() over(order by today_total_amount desc, total_amount_count desc, player_id desc) as num
                 FROM
                     game_ads.ads_player_recharge_ranking
                 WHERE player_id IN (@usersId)
@@ -9436,7 +9733,9 @@ public class GameDataServiceImpl implements IGameDataService {
                     server_name,
                     role_name,
                     $amount as today_total_amount,
-                    player_os
+                    player_os,
+                    total_amount_count,
+                    ROW_NUMBER() over(order by today_total_amount desc, total_amount_count desc, parent_player_id desc) as num
                 FROM
                     game_ads_parent.ads_player_recharge_ranking_parent
                 WHERE parent_player_id IN (@usersId)

+ 4 - 44
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -851,7 +851,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 		a.association_user_id as association_user_id, -- 来源的用户id
                 		a.source_system as source_system, -- sdk来源
                 		a.role_id as role_id, -- 角色id
-                		u.role_name as role_name, -- 角色名
+                		b.role_name as role_name, -- 角色名
                 		a.create_time as role_create_time, -- 角色创建时间
                 		a.os as os, -- 角色操作系统
                 		b.role_level as role_level, -- 角色等级
@@ -958,6 +958,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 			-- 角色等级、角色攻击力(取最新的信息)
                 			source_system,
                 			role_id,
+                			role_name,
                 			role_level,
                 			combat_num,
                 			ROW_NUMBER()over(partition by role_id , source_system order by update_time desc, user_id desc) as num
@@ -1209,27 +1210,6 @@ public class RoleManageServiceImpl implements IRoleManageService {
                         FROM dm_game_order.t_game_server_merge
                         WHERE is_delete = 0
                     ) t on a.source_system = t.source_system AND a.server_id = t.server_id AND d.super_game_id = t.game_id
-                    LEFT JOIN(
-                		SELECT
-                			a.source_system,
-                			a.role_id,
-                			a.role_name,
-                			a.role_level,
-                			a.combat_num ,
-                			a.game_id ,
-                			b.parent_game_id,
-                			b.super_game_id ,
-                			ROW_NUMBER()over(partition by a.source_system , a.role_id, b.parent_game_id order by a.role_level desc,a.combat_num desc) as num
-                		FROM dm_game_order.t_game_user_role a
-                		LEFT JOIN (
-                			SELECT
-                				source_system,
-                				id,
-                				IFNULL(parent_id, id) as parent_game_id,
-                				IFNULL(super_game_id, id) as super_game_id
-                			FROM dm_game_order.t_game
-                		) b on a.source_system = b.source_system AND a.game_id = b.id
-                	) u on a.source_system = u.source_system AND a.role_id = u.role_id AND d.super_game_id = u.super_game_id AND u.num =1
                 	LEFT JOIN (
                 		SELECT
                 			-- vip等级
@@ -1264,7 +1244,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
                         a.association_user_id as association_user_id, -- 来源的用户id
                         a.source_system as source_system, -- sdk来源
                         a.role_id as role_id, -- 角色id
-                        u.role_name as role_name, -- 角色名
+                        b.role_name as role_name, -- 角色名
                         a.create_time as role_create_time, -- 角色创建时间
                         a.os as os, -- 角色操作系统
                         b.role_level as role_level, -- 角色等级
@@ -1371,6 +1351,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
                             -- 角色等级、角色攻击力(取最新的信息)
                             source_system,
                             role_id,
+                            role_name,
                             role_level,
                             combat_num,
                             ROW_NUMBER()over(partition by role_id , source_system order by update_time desc, user_id desc) as num
@@ -1622,27 +1603,6 @@ public class RoleManageServiceImpl implements IRoleManageService {
                         FROM dm_game_order.t_game_server_merge
                         WHERE is_delete = 0
                     ) t on a.source_system = t.source_system AND a.server_id = t.server_id AND d.super_game_id = t.game_id
-                    LEFT JOIN(
-                		SELECT
-                			a.source_system,
-                			a.role_id,
-                			a.role_name,
-                			a.role_level,
-                			a.combat_num ,
-                			a.game_id ,
-                			b.parent_game_id,
-                			b.super_game_id ,
-                			ROW_NUMBER()over(partition by a.source_system , a.role_id, b.parent_game_id order by a.role_level desc,a.combat_num desc) as num
-                		FROM dm_game_order.t_game_user_role a
-                		LEFT JOIN (
-                			SELECT
-                				source_system,
-                				id,
-                				IFNULL(parent_id, id) as parent_game_id,
-                				IFNULL(super_game_id, id) as super_game_id
-                			FROM dm_game_order.t_game
-                		) b on a.source_system = b.source_system AND a.game_id = b.id
-                	) u on a.source_system = u.source_system AND a.role_id = u.role_id AND d.super_game_id = u.super_game_id AND u.num =1
                 	LEFT JOIN (
                 		SELECT
                 			-- vip等级

+ 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) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <导量逻辑> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <导量插入渠道变更记录, 修改手机号加限制> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 21 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IUserAgentLogService.java

@@ -0,0 +1,21 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.User;
+import com.zanxiang.game.module.mybatis.entity.UserAgentLog;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-07-20
+ * @description : 用户渠道记录
+ */
+public interface IUserAgentLogService extends IService<UserAgentLog> {
+
+    /**
+     * 注册代理日志
+     *
+     * @param user 用户
+     * @return boolean
+     */
+    boolean regAgentLog(User user);
+}

+ 44 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserAgentLogServiceImpl.java

@@ -0,0 +1,44 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.service.IUserAgentLogService;
+import com.zanxiang.game.module.mybatis.entity.Agent;
+import com.zanxiang.game.module.mybatis.entity.User;
+import com.zanxiang.game.module.mybatis.entity.UserAgentLog;
+import com.zanxiang.game.module.mybatis.mapper.UserAgentLogMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-07-20
+ * @description : 用户渠道记录
+ */
+@Slf4j
+@Service
+public class UserAgentLogServiceImpl extends ServiceImpl<UserAgentLogMapper, UserAgentLog> implements IUserAgentLogService {
+
+    @Override
+    public boolean regAgentLog(User user) {
+        if (Agent.DEFAULT_AGENT.equals(user.getAgentId()) || Strings.isBlank(user.getChannel())) {
+            return Boolean.FALSE;
+        }
+        try {
+            return super.save(this.transform(user));
+        } catch (Exception e) {
+            log.error("用户注册渠道记录保存异常, userId : {}, e : {}", user.getId(), e.getMessage());
+        }
+        return Boolean.FALSE;
+    }
+
+    private UserAgentLog transform(User user) {
+        return UserAgentLog.builder()
+                .userId(user.getId())
+                .newAgentId(user.getAgentId())
+                .newChannel(user.getChannel())
+                .createTime(user.getCreateTime())
+                .updateTime(user.getCreateTime())
+                .build();
+    }
+}

+ 16 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserServiceImpl.java

@@ -83,6 +83,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     @Autowired
     private IGameAuthService gameAuthService;
 
+    @Autowired
+    private IUserAgentLogService userAgentLogService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean appletToH5(Long userId, String mobile, Integer type) {
@@ -179,10 +182,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         ).collect(Collectors.toList());
         gameUserRoleService.saveBatch(h5GameUserRoleList);
         //用户更新
-        return super.update(new LambdaUpdateWrapper<User>()
+        super.update(new LambdaUpdateWrapper<User>()
                 .set(User::getRelationUserId, h5User.getId())
                 .set(User::getRelationCreateTime, LocalDateTime.now())
                 .eq(User::getId, userId));
+        //添加导量用户的渠道变更记录
+        return userAgentLogService.regAgentLog(h5User);
     }
 
     @Override
@@ -304,6 +309,16 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean userUpdate(UserUpdateParam param) {
+        if (Strings.isNotBlank(param.getMobile()) && !param.getMobile().contains("*")) {
+            User user = super.getById(param.getUserId());
+            //判断手机号是否被该游戏其他用户绑定
+            if (super.count(new LambdaQueryWrapper<User>()
+                    .eq(User::getGameId, user.getGameId())
+                    .eq(User::getMobile, param.getMobile())
+            ) > 0) {
+                throw new BaseException("手机号已被同游戏其他玩家绑定, 禁止修改");
+            }
+        }
         //用户信息更新
         if (Strings.isNotBlank(param.getMobile()) || Strings.isNotBlank(param.getAliPay()) || Strings.isNotBlank(param.getPassword())) {
             super.update(new LambdaUpdateWrapper<User>()