|
@@ -1,24 +1,42 @@
|
|
|
package com.zanxiang.game.data.serve.service.impl;
|
|
|
|
|
|
+import com.google.common.base.CaseFormat;
|
|
|
+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.pojo.dto.GameDataWaterDTO;
|
|
|
+import com.zanxiang.game.data.serve.pojo.entity.AdsEverydayWater;
|
|
|
+import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
|
|
|
+import com.zanxiang.game.data.serve.pojo.vo.*;
|
|
|
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;
|
|
|
import org.nutz.dao.Dao;
|
|
|
import org.nutz.dao.Sqls;
|
|
|
+import org.nutz.dao.entity.Entity;
|
|
|
import org.nutz.dao.pager.Pager;
|
|
|
import org.nutz.dao.sql.Criteria;
|
|
|
import org.nutz.dao.sql.Sql;
|
|
|
+import org.nutz.dao.util.Daos;
|
|
|
+import org.nutz.dao.util.cri.SimpleCriteria;
|
|
|
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
|
|
@@ -32,6 +50,11 @@ public class GameDataServiceImpl implements IGameDataService {
|
|
|
@Autowired
|
|
|
private Dao dao;
|
|
|
|
|
|
+ /**
|
|
|
+ * 游戏每日数据
|
|
|
+ * @param dto 前端传递查询参数
|
|
|
+ * @return 返回给前端的数据
|
|
|
+ */
|
|
|
@Override
|
|
|
public Page<GameDataDayVO> getGameDataDay(GameDataDayDTO dto) {
|
|
|
|
|
@@ -71,18 +94,300 @@ public class GameDataServiceImpl implements IGameDataService {
|
|
|
//设置查询总数
|
|
|
pager.setRecordCount(list.size());
|
|
|
|
|
|
+ List<GameDataDayVO> gameDataDayVOList = list.stream().map(vo -> {
|
|
|
+ //买量数据
|
|
|
+ String[] buyAmountD1 = vo.getBuyAmountD1().split("/");
|
|
|
+ vo.setBuyAmountD1Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountD1[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountD1[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountD1[2]))
|
|
|
+ .back(new BigDecimal(buyAmountD1[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountD1[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountD3 = vo.getBuyAmountD3().split("/");
|
|
|
+ vo.setBuyAmountD3Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountD3[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountD3[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountD3[2]))
|
|
|
+ .back(new BigDecimal(buyAmountD3[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountD3[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountD5 = vo.getBuyAmountD5().split("/");
|
|
|
+ vo.setBuyAmountD5Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountD5[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountD5[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountD5[2]))
|
|
|
+ .back(new BigDecimal(buyAmountD5[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountD5[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountD7 = vo.getBuyAmountD7().split("/");
|
|
|
+ vo.setBuyAmountD7Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountD7[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountD7[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountD7[2]))
|
|
|
+ .back(new BigDecimal(buyAmountD7[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountD7[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountD15 = vo.getBuyAmountD15().split("/");
|
|
|
+ vo.setBuyAmountD15Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountD15[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountD15[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountD15[2]))
|
|
|
+ .back(new BigDecimal(buyAmountD15[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountD15[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountM1 = vo.getBuyAmountM1().split("/");
|
|
|
+ vo.setBuyAmountM1Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountM1[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountM1[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountM1[2]))
|
|
|
+ .back(new BigDecimal(buyAmountM1[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountM1[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountM2 = vo.getBuyAmountM2().split("/");
|
|
|
+ vo.setBuyAmountM2Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountM2[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountM2[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountM2[2]))
|
|
|
+ .back(new BigDecimal(buyAmountM2[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountM2[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountM3 = vo.getBuyAmountM3().split("/");
|
|
|
+ vo.setBuyAmountM3Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountM3[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountM3[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountM3[2]))
|
|
|
+ .back(new BigDecimal(buyAmountM3[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountM3[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountM6 = vo.getBuyAmountM6().split("/");
|
|
|
+ vo.setBuyAmountM6Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountM6[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountM6[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountM6[2]))
|
|
|
+ .back(new BigDecimal(buyAmountM6[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountM6[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] buyAmountSum = vo.getBuyAmountSum().split("/");
|
|
|
+ vo.setBuyAmountSumTrend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(buyAmountSum[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(buyAmountSum[1]))
|
|
|
+ .increase(new BigDecimal(buyAmountSum[2]))
|
|
|
+ .back(new BigDecimal(buyAmountSum[3]))
|
|
|
+ .multiples(new BigDecimal(buyAmountSum[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ //自然量数据
|
|
|
+ String[] natureAmountD1 = vo.getNatureAmountD1().split("/");
|
|
|
+ vo.setNatureAmountD1Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountD1[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountD1[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountD1[2]))
|
|
|
+ .back(new BigDecimal(natureAmountD1[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountD1[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountD3 = vo.getNatureAmountD3().split("/");
|
|
|
+ vo.setNatureAmountD3Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountD3[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountD3[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountD3[2]))
|
|
|
+ .back(new BigDecimal(natureAmountD3[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountD3[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountD5 = vo.getNatureAmountD5().split("/");
|
|
|
+ vo.setNatureAmountD5Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountD5[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountD5[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountD5[2]))
|
|
|
+ .back(new BigDecimal(natureAmountD5[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountD5[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountD7 = vo.getNatureAmountD7().split("/");
|
|
|
+ vo.setNatureAmountD7Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountD7[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountD7[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountD7[2]))
|
|
|
+ .back(new BigDecimal(natureAmountD7[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountD7[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountD15 = vo.getNatureAmountD15().split("/");
|
|
|
+ vo.setNatureAmountD15Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountD15[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountD15[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountD15[2]))
|
|
|
+ .back(new BigDecimal(natureAmountD15[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountD15[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountM1 = vo.getNatureAmountM1().split("/");
|
|
|
+ vo.setNatureAmountM1Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountM1[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountM1[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountM1[2]))
|
|
|
+ .back(new BigDecimal(natureAmountM1[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountM1[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountM2 = vo.getNatureAmountM2().split("/");
|
|
|
+ vo.setNatureAmountM2Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountM2[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountM2[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountM2[2]))
|
|
|
+ .back(new BigDecimal(natureAmountM2[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountM2[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountM3 = vo.getNatureAmountM3().split("/");
|
|
|
+ vo.setNatureAmountM3Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountM3[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountM3[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountM3[2]))
|
|
|
+ .back(new BigDecimal(natureAmountM3[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountM3[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountM6 = vo.getNatureAmountM6().split("/");
|
|
|
+ vo.setNatureAmountM6Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountM6[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountM6[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountM6[2]))
|
|
|
+ .back(new BigDecimal(natureAmountM6[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountM6[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] natureAmountSum = vo.getNatureAmountSum().split("/");
|
|
|
+ vo.setNatureAmountSumTrend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(natureAmountSum[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(natureAmountSum[1]))
|
|
|
+ .increase(new BigDecimal(natureAmountSum[2]))
|
|
|
+ .back(new BigDecimal(natureAmountSum[3]))
|
|
|
+ .multiples(new BigDecimal(natureAmountSum[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ //总量数据
|
|
|
+ String[] amountD1 = vo.getAmountD1().split("/");
|
|
|
+ vo.setAmountD1Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountD1[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountD1[1]))
|
|
|
+ .increase(new BigDecimal(amountD1[2]))
|
|
|
+ .back(new BigDecimal(amountD1[3]))
|
|
|
+ .multiples(new BigDecimal(amountD1[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountD3 = vo.getAmountD3().split("/");
|
|
|
+ vo.setAmountD3Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountD3[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountD3[1]))
|
|
|
+ .increase(new BigDecimal(amountD3[2]))
|
|
|
+ .back(new BigDecimal(amountD3[3]))
|
|
|
+ .multiples(new BigDecimal(amountD3[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountD5 = vo.getAmountD5().split("/");
|
|
|
+ vo.setAmountD5Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountD5[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountD5[1]))
|
|
|
+ .increase(new BigDecimal(amountD5[2]))
|
|
|
+ .back(new BigDecimal(amountD5[3]))
|
|
|
+ .multiples(new BigDecimal(amountD5[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountD7 = vo.getAmountD7().split("/");
|
|
|
+ vo.setAmountD7Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountD7[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountD7[1]))
|
|
|
+ .increase(new BigDecimal(amountD7[2]))
|
|
|
+ .back(new BigDecimal(amountD7[3]))
|
|
|
+ .multiples(new BigDecimal(amountD7[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountD15 = vo.getAmountD15().split("/");
|
|
|
+ vo.setAmountD15Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountD15[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountD15[1]))
|
|
|
+ .increase(new BigDecimal(amountD15[2]))
|
|
|
+ .back(new BigDecimal(amountD15[3]))
|
|
|
+ .multiples(new BigDecimal(amountD15[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountM1 = vo.getAmountM1().split("/");
|
|
|
+ vo.setAmountM1Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountM1[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountM1[1]))
|
|
|
+ .increase(new BigDecimal(amountM1[2]))
|
|
|
+ .back(new BigDecimal(amountM1[3]))
|
|
|
+ .multiples(new BigDecimal(amountM1[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountM2 = vo.getAmountM2().split("/");
|
|
|
+ vo.setAmountM2Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountM2[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountM2[1]))
|
|
|
+ .increase(new BigDecimal(amountM2[2]))
|
|
|
+ .back(new BigDecimal(amountM2[3]))
|
|
|
+ .multiples(new BigDecimal(amountM2[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountM3 = vo.getAmountM3().split("/");
|
|
|
+ vo.setAmountM3Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountM3[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountM3[1]))
|
|
|
+ .increase(new BigDecimal(amountM3[2]))
|
|
|
+ .back(new BigDecimal(amountM3[3]))
|
|
|
+ .multiples(new BigDecimal(amountM3[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountM6 = vo.getAmountM6().split("/");
|
|
|
+ vo.setAmountM6Trend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountM6[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountM6[1]))
|
|
|
+ .increase(new BigDecimal(amountM6[2]))
|
|
|
+ .back(new BigDecimal(amountM6[3]))
|
|
|
+ .multiples(new BigDecimal(amountM6[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ String[] amountSum = vo.getAmountSum().split("/");
|
|
|
+ vo.setAmountSumTrend(RechargeTrendVO.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(amountSum[0]))
|
|
|
+ .rechargeUserCount(Long.valueOf(amountSum[1]))
|
|
|
+ .increase(new BigDecimal(amountSum[2]))
|
|
|
+ .back(new BigDecimal(amountSum[3]))
|
|
|
+ .multiples(new BigDecimal(amountSum[4]))
|
|
|
+ .build());
|
|
|
+
|
|
|
+ return vo;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
//返回list结果 封装到page对象里
|
|
|
- return new Page<>(list, pager);
|
|
|
+ return new Page<>(gameDataDayVOList, pager);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 游戏总数据
|
|
|
+ * @param dto 前端传递的查询参数
|
|
|
+ * @return 返回给前端的数据
|
|
|
+ */
|
|
|
@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 +426,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 +563,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 +769,229 @@ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<GameDataWaterVO> getGameDataWater(GameDataWaterDTO dto) {
|
|
|
+ if (null == dto.getRechargeDate()) {
|
|
|
+ dto.setRechargeDate(LocalDate.now());
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(dto.getSortFiled())) {
|
|
|
+ dto.setSortFiled("amount");
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(dto.getSortType())) {
|
|
|
+ dto.setSortType(OrderByEnum.DESC.getOrderType());
|
|
|
+ }
|
|
|
+ Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
|
|
|
+ // 创建一个 Criteria 接口实例
|
|
|
+ SimpleCriteria cri = Cnd.cri();
|
|
|
+ if (StringUtils.isNotBlank(dto.getGameName())) {
|
|
|
+ cri.where().andLike("game_name", dto.getGameName());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getGameClassify())) {
|
|
|
+ cri.where().andEquals("game_classify", dto.getGameClassify());
|
|
|
+ }
|
|
|
+ cri.where().and("dt", "=", dto.getRechargeDate());
|
|
|
+ cri.groupBy("game_id");
|
|
|
+ cri.orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
|
|
|
+ Sql sql = Sqls.queryEntity(waterSql() + "$condition");
|
|
|
+ sql.setPager(pager);
|
|
|
+ Entity<GameDataWaterVO> entity = dao.getEntity(GameDataWaterVO.class);
|
|
|
+ sql.setEntity(entity).setCondition(cri);
|
|
|
+ dao.execute(sql);
|
|
|
+
|
|
|
+ Sql sqlCount = Sqls.queryEntity("select count(*) from ads_everyday_water " + "$condition");
|
|
|
+ sqlCount.setCondition(cri);
|
|
|
+ pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
|
|
|
+
|
|
|
+ List<Long> gameIds = sql.getList(GameDataWaterVO.class).stream()
|
|
|
+ .map(GameDataWaterVO::getGameId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (CollectionUtils.isEmpty(gameIds)) {
|
|
|
+ return new Page<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ SimpleCriteria templateCri = Cnd.cri();
|
|
|
+ templateCri.where().and("dt", "=", dto.getRechargeDate());
|
|
|
+ templateCri.where().andInList("game_id", gameIds);
|
|
|
+ Sql templateSql = Sqls.queryEntity(waterTemplateSql() + "$condition");
|
|
|
+ Entity<AdsEverydayWater> everydayWaterEntity = dao.getEntity(AdsEverydayWater.class);
|
|
|
+ templateSql.setEntity(everydayWaterEntity).setCondition(templateCri);
|
|
|
+ dao.execute(templateSql);
|
|
|
+
|
|
|
+ Map<Long, List<AdsEverydayWater>> collect = templateSql.getList(AdsEverydayWater.class).stream().collect(Collectors.groupingBy(AdsEverydayWater::getGameId));
|
|
|
+ List<GameDataWaterVO> result = sql.getList(GameDataWaterVO.class).stream()
|
|
|
+ .map(item -> {
|
|
|
+ List<AdsEverydayWater> adsEverydayWaters = collect.get(item.getGameId());
|
|
|
+ if (!CollectionUtils.isEmpty(adsEverydayWaters)) {
|
|
|
+ List<RechargeTemplateVO> rechargeTemplateVOList = new ArrayList<>(10);
|
|
|
+
|
|
|
+ List<PlayerTemplateVO> playerTemplateVOS = new ArrayList<>(10);
|
|
|
+ adsEverydayWaters.forEach(adsEverydayWater -> {
|
|
|
+ if (StringUtils.isNotBlank(adsEverydayWater.getAmountOrderBy())) {
|
|
|
+ rechargeTemplateVOList.add(RechargeTemplateVO.builder()
|
|
|
+ .amountCount(adsEverydayWater.getAmountCount())
|
|
|
+ .amountNum(adsEverydayWater.getAmountNum())
|
|
|
+ .amountOrderBy(adsEverydayWater.getAmountOrderBy())
|
|
|
+ .amountPost(adsEverydayWater.getAmountPost())
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(adsEverydayWater.getUserOrderBy())) {
|
|
|
+ playerTemplateVOS.add(PlayerTemplateVO.builder()
|
|
|
+ .userId(adsEverydayWater.getUserId())
|
|
|
+ .userAmount(adsEverydayWater.getUserAmount())
|
|
|
+ .userOrderBy(adsEverydayWater.getUserOrderBy())
|
|
|
+ .userName(adsEverydayWater.getUserName())
|
|
|
+ .proportion(
|
|
|
+ item.getAmount().compareTo(BigDecimal.ZERO) == 0 ?
|
|
|
+ BigDecimal.ZERO :
|
|
|
+ adsEverydayWater.getUserAmount().divide(item.getAmount(), 4, RoundingMode.DOWN)
|
|
|
+ )
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ item.setRechargeTemplateVOList(rechargeTemplateVOList);
|
|
|
+ item.setPlayerTemplateVOS(playerTemplateVOS);
|
|
|
+ }
|
|
|
+ return item;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ return new Page<>(result, pager);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String waterSql() {
|
|
|
+ return """
|
|
|
+ select
|
|
|
+ game_id as id,
|
|
|
+ game_id,
|
|
|
+ max(game_name) as game_name,
|
|
|
+ max(game_classify) as game_classify,
|
|
|
+ max(amount) as amount,
|
|
|
+ max(buy_amount) as buy_amount,
|
|
|
+ max(nature_amount) as nature_amount
|
|
|
+ from ads_everyday_water
|
|
|
+ """;
|
|
|
+ }
|
|
|
|
|
|
+ private String waterTemplateSql() {
|
|
|
+ return """
|
|
|
+ select
|
|
|
+ game_id,
|
|
|
+ user_order_by,
|
|
|
+ user_id,
|
|
|
+ user_name,
|
|
|
+ user_amount,
|
|
|
+ amount_order_by,
|
|
|
+ amount_post,
|
|
|
+ amount_count,
|
|
|
+ amount_num
|
|
|
+ from ads_everyday_water
|
|
|
+ """;
|
|
|
+ }
|
|
|
}
|