|  | @@ -1,11 +1,15 @@
 | 
	
		
			
				|  |  |  package com.zanxiang.game.data.serve.service.impl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import com.google.gson.Gson;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.data.serve.pojo.dto.GameDataDayDTO;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.data.serve.pojo.dto.GameDataTotalDTO;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.data.serve.pojo.vo.GameDataDayVO;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.data.serve.pojo.vo.GameDataTotalVO;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.data.serve.service.IGameDataService;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.data.serve.utils.Page;
 | 
	
		
			
				|  |  | +import com.zanxiang.module.util.DateUtil;
 | 
	
		
			
				|  |  | +import lombok.Builder;
 | 
	
		
			
				|  |  | +import lombok.Data;
 | 
	
		
			
				|  |  |  import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  |  import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  |  import org.nutz.dao.Cnd;
 | 
	
	
		
			
				|  | @@ -16,9 +20,17 @@ import org.nutz.dao.sql.Criteria;
 | 
	
		
			
				|  |  |  import org.nutz.dao.sql.Sql;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | +import org.springframework.util.CollectionUtils;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import java.math.BigDecimal;
 | 
	
		
			
				|  |  | +import java.math.BigInteger;
 | 
	
		
			
				|  |  | +import java.math.RoundingMode;
 | 
	
		
			
				|  |  |  import java.time.LocalDate;
 | 
	
		
			
				|  |  | +import java.util.ArrayList;
 | 
	
		
			
				|  |  | +import java.util.HashMap;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.stream.Collectors;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * @author tianhua
 | 
	
	
		
			
				|  | @@ -77,12 +89,12 @@ public class GameDataServiceImpl implements IGameDataService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public Page<GameDataTotalVO> getGameDataTotal(GameDataTotalDTO dto) {
 | 
	
		
			
				|  |  | -        //如果注册时间参数为空,默认设置为当天
 | 
	
		
			
				|  |  | +        //如果注册时间参数为空,默认设置查询当天数据
 | 
	
		
			
				|  |  |          if (dto.getRegisteredBeginDate() == null || dto.getRechargeEndDate() == null) {
 | 
	
		
			
				|  |  |              dto.setRegisteredBeginDate(LocalDate.now());
 | 
	
		
			
				|  |  |              dto.setRegisteredEndDate(LocalDate.now());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        //如果充值时间参数为空,默认设置为注册时间
 | 
	
		
			
				|  |  | +        //如果充值时间参数为空,默认设置查询当天数据
 | 
	
		
			
				|  |  |          if (dto.getRechargeBeginDate() == null || dto.getRechargeEndDate() == null) {
 | 
	
		
			
				|  |  |              dto.setRechargeBeginDate(LocalDate.now());
 | 
	
		
			
				|  |  |              dto.setRechargeEndDate(LocalDate.now());
 | 
	
	
		
			
				|  | @@ -121,33 +133,135 @@ public class GameDataServiceImpl implements IGameDataService {
 | 
	
		
			
				|  |  |          //设置查询总数
 | 
	
		
			
				|  |  |          pager.setRecordCount(list.size());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        /*//根据充值时间修改值
 | 
	
		
			
				|  |  | -        list.stream().map(new Function<GameDataTotalVO, Object>() {
 | 
	
		
			
				|  |  | -            //第一个参数 转换之前的参数
 | 
	
		
			
				|  |  | -            //第二个参数,转换之后的参数
 | 
	
		
			
				|  |  | -            //apply中的传入参数 就是流中的每一个数据
 | 
	
		
			
				|  |  | -            //返回值类型就是需要转换之后的类型
 | 
	
		
			
				|  |  | -            @Override
 | 
	
		
			
				|  |  | -            public Object apply(GameDataTotalVO gameDataTotalVO) {
 | 
	
		
			
				|  |  | +        //根据充值时间修改值
 | 
	
		
			
				|  |  | +        List<GameDataTotalVO> gameDataTotalVOList = list.stream().map(vo -> {
 | 
	
		
			
				|  |  | +            //设置查询参数map
 | 
	
		
			
				|  |  | +            Map<String, Object> dayNMap = new HashMap<>(4);
 | 
	
		
			
				|  |  | +            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());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                //联表查询根据充值时间查询出相关参数
 | 
	
		
			
				|  |  | +            //买量表的充值相关数据
 | 
	
		
			
				|  |  | +            DayN buyDayN = getDayNByTableName(dayNMap, "ads_dayn_game_buy");
 | 
	
		
			
				|  |  | +            //自然量表的充值相关数据
 | 
	
		
			
				|  |  | +            DayN natureDayN = getDayNByTableName(dayNMap, "ads_dayn_game_nature");
 | 
	
		
			
				|  |  | +            //总量表的充值相关数据
 | 
	
		
			
				|  |  | +            DayN dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            //设置买量数据
 | 
	
		
			
				|  |  | +            //新用户充值次数、金额、人数
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserAmount(buyDayN == null ? BigDecimal.ZERO : buyDayN.getRechargeMoney());
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserAmountNum(buyDayN == null ? BigInteger.ZERO : buyDayN.getRechargeNum());
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserAmountCount(buyDayN == null ? BigInteger.ZERO : buyDayN.getRechargeCount());
 | 
	
		
			
				|  |  | +            //新用户复充人数
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserAgainNum(buyDayN == null ? BigInteger.ZERO : buyDayN.getRechargeAgainNum());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                //设置新用户相关数据
 | 
	
		
			
				|  |  | +            //老用户充值次数、人数、金额
 | 
	
		
			
				|  |  | +            vo.setBuyOldUserAmount(vo.getBuyAmount().subtract(vo.getBuyNewUserAmount()));
 | 
	
		
			
				|  |  | +            vo.setBuyOldUserCount(vo.getBuyAmountCount().subtract(vo.getBuyNewUserAmountCount()));
 | 
	
		
			
				|  |  | +            vo.setBuyOldUserNum(vo.getBuyAmountNum().subtract(vo.getBuyNewUserAmountNum()));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            //新用户付费比
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserRate(vo.getBuyAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getBuyNewUserAmountNum().doubleValue() / vo.getBuyAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +            //新用户付费率
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserRoi(vo.getBuyRegNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getBuyNewUserAmountNum().doubleValue() / vo.getBuyRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                //联表查询新用户复充人数
 | 
	
		
			
				|  |  | +            //新用户客单价
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserAvgAmount(vo.getBuyNewUserAmountCount().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getBuyNewUserAmount().doubleValue() / vo.getBuyNewUserAmountCount().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            //复充率
 | 
	
		
			
				|  |  | +            vo.setBuyUserAgainRate(vo.getBuyNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getBuyNewUserAgainNum().doubleValue() / vo.getBuyNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +            //新用户复充率
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserAgainRate(vo.getBuyNewUserTotalAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getBuyNewUserAgainNum().doubleValue() / vo.getBuyNewUserTotalAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                return null;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        });*/
 | 
	
		
			
				|  |  | +            //新用户付费ARPU
 | 
	
		
			
				|  |  | +            vo.setBuyNewUserAmountArpu(vo.getBuyNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getBuyNewUserAmount().doubleValue() / vo.getBuyNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //设置自然量数据
 | 
	
		
			
				|  |  | +            //新用户充值次数、金额、人数
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserAmount(natureDayN == null ? BigDecimal.ZERO : natureDayN.getRechargeMoney());
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserAmountNum(natureDayN == null ? BigInteger.ZERO : natureDayN.getRechargeNum());
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserAmountCount(natureDayN == null ? BigInteger.ZERO : natureDayN.getRechargeCount());
 | 
	
		
			
				|  |  | +            //新用户复充人数
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserAgainNum(natureDayN == null ? BigInteger.ZERO : natureDayN.getRechargeAgainNum());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //老用户充值次数、人数、金额
 | 
	
		
			
				|  |  | +            vo.setNatureOldUserAmount(vo.getNatureAmount().subtract(vo.getNatureNewUserAmount()));
 | 
	
		
			
				|  |  | +            vo.setNatureOldUserCount(vo.getNatureAmountCount().subtract(vo.getNatureNewUserAmountCount()));
 | 
	
		
			
				|  |  | +            vo.setNatureOldUserNum(vo.getNatureAmountNum().subtract(vo.getNatureNewUserAmountNum()));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //新用户付费比
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserRate(vo.getNatureAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNatureNewUserAmountNum().doubleValue() / vo.getNatureAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +            //新用户付费率
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserRoi(vo.getNatureRegNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNatureNewUserAmountNum().doubleValue() / vo.getNatureRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //新用户客单价
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserAvgAmount(vo.getNatureNewUserAmountCount().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNatureNewUserAmount().doubleValue() / vo.getNatureNewUserAmountCount().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //复充率
 | 
	
		
			
				|  |  | +            vo.setNatureUserAgainRate(vo.getNatureNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNatureNewUserAgainNum().doubleValue() / vo.getNatureNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +            //新用户复充率
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserAgainRate(vo.getNatureNewUserTotalAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNatureNewUserAgainNum().doubleValue() / vo.getNatureNewUserTotalAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //新用户付费ARPU
 | 
	
		
			
				|  |  | +            vo.setNatureNewUserAmountArpu(vo.getNatureNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNatureNewUserAmount().doubleValue() / vo.getNatureNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //设置总量数据
 | 
	
		
			
				|  |  | +            //新用户充值次数、金额、人数
 | 
	
		
			
				|  |  | +            vo.setNewUserAmount(dayN == null ? BigDecimal.ZERO : dayN.getRechargeMoney());
 | 
	
		
			
				|  |  | +            vo.setNewUserAmountNum(dayN == null ? BigInteger.ZERO : dayN.getRechargeNum());
 | 
	
		
			
				|  |  | +            vo.setNewUserAmountCount(dayN == null ? BigInteger.ZERO : dayN.getRechargeCount());
 | 
	
		
			
				|  |  | +            //新用户复充人数
 | 
	
		
			
				|  |  | +            vo.setNewUserAgainNum(dayN == null ? BigInteger.ZERO : dayN.getRechargeAgainNum());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //老用户充值次数、人数、金额
 | 
	
		
			
				|  |  | +            vo.setOldUserAmount(vo.getAmount().subtract(vo.getNewUserAmount()));
 | 
	
		
			
				|  |  | +            vo.setOldUserCount(vo.getAmountCount().subtract(vo.getNewUserAmountCount()));
 | 
	
		
			
				|  |  | +            vo.setOldUserNum(vo.getAmountNum().subtract(vo.getNewUserAmountNum()));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //新用户付费比
 | 
	
		
			
				|  |  | +            vo.setNewUserRate(vo.getAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNewUserAmountNum().doubleValue() / vo.getAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +            //新用户付费率
 | 
	
		
			
				|  |  | +            vo.setNewUserRoi(vo.getRegNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNewUserAmountNum().doubleValue() / vo.getRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //新用户客单价
 | 
	
		
			
				|  |  | +            vo.setNewUserAvgAmount(vo.getNewUserAmountCount().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNewUserAmount().doubleValue() / vo.getNewUserAmountCount().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //复充率
 | 
	
		
			
				|  |  | +            vo.setUserAgainRate(vo.getNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNewUserAgainNum().doubleValue() / vo.getNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +            //新用户复充率
 | 
	
		
			
				|  |  | +            vo.setNewUserAgainRate(vo.getNewUserTotalAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNewUserAgainNum().doubleValue() / vo.getNewUserTotalAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //新用户付费ARPU
 | 
	
		
			
				|  |  | +            vo.setNewUserAmountArpu(vo.getNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    BigDecimal.valueOf(vo.getNewUserAmount().doubleValue() / vo.getNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return vo;
 | 
	
		
			
				|  |  | +        }).collect(Collectors.toList());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //返回list结果封装到page对象里
 | 
	
		
			
				|  |  | -        return new Page<>(list, pager);
 | 
	
		
			
				|  |  | +        return new Page<>(gameDataTotalVOList, pager);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 游戏每日数据SQL
 | 
	
		
			
				|  |  |       *
 | 
	
	
		
			
				|  | @@ -156,122 +270,123 @@ public class GameDataServiceImpl implements IGameDataService {
 | 
	
		
			
				|  |  |      private String gameDataDaySql() {
 | 
	
		
			
				|  |  |          return """
 | 
	
		
			
				|  |  |                  SELECT
 | 
	
		
			
				|  |  | -                dt cost_date,
 | 
	
		
			
				|  |  | -                game_name,
 | 
	
		
			
				|  |  | -                game_classify,
 | 
	
		
			
				|  |  | -                
 | 
	
		
			
				|  |  | -                buy_reg_num,
 | 
	
		
			
				|  |  | -                nature_reg_num,
 | 
	
		
			
				|  |  | -                reg_num,
 | 
	
		
			
				|  |  | -                    
 | 
	
		
			
				|  |  | -                buy_first_new_user_amount_count,
 | 
	
		
			
				|  |  | -                buy_first_new_user_amount_num,
 | 
	
		
			
				|  |  | -                buy_first_new_user_amount,
 | 
	
		
			
				|  |  | -                buy_old_user_count,
 | 
	
		
			
				|  |  | -                buy_old_user_num,
 | 
	
		
			
				|  |  | -                buy_old_user_amount,
 | 
	
		
			
				|  |  | -                buy_amount_count,
 | 
	
		
			
				|  |  | -                buy_amount_num,
 | 
	
		
			
				|  |  | -                buy_amount,
 | 
	
		
			
				|  |  | -                buy_new_user_total_amount_count,
 | 
	
		
			
				|  |  | -                buy_new_user_total_amount_num,
 | 
	
		
			
				|  |  | -                buy_new_user_total_amount,
 | 
	
		
			
				|  |  | -                buy_first_roi,
 | 
	
		
			
				|  |  | -                buy_today_roi,
 | 
	
		
			
				|  |  | -                buy_new_user_rate,
 | 
	
		
			
				|  |  | -                buy_first_avg_amount,
 | 
	
		
			
				|  |  | -                buy_today_avg_amount,
 | 
	
		
			
				|  |  | -                buy_avg_amount,
 | 
	
		
			
				|  |  | -                buy_user_again_rate,
 | 
	
		
			
				|  |  | -                buy_reg_user_arpu,
 | 
	
		
			
				|  |  | -                buy_first_amount_arpu,
 | 
	
		
			
				|  |  | -                buy_today_amount_arpu,
 | 
	
		
			
				|  |  | -                buy_amount_arpu,
 | 
	
		
			
				|  |  | -                buy_amount_d1,
 | 
	
		
			
				|  |  | -                buy_amount_d3,
 | 
	
		
			
				|  |  | -                buy_amount_d5,
 | 
	
		
			
				|  |  | -                buy_amount_d7,
 | 
	
		
			
				|  |  | -                buy_amount_d15,
 | 
	
		
			
				|  |  | -                buy_amount_m1,
 | 
	
		
			
				|  |  | -                buy_amount_m2,
 | 
	
		
			
				|  |  | -                buy_amount_m3,
 | 
	
		
			
				|  |  | -                buy_amount_m6,
 | 
	
		
			
				|  |  | -                buy_amount_sum,
 | 
	
		
			
				|  |  | -                    
 | 
	
		
			
				|  |  | -                nature_first_new_user_amount_count,
 | 
	
		
			
				|  |  | -                nature_first_new_user_amount_num,
 | 
	
		
			
				|  |  | -                nature_first_new_user_amount,
 | 
	
		
			
				|  |  | -                nature_old_user_count,
 | 
	
		
			
				|  |  | -                nature_old_user_num,
 | 
	
		
			
				|  |  | -                nature_old_user_amount,
 | 
	
		
			
				|  |  | -                nature_amount_count,
 | 
	
		
			
				|  |  | -                nature_amount_num,
 | 
	
		
			
				|  |  | -                nature_amount,
 | 
	
		
			
				|  |  | -                nature_new_user_total_amount_count,
 | 
	
		
			
				|  |  | -                nature_new_user_total_amount_num,
 | 
	
		
			
				|  |  | -                nature_new_user_total_amount,
 | 
	
		
			
				|  |  | -                nature_first_roi,
 | 
	
		
			
				|  |  | -                nature_today_roi,
 | 
	
		
			
				|  |  | -                nature_new_user_rate,
 | 
	
		
			
				|  |  | -                nature_first_avg_amount,
 | 
	
		
			
				|  |  | -                nature_today_avg_amount,
 | 
	
		
			
				|  |  | -                nature_avg_amount,
 | 
	
		
			
				|  |  | -                nature_user_again_rate,
 | 
	
		
			
				|  |  | -                nature_reg_user_arpu,
 | 
	
		
			
				|  |  | -                nature_first_amount_arpu,
 | 
	
		
			
				|  |  | -                nature_today_amount_arpu,
 | 
	
		
			
				|  |  | -                nature_amount_arpu,
 | 
	
		
			
				|  |  | -                nature_amount_d1,
 | 
	
		
			
				|  |  | -                nature_amount_d3,
 | 
	
		
			
				|  |  | -                nature_amount_d5,
 | 
	
		
			
				|  |  | -                nature_amount_d7,
 | 
	
		
			
				|  |  | -                nature_amount_d15,
 | 
	
		
			
				|  |  | -                nature_amount_m1,
 | 
	
		
			
				|  |  | -                nature_amount_m2,
 | 
	
		
			
				|  |  | -                nature_amount_m3,
 | 
	
		
			
				|  |  | -                nature_amount_m6,
 | 
	
		
			
				|  |  | -                nature_amount_sum,
 | 
	
		
			
				|  |  | +                    dt cost_date,
 | 
	
		
			
				|  |  | +                    game_name,
 | 
	
		
			
				|  |  | +                    game_classify,
 | 
	
		
			
				|  |  | +                                    
 | 
	
		
			
				|  |  | +                    buy_reg_num,
 | 
	
		
			
				|  |  | +                    nature_reg_num,
 | 
	
		
			
				|  |  | +                    reg_num,
 | 
	
		
			
				|  |  | +                        
 | 
	
		
			
				|  |  | +                    buy_first_new_user_amount_count,
 | 
	
		
			
				|  |  | +                    buy_first_new_user_amount_num,
 | 
	
		
			
				|  |  | +                    buy_first_new_user_amount,
 | 
	
		
			
				|  |  | +                    buy_old_user_count,
 | 
	
		
			
				|  |  | +                    buy_old_user_num,
 | 
	
		
			
				|  |  | +                    buy_old_user_amount,
 | 
	
		
			
				|  |  | +                    buy_amount_count,
 | 
	
		
			
				|  |  | +                    buy_amount_num,
 | 
	
		
			
				|  |  | +                    buy_amount,
 | 
	
		
			
				|  |  | +                    buy_new_user_total_amount_count,
 | 
	
		
			
				|  |  | +                    buy_new_user_total_amount_num,
 | 
	
		
			
				|  |  | +                    buy_new_user_total_amount,
 | 
	
		
			
				|  |  | +                    buy_first_roi,
 | 
	
		
			
				|  |  | +                    buy_today_roi,
 | 
	
		
			
				|  |  | +                    buy_new_user_rate,
 | 
	
		
			
				|  |  | +                    buy_first_avg_amount,
 | 
	
		
			
				|  |  | +                    buy_today_avg_amount,
 | 
	
		
			
				|  |  | +                    buy_avg_amount,
 | 
	
		
			
				|  |  | +                    buy_user_again_rate,
 | 
	
		
			
				|  |  | +                    buy_reg_user_arpu,
 | 
	
		
			
				|  |  | +                    buy_first_amount_arpu,
 | 
	
		
			
				|  |  | +                    buy_today_amount_arpu,
 | 
	
		
			
				|  |  | +                    buy_amount_arpu,
 | 
	
		
			
				|  |  | +                    buy_amount_d1,
 | 
	
		
			
				|  |  | +                    buy_amount_d3,
 | 
	
		
			
				|  |  | +                    buy_amount_d5,
 | 
	
		
			
				|  |  | +                    buy_amount_d7,
 | 
	
		
			
				|  |  | +                    buy_amount_d15,
 | 
	
		
			
				|  |  | +                    buy_amount_m1,
 | 
	
		
			
				|  |  | +                    buy_amount_m2,
 | 
	
		
			
				|  |  | +                    buy_amount_m3,
 | 
	
		
			
				|  |  | +                    buy_amount_m6,
 | 
	
		
			
				|  |  | +                    buy_amount_sum,
 | 
	
		
			
				|  |  | +                        
 | 
	
		
			
				|  |  | +                    nature_first_new_user_amount_count,
 | 
	
		
			
				|  |  | +                    nature_first_new_user_amount_num,
 | 
	
		
			
				|  |  | +                    nature_first_new_user_amount,
 | 
	
		
			
				|  |  | +                    nature_old_user_count,
 | 
	
		
			
				|  |  | +                    nature_old_user_num,
 | 
	
		
			
				|  |  | +                    nature_old_user_amount,
 | 
	
		
			
				|  |  | +                    nature_amount_count,
 | 
	
		
			
				|  |  | +                    nature_amount_num,
 | 
	
		
			
				|  |  | +                    nature_amount,
 | 
	
		
			
				|  |  | +                    nature_new_user_total_amount_count,
 | 
	
		
			
				|  |  | +                    nature_new_user_total_amount_num,
 | 
	
		
			
				|  |  | +                    nature_new_user_total_amount,
 | 
	
		
			
				|  |  | +                    nature_first_roi,
 | 
	
		
			
				|  |  | +                    nature_today_roi,
 | 
	
		
			
				|  |  | +                    nature_new_user_rate,
 | 
	
		
			
				|  |  | +                    nature_first_avg_amount,
 | 
	
		
			
				|  |  | +                    nature_today_avg_amount,
 | 
	
		
			
				|  |  | +                    nature_avg_amount,
 | 
	
		
			
				|  |  | +                    nature_user_again_rate,
 | 
	
		
			
				|  |  | +                    nature_reg_user_arpu,
 | 
	
		
			
				|  |  | +                    nature_first_amount_arpu,
 | 
	
		
			
				|  |  | +                    nature_today_amount_arpu,
 | 
	
		
			
				|  |  | +                    nature_amount_arpu,
 | 
	
		
			
				|  |  | +                    nature_amount_d1,
 | 
	
		
			
				|  |  | +                    nature_amount_d3,
 | 
	
		
			
				|  |  | +                    nature_amount_d5,
 | 
	
		
			
				|  |  | +                    nature_amount_d7,
 | 
	
		
			
				|  |  | +                    nature_amount_d15,
 | 
	
		
			
				|  |  | +                    nature_amount_m1,
 | 
	
		
			
				|  |  | +                    nature_amount_m2,
 | 
	
		
			
				|  |  | +                    nature_amount_m3,
 | 
	
		
			
				|  |  | +                    nature_amount_m6,
 | 
	
		
			
				|  |  | +                    nature_amount_sum,
 | 
	
		
			
				|  |  | +                        
 | 
	
		
			
				|  |  | +                    first_new_user_amount_count,
 | 
	
		
			
				|  |  | +                    first_new_user_amount_num,
 | 
	
		
			
				|  |  | +                    first_new_user_amount,
 | 
	
		
			
				|  |  | +                    old_user_count,
 | 
	
		
			
				|  |  | +                    old_user_num,
 | 
	
		
			
				|  |  | +                    old_user_amount,
 | 
	
		
			
				|  |  | +                    amount_count,
 | 
	
		
			
				|  |  | +                    amount_num,
 | 
	
		
			
				|  |  | +                    amount,
 | 
	
		
			
				|  |  | +                    new_user_total_amount_count,
 | 
	
		
			
				|  |  | +                    new_user_total_amount_num,
 | 
	
		
			
				|  |  | +                    new_user_total_amount,
 | 
	
		
			
				|  |  | +                    first_roi,
 | 
	
		
			
				|  |  | +                    today_roi,
 | 
	
		
			
				|  |  | +                    new_user_rate,
 | 
	
		
			
				|  |  | +                    first_avg_amount,
 | 
	
		
			
				|  |  | +                    today_avg_amount,
 | 
	
		
			
				|  |  | +                    avg_amount,
 | 
	
		
			
				|  |  | +                    user_again_rate,
 | 
	
		
			
				|  |  | +                    reg_user_arpu,
 | 
	
		
			
				|  |  | +                    first_amount_arpu,
 | 
	
		
			
				|  |  | +                    today_amount_arpu,
 | 
	
		
			
				|  |  | +                    amount_arpu,
 | 
	
		
			
				|  |  | +                    amount_d1,
 | 
	
		
			
				|  |  | +                    amount_d3,
 | 
	
		
			
				|  |  | +                    amount_d5,
 | 
	
		
			
				|  |  | +                    amount_d7,
 | 
	
		
			
				|  |  | +                    amount_d15,
 | 
	
		
			
				|  |  | +                    amount_m1,
 | 
	
		
			
				|  |  | +                    amount_m2,
 | 
	
		
			
				|  |  | +                    amount_m3,
 | 
	
		
			
				|  |  | +                    amount_m6,
 | 
	
		
			
				|  |  | +                    amount_sum
 | 
	
		
			
				|  |  |                      
 | 
	
		
			
				|  |  | -                first_new_user_amount_count,
 | 
	
		
			
				|  |  | -                first_new_user_amount_num,
 | 
	
		
			
				|  |  | -                first_new_user_amount,
 | 
	
		
			
				|  |  | -                old_user_count,
 | 
	
		
			
				|  |  | -                old_user_num,
 | 
	
		
			
				|  |  | -                old_user_amount,
 | 
	
		
			
				|  |  | -                amount_count,
 | 
	
		
			
				|  |  | -                amount_num,
 | 
	
		
			
				|  |  | -                amount,
 | 
	
		
			
				|  |  | -                new_user_total_amount_count,
 | 
	
		
			
				|  |  | -                new_user_total_amount_num,
 | 
	
		
			
				|  |  | -                new_user_total_amount,
 | 
	
		
			
				|  |  | -                first_roi,
 | 
	
		
			
				|  |  | -                today_roi,
 | 
	
		
			
				|  |  | -                new_user_rate,
 | 
	
		
			
				|  |  | -                first_avg_amount,
 | 
	
		
			
				|  |  | -                today_avg_amount,
 | 
	
		
			
				|  |  | -                avg_amount,
 | 
	
		
			
				|  |  | -                user_again_rate,
 | 
	
		
			
				|  |  | -                reg_user_arpu,
 | 
	
		
			
				|  |  | -                first_amount_arpu,
 | 
	
		
			
				|  |  | -                today_amount_arpu,
 | 
	
		
			
				|  |  | -                amount_arpu,
 | 
	
		
			
				|  |  | -                amount_d1,
 | 
	
		
			
				|  |  | -                amount_d3,
 | 
	
		
			
				|  |  | -                amount_d5,
 | 
	
		
			
				|  |  | -                amount_d7,
 | 
	
		
			
				|  |  | -                amount_d15,
 | 
	
		
			
				|  |  | -                amount_m1,
 | 
	
		
			
				|  |  | -                amount_m2,
 | 
	
		
			
				|  |  | -                amount_m3,
 | 
	
		
			
				|  |  | -                amount_m6,
 | 
	
		
			
				|  |  | -                amount_sum
 | 
	
		
			
				|  |  | -                    
 | 
	
		
			
				|  |  | -                FROM ads_game_day
 | 
	
		
			
				|  |  | +                FROM
 | 
	
		
			
				|  |  | +                    ads_game_day
 | 
	
		
			
				|  |  |                  """;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  | -     * 游戏总数居SQL
 | 
	
		
			
				|  |  | +     * 游戏总数据SQL
 | 
	
		
			
				|  |  |       *
 | 
	
		
			
				|  |  |       * @return String
 | 
	
		
			
				|  |  |       */
 | 
	
	
		
			
				|  | @@ -361,5 +476,113 @@ public class GameDataServiceImpl implements IGameDataService {
 | 
	
		
			
				|  |  |                  """;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /** 三张表共用的方法
 | 
	
		
			
				|  |  | +     * @param dayNMap 参数Map
 | 
	
		
			
				|  |  | +     * @param tableName 查询的表名
 | 
	
		
			
				|  |  | +     * @return DayN数据
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private DayN getDayNByTableName(Map<String, Object> dayNMap, String tableName) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //构架SQL语句,查询相关DayN表获取相关充值数据
 | 
	
		
			
				|  |  | +        Sql dayNSql = Sqls.create(
 | 
	
		
			
				|  |  | +                """
 | 
	
		
			
				|  |  | +                   SELECT
 | 
	
		
			
				|  |  | +                        dayN
 | 
	
		
			
				|  |  | +                   FROM
 | 
	
		
			
				|  |  | +                        $tableName
 | 
	
		
			
				|  |  | +                   where
 | 
	
		
			
				|  |  | +                        dt between @registerBeginDate and @registerEndDate
 | 
	
		
			
				|  |  | +                        and game_id = @gameId
 | 
	
		
			
				|  |  | +                """
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +        //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]));
 | 
	
		
			
				|  |  | +                        //充值的次数
 | 
	
		
			
				|  |  | +                        BigInteger count = new BigInteger(oldValues[1]).add(new BigInteger(resValues[1]));
 | 
	
		
			
				|  |  | +                        //充值的人数
 | 
	
		
			
				|  |  | +                        BigInteger num = new BigInteger(oldValues[2]).add(new BigInteger(resValues[2]));
 | 
	
		
			
				|  |  | +                        //新用户复充人数
 | 
	
		
			
				|  |  | +                        BigInteger againNum = new BigInteger(oldValues[3]).add(new BigInteger(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(new BigInteger(values[1]))
 | 
	
		
			
				|  |  | +                        .rechargeNum(new BigInteger(values[2]))
 | 
	
		
			
				|  |  | +                        .rechargeAgainNum(new BigInteger(values[3]))
 | 
	
		
			
				|  |  | +                        .build();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return dayN;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * DayN内部类
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Data
 | 
	
		
			
				|  |  | +    @Builder
 | 
	
		
			
				|  |  | +    public static class DayN {
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 充值金额
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        private BigDecimal rechargeMoney;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 充值次数
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        private BigInteger rechargeCount;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 充值人数
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        private BigInteger rechargeNum;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 新用户复充人数
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        private BigInteger rechargeAgainNum;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |