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

:fix:修改游戏总数据sqlbug

zhangxianyu преди 10 месеца
родител
ревизия
471cdadb7a
променени са 1 файла, в които са добавени 237 реда и са изтрити 8 реда
  1. 237 8
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

+ 237 - 8
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

@@ -818,14 +818,14 @@ public class GameDataServiceImpl implements IGameDataService {
         if (dto.getGameDimension() == 1L) {
         if (dto.getGameDimension() == 1L) {
             switch (dto.getTableTypes()) {
             switch (dto.getTableTypes()) {
                 case "buy" -> dayNMap = tempDayNData(dto, "ads_dayn_game_buy");
                 case "buy" -> dayNMap = tempDayNData(dto, "ads_dayn_game_buy");
-                case "nature" -> dayNMap = tempDayNData(dto, "ads_dayn_game_nature");
+                case "nature" -> dayNMap = tempDayNDataNature(dto, "ads_dayn_game_nature");
                 case "total" -> dayNMap = tempDayNData(dto, "ads_dayn_game");
                 case "total" -> dayNMap = tempDayNData(dto, "ads_dayn_game");
                 default -> dayNMap = tempDayNData(dto, "ads_dayn_game");
                 default -> dayNMap = tempDayNData(dto, "ads_dayn_game");
             }
             }
         } else {
         } else {
             switch (dto.getTableTypes()) {
             switch (dto.getTableTypes()) {
                 case "buy" -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_buy_parent");
                 case "buy" -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_buy_parent");
-                case "nature" -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_nature_parent");
+                case "nature" -> dayNMap = tempDayNDataNature(dto, "game_ads_parent.ads_dayn_game_nature_parent");
                 case "total" -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_parent");
                 case "total" -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_parent");
                 default -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_parent");
                 default -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_parent");
             }
             }
@@ -1082,7 +1082,7 @@ public class GameDataServiceImpl implements IGameDataService {
         if (dto.getGameDimension() == 1L) {
         if (dto.getGameDimension() == 1L) {
             switch (dto.getTableTypes()) {
             switch (dto.getTableTypes()) {
                 case "buy" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game_buy");
                 case "buy" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game_buy");
-                case "nature" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game_nature");
+                case "nature" -> dayN = getDayNByTableNameNature(dayNMap, "ads_dayn_game_nature");
                 case "total" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
                 case "total" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
                 default -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
                 default -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
             }
             }
@@ -1090,7 +1090,7 @@ public class GameDataServiceImpl implements IGameDataService {
             //父游戏维度
             //父游戏维度
             switch (dto.getTableTypes()) {
             switch (dto.getTableTypes()) {
                 case "buy" -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_buy_parent");
                 case "buy" -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_buy_parent");
-                case "nature" -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_nature_parent");
+                case "nature" -> dayN = getDayNByTableNameNature(dayNMap, "game_ads_parent.ads_dayn_game_nature_parent");
                 case "total" -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_parent");
                 case "total" -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_parent");
                 default -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_parent");
                 default -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_parent");
             }
             }
@@ -1434,7 +1434,7 @@ public class GameDataServiceImpl implements IGameDataService {
      * @param tableName 表名
      * @param tableName 表名
      * @return Map
      * @return Map
      */
      */
-    private Map<String, DayN> tempDayNData(GameDataTotalDTO dto, String tableName) {
+    private Map<String, DayN> tempDayNDataNature(GameDataTotalDTO dto, String tableName) {
         String gameColumn = "game_id";
         String gameColumn = "game_id";
         if (dto.getGameDimension() == 2L) {
         if (dto.getGameDimension() == 2L) {
             gameColumn = "parent_game_id";
             gameColumn = "parent_game_id";
@@ -1502,7 +1502,7 @@ public class GameDataServiceImpl implements IGameDataService {
             //解析 dayN
             //解析 dayN
             Map<String, String> resMap = tempMap.get(adsDaynGame.getGameId());
             Map<String, String> resMap = tempMap.get(adsDaynGame.getGameId());
             //解析每个 adsDaynGame 的 dayN
             //解析每个 adsDaynGame 的 dayN
-            parseJsonData(adsDaynGame, resMap, dto);
+            parseJsonDataNature(adsDaynGame, resMap, dto);
             //将解析的结果保存
             //将解析的结果保存
             tempMap.put(adsDaynGame.getGameId(), resMap);
             tempMap.put(adsDaynGame.getGameId(), resMap);
         }
         }
@@ -1524,6 +1524,100 @@ public class GameDataServiceImpl implements IGameDataService {
         return gameIdToDayNMap;
         return gameIdToDayNMap;
     }
     }
 
 
+    /**
+     * 生成DayN数据方法
+     *
+     * @param dto       前端查询参数
+     * @param tableName 表名
+     * @return Map
+     */
+    private Map<String, DayN> tempDayNData(GameDataTotalDTO dto, String tableName) {
+        String gameColumn = "game_id";
+        if (dto.getGameDimension() == 2L) {
+            gameColumn = "parent_game_id";
+        }
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            //拼接注册时间查询条件
+            cri.where().andBetween("dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
+            //拼接游戏ID查询条件
+            cri.where().andInList(gameColumn, dto.getGameId());
+        }
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源查询条件
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+
+        Sql dayNSql;
+        if (dto.getGameDimension() == 1L) {
+            dayNSql = Sqls.create("""
+                    SELECT
+                        dt,
+                        game_id,
+                        source_system,
+                        dayN as day_n
+                    FROM
+                        $tableName
+                    """ + cri);
+        } else {
+            dayNSql = Sqls.create("""
+                    SELECT
+                        dt,
+                        parent_game_id as game_id,
+                        source_system,
+                        dayN as day_n
+                    FROM
+                        $tableName
+                    """ + cri);
+        }
+        //给定查询的表名
+        dayNSql.vars().set("tableName", tableName);
+        //设置回传
+        dayNSql.setCallback(Sqls.callback.entities());
+        dayNSql.setEntity(dao.getEntity(AdsDaynGame.class));
+        //执行sql 获取数据到list中
+        dao.execute(dayNSql);
+
+        //将数据库中获取的所有结果封装到一个List中
+        List<AdsDaynGame> list = dayNSql.getList(AdsDaynGame.class);
+
+        Map<String, Map<String, String>> tempMap = new HashMap<>();
+
+        //循环遍历 list 按照 gameId 进行存储
+        for (AdsDaynGame adsDaynGame : list) {
+            if (!tempMap.containsKey(adsDaynGame.getGameId())) {
+                //Map中没有改游戏的相关数据,初始化dayNMap
+                Map<String, String> resMap = new HashMap<>();
+                //对应的参数说明:  日期:每天充值金额-充值次数
+                resMap.put("dayN", "0.00-0");
+                //保存初始化结果
+                tempMap.put(adsDaynGame.getGameId(), resMap);
+            }
+            //解析 dayN
+            Map<String, String> resMap = tempMap.get(adsDaynGame.getGameId());
+            //解析每个 adsDaynGame 的 dayN
+            parseJsonData(adsDaynGame, resMap, dto);
+            //将解析的结果保存
+            tempMap.put(adsDaynGame.getGameId(), resMap);
+        }
+
+        //生成dayN对象
+        Map<String, DayN> gameIdToDayNMap = new HashMap<>();
+        for (Map.Entry<String, Map<String, String>> entry : tempMap.entrySet()) {
+            //根据解析出来的dayN值构建DayN对象
+            String[] values = entry.getValue().get("dayN").split("-");
+            gameIdToDayNMap.put(entry.getKey(), DayN.builder()
+                    .rechargeMoney(new BigDecimal(values[0]))
+                    .rechargeCount(Long.valueOf(values[1]))
+                    .build());
+        }
+
+        return gameIdToDayNMap;
+    }
+
     /**
     /**
      * 解析dayN json字符串数据
      * 解析dayN json字符串数据
      *
      *
@@ -1531,7 +1625,7 @@ public class GameDataServiceImpl implements IGameDataService {
      * @param resMap      记录最终结果Map
      * @param resMap      记录最终结果Map
      * @param dto         前端查询条件
      * @param dto         前端查询条件
      */
      */
-    private void parseJsonData(AdsDaynGame adsDaynGame, Map<String, String> resMap, GameDataTotalDTO dto) {
+    private void parseJsonDataNature(AdsDaynGame adsDaynGame, Map<String, String> resMap, GameDataTotalDTO dto) {
         //将每一个adsDaynGame中的dayN属性值 由json转为 Map 型
         //将每一个adsDaynGame中的dayN属性值 由json转为 Map 型
         Gson gson = new Gson();
         Gson gson = new Gson();
         Map<String, String> jsonList = gson.fromJson(adsDaynGame.getDayN(), Map.class);
         Map<String, String> jsonList = gson.fromJson(adsDaynGame.getDayN(), Map.class);
@@ -1565,6 +1659,41 @@ public class GameDataServiceImpl implements IGameDataService {
 
 
     }
     }
 
 
+    /**
+     * 解析dayN json字符串数据
+     *
+     * @param adsDaynGame 对象
+     * @param resMap      记录最终结果Map
+     * @param dto         前端查询条件
+     */
+    private void parseJsonData(AdsDaynGame adsDaynGame, Map<String, String> resMap, GameDataTotalDTO dto) {
+        //将每一个adsDaynGame中的dayN属性值 由json转为 Map 型
+        Gson gson = new Gson();
+        Map<String, String> jsonList = gson.fromJson(adsDaynGame.getDayN(), Map.class);
+        //解析 jsonList
+        for (Map.Entry<String, String> entry : jsonList.entrySet()) {
+            //key是充值日期
+            String key = entry.getKey();
+            String value = entry.getValue();
+            //将value按“-”分割
+            String[] resValues = value.split("-");
+            //判断充值日期 在充值日期内的数据进行计算
+            if (DateUtil.parseLocalDate(key).compareTo(dto.getRechargeBeginDate()) >= 0
+                    && DateUtil.parseLocalDate(key).compareTo(dto.getRechargeEndDate()) <= 0) {
+                //获取原先的dayN的值
+                String[] oldValues = resMap.get("dayN").split("-");
+                //充值的金额
+                BigDecimal chargeMoney = new BigDecimal(oldValues[0]).add(new BigDecimal(resValues[0])).setScale(2, RoundingMode.HALF_UP);
+                //充值的次数
+                long count = Long.parseLong(oldValues[1]) + Long.parseLong(resValues[1]);
+                //合并成字符串 更新dayN的值
+                String newValue = chargeMoney + "-" + count;
+                resMap.put("dayN", newValue);
+            }
+        }
+
+    }
+
     /**
     /**
      * 主表 账面相关 查询条件
      * 主表 账面相关 查询条件
      *
      *
@@ -1740,7 +1869,7 @@ public class GameDataServiceImpl implements IGameDataService {
      * @param tableName 查询的表名
      * @param tableName 查询的表名
      * @return DayN数据
      * @return DayN数据
      */
      */
-    private DayN getDayNByTableName(Map<String, Object> dayNMap, String tableName) {
+    private DayN getDayNByTableNameNature(Map<String, Object> dayNMap, String tableName) {
         //查询的游戏维度
         //查询的游戏维度
         Long gameDimension = (Long) dayNMap.get("gameDimension");
         Long gameDimension = (Long) dayNMap.get("gameDimension");
 
 
@@ -1841,6 +1970,106 @@ public class GameDataServiceImpl implements IGameDataService {
         return dayN;
         return dayN;
     }
     }
 
 
+
+    /**
+     * 三张表共用查询dayN数据的方法
+     *
+     * @param dayNMap   参数Map
+     * @param tableName 查询的表名
+     * @return DayN数据
+     */
+    private DayN getDayNByTableName(Map<String, Object> dayNMap, String tableName) {
+        //查询的游戏维度
+        Long gameDimension = (Long) dayNMap.get("gameDimension");
+
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (dayNMap.get("registerBeginDate") != null && dayNMap.get("registerEndDate") != null) {
+            //拼接注册时间查询条件
+            cri.where().andBetween("dt", dayNMap.get("registerBeginDate"), dayNMap.get("registerEndDate"));
+        }
+        if (CollectionUtils.isNotEmpty((List<?>) dayNMap.get("gameId"))) {
+            if (gameDimension == 1L) {
+                // 子游戏维度
+                cri.where().andInList("game_id", (List<Long>) dayNMap.get("gameId"));
+            } else {
+                // 父游戏维度
+                cri.where().andInList("parent_game_id", (List<Long>) dayNMap.get("gameId"));
+            }
+        }
+        if (dayNMap.get("sourceSystem") != null) {
+            //拼接SDK来源查询条件
+            cri.where().andEquals("source_system", dayNMap.get("sourceSystem"));
+        }
+
+        Sql dayNSql = Sqls.create("""
+                SELECT
+                    dayN
+                FROM
+                    $tableName
+                """ + cri);
+
+        //sql语句传入参数
+        dayNSql.setParams(dayNMap);
+        //给定查询的表名
+        dayNSql.vars().set("tableName", tableName);
+        //设置回传
+        dayNSql.setCallback(Sqls.callback.strList());
+        //执行sql 获取数据到list中
+        dao.execute(dayNSql);
+
+        //将数据库中获取的所有结果封装到一个List中
+        List<String> dayNList = dayNSql.getList(String.class);
+        //构建一个内部类
+        DayN dayN = null;
+        //解析dayNList
+        if (!CollectionUtils.isEmpty(dayNList)) {
+            //将dayNList中json格式数据转换为 Map
+            Gson gson = new Gson();
+            List<Map<String, String>> jsonList = gson.fromJson(dayNList.toString(), ArrayList.class);
+            //用来存储数据的map
+            Map<String, String> resMap = new HashMap<>();
+            //对应的参数说明:  日期:每天充值金额-充值次数-充值人数-新用户复充人数
+            resMap.put("dayN", "0.00-0-0-0");
+            for (Map<String, String> jsonMap : jsonList) {
+                for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
+                    //key是充值日期
+                    String key = entry.getKey();
+                    String value = entry.getValue();
+                    //将value按“-”分割
+                    String[] resValues = value.split("-");
+                    //判断充值日期 在充值日期内的数据进行计算
+                    if (DateUtil.parseLocalDate(key).compareTo((LocalDate) dayNMap.get("rechargeBeginDate")) >= 0
+                            && DateUtil.parseLocalDate(key).compareTo((LocalDate) dayNMap.get("rechargeEndDate")) <= 0) {
+                        //获取原先的dayN的值
+                        String[] oldValues = resMap.get("dayN").split("-");
+                        //充值的金额
+                        BigDecimal chargeMoney = new BigDecimal(oldValues[0]).add(new BigDecimal(resValues[0]));
+                        //充值的次数
+                        long count = Long.parseLong(oldValues[1]) + Long.parseLong(resValues[1]);
+                        //充值的人数
+                        long num = Long.parseLong(oldValues[2]) + Long.parseLong(resValues[2]);
+                        //新用户复充人数
+                        long againNum = Long.parseLong(oldValues[3]) + Long.parseLong(resValues[3]);
+                        //合并成字符串 更新dayN的值
+                        String newValue = chargeMoney + "-" + count + "-" + num + "-" + againNum;
+                        resMap.put("dayN", newValue);
+                    }
+                }
+            }
+            //设置dayN的参数
+            if (!resMap.isEmpty() && !resMap.get("dayN").isEmpty()) {
+                String[] values = resMap.get("dayN").split("-");
+                dayN = DayN.builder()
+                        .rechargeMoney(new BigDecimal(values[0]))
+                        .rechargeCount(Long.valueOf(values[1]))
+                        .build();
+            }
+        }
+
+        return dayN;
+    }
+
     /**
     /**
      * 通过反射来获取Cn的值
      * 通过反射来获取Cn的值
      *
      *