Explorar el Código

修改内容:优化游戏总数据代码;修改创角人数字段

lth hace 1 año
padre
commit
612ba1d267

+ 577 - 255
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

@@ -249,7 +249,6 @@ public class GameDataServiceImpl implements IGameDataService {
      */
     @Override
     public Page<GameDataTotalVO> getGameDataTotal(GameDataTotalDTO dto) {
-
         //如果注册时间参数为空,默认设置查询当天数据
         if (dto.getRegisteredBeginDate() == null || dto.getRegisteredEndDate() == null) {
             dto.setRegisteredBeginDate(LocalDate.now());
@@ -268,34 +267,22 @@ public class GameDataServiceImpl implements IGameDataService {
         if (StringUtils.isBlank(dto.getSortType())) {
             dto.setSortType(OrderByEnum.ASC.getOrderType());
         }
-        //根据传入的dto拼接查询参数
-        Criteria cri = Cnd.cri();
-        if (StringUtils.isNotBlank(dto.getGameName())) {
-            //拼接游戏名称查询条件
-            cri.where().andEquals("a.game_name", dto.getGameName());
-        }
-        if (dto.getGameId() != null) {
-            //拼接游戏id查询条件
-            cri.where().andEquals("game_id", dto.getGameId());
-        }
-        if (dto.getGameClassify() != null) {
-            //拼接游戏类型查询条件
-            cri.where().andEquals("a.game_classify", dto.getGameClassify());
-        }
-        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
-            //拼接注册日期查询条件
-            cri.where().andBetween("a.dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
-        }
-        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
-            //拼接SDK来源
-            cri.where().andEquals("a.source_system", dto.getSourceSystem());
-        }
-        //拼接分组条件
-        cri.getGroupBy().groupBy("a.game_name", "a.game_id", "a.game_classify");
+
+        //主表查询条件
+        Criteria criA = myCri(dto, "criA");
+        //账面相关查询条件 时间条件只和充值时间相关
+        Criteria criB = myCri(dto, "criB");
+        //账面人数相关 时间只需要充值时间条件,不需要注册时间条件
+        Criteria criAmount = myCriRecharge(dto, false);
+        //新用户充值人数和新用户复充人数 时间条件需要注册时间和充值时间
+        Criteria criNewUser = myCriRecharge(dto, true);
+        //创角人数查询条件
+        Criteria criRoleNum = myCriRole(dto);
         //拼接排序条件
-        cri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        Criteria orderByCri = Cnd.cri();
+        orderByCri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
         //创建sql语句 执行sql
-        Sql sql = Sqls.create(gameDataTotalSql() + cri);
+        Sql sql = Sqls.create(getGameDataTotalSql(criA, criB, criAmount, criNewUser, criRoleNum) + orderByCri);
         //设置自定义回显对象
         sql.setCallback(Sqls.callback.entities());
         sql.setEntity(dao.getEntity(GameDataTotalVO.class));
@@ -306,42 +293,53 @@ public class GameDataServiceImpl implements IGameDataService {
         //得到结果集list
         List<GameDataTotalVO> list = sql.getList(GameDataTotalVO.class);
         //设置查询总数
-        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_game_day a " + cri);
+        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_game_day" + criA);
         pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
 
+        //获取所有筛选条件内的dayN数据
+        Map<String, DayN> dayNMap = tempDayNData(dto, "ads_dayn_game");
+        Map<String, DayN> dayNMapBuy = tempDayNData(dto, "ads_dayn_game_buy");
+        Map<String, DayN> dayNMapNature = tempDayNData(dto, "ads_dayn_game_nature");
+
         //根据充值时间修改值
         List<GameDataTotalVO> gameDataTotalVOList = list.stream().map(vo -> {
 
-            //获取到一个只含有与充值时间有关的数据对象
-            GameDataTotalVO tempVO = getRechargeData(vo, dto);
-            //将tempVO中查出的数据添加到vo上
-            copyNullProperties(tempVO, vo);
-
-            //设置查询参数map
-            Map<String, Object> dayNMap = new HashMap<>(6);
-            dayNMap.put("registerBeginDate", dto.getRegisteredBeginDate());
-            dayNMap.put("registerEndDate", dto.getRegisteredEndDate());
-            dayNMap.put("rechargeBeginDate", dto.getRechargeBeginDate());
-            dayNMap.put("rechargeEndDate", dto.getRechargeEndDate());
-            dayNMap.put("gameId", vo.getGameId());
-            if (StringUtils.isNotBlank(dto.getSourceSystem())) {
-                dayNMap.put("sourceSystem", dto.getSourceSystem());
-            }
-
             //买量表的充值相关数据
-            DayN buyDayN = getDayNByTableName(dayNMap, "ads_dayn_game_buy");
+            DayN buyDayN = dayNMapBuy.get(vo.getGameId().toString());
             //自然量表的充值相关数据
-            DayN natureDayN = getDayNByTableName(dayNMap, "ads_dayn_game_nature");
+            DayN natureDayN = dayNMapNature.get(vo.getGameId().toString());
             //总量表的充值相关数据
-            DayN dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
+            DayN dayN = dayNMap.get(vo.getGameId().toString());
+
+            //账面ARPPU
+            //设置账面ARPU(总量、买量、自然量)
+            vo.setAmountArpu(vo.getAmountNum() == 0L ? BigDecimal.ZERO :
+                    vo.getAmount().divide(BigDecimal.valueOf(vo.getAmountNum()), 2, RoundingMode.HALF_UP));
+            vo.setBuyAmountArpu(vo.getBuyAmountNum() == 0L ? BigDecimal.ZERO :
+                    vo.getBuyAmount().divide(BigDecimal.valueOf(vo.getBuyAmountNum()), 2, RoundingMode.HALF_UP));
+            vo.setNatureAmountArpu(vo.getNatureAmountNum() == 0L ? BigDecimal.ZERO :
+                    vo.getNatureAmount().divide(BigDecimal.valueOf(vo.getNatureAmountNum()), 2, RoundingMode.HALF_UP));
+
+            //创角成本
+            vo.setRoleNumCost(vo.getRoleNum() == 0L ? BigDecimal.ZERO :
+                    vo.getCost().divide(BigDecimal.valueOf(vo.getRoleNum()), 2, RoundingMode.HALF_UP));
+            vo.setBuyRoleNumCost(vo.getBuyRoleNum() == 0L ? BigDecimal.ZERO :
+                    vo.getCost().divide(BigDecimal.valueOf(vo.getBuyRoleNum()), 2, RoundingMode.HALF_UP));
+            vo.setNatureRoleNumCost(vo.getNatureRoleNum() == 0L ? BigDecimal.ZERO :
+                    vo.getCost().divide(BigDecimal.valueOf(vo.getNatureRoleNum()), 2, RoundingMode.HALF_UP));
+
+            //创角率
+            vo.setRoleNumRate(vo.getRegNum() == 0L ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getRoleNum().doubleValue() / vo.getRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+            vo.setBuyRoleNumRate(vo.getBuyRegNum() == 0L ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getBuyRoleNum().doubleValue() / vo.getBuyRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+            vo.setNatureRoleNumRate(vo.getNatureRegNum() == 0L ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNatureRoleNum().doubleValue() / vo.getNatureRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 
             //设置买量数据
-            //新用户充值次数、金额、人数
+            //新用户充值次数、金额
             vo.setBuyNewUserAmount(buyDayN == null ? BigDecimal.ZERO : buyDayN.getRechargeMoney());
-            vo.setBuyNewUserAmountNum(getNewUserAmountNum(dayNMap, "buy"));
             vo.setBuyNewUserAmountCount(buyDayN == null ? 0L : buyDayN.getRechargeCount());
-            //新用户复充人数
-            vo.setBuyNewUserAgainNum(getNewUserAmountAgainNum(dayNMap, "buy"));
 
             //老用户充值次数、人数、金额
             vo.setBuyOldUserAmount(vo.getBuyAmount().subtract(vo.getBuyNewUserAmount()));
@@ -378,12 +376,9 @@ public class GameDataServiceImpl implements IGameDataService {
                     vo.getCost().divide(BigDecimal.valueOf(vo.getBuyNewUserAmountNum()), 4, RoundingMode.HALF_UP));
 
             //设置自然量数据
-            //新用户充值次数、金额、人数
+            //新用户充值次数、金额
             vo.setNatureNewUserAmount(natureDayN == null ? BigDecimal.ZERO : natureDayN.getRechargeMoney());
-            vo.setNatureNewUserAmountNum(getNewUserAmountNum(dayNMap, "nature"));
             vo.setNatureNewUserAmountCount(natureDayN == null ? 0L : natureDayN.getRechargeCount());
-            //新用户复充人数
-            vo.setNatureNewUserAgainNum(getNewUserAmountAgainNum(dayNMap, "nature"));
 
             //老用户充值次数、人数、金额
             vo.setNatureOldUserAmount(vo.getNatureAmount().subtract(vo.getNatureNewUserAmount()));
@@ -420,12 +415,9 @@ public class GameDataServiceImpl implements IGameDataService {
                     vo.getCost().divide(BigDecimal.valueOf(vo.getNatureNewUserAmountNum()), 4, RoundingMode.HALF_UP));
 
             //设置总量数据
-            //新用户充值次数、金额、人数
+            //新用户充值次数、金额
             vo.setNewUserAmount(dayN == null ? BigDecimal.ZERO : dayN.getRechargeMoney());
-            vo.setNewUserAmountNum(getNewUserAmountNum(dayNMap, ""));
             vo.setNewUserAmountCount(dayN == null ? 0L : dayN.getRechargeCount());
-            //新用户复充人数
-            vo.setNewUserAgainNum(getNewUserAmountAgainNum(dayNMap, ""));
 
             //老用户充值次数、人数、金额
             vo.setOldUserAmount(vo.getAmount().subtract(vo.getNewUserAmount()));
@@ -581,8 +573,9 @@ public class GameDataServiceImpl implements IGameDataService {
 
     /**
      * 游戏总数据总计的新用户充值人数相关值得计算方法
+     *
      * @param dto 前端查询条件
-     * @param vo 返回给前端得实体
+     * @param vo  返回给前端得实体
      */
     private void getGameDataTotalTotalRechargeData(GameDataTotalTotalDTO dto, GameDataTotalTotalVO vo) {
 
@@ -883,11 +876,6 @@ public class GameDataServiceImpl implements IGameDataService {
         List<AdsGameDayAgain> list = getListByTableType("total", cri);
         List<AdsGameDayAgainBuy> listBuySql = getListByTableType("buy", cri);
         List<AdsGameDayAgainNature> listNatureSql = getListByTableType("nature", cri);
-
-        log.info("list长度:" + list.size());
-        log.info("listBuy长度:" + listBuySql.size());
-        log.info("listNature长度:" + listNatureSql.size());
-
         //创建Map记录数据
         Map<LocalDate, List<GameDataAgainDayVO>> map = new TreeMap<>(
                 (o1, o2) -> o1.isBefore(o2) == true ? -1 : 1);
@@ -990,80 +978,229 @@ public class GameDataServiceImpl implements IGameDataService {
             map.put(list.get(i).getDdf(), tempList.get(i));
         }
 
-        log.info("list长度:" + list.size());
-        log.info("listBuy长度:" + listBuy.size());
-        log.info("listNature长度:" + listNature.size());
-
         //返回数据
         return map;
     }
 
     /**
-     * 查询只与充值时间相关的数据
+     * 生成DayN数据方法
      *
-     * @param vo  返回给前端的实体
-     * @param dto 前端查询实体
-     * @return GameDataTotalVO
+     * @param dto       前端查询参数
+     * @param tableName 表名
+     * @return Map
      */
-    private GameDataTotalVO getRechargeData(GameDataTotalVO vo, GameDataTotalDTO dto) {
-        //查询条件
-        Criteria criRc = Cnd.cri();
-        if (StringUtils.isNotBlank(vo.getGameName())) {
+    private Map<String, DayN> tempDayNData(GameDataTotalDTO dto, String tableName) {
+
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            //拼接注册时间查询条件
+            cri.where().andBetween("dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        if (dto.getGameId() != null) {
+            //拼接游戏ID查询条件
+            cri.where().andEquals("game_id", dto.getGameId());
+        }
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源查询条件
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+
+        Sql dayNSql = Sqls.create("""
+                SELECT
+                    dt,
+                    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字符串数据
+     *
+     * @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);
+            }
+        }
+
+    }
+
+    /**
+     * 主表 账面相关 查询条件
+     *
+     * @param dto  前端传递的查询条件
+     * @param type criA 查询主表  criB 查询账面相关
+     * @return 查询条件
+     */
+    private Criteria myCri(GameDataTotalDTO dto, String type) {
+        //根据传入的dto拼接查询参数
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getGameName())) {
             //拼接游戏名称查询条件
-            criRc.where().andEquals("game_name", vo.getGameName());
+            cri.where().andEquals("game_name", dto.getGameName());
         }
-        if (vo.getGameClassify() != null) {
+        if (dto.getGameId() != null) {
+            //拼接游戏id查询条件
+            cri.where().andEquals("game_id", dto.getGameId());
+        }
+        if (dto.getGameClassify() != null) {
             //拼接游戏类型查询条件
-            criRc.where().andEquals("game_classify", vo.getGameClassify());
+            cri.where().andEquals("game_classify", dto.getGameClassify());
         }
-        if (vo.getGameId() != null) {
-            //拼接游戏id查询条件
-            criRc.where().andEquals("game_id", vo.getGameId());
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源
+            cri.where().andEquals("source_system", dto.getSourceSystem());
         }
-        if (dto.getRechargeBeginDate() != null && dto.getRechargeEndDate() != null) {
-            //拼接充值日期查询条件
-            criRc.where().andBetween("dt", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
+        //根据type拼接不同的时间查询条件
+        if (type.equals("criA")) {
+            if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+                //拼接注册日期查询条件
+                cri.where().andBetween("dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+            }
+        } else if (type.equals("criB")) {
+            if (dto.getRechargeBeginDate() != null && dto.getRechargeEndDate() != null) {
+                //拼接充值日期查询条件
+                cri.where().andBetween("dt", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
+            }
+        }
+        //拼接分组条件
+        cri.getGroupBy().groupBy("game_name", "game_id", "game_classify");
+
+        return cri;
+    }
+
+    /**
+     * 账面充值人数、新用户充值人数、新用户复充人数的查询条件
+     *
+     * @param dto              前端传递的查询条件参数实体
+     * @param needRegTime      是否需要拼接注册时间
+     * @return 查询条件
+     */
+    private Criteria myCriRecharge(GameDataTotalDTO dto, Boolean needRegTime) {
+        //根据传入的dto拼接查询参数
+        Criteria cri = Cnd.cri();
+        if (dto.getGameId() != null) {
+            //拼接游戏id查询条件
+            cri.where().andEquals("game_id", dto.getGameId());
         }
         if (StringUtils.isNotBlank(dto.getSourceSystem())) {
             //拼接SDK来源
-            criRc.where().andEquals("source_system", dto.getSourceSystem());
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        //拼接不同的时间查询条件
+        if (needRegTime && dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            //拼接注册日期查询条件
+            cri.where().andBetween("reg_time", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        if (dto.getRechargeBeginDate() != null && dto.getRechargeEndDate() != null) {
+            //拼接充值日期查询条件
+            cri.where().andBetween("order_time", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
         }
-        //创建sql语句
-        Sql sqlWithRechargeDate = Sqls.create(gameDataTotalSqlRecharge() + criRc);
 
-        sqlWithRechargeDate.setCallback(Sqls.callback.entity());
-        sqlWithRechargeDate.setEntity(dao.getEntity(GameDataTotalVO.class));
-        dao.execute(sqlWithRechargeDate);
-        //得到vo
-        GameDataTotalVO gameDataTotalVO = sqlWithRechargeDate.getObject(GameDataTotalVO.class);
+        return cri;
+    }
 
-        //设置查询参数map
-        Map<String, Object> queryMap = new HashMap<>(4);
-        queryMap.put("rechargeBeginDate", dto.getRechargeBeginDate());
-        queryMap.put("rechargeEndDate", dto.getRechargeEndDate());
-        queryMap.put("gameId", vo.getGameId());
+    /**
+     * 创角人数相关查询条件
+     *
+     * @param dto  前端传递的查询条件
+     * @return 查询条件
+     */
+    private Criteria myCriRole(GameDataTotalDTO dto) {
+        //根据传入的dto拼接查询参数
+        Criteria cri = Cnd.cri();
+        if (dto.getGameId() != null) {
+            //拼接游戏id查询条件
+            cri.where().andEquals("user_game_id", dto.getGameId());
+        }
         if (StringUtils.isNotBlank(dto.getSourceSystem())) {
-            queryMap.put("sourceSystem", dto.getSourceSystem());
+            //拼接SDK来源
+            cri.where().andEquals("source_system", dto.getSourceSystem());
         }
-        //账面充值人数(总量、买量、自然量)
-        Long amountNum = getNewUserAmountNum(queryMap, "");
-        Long buyAmountNum = getNewUserAmountNum(queryMap, "buy");
-        Long natureAmountNum = getNewUserAmountNum(queryMap, "nature");
-        //设置账面充值人数
-        gameDataTotalVO.setAmountNum(amountNum);
-        gameDataTotalVO.setBuyAmountNum(buyAmountNum);
-        gameDataTotalVO.setNatureAmountNum(natureAmountNum);
-        //设置账面ARPU(总量、买量、自然量)
-        gameDataTotalVO.setAmountArpu(amountNum == 0L ? BigDecimal.ZERO :
-                gameDataTotalVO.getAmount().divide(BigDecimal.valueOf(amountNum), 2, RoundingMode.HALF_UP));
-        gameDataTotalVO.setBuyAmountArpu(buyAmountNum == 0L ? BigDecimal.ZERO :
-                gameDataTotalVO.getBuyAmount().divide(BigDecimal.valueOf(buyAmountNum), 2, RoundingMode.HALF_UP));
-        gameDataTotalVO.setNatureAmountArpu(natureAmountNum == 0L ? BigDecimal.ZERO :
-                gameDataTotalVO.getNatureAmount().divide(BigDecimal.valueOf(natureAmountNum), 2, RoundingMode.HALF_UP));
-
-        return gameDataTotalVO;
+        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            //拼接注册日期查询条件
+            cri.where().andBetween("user_dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        if (dto.getRechargeBeginDate() != null && dto.getRechargeEndDate() != null) {
+            //拼接充值日期查询条件 在充值时间内创角
+            cri.where().andBetween("DATE(role_create_time)", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
+        }
+
+        return cri;
     }
 
+
     /**
      * 所有为空值的属性都不copy
      *
@@ -2088,132 +2225,317 @@ public class GameDataServiceImpl implements IGameDataService {
 
     /**
      * 游戏总数据SQL
-     *
+     * @param criA 主表查询条件
+     * @param criB 账面相关查询条件
+     * @param criAmount 账面充值人数查询条件
+     * @param criNewUser 新用户相关查询条件
+     * @param criRoleNum 创角人数相关查询条件
      * @return String
      */
-    private String gameDataTotalSql() {
+    private String getGameDataTotalSql(Criteria criA, Criteria criB, Criteria criAmount, Criteria criNewUser, Criteria criRoleNum) {
         return """
                 SELECT
-                    a.game_id game_id,
-                    a.game_name game_name,
-                    a.game_classify game_classify,
-                    
-                    sum(a.buy_reg_num) buy_reg_num,
-                    sum(a.nature_reg_num) nature_reg_num,
-                    sum(a.reg_num) reg_num,
-                    sum(a.cost) cost,
-                    
-                    sum(a.buy_first_new_user_amount_count) buy_first_new_user_amount_count,
-                    sum(a.buy_first_new_user_amount_num) buy_first_new_user_amount_num,
-                    sum(a.buy_first_new_user_amount) buy_first_new_user_amount,
-                    sum(a.nature_first_new_user_amount_count) nature_first_new_user_amount_count,
-                    sum(a.nature_first_new_user_amount_num) nature_first_new_user_amount_num,
-                    sum(a.nature_first_new_user_amount) nature_first_new_user_amount,
-                    sum(a.first_new_user_amount_count) first_new_user_amount_count,
-                    sum(a.first_new_user_amount_num) first_new_user_amount_num,
-                    sum(a.first_new_user_amount) first_new_user_amount,
-                    
-                    sum(a.buy_new_user_total_amount_count) buy_new_user_total_amount_count,
-                    sum(a.buy_new_user_total_amount_num) buy_new_user_total_amount_num,
-                    sum(a.buy_new_user_total_amount) buy_new_user_total_amount,
-                    sum(a.nature_new_user_total_amount_count) nature_new_user_total_amount_count,
-                    sum(a.nature_new_user_total_amount_num) nature_new_user_total_amount_num,
-                    sum(a.nature_new_user_total_amount) nature_new_user_total_amount,
-                    sum(a.new_user_total_amount_count) new_user_total_amount_count,
-                    sum(a.new_user_total_amount_num) new_user_total_amount_num,
-                    sum(a.new_user_total_amount) new_user_total_amount,
-                    
-                    round(if(SUM(a.cost) > 0 , SUM(buy_first_new_user_amount) / SUM(a.cost) ,0), 4) buy_first_roi,
-                    round(if(sum(a.buy_reg_num) > 0 ,sum(a.buy_first_new_user_amount_num) / sum(a.buy_reg_num), 0), 4) buy_first_amount_rate,
-                    round(if(sum(a.buy_reg_num) > 0, sum(a.buy_new_user_total_amount_num) / sum(a.buy_reg_num), 0), 4) buy_today_amount_rate,
-                    round(if(SUM(a.cost) > 0 , SUM(a.nature_first_new_user_amount) / SUM(a.cost) ,0), 4) nature_first_roi,
-                    round(if(sum(a.nature_reg_num) > 0 ,sum(a.nature_first_new_user_amount_num) / sum(a.nature_reg_num), 0), 4) nature_first_amount_rate,
-                    round(if(sum(a.nature_reg_num) > 0, sum(a.nature_new_user_total_amount_num) / sum(a.nature_reg_num), 0), 4) nature_today_amount_rate,
-                    round(if(SUM(a.cost) > 0 , SUM(first_new_user_amount) / SUM(a.cost) ,0), 4) first_roi,
-                    round(if(sum(a.reg_num) > 0 ,sum(a.first_new_user_amount_num) / sum(a.reg_num), 0), 4) first_amount_rate,
-                    round(if(sum(a.reg_num) > 0, sum(a.new_user_total_amount_num) / sum(a.reg_num), 0), 4) today_amount_rate,
-                    
-                    round(if(sum(a.buy_first_new_user_amount_count) > 0, sum(a.buy_first_new_user_amount) / sum(a.buy_first_new_user_amount_count), 0), 2) buy_first_avg_amount,
-                    round(if(sum(a.buy_new_user_total_amount_count) > 0, sum(a.buy_new_user_total_amount) / sum(a.buy_new_user_total_amount_count), 0), 2) buy_today_avg_amount,
-                    
-                    round(if(sum(a.nature_first_new_user_amount_count) > 0, sum(a.nature_first_new_user_amount) / sum(a.nature_first_new_user_amount_count), 0), 2) nature_first_avg_amount,
-                    round(if(sum(a.nature_new_user_total_amount_count) > 0, sum(a.nature_new_user_total_amount) / sum(a.nature_new_user_total_amount_count), 0), 2) nature_today_avg_amount,
-                    
-                    round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 2) first_avg_amount,
-                    round(if(sum(a.new_user_total_amount_count) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_count), 0), 2) today_avg_amount,
-                    
-                    
-                    round(if(sum(a.buy_new_user_total_amount_num) > 0 , sum(a.buy_reg_order_user_again) / sum(a.buy_new_user_total_amount_num), 0), 4) buy_today_again_rate,
-                    round(if(sum(a.nature_new_user_total_amount_num) > 0 , sum(a.nature_reg_order_user_again) / sum(a.nature_new_user_total_amount_num), 0), 4) nature_today_again_rate,
-                    round(if(sum(a.new_user_total_amount_num) > 0 , sum(a.reg_order_user_again) / sum(a.new_user_total_amount_num), 0), 4) today_again_rate,
-                    
-                    round(if(sum(a.buy_reg_num) > 0 , sum(a.buy_new_user_total_amount) / sum(a.buy_reg_num), 0), 2) buy_reg_user_arpu,
-                    round(if(sum(a.buy_first_new_user_amount_num) > 0 , sum(a.buy_first_new_user_amount) / sum(a.buy_first_new_user_amount_num), 0), 2) buy_first_amount_arpu,
-                    round(if(sum(a.buy_new_user_total_amount_num) > 0 , sum(a.buy_new_user_total_amount) / sum(a.buy_new_user_total_amount_num), 0), 2) buy_today_amount_arpu,
-                    
-                    round(if(sum(a.nature_reg_num) > 0 , sum(a.nature_new_user_total_amount) / sum(a.nature_reg_num), 0), 2) nature_reg_user_arpu,
-                    round(if(sum(a.nature_first_new_user_amount_num) > 0 , sum(a.nature_first_new_user_amount) / sum(a.nature_first_new_user_amount_num), 0), 2) nature_first_amount_arpu,
-                    round(if(sum(a.nature_new_user_total_amount_num) > 0 , sum(a.nature_new_user_total_amount) / sum(a.nature_new_user_total_amount_num), 0), 2) nature_today_amount_arpu,
-                    
-                    round(if(sum(a.reg_num) > 0 , sum(a.new_user_total_amount) / sum(a.reg_num), 0), 2) reg_user_arpu,
-                    round(if(sum(a.first_new_user_amount_num) > 0 , sum(a.first_new_user_amount) / sum(a.first_new_user_amount_num), 0), 2) first_amount_arpu,
-                    round(if(sum(a.new_user_total_amount_num) > 0 , sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 2) today_amount_arpu,
-                    
-                    round(if(SUM(buy_reg_num) > 0, SUM(cost) / SUM(buy_reg_num), 0), 2) buy_reg_cost,
-                    round(if(SUM(nature_reg_num) > 0, SUM(cost) / SUM(nature_reg_num), 0), 2) nature_reg_cost,
-                    round(if(SUM(reg_num) > 0, SUM(cost) / SUM(reg_num), 0), 2) reg_cost,
-                    
-                    round(if(SUM(cost) > 0 , SUM(buy_new_user_total_amount) / SUM(cost), 0), 4) buy_total_roi,
-                    round(if(SUM(cost) > 0 , SUM(nature_new_user_total_amount) / SUM(cost), 0), 4) nature_total_roi,
-                    round(if(SUM(cost) > 0 , SUM(new_user_total_amount) / SUM(cost), 0), 4) total_roi,
-                    
-                    round(if(SUM(buy_first_new_user_amount_num) > 0, SUM(cost) / SUM(buy_first_new_user_amount_num), 0), 2) buy_first_new_user_recharge_cost,
-                    round(if(SUM(nature_first_new_user_amount_num) > 0, SUM(cost) / SUM(nature_first_new_user_amount_num), 0), 2) nature_first_new_user_recharge_cost,
-                    round(if(SUM(first_new_user_amount_num) > 0, SUM(cost) / SUM(first_new_user_amount_num), 0), 2) first_new_user_recharge_cost,
-                    
-                    round(if(SUM(buy_new_user_total_amount_num) > 0, SUM(cost) / SUM(buy_new_user_total_amount_num), 0), 2) buy_total_recharge_cost,
-                    round(if(SUM(nature_new_user_total_amount_num) > 0, SUM(cost) / SUM(nature_new_user_total_amount_num), 0), 2) nature_total_recharge_cost,
-                    round(if(SUM(new_user_total_amount_num) > 0, SUM(cost) / SUM(new_user_total_amount_num), 0), 2) total_recharge_cost,
-                    
-                    SUM(buy_hundred_user_num) buy_hundred_user_num,
-                    round(IF(SUM(buy_hundred_user_num) > 0, SUM(cost) / SUM(buy_hundred_user_num), 0), 2) buy_hundred_user_num_cost,
-                    SUM(buy_first_role_num) buy_first_role_num,
-                    SUM(buy_role_num) buy_role_num,
-                    SUM(buy_new_user_total_role_num) buy_new_user_total_role_num,
-                    round(IF(SUM(buy_first_role_num) > 0, SUM(cost) / SUM(buy_first_role_num), 0), 2) buy_first_role_num_cost,
-                    round(IF(SUM(buy_role_num) > 0, SUM(cost) / SUM(buy_role_num), 0), 2) buy_role_num_cost,
-                    round(IF(SUM(buy_new_user_total_role_num) >0, SUM(cost) / SUM(buy_new_user_total_role_num), 0), 2) buy_new_user_total_role_num_cost,
-                    round(IF(SUM(buy_reg_num) >0, SUM(buy_first_role_num) / SUM(buy_reg_num), 0), 4) buy_first_role_num_rate,
-                    round(IF(SUM(buy_reg_num) >0, SUM(buy_role_num) / SUM(buy_reg_num), 0), 4) buy_role_num_rate,
-                    round(IF(SUM(buy_reg_num) >0, SUM(buy_new_user_total_role_num) / SUM(buy_reg_num), 0), 4) buy_new_user_total_role_num_rate,
-                    
-                    SUM(nature_hundred_user_num) nature_hundred_user_num,
-                    round(IF(SUM(nature_hundred_user_num) > 0, SUM(cost) / SUM(nature_hundred_user_num), 0), 2) nature_hundred_user_num_cost,
-                    SUM(nature_first_role_num) nature_first_role_num,
-                    SUM(nature_role_num) nature_role_num,
-                    SUM(nature_new_user_total_role_num) nature_new_user_total_role_num,
-                    round(IF(SUM(nature_first_role_num) > 0, SUM(cost) / SUM(nature_first_role_num), 0), 2) nature_first_role_num_cost,
-                    round(IF(SUM(nature_role_num) > 0, SUM(cost) / SUM(nature_role_num), 0), 2) nature_role_num_cost,
-                    round(IF(SUM(nature_new_user_total_role_num) >0, SUM(cost) / SUM(nature_new_user_total_role_num), 0), 2) nature_new_user_total_role_num_cost,
-                    round(IF(SUM(nature_reg_num) >0, SUM(nature_first_role_num) / SUM(nature_reg_num), 0), 4) nature_first_role_num_rate,
-                    round(IF(SUM(nature_reg_num) >0, SUM(nature_role_num) / SUM(nature_reg_num), 0), 4) nature_role_num_rate,
-                    round(IF(SUM(nature_reg_num) >0, SUM(nature_new_user_total_role_num) / SUM(nature_reg_num), 0), 4) nature_new_user_total_role_num_rate,
-                   
-                    SUM(hundred_user_num) hundred_user_num,
-                    round(IF(SUM(hundred_user_num) > 0, SUM(cost) / SUM(hundred_user_num), 0), 2) hundred_user_num_cost,
-                    SUM(first_role_num) first_role_num,
-                    SUM(role_num) role_num,
-                    SUM(new_user_total_role_num) new_user_total_role_num,
-                    round(IF(SUM(first_role_num) > 0, SUM(cost) / SUM(first_role_num), 0), 2) first_role_num_cost,
-                    round(IF(SUM(role_num) > 0, SUM(cost) / SUM(role_num), 0), 2) role_num_cost,
-                    round(IF(SUM(new_user_total_role_num) >0, SUM(cost) / SUM(new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
-                    round(IF(SUM(reg_num) >0, SUM(first_role_num) / SUM(reg_num), 0), 4) first_role_num_rate,
-                    round(IF(SUM(reg_num) >0, SUM(role_num) / SUM(reg_num), 0), 4) role_num_rate,
-                    round(IF(SUM(reg_num) >0, SUM(new_user_total_role_num) / SUM(reg_num), 0), 4) new_user_total_role_num_rate
-                    
-                FROM
-                    ads_game_day a
-                """;
+                    a.*,
+                	b.*,
+                	IFNULL(new_user_amount_num, 0) new_user_amount_num,
+                	IFNULL(new_user_again_num, 0) new_user_again_num,
+                	IFNULL(amount_num, 0) amount_num,
+                	IFNULL(buy_new_user_amount_num, 0) buy_new_user_amount_num,
+                	IFNULL(buy_new_user_again_num, 0) buy_new_user_again_num,
+                	IFNULL(buy_amount_num, 0) buy_amount_num,
+                	IFNULL(nature_new_user_amount_num, 0) nature_new_user_amount_num,
+                	IFNULL(nature_new_user_again_num, 0) nature_new_user_again_num,
+                	IFNULL(nature_amount_num, 0) nature_amount_num,
+                 	IFNULL(role_num, 0) role_num,
+                 	IFNULL(buy_role_num, 0) buy_role_num,
+                 	IFNULL(nature_role_num, 0) nature_role_num
+                FROM(
+                	SELECT
+                		game_id,
+                		game_name,
+                		game_classify,
+                		sum(buy_reg_num) buy_reg_num,
+                		sum(nature_reg_num) nature_reg_num,
+                		sum(reg_num) reg_num,
+                		sum(cost) cost,
+                		sum(buy_first_new_user_amount_count) buy_first_new_user_amount_count,
+                		sum(buy_first_new_user_amount_num) buy_first_new_user_amount_num,
+                		sum(buy_first_new_user_amount) buy_first_new_user_amount,
+                		sum(nature_first_new_user_amount_count) nature_first_new_user_amount_count,
+                		sum(nature_first_new_user_amount_num) nature_first_new_user_amount_num,
+                		sum(nature_first_new_user_amount) nature_first_new_user_amount,
+                		sum(first_new_user_amount_count) first_new_user_amount_count,
+                		sum(first_new_user_amount_num) first_new_user_amount_num,
+                		sum(first_new_user_amount) first_new_user_amount,
+                		sum(buy_new_user_total_amount_count) buy_new_user_total_amount_count,
+                		sum(buy_new_user_total_amount_num) buy_new_user_total_amount_num,
+                		sum(buy_new_user_total_amount) buy_new_user_total_amount,
+                		sum(nature_new_user_total_amount_count) nature_new_user_total_amount_count,
+                		sum(nature_new_user_total_amount_num) nature_new_user_total_amount_num,
+                		sum(nature_new_user_total_amount) nature_new_user_total_amount,
+                		sum(new_user_total_amount_count) new_user_total_amount_count,
+                		sum(new_user_total_amount_num) new_user_total_amount_num,
+                		sum(new_user_total_amount) new_user_total_amount,
+                		round(if(SUM(cost) > 0 , SUM(buy_first_new_user_amount) / SUM(cost) , 0), 4) buy_first_roi,
+                		round(if(sum(buy_reg_num) > 0 , sum(buy_first_new_user_amount_num) / sum(buy_reg_num), 0), 4) buy_first_amount_rate,
+                		round(if(sum(buy_reg_num) > 0, sum(buy_new_user_total_amount_num) / sum(buy_reg_num), 0), 4) buy_today_amount_rate,
+                		round(if(SUM(cost) > 0 , SUM(nature_first_new_user_amount) / SUM(cost) , 0), 4) nature_first_roi,
+                		round(if(sum(nature_reg_num) > 0 , sum(nature_first_new_user_amount_num) / sum(nature_reg_num), 0), 4) nature_first_amount_rate,
+                		round(if(sum(nature_reg_num) > 0, sum(nature_new_user_total_amount_num) / sum(nature_reg_num), 0), 4) nature_today_amount_rate,
+                		round(if(SUM(cost) > 0 , SUM(first_new_user_amount) / SUM(cost) , 0), 4) first_roi,
+                		round(if(sum(reg_num) > 0 , sum(first_new_user_amount_num) / sum(reg_num), 0), 4) first_amount_rate,
+                		round(if(sum(reg_num) > 0, sum(new_user_total_amount_num) / sum(reg_num), 0), 4) today_amount_rate,
+                		round(if(sum(buy_first_new_user_amount_count) > 0, sum(buy_first_new_user_amount) / sum(buy_first_new_user_amount_count), 0), 2) buy_first_avg_amount,
+                		round(if(sum(buy_new_user_total_amount_count) > 0, sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_count), 0), 2) buy_today_avg_amount,
+                		round(if(sum(nature_first_new_user_amount_count) > 0, sum(nature_first_new_user_amount) / sum(nature_first_new_user_amount_count), 0), 2) nature_first_avg_amount,
+                		round(if(sum(nature_new_user_total_amount_count) > 0, sum(nature_new_user_total_amount) / sum(nature_new_user_total_amount_count), 0), 2) nature_today_avg_amount,
+                		round(if(sum(first_new_user_amount_count) > 0, sum(first_new_user_amount) / sum(first_new_user_amount_count), 0), 2) first_avg_amount,
+                		round(if(sum(new_user_total_amount_count) > 0, sum(new_user_total_amount) / sum(new_user_total_amount_count), 0), 2) today_avg_amount,
+                		round(if(sum(buy_new_user_total_amount_num) > 0 , sum(buy_reg_order_user_again) / sum(buy_new_user_total_amount_num), 0), 4) buy_today_again_rate,
+                		round(if(sum(nature_new_user_total_amount_num) > 0 , sum(nature_reg_order_user_again) / sum(nature_new_user_total_amount_num), 0), 4) nature_today_again_rate,
+                		round(if(sum(new_user_total_amount_num) > 0 , sum(reg_order_user_again) / sum(new_user_total_amount_num), 0), 4) today_again_rate,
+                		round(if(sum(buy_reg_num) > 0 , sum(buy_new_user_total_amount) / sum(buy_reg_num), 0), 2) buy_reg_user_arpu,
+                		round(if(sum(buy_first_new_user_amount_num) > 0 , sum(buy_first_new_user_amount) / sum(buy_first_new_user_amount_num), 0), 2) buy_first_amount_arpu,
+                		round(if(sum(buy_new_user_total_amount_num) > 0 , sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_num), 0), 2) buy_today_amount_arpu,
+                		round(if(sum(nature_reg_num) > 0 , sum(nature_new_user_total_amount) / sum(nature_reg_num), 0), 2) nature_reg_user_arpu,
+                		round(if(sum(nature_first_new_user_amount_num) > 0 , sum(nature_first_new_user_amount) / sum(nature_first_new_user_amount_num), 0), 2) nature_first_amount_arpu,
+                		round(if(sum(nature_new_user_total_amount_num) > 0 , sum(nature_new_user_total_amount) / sum(nature_new_user_total_amount_num), 0), 2) nature_today_amount_arpu,
+                		round(if(sum(reg_num) > 0 , sum(new_user_total_amount) / sum(reg_num), 0), 2) reg_user_arpu,
+                		round(if(sum(first_new_user_amount_num) > 0 , sum(first_new_user_amount) / sum(first_new_user_amount_num), 0), 2) first_amount_arpu,
+                		round(if(sum(new_user_total_amount_num) > 0 , sum(new_user_total_amount) / sum(new_user_total_amount_num), 0), 2) today_amount_arpu,
+                		round(if(SUM(buy_reg_num) > 0, SUM(cost) / SUM(buy_reg_num), 0), 2) buy_reg_cost,
+                		round(if(SUM(nature_reg_num) > 0, SUM(cost) / SUM(nature_reg_num), 0), 2) nature_reg_cost,
+                		round(if(SUM(reg_num) > 0, SUM(cost) / SUM(reg_num), 0), 2) reg_cost,
+                		round(if(SUM(cost) > 0 , SUM(buy_new_user_total_amount) / SUM(cost), 0), 4) buy_total_roi,
+                		round(if(SUM(cost) > 0 , SUM(nature_new_user_total_amount) / SUM(cost), 0), 4) nature_total_roi,
+                		round(if(SUM(cost) > 0 , SUM(new_user_total_amount) / SUM(cost), 0), 4) total_roi,
+                		round(if(SUM(buy_first_new_user_amount_num) > 0, SUM(cost) / SUM(buy_first_new_user_amount_num), 0), 2) buy_first_new_user_recharge_cost,
+                		round(if(SUM(nature_first_new_user_amount_num) > 0, SUM(cost) / SUM(nature_first_new_user_amount_num), 0), 2) nature_first_new_user_recharge_cost,
+                		round(if(SUM(first_new_user_amount_num) > 0, SUM(cost) / SUM(first_new_user_amount_num), 0), 2) first_new_user_recharge_cost,
+                		round(if(SUM(buy_new_user_total_amount_num) > 0, SUM(cost) / SUM(buy_new_user_total_amount_num), 0), 2) buy_total_recharge_cost,
+                		round(if(SUM(nature_new_user_total_amount_num) > 0, SUM(cost) / SUM(nature_new_user_total_amount_num), 0), 2) nature_total_recharge_cost,
+                		round(if(SUM(new_user_total_amount_num) > 0, SUM(cost) / SUM(new_user_total_amount_num), 0), 2) total_recharge_cost,
+                		SUM(buy_hundred_user_num) buy_hundred_user_num,
+                		round(IF(SUM(buy_hundred_user_num) > 0, SUM(cost) / SUM(buy_hundred_user_num), 0), 2) buy_hundred_user_num_cost,
+                		SUM(buy_first_role_num) buy_first_role_num,
+                		SUM(buy_new_user_total_role_num) buy_new_user_total_role_num,
+                		round(IF(SUM(buy_first_role_num) > 0, SUM(cost) / SUM(buy_first_role_num), 0), 2) buy_first_role_num_cost,
+                		round(IF(SUM(buy_new_user_total_role_num) >0, SUM(cost) / SUM(buy_new_user_total_role_num), 0), 2) buy_new_user_total_role_num_cost,
+                		round(IF(SUM(buy_reg_num) >0, SUM(buy_first_role_num) / SUM(buy_reg_num), 0), 4) buy_first_role_num_rate,
+                		round(IF(SUM(buy_reg_num) >0, SUM(buy_new_user_total_role_num) / SUM(buy_reg_num), 0), 4) buy_new_user_total_role_num_rate,
+                		SUM(nature_hundred_user_num) nature_hundred_user_num,
+                		round(IF(SUM(nature_hundred_user_num) > 0, SUM(cost) / SUM(nature_hundred_user_num), 0), 2) nature_hundred_user_num_cost,
+                		SUM(nature_first_role_num) nature_first_role_num,
+                		SUM(nature_new_user_total_role_num) nature_new_user_total_role_num,
+                		round(IF(SUM(nature_first_role_num) > 0, SUM(cost) / SUM(nature_first_role_num), 0), 2) nature_first_role_num_cost,
+                		round(IF(SUM(nature_new_user_total_role_num) >0, SUM(cost) / SUM(nature_new_user_total_role_num), 0), 2) nature_new_user_total_role_num_cost,
+                		round(IF(SUM(nature_reg_num) >0, SUM(nature_first_role_num) / SUM(nature_reg_num), 0), 4) nature_first_role_num_rate,
+                		round(IF(SUM(nature_reg_num) >0, SUM(nature_new_user_total_role_num) / SUM(nature_reg_num), 0), 4) nature_new_user_total_role_num_rate,
+                		SUM(hundred_user_num) hundred_user_num,
+                		round(IF(SUM(hundred_user_num) > 0, SUM(cost) / SUM(hundred_user_num), 0), 2) hundred_user_num_cost,
+                		SUM(first_role_num) first_role_num,
+                		SUM(new_user_total_role_num) new_user_total_role_num,
+                		round(IF(SUM(first_role_num) > 0, SUM(cost) / SUM(first_role_num), 0), 2) first_role_num_cost,
+                		round(IF(SUM(new_user_total_role_num) >0, SUM(cost) / SUM(new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
+                		round(IF(SUM(reg_num) >0, SUM(first_role_num) / SUM(reg_num), 0), 4) first_role_num_rate,
+                		round(IF(SUM(reg_num) >0, SUM(new_user_total_role_num) / SUM(reg_num), 0), 4) new_user_total_role_num_rate
+                	FROM
+                		ads_game_day
+                	"""
+                + criA +
+                """
+                        	 ) a
+                        LEFT JOIN (
+                        	SELECT
+                        		game_id as b_game_id,
+                        		IFNULL(sum(buy_amount_count), 0) buy_amount_count,
+                        		IFNULL(sum(buy_amount), 0) buy_amount,
+                        		IFNULL(sum(nature_amount_count), 0) nature_amount_count,
+                        		IFNULL(sum(nature_amount), 0) nature_amount,
+                        		IFNULL(sum(amount_count), 0) amount_count,
+                        		IFNULL(sum(amount), 0) amount,
+                        		round(if(sum(buy_amount_count) > 0, sum(buy_amount) / sum(buy_amount_count), 0), 2) buy_avg_amount,
+                        		round(if(sum(nature_amount_count) > 0, sum(nature_amount) / sum(nature_amount_count), 0), 2) nature_avg_amount,
+                        		round(if(sum(amount_count) > 0, sum(amount) / sum(amount_count), 0), 2) avg_amount
+                        	FROM
+                        		game_ads.ads_game_day
+                        	"""
+                + criB +
+                """
+                            ) b
+                        ON a.game_id = b.b_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		game_id as c_game_id,
+                        		IFNULL(COUNT(DISTINCT user_id), 0) amount_num
+                        	FROM
+                        		game_ads.ads_information
+                        	"""
+                + criAmount +
+                """
+                        	GROUP BY
+                        		game_id) c
+                        ON a.game_id = c.c_game_id
+                        LEFT JOIN(
+                        	SELECT
+                        		game_id as d_game_id,
+                        		IFNULL(COUNT(DISTINCT user_id), 0) buy_amount_num
+                        	FROM
+                        		game_ads.ads_information
+                        	"""
+                + criAmount +
+                """
+                        		AND NOT agent_id = 0
+                        	GROUP BY game_id) d
+                        ON a.game_id = d.d_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		game_id as e_game_id,
+                        		IFNULL(COUNT(DISTINCT user_id), 0) nature_amount_num
+                        	FROM
+                        		game_ads.ads_information
+                        	"""
+                + criAmount +
+                """
+                        		AND agent_id = 0
+                        	GROUP BY game_id ) e
+                        ON a.game_id = e.e_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		game_id as f_game_id,
+                        		COUNT(DISTINCT user_id) buy_new_user_amount_num
+                        	FROM
+                        		game_ads.ads_information
+                            """
+                + criNewUser +
+                """
+                        		AND NOT agent_id = 0
+                        	GROUP BY game_id) f
+                        ON a.game_id = f.f_game_id
+                        LEFT JOIN(
+                        	SELECT
+                        		game_id as g_game_id,
+                        		COUNT(tempA.num) as buy_new_user_again_num
+                        	FROM (
+                        			SELECT
+                        				game_id,
+                        				COUNT(user_id) num
+                        			FROM
+                        				game_ads.ads_information
+                        			"""
+                + criNewUser +
+                """
+                        				AND NOT agent_id = 0
+                        			GROUP BY
+                        				user_id,
+                        				game_id
+                        			HAVING
+                        				COUNT(user_id) > 1 ) tempA
+                        	GROUP BY tempA.game_id) g
+                        ON a.game_id = g.g_game_id
+                        LEFT JOIN(
+                        	SELECT
+                        		game_id as h_game_id,
+                        		COUNT(DISTINCT user_id) as nature_new_user_amount_num
+                        	FROM
+                        		game_ads.ads_information
+                        	"""
+                + criNewUser +
+                """
+                        		AND agent_id = 0
+                        	GROUP BY game_id) h
+                        ON a.game_id = h.h_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		game_id as i_game_id,
+                        		COUNT(tempB.num) as nature_new_user_again_num
+                        	FROM (
+                        			SELECT
+                        				game_id,
+                        				COUNT(user_id) num
+                        			FROM
+                        				game_ads.ads_information
+                        			"""
+                + criNewUser +
+                """
+                        				AND agent_id = 0
+                        			GROUP BY
+                        				user_id,
+                        				game_id
+                        			HAVING
+                        				COUNT(user_id) > 1 ) tempB
+                        		GROUP BY tempB.game_id ) i
+                        ON a.game_id = i.i_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		game_id as j_game_id,
+                        		COUNT(DISTINCT user_id) new_user_amount_num
+                        	FROM
+                        		game_ads.ads_information
+                        	"""
+                + criNewUser +
+                """
+                        	GROUP BY game_id) j
+                        ON a.game_id = j.j_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		game_id as k_game_id,
+                        		COUNT(tempC.num) as new_user_again_num
+                        	FROM (
+                        			SELECT
+                        				game_id,
+                        				COUNT(user_id) num
+                        			FROM
+                        				game_ads.ads_information
+                        			"""
+                + criNewUser +
+                """
+                        			GROUP BY
+                        				user_id,
+                        				game_id
+                        			HAVING
+                        				COUNT(user_id) > 1 ) tempC
+                        		GROUP BY tempC.game_id ) k
+                        ON a.game_id = k.k_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		user_game_id ,
+                        		COUNT(DISTINCT role_user_id) as role_num
+                        	FROM
+                        		dw_create_role_detail
+                        """
+                + criRoleNum +
+                        """
+                        	GROUP BY user_game_id
+                        ) l
+                        ON a.game_id = l.user_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		user_game_id ,
+                        		COUNT(DISTINCT role_user_id) as nature_role_num
+                        	FROM
+                        		dw_create_role_detail
+                        """
+                + criRoleNum +
+                        """
+                        		AND user_agent_id = 0
+                        	GROUP BY user_game_id
+                        ) m
+                        ON a.game_id = m.user_game_id
+                        LEFT JOIN (
+                        	SELECT
+                        		user_game_id ,
+                        		COUNT(DISTINCT role_user_id) as buy_role_num
+                        	FROM
+                        		dw_create_role_detail
+                        """
+                + criRoleNum +
+                        """
+                        		AND NOT user_agent_id = 0
+                        	GROUP BY user_game_id
+                        ) n
+                        ON a.game_id = n.user_game_id
+                        """;
     }
 
     /**
@@ -2652,17 +2974,17 @@ public class GameDataServiceImpl implements IGameDataService {
                 .filter(tt -> null != tt.getNatureGameId())
                 .collect(Collectors.groupingBy(H5NatureUserVO::getNatureGameId));
 
-        Map<String,Object> natureNewUserMap = new HashMap<>(7);
-        natureNewUserMap.put("h5GameId",item.getGameId());
-        natureNewUserMap.put("rechargeBeginDay",dto.getRechargeBeginDate());
-        natureNewUserMap.put("rechargeEndDay",dto.getRechargeEndDate());
-        natureNewUserMap.put("costBeginDay",dto.getCostBeginDate());
-        natureNewUserMap.put("costEndDay",dto.getCostEndDate());
+        Map<String, Object> natureNewUserMap = new HashMap<>(7);
+        natureNewUserMap.put("h5GameId", item.getGameId());
+        natureNewUserMap.put("rechargeBeginDay", dto.getRechargeBeginDate());
+        natureNewUserMap.put("rechargeEndDay", dto.getRechargeEndDate());
+        natureNewUserMap.put("costBeginDay", dto.getCostBeginDate());
+        natureNewUserMap.put("costEndDay", dto.getCostEndDate());
         List<H5NatureUserVO> natureGameList = natureGameSql.getList(H5NatureUserVO.class).stream()
                 .filter(tt -> null != tt.getNatureGameId())
                 .map(natureGame -> {
-                    natureNewUserMap.put("natureSourceSystem",natureGame.getNatureSourceSystem());
-                    natureNewUserMap.put("natureGameId",natureGame.getNatureGameId());
+                    natureNewUserMap.put("natureSourceSystem", natureGame.getNatureSourceSystem());
+                    natureNewUserMap.put("natureGameId", natureGame.getNatureGameId());
 
                     importDayNMap.put("sourceSystem", natureGame.getNatureSourceSystem());
                     importDayNMap.put("gameId", natureGame.getNatureGameId());
@@ -2744,20 +3066,20 @@ public class GameDataServiceImpl implements IGameDataService {
                 .filter(tt -> null != tt.getBuyGameId())
                 .collect(Collectors.groupingBy(H5BuyUserVO::getBuyGameId));
 
-        Map<String,Object> buyNewUserMap = new HashMap<>(7);
-        buyNewUserMap.put("h5GameId",item.getGameId());
-        buyNewUserMap.put("rechargeBeginDay",dto.getRechargeBeginDate());
-        buyNewUserMap.put("rechargeEndDay",dto.getRechargeEndDate());
-        buyNewUserMap.put("costBeginDay",dto.getCostBeginDate());
-        buyNewUserMap.put("costEndDay",dto.getCostEndDate());
+        Map<String, Object> buyNewUserMap = new HashMap<>(7);
+        buyNewUserMap.put("h5GameId", item.getGameId());
+        buyNewUserMap.put("rechargeBeginDay", dto.getRechargeBeginDate());
+        buyNewUserMap.put("rechargeEndDay", dto.getRechargeEndDate());
+        buyNewUserMap.put("costBeginDay", dto.getCostBeginDate());
+        buyNewUserMap.put("costEndDay", dto.getCostEndDate());
         List<H5BuyUserVO> buyGameList = buyGameSql.getList(H5BuyUserVO.class).stream()
                 .filter(tt -> null != tt.getBuyGameId())
                 .map(buyGame -> {
                     importDayNMap.put("sourceSystem", buyGame.getBuySourceSystem());
                     importDayNMap.put("gameId", buyGame.getBuyGameId());
 
-                    buyNewUserMap.put("buySourceSystem",buyGame.getBuySourceSystem());
-                    buyNewUserMap.put("buyGameId",buyGame.getBuyGameId());
+                    buyNewUserMap.put("buySourceSystem", buyGame.getBuySourceSystem());
+                    buyNewUserMap.put("buyGameId", buyGame.getBuyGameId());
                     H5DayN importBuyH5DayN = getImportBuyH5DayN(dto, importDayNMap, buyNewUserMap);
                     if (null != showBuyGameMap && null != showBuyGameMap.get(buyGame.getBuyGameId()) && !showBuyGameMap.get(buyGame.getBuyGameId()).isEmpty()) {
                         buyGame.setH5LeadBuyAmount(showBuyGameMap.get(buyGame.getBuyGameId()).get(0).getH5LeadBuyAmount());