|  | @@ -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;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |