|
|
@@ -1,6 +1,8 @@
|
|
|
package com.ytpm.service.dyz.impl;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.date.DatePattern;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
import cn.hutool.core.util.RandomUtil;
|
|
|
import com.ytpm.advertise.enums.AdPlatformTypeEnum;
|
|
|
@@ -15,6 +17,10 @@ import com.ytpm.app.model.YtDyzUser;
|
|
|
import com.ytpm.app.param.DyzAdRecordParam;
|
|
|
import com.ytpm.dao.dyz.AdRecordMapper;
|
|
|
import com.ytpm.dao.dyz.AppUserMapper;
|
|
|
+import com.ytpm.dao.nofeeds.NFAdRecordMapper;
|
|
|
+import com.ytpm.dao.nofeeds.NFUserMapper;
|
|
|
+import com.ytpm.dao.qnjz.QNAdRecordMapper;
|
|
|
+import com.ytpm.dao.qnjz.QNUserMapper;
|
|
|
import com.ytpm.feign.RiskFeign;
|
|
|
import com.ytpm.general.RepMessage;
|
|
|
import com.ytpm.general.Result;
|
|
|
@@ -32,18 +38,20 @@ import com.ytpm.middle.view.NetWorkRevenueVO;
|
|
|
import com.ytpm.middle.view.UserRankingListVO;
|
|
|
import com.ytpm.service.dyz.AdService;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.sql.Date;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
-import java.util.Collections;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
@@ -55,12 +63,19 @@ import java.util.stream.Collectors;
|
|
|
@RefreshScope
|
|
|
public class AdServiceImpl implements AdService {
|
|
|
|
|
|
- @Autowired
|
|
|
+ @Resource
|
|
|
private AdRecordMapper adRecordMapper;
|
|
|
- @Autowired
|
|
|
+ @Resource
|
|
|
+ private QNAdRecordMapper qnAdRecordMapper;
|
|
|
+ @Resource
|
|
|
+ private NFAdRecordMapper nfAdRecordMapper;
|
|
|
+ @Resource
|
|
|
private AppUserMapper appUserMapper;
|
|
|
- @Qualifier("com.ytpm.feign.RiskFeign")
|
|
|
- @Autowired
|
|
|
+ @Resource
|
|
|
+ private QNUserMapper qnUserMapper;
|
|
|
+ @Resource
|
|
|
+ private NFUserMapper nfUserMapper;
|
|
|
+ @Resource
|
|
|
private RiskFeign riskFeign;
|
|
|
@Value("${risk.config.banned.tips}")
|
|
|
private String tips;
|
|
|
@@ -172,10 +187,26 @@ public class AdServiceImpl implements AdService {
|
|
|
@Override
|
|
|
public AgentTopCountView getAppTopCount(String appIds) {
|
|
|
AgentTopCountView view = new AgentTopCountView();
|
|
|
- view.setAdCount(adRecordMapper.countByAppIds(appIds));
|
|
|
- view.setUserCount(appUserMapper.countUserByAppIds(appIds));
|
|
|
- view.setRevenue(appUserMapper.countRevenueByAppIds(appIds));
|
|
|
- view.setRiskCount(appUserMapper.countBannedByAppIds(appIds));
|
|
|
+ int dyzAdCount = adRecordMapper.countByAppIds(appIds);
|
|
|
+ int qnAdCount = qnAdRecordMapper.countByAppIds(appIds);
|
|
|
+ int nfAdCount = nfAdRecordMapper.countByAppIds(appIds);
|
|
|
+ view.setAdCount(dyzAdCount+qnAdCount+nfAdCount);
|
|
|
+ int dyzUserCount = appUserMapper.countUserByAppIds(appIds);
|
|
|
+ int qnUserCount = qnUserMapper.countUserByAppIds(appIds);
|
|
|
+ int nfUserCount = nfUserMapper.countUserByAppIds(appIds);
|
|
|
+ view.setUserCount(dyzUserCount+qnUserCount+nfUserCount);
|
|
|
+ BigDecimal totalRevenue = new BigDecimal(0);
|
|
|
+ BigDecimal dyzRevenue = appUserMapper.countRevenueByAppIds(appIds);
|
|
|
+ if(Objects.nonNull(dyzRevenue)){totalRevenue = totalRevenue.add(dyzRevenue);}
|
|
|
+ BigDecimal qnRevenue = qnUserMapper.countRevenueByAppIds(appIds);
|
|
|
+ if(Objects.nonNull(qnRevenue)){totalRevenue = totalRevenue.add(qnRevenue);}
|
|
|
+ BigDecimal nfRevenue = nfUserMapper.countRevenueByAppIds(appIds);
|
|
|
+ if(Objects.nonNull(nfRevenue)){totalRevenue = totalRevenue.add(nfRevenue);}
|
|
|
+ view.setRevenue(totalRevenue);
|
|
|
+ int bannedCount = appUserMapper.countBannedByAppIds(appIds);
|
|
|
+ int qnBannedCount = qnUserMapper.countBannedByAppIds(appIds);
|
|
|
+ int nfBannedCount = nfUserMapper.countBannedByAppIds(appIds);
|
|
|
+ view.setRiskCount(bannedCount+qnBannedCount+nfBannedCount);
|
|
|
return view;
|
|
|
}
|
|
|
|
|
|
@@ -209,49 +240,66 @@ public class AdServiceImpl implements AdService {
|
|
|
@Override
|
|
|
public List<AgentAdGroupStaticsVO> getAgentProfit(String appIds) {
|
|
|
//查询今日的 按小时 按广告平台分组数据
|
|
|
- List<AgentAdGroupStaticsVO> vos = adRecordMapper.getAdGroupStatics(appIds);
|
|
|
- String networkIds = vos.stream().map(AgentAdGroupStaticsVO::getNetowrkId).collect(Collectors.joining(","));
|
|
|
- //根据广告平台查询 收益分组 1-今日 2-昨日 3-本月
|
|
|
- List<NetWorkRevenueVO> revenueToday = adRecordMapper.getRevenueByIds(appIds, 1, networkIds);
|
|
|
- List<NetWorkRevenueVO> revenueYestDay = adRecordMapper.getRevenueByIds(appIds, 2, networkIds);
|
|
|
- List<NetWorkRevenueVO> revenueMonth = adRecordMapper.getRevenueByIds(appIds, 3, networkIds);
|
|
|
- Map<String, BigDecimal> revenueTodayMap = revenueToday.stream().collect(
|
|
|
- Collectors.toMap(NetWorkRevenueVO::getNetWorkId, NetWorkRevenueVO::getNetWorkRevenue));
|
|
|
- Map<String, BigDecimal> revenueYestdayMap = revenueYestDay.stream().collect(
|
|
|
- Collectors.toMap(NetWorkRevenueVO::getNetWorkId, NetWorkRevenueVO::getNetWorkRevenue));
|
|
|
- Map<String, BigDecimal> revenueMonthMap = revenueMonth.stream().collect(
|
|
|
- Collectors.toMap(NetWorkRevenueVO::getNetWorkId, NetWorkRevenueVO::getNetWorkRevenue));
|
|
|
- //根据广告平台查询 ecpm分组 1-今日 2-昨日 3-本月
|
|
|
- List<NetWorkEcpmVO> ecpmToday = adRecordMapper.getEcpmByIds(appIds, 1, networkIds);
|
|
|
- List<NetWorkEcpmVO> ecpmYestDay = adRecordMapper.getEcpmByIds(appIds, 2, networkIds);
|
|
|
- List<NetWorkEcpmVO> ecpmMonth = adRecordMapper.getEcpmByIds(appIds, 3, networkIds);
|
|
|
- Map<String, BigDecimal> ecpmTodayMap = ecpmToday.stream().collect(
|
|
|
- Collectors.toMap(NetWorkEcpmVO::getNetWorkId, NetWorkEcpmVO::getNetWorkEcpm));
|
|
|
- Map<String, BigDecimal> ecpmYestdayMap = ecpmYestDay.stream().collect(
|
|
|
- Collectors.toMap(NetWorkEcpmVO::getNetWorkId, NetWorkEcpmVO::getNetWorkEcpm));
|
|
|
- Map<String, BigDecimal> ecpmMonthMap = ecpmMonth.stream().collect(
|
|
|
- Collectors.toMap(NetWorkEcpmVO::getNetWorkId, NetWorkEcpmVO::getNetWorkEcpm));
|
|
|
- for (AgentAdGroupStaticsVO vo : vos) {
|
|
|
- //今日收益
|
|
|
- List<AgentNetworkRevenueGroupVO> networkRevenueGroups = vo.getNetworkRevenueGroups();
|
|
|
- if(CollUtil.isNotEmpty(networkRevenueGroups)){
|
|
|
- Map<String, BigDecimal> revenueMap = networkRevenueGroups.stream().collect(
|
|
|
- Collectors.toMap(AgentNetworkRevenueGroupVO::getHour, AgentNetworkRevenueGroupVO::getRevenue));
|
|
|
- vo.setTodayHourRevenueMap(revenueMap);
|
|
|
+ List<AgentAdGroupStaticsVO> vos = new ArrayList<>();
|
|
|
+ // 需要查询各 app 今日的广告记录 然后在内存中按照 广告平台分组 计算平均ecpm值, 并且设置每小时的
|
|
|
+ List<YtDyzAdRecord> records = new ArrayList<>();
|
|
|
+ List<YtDyzAdRecord> dyzRecords = adRecordMapper.getTodayRecord(appIds,1);
|
|
|
+ if(CollUtil.isNotEmpty(dyzRecords)){records.addAll(dyzRecords);}
|
|
|
+ List<YtDyzAdRecord> qnRecords = qnAdRecordMapper.getTodayRecord(appIds,1);
|
|
|
+ if(CollUtil.isNotEmpty(qnRecords)){records.addAll(qnRecords);}
|
|
|
+ List<YtDyzAdRecord> nfRecords = nfAdRecordMapper.getTodayRecord(appIds,1);
|
|
|
+ if(CollUtil.isNotEmpty(nfRecords)){records.addAll(nfRecords);}
|
|
|
+ //昨日所有
|
|
|
+ List<YtDyzAdRecord> yestRecords = new ArrayList<>();
|
|
|
+ List<YtDyzAdRecord> dyzYestRecords = adRecordMapper.getTodayRecord(appIds,2);
|
|
|
+ if(CollUtil.isNotEmpty(dyzYestRecords)){yestRecords.addAll(dyzYestRecords);}
|
|
|
+ List<YtDyzAdRecord> qnYestRecords = qnAdRecordMapper.getTodayRecord(appIds,2);
|
|
|
+ if(CollUtil.isNotEmpty(qnYestRecords)){yestRecords.addAll(qnYestRecords);}
|
|
|
+ List<YtDyzAdRecord> nfYestRecords = nfAdRecordMapper.getTodayRecord(appIds,2);
|
|
|
+ if(CollUtil.isNotEmpty(nfYestRecords)){yestRecords.addAll(nfYestRecords);}
|
|
|
+ //本月所有
|
|
|
+ List<YtDyzAdRecord> monthRecords = new ArrayList<>();
|
|
|
+ List<YtDyzAdRecord> dyzMonthRecords = adRecordMapper.getTodayRecord(appIds,3);
|
|
|
+ if(CollUtil.isNotEmpty(dyzMonthRecords)){monthRecords.addAll(dyzMonthRecords);}
|
|
|
+ List<YtDyzAdRecord> qnMonthRecords = qnAdRecordMapper.getTodayRecord(appIds,3);
|
|
|
+ if(CollUtil.isNotEmpty(qnMonthRecords)){monthRecords.addAll(qnMonthRecords);}
|
|
|
+ List<YtDyzAdRecord> nfMonthRecords = nfAdRecordMapper.getTodayRecord(appIds,3);
|
|
|
+ if(CollUtil.isNotEmpty(nfMonthRecords)){monthRecords.addAll(nfMonthRecords);}
|
|
|
+ //广告平台分组
|
|
|
+ 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));
|
|
|
}
|
|
|
- vo.setTodayRevenue(revenueTodayMap.get(vo.getNetowrkId()));
|
|
|
- vo.setYesterdayRevenue(revenueYestdayMap.get(vo.getNetowrkId()));
|
|
|
- vo.setMonthRevenue(revenueMonthMap.get(vo.getNetowrkId()));
|
|
|
- //今日ecpm
|
|
|
- List<AgentNetworkEcpmGroupVO> networkEcpmGroups = vo.getNetworkEcpmGroups();
|
|
|
- if(CollUtil.isNotEmpty(networkEcpmGroups)){
|
|
|
- Map<String, BigDecimal> ecpmMap = networkEcpmGroups.stream().collect(Collectors.toMap(AgentNetworkEcpmGroupVO::getHour, s->s.getEcpm().divide(BigDecimal.valueOf(s.getCount()),2,BigDecimal.ROUND_HALF_UP)));
|
|
|
- //统计每个小时的计数加起来为全天总次数
|
|
|
- vo.setTodayHourEcpmMap(ecpmMap);
|
|
|
- }
|
|
|
- vo.setTodayEcpm(ecpmTodayMap.get(vo.getNetowrkId()));
|
|
|
- vo.setYesterdayEcpm(ecpmYestdayMap.get(vo.getNetowrkId()));
|
|
|
- vo.setMonthEcpm(ecpmMonthMap.get(vo.getNetowrkId()));
|
|
|
+ vo.setTodayHourEcpmMap(ecpmMap);
|
|
|
+ vo.setTodayHourRevenueMap(revenueMap);
|
|
|
+ vos.add(vo);
|
|
|
}
|
|
|
return vos;
|
|
|
}
|