|
@@ -0,0 +1,558 @@
|
|
|
+package com.zanxiang.game.gs.data.serve.service.impl;
|
|
|
+
|
|
|
+
|
|
|
+import com.google.common.base.CaseFormat;
|
|
|
+import com.mybatisflex.core.paginate.Page;
|
|
|
+import com.mybatisflex.core.query.QueryWrapper;
|
|
|
+import com.mybatisflex.core.row.Row;
|
|
|
+import com.zanxiang.game.gs.data.serve.pojo.dto.ServerPayDTO;
|
|
|
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGameServerGsActiveRDayParent;
|
|
|
+import com.zanxiang.game.gs.data.serve.pojo.vo.GsRTotalVO;
|
|
|
+import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
|
|
|
+import com.zanxiang.game.gs.data.serve.pojo.vo.ServerPayVO;
|
|
|
+import com.zanxiang.game.gs.data.serve.service.IAdsGameServerGsActiveRDayParentService;
|
|
|
+import com.zanxiang.game.gs.data.serve.service.IGameServerSonMergeService;
|
|
|
+import com.zanxiang.game.gs.data.serve.service.ISysUserService;
|
|
|
+import com.zanxiang.module.util.DateUtil;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import com.zanxiang.game.gs.data.serve.service.IAdsGsServerDayParentService;
|
|
|
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsGsServerDayParent;
|
|
|
+import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsGsServerDayParentMapper;
|
|
|
+import com.mybatisflex.spring.service.impl.ServiceImpl;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+import static com.mybatisflex.core.query.QueryMethods.ifNull;
|
|
|
+import static com.mybatisflex.core.query.QueryMethods.sum;
|
|
|
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.table.DwGsServerAmountDayParentTableDef.DW_GS_SERVER_AMOUNT_DAY_PARENT;
|
|
|
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.dw.table.DwGsServerRoleDayParentTableDef.DW_GS_SERVER_ROLE_DAY_PARENT;
|
|
|
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsGameServerGsActiveRDayParentTableDef.ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT;
|
|
|
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsGsServerDayParentTableDef.ADS_GS_SERVER_DAY_PARENT;
|
|
|
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsRoleAmountDataParentTableDef.ADS_ROLE_AMOUNT_DATA_PARENT;
|
|
|
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsRoleAmountRateParentTableDef.ADS_ROLE_AMOUNT_RATE_PARENT;
|
|
|
+
|
|
|
+/**
|
|
|
+ * GS区服付费留存(游戏GS管理) 服务层实现。
|
|
|
+ *
|
|
|
+ * @author shaosong
|
|
|
+ * @since 1.0
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class AdsGsServerDayParentServiceImpl extends ServiceImpl<AdsGsServerDayParentMapper, AdsGsServerDayParent> implements IAdsGsServerDayParentService {
|
|
|
+ @Resource
|
|
|
+ private ISysUserService sysUserService;
|
|
|
+ @Resource
|
|
|
+ private IGameServerSonMergeService serverSonMergeService;
|
|
|
+ @Resource
|
|
|
+ private IAdsGameServerGsActiveRDayParentService rDayParentService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PageVO<ServerPayVO, Row> serverPay(ServerPayDTO dto) {
|
|
|
+ if (StringUtils.isBlank(dto.getSortFiled())) {
|
|
|
+ dto.setSortFiled(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT.getName());
|
|
|
+ } else {
|
|
|
+ String column = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled());
|
|
|
+ dto.setSortFiled(column);
|
|
|
+ }
|
|
|
+ QueryWrapper wrapper = getServePayWrapper(dto);
|
|
|
+
|
|
|
+ Page<ServerPayVO> paginate = getMapper().paginateAs(dto.getPageNum(), dto.getPageSize(), wrapper, ServerPayVO.class);
|
|
|
+ if (0 == paginate.getTotalRow()) {
|
|
|
+ return PageVO.empty(dto);
|
|
|
+ }
|
|
|
+ List<ServerPayVO> records = paginate.getRecords();
|
|
|
+
|
|
|
+ Set<String> serverIdList = records.stream().map(ServerPayVO::getServerId).collect(Collectors.toSet());
|
|
|
+
|
|
|
+ Set<Long> gsIdList = new HashSet<>();
|
|
|
+ records.stream().map(ServerPayVO::getGsIds)
|
|
|
+ .filter(item -> StringUtils.isNotBlank(item) && !"null".equals(item))
|
|
|
+ .forEach(gsIds -> {
|
|
|
+ List<String> gsIdStr = Arrays.asList(gsIds.split(","));
|
|
|
+ Set<Long> collect = gsIdStr.stream().map(Long::valueOf).collect(Collectors.toSet());
|
|
|
+ gsIdList.addAll(collect);
|
|
|
+ });
|
|
|
+ // GS名称查询
|
|
|
+ Map<Long, String> sysUserMap = CollectionUtils.isEmpty(gsIdList) ? null : sysUserService.getSysUserMap(gsIdList);
|
|
|
+ // 是否原始服
|
|
|
+ Map<Long, Map<String, Integer>> serverOriginMap = serverSonMergeService.gameServerOriginMap(dto.getSourceSystem(), serverIdList);
|
|
|
+ // R数据查询
|
|
|
+ String uniqueServeList = records.stream().map(item -> item.getParentGameId() + "_" + item.getServerId())
|
|
|
+ .map(item -> "'" + item + "'")
|
|
|
+ .collect(Collectors.joining(", "));
|
|
|
+ List<AdsGameServerGsActiveRDayParent> rDayParentList = rDayParentService.list(getDayServeRWrapper(uniqueServeList, dto.getSourceSystem()));
|
|
|
+ Map<String, List<AdsGameServerGsActiveRDayParent>> rDayMap = rDayParentList.stream().collect(Collectors.groupingBy(rDayParent -> rDayParent.getParentGameId() + "_" + rDayParent.getServerId()));
|
|
|
+
|
|
|
+ //获取所有的da字段
|
|
|
+ List<Field> fieldList = Arrays.stream(ServerPayVO.class.getDeclaredFields())
|
|
|
+ .filter(field -> field.getName().contains("da"))
|
|
|
+ .peek(field -> field.setAccessible(true))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ //获取所有的da对应的retainedDa
|
|
|
+ List<Field> fieldObjectList = Arrays.stream(ServerPayVO.class.getDeclaredFields())
|
|
|
+ .filter(field -> field.getName().contains("retainedDa"))
|
|
|
+ .peek(field -> field.setAccessible(true))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ records.forEach(record -> {
|
|
|
+ // 基础信息
|
|
|
+ String gsIds = record.getGsIds();
|
|
|
+ if (StringUtils.isNotBlank(gsIds) && !"null".equals(gsIds)) {
|
|
|
+ List<String> gsIdStr = Arrays.asList(gsIds.split(","));
|
|
|
+ record.setGsStatus(gsIdStr.size() == 1 ? 1 : 2);
|
|
|
+ Set<String> collect = gsIdStr.stream().map(Long::valueOf)
|
|
|
+ .map(gsId -> sysUserMap != null ? sysUserMap.get(gsId) : null)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ record.setGsName(StringUtils.join(collect, ","));
|
|
|
+ }
|
|
|
+ Integer original = null == serverOriginMap.get(record.getSuperGameId()) ? null : serverOriginMap.get(record.getSuperGameId()).get(record.getServerId());
|
|
|
+ record.setOriginServer(null == original ? null : 1 == original);
|
|
|
+
|
|
|
+ record.setStartDiff(DateUtil.intervalOfDays(record.getStartTime(), LocalDate.now()));
|
|
|
+ record.setServeDiff(record.getEndTime().isBefore(LocalDate.now()) ? DateUtil.intervalOfDays(record.getStartTime(), record.getEndTime())
|
|
|
+ : DateUtil.intervalOfDays(record.getStartTime(), LocalDate.now()));
|
|
|
+ record.setServeStatus(record.getEndTime().isBefore(LocalDate.now()));
|
|
|
+
|
|
|
+ // R数据计算
|
|
|
+ List<AdsGameServerGsActiveRDayParent> rDataList = rDayMap.get(record.getParentGameId() + "_" + record.getServerId());
|
|
|
+
|
|
|
+ // Da的总计
|
|
|
+ String totalRDa;
|
|
|
+ String totalDa = record.getTotal();
|
|
|
+ if (CollectionUtils.isNotEmpty(rDataList)) {
|
|
|
+ long sumSR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getSmallR).sum();
|
|
|
+ long sumMR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getCentreR).sum();
|
|
|
+ long sumBR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getBigR).sum();
|
|
|
+ long sumSuperR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getSuperLargeR).sum();
|
|
|
+ long sumTotalR = rDataList.stream().mapToLong(AdsGameServerGsActiveRDayParent::getTotalR).sum();
|
|
|
+
|
|
|
+ AdsGameServerGsActiveRDayParent build = AdsGameServerGsActiveRDayParent.builder()
|
|
|
+ .smallR(sumSR)
|
|
|
+ .centreR(sumMR)
|
|
|
+ .bigR(sumBR)
|
|
|
+ .superLargeR(sumSuperR)
|
|
|
+ .totalR(sumTotalR)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ //累计充值人数
|
|
|
+ String[] split = totalDa.split("/");
|
|
|
+ totalRDa = getRDataStr(build, Long.valueOf(split[2]), Long.valueOf(split[1]));
|
|
|
+ } else {
|
|
|
+ // 小R付费比 7/中R付费比 8/大R付费比 9/超R付费比 10/小R留存率 11/中R留存率 12/大R留存率 13/超R留存率 14/R总留存率 15/小R人数 16/中R人数 17/大R人数 18/超R人数 19/总R人数 20
|
|
|
+ totalRDa = "0/0/0/0/0/0/0/0/0/0/0/0/0/0";
|
|
|
+ }
|
|
|
+ totalDa += "/" + totalRDa;
|
|
|
+ String[] totalSplit = totalDa.split("/");
|
|
|
+ ServerPayVO.DayN retentionTotal = ServerPayVO.DayN.builder()
|
|
|
+ .activeNum(Long.parseLong(totalSplit[0]))
|
|
|
+ .payNum(Long.parseLong(totalSplit[1]))
|
|
|
+ .totalPayNum(Long.parseLong(totalSplit[2]))
|
|
|
+ .sRNum(Long.parseLong(totalSplit[16]))
|
|
|
+ .mRNum(Long.parseLong(totalSplit[17]))
|
|
|
+ .bRNum(Long.parseLong(totalSplit[18]))
|
|
|
+ .superRNum(Long.parseLong(totalSplit[19]))
|
|
|
+ .totalRNum(Long.parseLong(totalSplit[20]))
|
|
|
+ .payMoney(new BigDecimal(totalSplit[3]))
|
|
|
+ .payRate(new BigDecimal(totalSplit[4]))
|
|
|
+ .sRRate(new BigDecimal(totalSplit[7]))
|
|
|
+ .mRRate(new BigDecimal(totalSplit[8]))
|
|
|
+ .bRRate(new BigDecimal(totalSplit[9]))
|
|
|
+ .superRRate(new BigDecimal(totalSplit[10]))
|
|
|
+ .activeRetainedRate(new BigDecimal(totalSplit[5]))
|
|
|
+ .payRetainedRate(new BigDecimal(totalSplit[6]))
|
|
|
+ .sRRetainedRate(new BigDecimal(totalSplit[11]))
|
|
|
+ .mRRetainedRate(new BigDecimal(totalSplit[12]))
|
|
|
+ .bRRetainedRate(new BigDecimal(totalSplit[13]))
|
|
|
+ .superRRetainedRate(new BigDecimal(totalSplit[14]))
|
|
|
+ .totalRRetainedRate(new BigDecimal(totalSplit[15]))
|
|
|
+ .build();
|
|
|
+ record.setRetainedTotal(retentionTotal);
|
|
|
+
|
|
|
+ // Da的90天
|
|
|
+ for (int i = 0; i < fieldList.size(); i++) {
|
|
|
+ try {
|
|
|
+ Field field = fieldList.get(i);
|
|
|
+ // 活跃人数 0/付费人数 1/累计付费人数 2/付费金额 3/付费率 4/活跃留存率 5/付费留存率 6
|
|
|
+ String da = (String) field.get(record);
|
|
|
+ String rDa;
|
|
|
+ if (rDataList != null && rDataList.size() >= i + 1) {
|
|
|
+ //累计充值人数
|
|
|
+ String[] split = da.split("/");
|
|
|
+ AdsGameServerGsActiveRDayParent gsGameServerDayRVO = rDataList.get(i);
|
|
|
+ rDa = getRDataStr(gsGameServerDayRVO, Long.valueOf(split[2]), Long.valueOf(split[1]));
|
|
|
+ } else {
|
|
|
+ // 小R付费比 7/中R付费比 8/大R付费比 9/超R付费比 10/小R留存率 11/中R留存率 12/大R留存率 13/超R留存率 14/R总留存率 15/小R人数 16/中R人数 17/大R人数 18/超R人数 19/总R人数 20
|
|
|
+ rDa = "0/0/0/0/0/0/0/0/0/0/0/0/0/0";
|
|
|
+ }
|
|
|
+ da += "/" + rDa;
|
|
|
+ String[] split = da.split("/");
|
|
|
+ ServerPayVO.DayN retentionVO = ServerPayVO.DayN.builder()
|
|
|
+ .activeNum(Long.parseLong(split[0]))
|
|
|
+ .payNum(Long.parseLong(split[1]))
|
|
|
+ .totalPayNum(Long.parseLong(split[2]))
|
|
|
+ .sRNum(Long.parseLong(split[16]))
|
|
|
+ .mRNum(Long.parseLong(split[17]))
|
|
|
+ .bRNum(Long.parseLong(split[18]))
|
|
|
+ .superRNum(Long.parseLong(split[19]))
|
|
|
+ .totalRNum(Long.parseLong(split[20]))
|
|
|
+ .payMoney(new BigDecimal(split[3]))
|
|
|
+ .payRate(new BigDecimal(split[4]))
|
|
|
+ .sRRate(new BigDecimal(split[7]))
|
|
|
+ .mRRate(new BigDecimal(split[8]))
|
|
|
+ .bRRate(new BigDecimal(split[9]))
|
|
|
+ .superRRate(new BigDecimal(split[10]))
|
|
|
+ .activeRetainedRate(new BigDecimal(split[5]))
|
|
|
+ .payRetainedRate(new BigDecimal(split[6]))
|
|
|
+ .sRRetainedRate(new BigDecimal(split[11]))
|
|
|
+ .mRRetainedRate(new BigDecimal(split[12]))
|
|
|
+ .bRRetainedRate(new BigDecimal(split[13]))
|
|
|
+ .superRRetainedRate(new BigDecimal(split[14]))
|
|
|
+ .totalRRetainedRate(new BigDecimal(split[15]))
|
|
|
+ .build();
|
|
|
+ fieldObjectList.get(i).set(record, retentionVO);
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return new PageVO<>(paginate);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 拼接R留存率 (R/充值总人数)
|
|
|
+ *
|
|
|
+ * @param rvo
|
|
|
+ * @param payNum
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getRDataStr(AdsGameServerGsActiveRDayParent rvo, Long totalPayNum, Long payNum) {
|
|
|
+ String rateD = "";
|
|
|
+ String payRateD = "";
|
|
|
+ if (rvo != null && totalPayNum != null && totalPayNum != 0) {
|
|
|
+ //R人数
|
|
|
+ Long smallRCount = rvo.getSmallR();
|
|
|
+ Long mediumRCount = rvo.getCentreR();
|
|
|
+ Long largeRCont = rvo.getBigR();
|
|
|
+ Long superRCount = rvo.getSuperLargeR();
|
|
|
+ //R总
|
|
|
+ long totalRCount = rvo.getTotalR();
|
|
|
+ //R留存率
|
|
|
+ BigDecimal smallRate = rRate(smallRCount, totalPayNum);
|
|
|
+ BigDecimal mediumRate = rRate(mediumRCount, totalPayNum);
|
|
|
+ BigDecimal largeRate = rRate(largeRCont, totalPayNum);
|
|
|
+ BigDecimal superRate = rRate(superRCount, totalPayNum);
|
|
|
+ //R总留存
|
|
|
+ BigDecimal rTotalRate = rRate(totalRCount, totalPayNum);
|
|
|
+ rateD = smallRate + "/" + mediumRate + "/" + largeRate + "/" + superRate + "/" + rTotalRate + "/" + smallRCount + "/" + mediumRCount + "/" + largeRCont + "/" + superRCount + "/" + totalRCount;
|
|
|
+ } else {
|
|
|
+ // 小R留存率/中R留存率/大R留存率/超R留存率/R总留存率/小R人数/中R人数/大R人数/超R人数/总R人数
|
|
|
+ rateD = "0/0/0/0/0/0/0/0/0/0";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rvo != null && payNum != null && payNum != 0) {
|
|
|
+ //R人数
|
|
|
+ Long smallRCount = rvo.getSmallR();
|
|
|
+ Long mediumRCount = rvo.getCentreR();
|
|
|
+ Long largeRCont = rvo.getBigR();
|
|
|
+ Long superRCount = rvo.getSuperLargeR();
|
|
|
+
|
|
|
+ //R付费比
|
|
|
+ BigDecimal smallPayRate = rRate(smallRCount, payNum);
|
|
|
+ BigDecimal mediumPayRate = rRate(mediumRCount, payNum);
|
|
|
+ BigDecimal largePayRate = rRate(largeRCont, payNum);
|
|
|
+ BigDecimal superPayRate = rRate(superRCount, payNum);
|
|
|
+ payRateD = smallPayRate + "/" + mediumPayRate + "/" + largePayRate + "/" + superPayRate + "/";
|
|
|
+ } else {
|
|
|
+ // 小R付费比/中R付费比/大R付费比/超R付费比
|
|
|
+ payRateD = "0/0/0/0/";
|
|
|
+ }
|
|
|
+ return payRateD + rateD;
|
|
|
+ }
|
|
|
+
|
|
|
+ private BigDecimal rRate(Long molecule, Long denominator) {
|
|
|
+ return new BigDecimal(molecule).divide(new BigDecimal(denominator), 4, RoundingMode.HALF_UP).setScale(2, RoundingMode.DOWN);
|
|
|
+ }
|
|
|
+
|
|
|
+ private QueryWrapper getDayServeRWrapper(String uniqueServeList, String sourceSystem) {
|
|
|
+ return QueryWrapper.create()
|
|
|
+ .from(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT)
|
|
|
+ .select(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.ALL_COLUMNS)
|
|
|
+ .eq(AdsGameServerGsActiveRDayParent::getSourceSystem, sourceSystem)
|
|
|
+ .and("CONCAT_WS('_', parent_game_id, server_id) IN (" + uniqueServeList + ")");
|
|
|
+ }
|
|
|
+
|
|
|
+ private QueryWrapper getTotalServeRWrapper(ServerPayDTO dto) {
|
|
|
+ QueryWrapper queryWrapper = QueryWrapper.create()
|
|
|
+ .from(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT)
|
|
|
+ .leftJoin(ADS_GS_SERVER_DAY_PARENT)
|
|
|
+ .on(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SOURCE_SYSTEM.eq(ADS_GS_SERVER_DAY_PARENT.SOURCE_SYSTEM)
|
|
|
+ .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.DT.eq(ADS_GS_SERVER_DAY_PARENT.START_TIME)
|
|
|
+ .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.PARENT_GAME_ID.eq(ADS_GS_SERVER_DAY_PARENT.PARENT_GAME_ID))
|
|
|
+ .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SERVER_ID.eq(ADS_GS_SERVER_DAY_PARENT.SERVER_ID))))
|
|
|
+ .select("GROUP_CONCAT(CONCAT(CAST(small_r AS CHAR))) as small_r")
|
|
|
+ .select("GROUP_CONCAT(CONCAT(CAST(centre_r AS CHAR))) as centre_r")
|
|
|
+ .select("GROUP_CONCAT(CONCAT(CAST(big_r AS CHAR))) as big_r")
|
|
|
+ .select("GROUP_CONCAT(CONCAT(CAST(super_large_r AS CHAR))) as super_large_r")
|
|
|
+ .select("GROUP_CONCAT(CONCAT(CAST(total_r AS CHAR))) as total_r")
|
|
|
+ .groupBy(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.DT)
|
|
|
+ .groupBy(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SOURCE_SYSTEM)
|
|
|
+ .groupBy(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.PARENT_GAME_ID)
|
|
|
+ .groupBy(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SERVER_ID);
|
|
|
+ condition(dto, queryWrapper);
|
|
|
+ return queryWrapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ private QueryWrapper getAllServeRWrapper(ServerPayDTO dto) {
|
|
|
+ QueryWrapper queryWrapper = QueryWrapper.create()
|
|
|
+ .from(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT)
|
|
|
+ .leftJoin(ADS_GS_SERVER_DAY_PARENT)
|
|
|
+ .on(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SOURCE_SYSTEM.eq(ADS_GS_SERVER_DAY_PARENT.SOURCE_SYSTEM)
|
|
|
+ .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.DT.eq(ADS_GS_SERVER_DAY_PARENT.START_TIME)
|
|
|
+ .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.PARENT_GAME_ID.eq(ADS_GS_SERVER_DAY_PARENT.PARENT_GAME_ID))
|
|
|
+ .and(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SERVER_ID.eq(ADS_GS_SERVER_DAY_PARENT.SERVER_ID))))
|
|
|
+ .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SMALL_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SMALL_R.getName()))
|
|
|
+ .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.CENTRE_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.CENTRE_R.getName()))
|
|
|
+ .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.BIG_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.BIG_R.getName()))
|
|
|
+ .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SUPER_LARGE_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.SUPER_LARGE_R.getName()))
|
|
|
+ .select(sum(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.TOTAL_R).as(ADS_GAME_SERVER_GS_ACTIVE_R_DAY_PARENT.TOTAL_R.getName()));
|
|
|
+ condition(dto, queryWrapper);
|
|
|
+ return queryWrapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ private QueryWrapper getServePayWrapper(ServerPayDTO dto) {
|
|
|
+ QueryWrapper queryWrapper = QueryWrapper.create()
|
|
|
+ .from(ADS_GS_SERVER_DAY_PARENT)
|
|
|
+ .select(ADS_GS_SERVER_DAY_PARENT.ALL_COLUMNS)
|
|
|
+ .orderBy(dto.getSortFiled(), dto.getSortAsc());
|
|
|
+ condition(dto, queryWrapper);
|
|
|
+ return queryWrapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ private QueryWrapper getServePayTotalWrapper(ServerPayDTO dto) {
|
|
|
+ QueryWrapper queryWrapper = QueryWrapper.create()
|
|
|
+ .from(ADS_GS_SERVER_DAY_PARENT)
|
|
|
+ .select(getDayN())
|
|
|
+ .select(sum(ADS_GS_SERVER_DAY_PARENT.TOTAL_ROLE_NUM).as(ADS_GS_SERVER_DAY_PARENT.TOTAL_ROLE_NUM.getName()))
|
|
|
+ .select(sum(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT_NUM).as(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT_NUM.getName()))
|
|
|
+ .select(sum(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT_COUNT).as(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT_COUNT.getName()))
|
|
|
+ .select(sum(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT).as(ADS_GS_SERVER_DAY_PARENT.TOTAL_AMOUNT.getName()))
|
|
|
+ .select("ROUND(IF(SUM(total_amount_num) > 0 , SUM(total_amount) / SUM(total_amount_num), 0), 4) AS arppu")
|
|
|
+ .select("ROUND(IF(SUM(total_amount_count) > 0 , SUM(total_amount) / SUM(total_amount_count), 0), 4) AS avg_amount")
|
|
|
+ .select("ROUND(IF(SUM(total_role_num) > 0 , SUM(total_amount_num) / SUM(total_role_num), 0), 4) AS amount_rate")
|
|
|
+ .select(sum(ADS_GS_SERVER_DAY_PARENT.SON_ROLE_NUM).as(ADS_GS_SERVER_DAY_PARENT.SON_ROLE_NUM.getName()))
|
|
|
+ .select(sum(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT_NUM).as(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT_NUM.getName()))
|
|
|
+ .select(sum(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT_COUNT).as(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT_COUNT.getName()))
|
|
|
+ .select(sum(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT).as(ADS_GS_SERVER_DAY_PARENT.SON_SERVER_AMOUNT.getName()))
|
|
|
+ .select("ROUND(IF(SUM(son_server_amount_num) > 0 , SUM(son_server_amount) / SUM(son_server_amount_num), 0), 4) AS son_arppu")
|
|
|
+ .select("ROUND(IF(SUM(son_server_amount_count) > 0 , SUM(son_server_amount) / SUM(son_server_amount_count), 0), 4) AS son_avg_amount")
|
|
|
+ .select("ROUND(IF(SUM(son_role_num) > 0 , SUM(son_server_amount_num) / SUM(son_role_num), 0), 4) AS son_amount_rate");
|
|
|
+ condition(dto, queryWrapper);
|
|
|
+ return queryWrapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void condition(ServerPayDTO dto, QueryWrapper queryWrapper) {
|
|
|
+ queryWrapper.eq(AdsGsServerDayParent::getSourceSystem, dto.getSourceSystem())
|
|
|
+ .ge(AdsGsServerDayParent::getStartTime, dto.getServerStartBegin(), null != dto.getServerStartBegin())
|
|
|
+ .le(AdsGsServerDayParent::getStartTime, dto.getServerStartEnd(), null != dto.getServerStartEnd())
|
|
|
+ .ge(AdsGsServerDayParent::getStartTime, dto.getServeDayBegin(), null != dto.getServeDayBegin())
|
|
|
+ .le(AdsGsServerDayParent::getEndTime, dto.getServeDayEnd(), null != dto.getServeDayEnd())
|
|
|
+ .eq(AdsGsServerDayParent::getSuperGameId, dto.getSuperGameId(), null != dto.getSuperGameId())
|
|
|
+ .eq(AdsGsServerDayParent::getParentGameId, dto.getParentGameId(), null != dto.getParentGameId())
|
|
|
+ .in(AdsGsServerDayParent::getServerId, dto.getServerIdList(), CollectionUtils.isNotEmpty(dto.getServerIdList()))
|
|
|
+ .ge(AdsGsServerDayParent::getEndTime, LocalDate.now(), null != dto.getServeStatus() && 1 == dto.getServeStatus())
|
|
|
+ .le(AdsGsServerDayParent::getEndTime, LocalDate.now(), null != dto.getServeStatus() && 2 == dto.getServeStatus());
|
|
|
+ if (CollectionUtils.isNotEmpty(dto.getGsIdList())) {
|
|
|
+ StringBuilder gsSql = new StringBuilder();
|
|
|
+ dto.getGsIdList().forEach(gsId -> {
|
|
|
+ gsSql.append(String.format(" FIND_IN_SET(%s, gs_ids) > 0", gsId));
|
|
|
+ gsSql.append(" OR ");
|
|
|
+ });
|
|
|
+ gsSql.setLength(gsSql.length() - 4);
|
|
|
+ queryWrapper.and(gsSql.toString());
|
|
|
+ }
|
|
|
+ if (null != dto.getGsStatus() && 1 == dto.getGsStatus()) {
|
|
|
+ queryWrapper.and("gs_ids != 'null' and LENGTH(gs_ids) - LENGTH(REPLACE(gs_ids, ',', '')) + 1 = 1");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (null != dto.getGsStatus() && 2 == dto.getGsStatus()) {
|
|
|
+ queryWrapper.and("gs_ids != 'null' and LENGTH(gs_ids) - LENGTH(REPLACE(gs_ids, ',', '')) + 1 > 1");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getDayN() {
|
|
|
+ StringBuilder currDayN = new StringBuilder(StringUtils.EMPTY);
|
|
|
+ for (int day = 1; day <= 90; day++) {
|
|
|
+ String dayN = "da" + day;
|
|
|
+ daySplit(currDayN, dayN);
|
|
|
+ }
|
|
|
+ String total = "total";
|
|
|
+ daySplit(currDayN, total);
|
|
|
+ // 移除最后一个逗号和空格
|
|
|
+ if (currDayN.length() > 0) {
|
|
|
+ currDayN.setLength(currDayN.length() - 2);
|
|
|
+ }
|
|
|
+ //返回结果
|
|
|
+ return currDayN.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void daySplit(StringBuilder totalDayN, String dayN) {
|
|
|
+ totalDayN.append(" CONCAT_WS('/', ")
|
|
|
+ .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 1)), 0), ")
|
|
|
+ .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 2)), 0), ")
|
|
|
+ .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 3)), 0), ")
|
|
|
+ .append("IFNULL(SUM(SPLIT_PART(").append(dayN).append(", '/', 4)), 0), ")
|
|
|
+ .append("ROUND(IF(SUM(SPLIT_PART(").append(dayN).append(", '/', 1)) > 0, ")
|
|
|
+ .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 2)) / SUM(SPLIT_PART(").append(dayN).append(", '/', 1)), 0), 4), ")
|
|
|
+ .append("ROUND(IF(SUM(son_role_num) > 0, SUM(SPLIT_PART(").append(dayN).append(", '/', 1)) / SUM(son_role_num), 0), 4), ")
|
|
|
+ .append("ROUND(IF(SUM(son_server_amount_num) > 0, SUM(SPLIT_PART(").append(dayN).append(", '/', 2)) / SUM(son_server_amount_num), 0), 4)) ")
|
|
|
+ .append("as ").append(dayN).append(", ");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ServerPayVO serverPayTotal(ServerPayDTO dto) {
|
|
|
+ QueryWrapper wrapper = getServePayTotalWrapper(dto);
|
|
|
+
|
|
|
+ ServerPayVO serverPayVO = getMapper().selectOneByQueryAs(wrapper, ServerPayVO.class);
|
|
|
+ if (null == serverPayVO) {
|
|
|
+ return ServerPayVO.builder().build();
|
|
|
+ }
|
|
|
+ // R数据查询
|
|
|
+ List<GsRTotalVO> rDayParentList = rDayParentService.listAs(getTotalServeRWrapper(dto), GsRTotalVO.class);
|
|
|
+ AdsGameServerGsActiveRDayParent allRData = rDayParentService.getOne(getAllServeRWrapper(dto));
|
|
|
+
|
|
|
+ //获取所有的da字段
|
|
|
+ List<Field> fieldList = Arrays.stream(ServerPayVO.class.getDeclaredFields())
|
|
|
+ .filter(field -> field.getName().contains("da"))
|
|
|
+ .peek(field -> field.setAccessible(true))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ //获取所有的da对应的retainedDa
|
|
|
+ List<Field> fieldObjectList = Arrays.stream(ServerPayVO.class.getDeclaredFields())
|
|
|
+ .filter(field -> field.getName().contains("retainedDa"))
|
|
|
+ .peek(field -> field.setAccessible(true))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ Map<Integer, AdsGameServerGsActiveRDayParent> dayRVOMap = new HashMap<>();
|
|
|
+ for (GsRTotalVO rData : rDayParentList) {
|
|
|
+ if (StringUtils.isEmpty(rData.getSmallR())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String[] smallRs = rData.getSmallR().split(",");
|
|
|
+ String[] mediumRs = rData.getCentreR().split(",");
|
|
|
+ String[] bigRs = rData.getBigR().split(",");
|
|
|
+ String[] superRs = rData.getSuperLargeR().split(",");
|
|
|
+ String[] totalRs = rData.getTotalR().split(",");
|
|
|
+ for (int i = 0; i < fieldList.size(); i++) {
|
|
|
+ if (i >= smallRs.length) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String smallR = smallRs[i];
|
|
|
+ String mediumR = mediumRs[i];
|
|
|
+ String largeR = bigRs[i];
|
|
|
+ String superR = superRs[i];
|
|
|
+ String totalR = totalRs[i];
|
|
|
+ if (dayRVOMap.get(i) == null) {
|
|
|
+ AdsGameServerGsActiveRDayParent gsGameServerDayRVO = new AdsGameServerGsActiveRDayParent();
|
|
|
+ gsGameServerDayRVO.setSmallR(Long.parseLong(smallR.trim()));
|
|
|
+ gsGameServerDayRVO.setCentreR(Long.parseLong(mediumR.trim()));
|
|
|
+ gsGameServerDayRVO.setBigR(Long.parseLong(largeR.trim()));
|
|
|
+ gsGameServerDayRVO.setSuperLargeR(Long.parseLong(superR.trim()));
|
|
|
+ gsGameServerDayRVO.setTotalR(Long.parseLong(totalR.trim()));
|
|
|
+ dayRVOMap.put(i, gsGameServerDayRVO);
|
|
|
+ } else {
|
|
|
+ AdsGameServerGsActiveRDayParent gsGameServerDayRVO = dayRVOMap.get(i);
|
|
|
+ gsGameServerDayRVO.setSmallR(gsGameServerDayRVO.getSmallR() + Long.parseLong(smallR.trim()));
|
|
|
+ gsGameServerDayRVO.setCentreR(gsGameServerDayRVO.getCentreR() + Long.parseLong(mediumR.trim()));
|
|
|
+ gsGameServerDayRVO.setBigR(gsGameServerDayRVO.getBigR() + Long.parseLong(largeR.trim()));
|
|
|
+ gsGameServerDayRVO.setSuperLargeR(gsGameServerDayRVO.getSuperLargeR() + Long.parseLong(superR.trim()));
|
|
|
+ gsGameServerDayRVO.setTotalR(gsGameServerDayRVO.getTotalR() + Long.parseLong(totalR.trim()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // DaN数据
|
|
|
+ for (int i = 0; i < fieldList.size(); i++) {
|
|
|
+ Field field = fieldList.get(i);
|
|
|
+ try {
|
|
|
+ String daN = (String) field.get(serverPayVO);
|
|
|
+ //总的累计数据
|
|
|
+ String[] daNSplit = daN.split("/");
|
|
|
+ AdsGameServerGsActiveRDayParent gsGameServerDayRVO = dayRVOMap.get(i);
|
|
|
+ String rData = getRDataStr(gsGameServerDayRVO, Long.valueOf(daNSplit[2]), Long.valueOf(daNSplit[1]));
|
|
|
+ daN += "/" + rData;
|
|
|
+ String[] retention = daN.split("/");
|
|
|
+ ServerPayVO.DayN retentionVO = ServerPayVO.DayN.builder()
|
|
|
+ .activeNum(Long.parseLong(retention[0]))
|
|
|
+ .payNum(Long.parseLong(retention[1]))
|
|
|
+ .totalPayNum(Long.parseLong(retention[2]))
|
|
|
+ .sRNum(Long.parseLong(retention[16]))
|
|
|
+ .mRNum(Long.parseLong(retention[17]))
|
|
|
+ .bRNum(Long.parseLong(retention[18]))
|
|
|
+ .superRNum(Long.parseLong(retention[19]))
|
|
|
+ .totalRNum(Long.parseLong(retention[20]))
|
|
|
+ .payMoney(new BigDecimal(retention[3]))
|
|
|
+ .payRate(new BigDecimal(retention[4]))
|
|
|
+ .sRRate(new BigDecimal(retention[7]))
|
|
|
+ .mRRate(new BigDecimal(retention[8]))
|
|
|
+ .bRRate(new BigDecimal(retention[9]))
|
|
|
+ .superRRate(new BigDecimal(retention[10]))
|
|
|
+ .activeRetainedRate(new BigDecimal(retention[5]))
|
|
|
+ .payRetainedRate(new BigDecimal(retention[6]))
|
|
|
+ .sRRetainedRate(new BigDecimal(retention[11]))
|
|
|
+ .mRRetainedRate(new BigDecimal(retention[12]))
|
|
|
+ .bRRetainedRate(new BigDecimal(retention[13]))
|
|
|
+ .superRRetainedRate(new BigDecimal(retention[14]))
|
|
|
+ .totalRRetainedRate(new BigDecimal(retention[15]))
|
|
|
+ .build();
|
|
|
+ fieldObjectList.get(i).set(serverPayVO, retentionVO);
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String totalRDa;
|
|
|
+ String totalDa = serverPayVO.getTotal();
|
|
|
+ if (null != allRData) {
|
|
|
+ //累计充值人数
|
|
|
+ String[] split = totalDa.split("/");
|
|
|
+ totalRDa = getRDataStr(allRData, Long.valueOf(split[2]), Long.valueOf(split[1]));
|
|
|
+ } else {
|
|
|
+ // 小R付费比 7/中R付费比 8/大R付费比 9/超R付费比 10/小R留存率 11/中R留存率 12/大R留存率 13/超R留存率 14/R总留存率 15/小R人数 16/中R人数 17/大R人数 18/超R人数 19/总R人数 20
|
|
|
+ totalRDa = "0/0/0/0/0/0/0/0/0/0/0/0/0/0";
|
|
|
+ }
|
|
|
+ totalDa += "/" + totalRDa;
|
|
|
+ String[] totalSplit = totalDa.split("/");
|
|
|
+ ServerPayVO.DayN retentionTotal = ServerPayVO.DayN.builder()
|
|
|
+ .activeNum(Long.parseLong(totalSplit[0]))
|
|
|
+ .payNum(Long.parseLong(totalSplit[1]))
|
|
|
+ .totalPayNum(Long.parseLong(totalSplit[2]))
|
|
|
+ .sRNum(Long.parseLong(totalSplit[16]))
|
|
|
+ .mRNum(Long.parseLong(totalSplit[17]))
|
|
|
+ .bRNum(Long.parseLong(totalSplit[18]))
|
|
|
+ .superRNum(Long.parseLong(totalSplit[19]))
|
|
|
+ .totalRNum(Long.parseLong(totalSplit[20]))
|
|
|
+ .payMoney(new BigDecimal(totalSplit[3]))
|
|
|
+ .payRate(new BigDecimal(totalSplit[4]))
|
|
|
+ .sRRate(new BigDecimal(totalSplit[7]))
|
|
|
+ .mRRate(new BigDecimal(totalSplit[8]))
|
|
|
+ .bRRate(new BigDecimal(totalSplit[9]))
|
|
|
+ .superRRate(new BigDecimal(totalSplit[10]))
|
|
|
+ .activeRetainedRate(new BigDecimal(totalSplit[5]))
|
|
|
+ .payRetainedRate(new BigDecimal(totalSplit[6]))
|
|
|
+ .sRRetainedRate(new BigDecimal(totalSplit[11]))
|
|
|
+ .mRRetainedRate(new BigDecimal(totalSplit[12]))
|
|
|
+ .bRRetainedRate(new BigDecimal(totalSplit[13]))
|
|
|
+ .superRRetainedRate(new BigDecimal(totalSplit[14]))
|
|
|
+ .totalRRetainedRate(new BigDecimal(totalSplit[15]))
|
|
|
+ .build();
|
|
|
+ serverPayVO.setRetainedTotal(retentionTotal);
|
|
|
+ return serverPayVO;
|
|
|
+ }
|
|
|
+}
|