|
@@ -30,6 +30,7 @@ import com.ytpm.middle.view.UserRankingListVO;
|
|
|
import com.ytpm.question.dao.AdRecordMapper;
|
|
import com.ytpm.question.dao.AdRecordMapper;
|
|
|
import com.ytpm.question.dao.AppUserMapper;
|
|
import com.ytpm.question.dao.AppUserMapper;
|
|
|
import com.ytpm.question.service.AdService;
|
|
import com.ytpm.question.service.AdService;
|
|
|
|
|
+import com.ytpm.question.view.AgentNetworkAgg;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -234,75 +235,49 @@ public class AdServiceImpl implements AdService {
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
public List<AgentAdGroupStaticsVO> getAgentProfit(String appIds) {
|
|
public List<AgentAdGroupStaticsVO> getAgentProfit(String appIds) {
|
|
|
- //查询今日的 按小时 按广告平台分组数据
|
|
|
|
|
- List<AgentAdGroupStaticsVO> vos = new ArrayList<>();
|
|
|
|
|
- // 需要查询各 app 今日的广告记录 然后在内存中按照 广告平台分组 计算平均ecpm值, 并且设置每小时的
|
|
|
|
|
- List<YtDyzAdRecord> records;
|
|
|
|
|
- //昨日所有
|
|
|
|
|
- List<YtDyzAdRecord> yestRecords;
|
|
|
|
|
- //本月所有
|
|
|
|
|
- List<YtDyzAdRecord> monthRecords = new ArrayList<>();
|
|
|
|
|
|
|
+ // 使用数据库聚合减少内存占用
|
|
|
|
|
+ List<AgentNetworkAgg> todayHourAgg = adRecordMapper.getTodayAggByNetworkHour(appIds);
|
|
|
|
|
+ List<AgentNetworkAgg> yesterdayAgg = adRecordMapper.getYesterdayAggByNetwork(appIds);
|
|
|
|
|
+ List<AgentNetworkAgg> monthAgg = adRecordMapper.getMonthAggByNetwork(appIds);
|
|
|
|
|
|
|
|
- Calendar cal = Calendar.getInstance(); // 获取当前日期时间
|
|
|
|
|
- cal.add(Calendar.MONTH, 0);
|
|
|
|
|
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
- //获取到本月起始日
|
|
|
|
|
- int actualMinimum = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
- //获取到本月结束日
|
|
|
|
|
- int actualMaximum = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
|
|
|
|
|
- cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), actualMinimum, 0, 0, 0);
|
|
|
|
|
- String firstDay = sdf.format(cal.getTime());
|
|
|
|
|
- cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), actualMaximum, 23, 59, 59);
|
|
|
|
|
- String lastDay = sdf.format(cal.getTime());
|
|
|
|
|
- List<YtDyzAdRecord> dyzMonthRecords = adRecordMapper.getTodayRecord(appIds, firstDay, lastDay);
|
|
|
|
|
- if (CollUtil.isNotEmpty(dyzMonthRecords)) {
|
|
|
|
|
- monthRecords.addAll(dyzMonthRecords);
|
|
|
|
|
- }
|
|
|
|
|
- records = monthRecords.stream().filter(
|
|
|
|
|
- s -> DateUtil.isSameDay(DateUtil.parse(s.getFinishTime()), new Date())).collect(Collectors.toList());
|
|
|
|
|
|
|
+ Map<String, List<AgentNetworkAgg>> todayByNetwork = todayHourAgg.stream().collect(Collectors.groupingBy(AgentNetworkAgg::getNetworkId));
|
|
|
|
|
+ Map<String, AgentNetworkAgg> yesterdayByNetwork = yesterdayAgg.stream().collect(Collectors.toMap(AgentNetworkAgg::getNetworkId, v -> v, (a, b) -> a));
|
|
|
|
|
+ Map<String, AgentNetworkAgg> monthByNetwork = monthAgg.stream().collect(Collectors.toMap(AgentNetworkAgg::getNetworkId, v -> v, (a, b) -> a));
|
|
|
|
|
+
|
|
|
|
|
+ List<AgentAdGroupStaticsVO> result = new ArrayList<>();
|
|
|
|
|
+ for (Map.Entry<String, List<AgentNetworkAgg>> e : todayByNetwork.entrySet()) {
|
|
|
|
|
+ String networkId = e.getKey();
|
|
|
|
|
+ List<AgentNetworkAgg> hourly = e.getValue();
|
|
|
|
|
+ AgentAdGroupStaticsVO vo = new AgentAdGroupStaticsVO();
|
|
|
|
|
+ vo.setNetowrkId(networkId);
|
|
|
|
|
+ vo.setNetowrkName(hourly.get(0).getNetworkName());
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal todayRevenue = hourly.stream().map(AgentNetworkAgg::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
+ BigDecimal todayEcpm = hourly.stream().map(AgentNetworkAgg::getEcpm).reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
|
|
+ .divide(new BigDecimal(Math.max(1, hourly.size())), 2, RoundingMode.HALF_UP);
|
|
|
|
|
+
|
|
|
|
|
+ AgentNetworkAgg yAgg = yesterdayByNetwork.get(networkId);
|
|
|
|
|
+ AgentNetworkAgg mAgg = monthByNetwork.get(networkId);
|
|
|
|
|
+
|
|
|
|
|
+ vo.setTodayRevenue(todayRevenue);
|
|
|
|
|
+ vo.setYesterdayRevenue(yAgg != null ? yAgg.getRevenue() : BigDecimal.ZERO);
|
|
|
|
|
+ vo.setMonthRevenue(mAgg != null ? mAgg.getRevenue() : BigDecimal.ZERO);
|
|
|
|
|
+
|
|
|
|
|
+ vo.setTodayEcpm(todayEcpm);
|
|
|
|
|
+ vo.setYesterdayEcpm(yAgg != null ? yAgg.getEcpm() : BigDecimal.ZERO);
|
|
|
|
|
+ vo.setMonthEcpm(mAgg != null ? mAgg.getEcpm() : BigDecimal.ZERO);
|
|
|
|
|
|
|
|
- cal = Calendar.getInstance();
|
|
|
|
|
- cal.add(Calendar.DATE, -1); // 昨天的日期时间
|
|
|
|
|
- Date yest = cal.getTime();
|
|
|
|
|
- yestRecords = monthRecords.stream().filter(
|
|
|
|
|
- s -> DateUtil.isSameDay(DateUtil.parse(s.getFinishTime()), yest)).collect(Collectors.toList());
|
|
|
|
|
- //广告平台分组
|
|
|
|
|
- Map<String, List<YtDyzAdRecord>> networkMap = records.stream().collect(
|
|
|
|
|
- Collectors.groupingBy(YtDyzAdRecord::getNetworkFormId));
|
|
|
|
|
- //按广告平台分组统计昨天和本月的收益&ecpm
|
|
|
|
|
- BigDecimal yestRevenue = yestRecords.stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
- BigDecimal yestEcpm = yestRecords.stream().map(YtDyzAdRecord::getEcpm).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
- BigDecimal monthRevenue = monthRecords.stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
- BigDecimal monthEcpm = monthRecords.stream().map(YtDyzAdRecord::getEcpm).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
- AgentAdGroupStaticsVO vo;
|
|
|
|
|
- for (Map.Entry<String, List<YtDyzAdRecord>> adEntry : networkMap.entrySet()) {
|
|
|
|
|
- vo = new AgentAdGroupStaticsVO();
|
|
|
|
|
- vo.setNetowrkId(adEntry.getKey());
|
|
|
|
|
- vo.setNetowrkName(networkMap.get(adEntry.getKey()).get(0).getNetworkName());
|
|
|
|
|
- //设置收益
|
|
|
|
|
- vo.setTodayRevenue(adEntry.getValue().stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
|
- vo.setYesterdayRevenue(yestRevenue);
|
|
|
|
|
- vo.setMonthRevenue(monthRevenue);
|
|
|
|
|
- //设置ecpm
|
|
|
|
|
- BigDecimal totalEcpm = adEntry.getValue().stream().map(YtDyzAdRecord::getEcpm).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
- vo.setTodayEcpm(totalEcpm.divide(new BigDecimal(adEntry.getValue().size()), 2, RoundingMode.HALF_UP));
|
|
|
|
|
- vo.setYesterdayEcpm(yestEcpm.divide(new BigDecimal(yestRecords.size()), 2, RoundingMode.HALF_UP));
|
|
|
|
|
- vo.setMonthEcpm(monthEcpm.divide(new BigDecimal(monthRecords.size()), 2, RoundingMode.HALF_UP));
|
|
|
|
|
- //设置分小时报表
|
|
|
|
|
- Map<LocalDateTime, List<YtDyzAdRecord>> hourMap = adEntry.getValue().stream().collect(Collectors.groupingBy(s ->
|
|
|
|
|
- DateUtil.parse(s.getFinishTime(), "yyyy-MM-dd HH").toLocalDateTime()));
|
|
|
|
|
- Map<String, BigDecimal> ecpmMap = new HashMap<>();
|
|
|
|
|
- Map<String, BigDecimal> revenueMap = new HashMap<>();
|
|
|
|
|
- for (Map.Entry<LocalDateTime, List<YtDyzAdRecord>> entry : hourMap.entrySet()) {
|
|
|
|
|
- BigDecimal reduce = entry.getValue().stream().map(YtDyzAdRecord::getEcpm).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
- ecpmMap.put(entry.getKey().toString(), reduce.divide(new BigDecimal(entry.getValue().size()), RoundingMode.HALF_UP));
|
|
|
|
|
- revenueMap.put(entry.getKey().toString(), hourMap.get(entry.getKey()).stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
|
|
|
+ Map<String, BigDecimal> hourRev = new HashMap<>();
|
|
|
|
|
+ Map<String, BigDecimal> hourEcpm = new HashMap<>();
|
|
|
|
|
+ for (AgentNetworkAgg a : hourly) {
|
|
|
|
|
+ hourRev.put(a.getTime(), a.getRevenue());
|
|
|
|
|
+ hourEcpm.put(a.getTime(), a.getEcpm());
|
|
|
}
|
|
}
|
|
|
- vo.setTodayHourEcpmMap(ecpmMap);
|
|
|
|
|
- vo.setTodayHourRevenueMap(revenueMap);
|
|
|
|
|
- vos.add(vo);
|
|
|
|
|
|
|
+ vo.setTodayHourRevenueMap(hourRev);
|
|
|
|
|
+ vo.setTodayHourEcpmMap(hourEcpm);
|
|
|
|
|
+ result.add(vo);
|
|
|
}
|
|
}
|
|
|
- return vos;
|
|
|
|
|
|
|
+ return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|