2
0

2 Commits 35b7c9240c ... 3d38121d9e

Autor SHA1 Mensagem Data
  Letianhua 3d38121d9e Merge remote-tracking branch 'origin/package' into package há 1 ano atrás
  Letianhua 0f67094112 游戏每日添加用户详情 há 1 ano atrás

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

+ 308 - 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());
 
@@ -614,6 +697,25 @@ public class GameDataServiceImpl implements IGameDataService {
         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,
@@ -5121,7 +5226,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 +5247,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 +5276,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 +5440,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 +9035,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 +9044,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 +9053,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 +9062,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 +9705,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) as num
                 FROM
                     game_ads.ads_player_recharge_ranking
                 WHERE player_id IN (@usersId)
@@ -9436,7 +9727,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) as num
                 FROM
                     game_ads_parent.ads_player_recharge_ranking_parent
                 WHERE parent_player_id IN (@usersId)