Переглянути джерело

Merge remote-tracking branch 'origin/master'

hidewnd 1 місяць тому
батько
коміт
fa6c5b52b1

+ 16 - 0
yt-question/yt-question-service/src/main/java/com/ytpm/question/dao/AdRecordMapper.java

@@ -4,6 +4,7 @@ import com.ytpm.agent.param.AdRecordListParam;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.param.YtAppUserListParam;
 import com.ytpm.middle.view.AppRevenueHourVO;
+import com.ytpm.question.view.AgentNetworkAgg;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -66,4 +67,19 @@ public interface AdRecordMapper {
      * 查询指定广告记录
      */
     List<YtDyzAdRecord> selectRecordByIds(@Param("loginStatus") Integer loginStatus, @Param("ids") List<String> adRecordIds);
+
+    /**
+     * 今日分小时按广告平台聚合
+     */
+    List<AgentNetworkAgg> getTodayAggByNetworkHour(@Param("appIds") String appIds);
+
+    /**
+     * 昨日按广告平台聚合
+     */
+    List<AgentNetworkAgg> getYesterdayAggByNetwork(@Param("appIds") String appIds);
+
+    /**
+     * 本月按广告平台聚合
+     */
+    List<AgentNetworkAgg> getMonthAggByNetwork(@Param("appIds") String appIds);
 }

+ 40 - 65
yt-question/yt-question-service/src/main/java/com/ytpm/question/service/impl/AdServiceImpl.java

@@ -30,6 +30,7 @@ import com.ytpm.middle.view.UserRankingListVO;
 import com.ytpm.question.dao.AdRecordMapper;
 import com.ytpm.question.dao.AppUserMapper;
 import com.ytpm.question.service.AdService;
+import com.ytpm.question.view.AgentNetworkAgg;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -234,75 +235,49 @@ public class AdServiceImpl implements AdService {
      */
     @Override
     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;
     }
 
     /**

+ 48 - 0
yt-question/yt-question-service/src/main/resources/mapper/AdRecordMapper.xml

@@ -91,6 +91,54 @@
             #{item}
         </foreach>
     </select>
+    <select id="getTodayAggByNetworkHour" resultType="com.ytpm.question.view.AgentNetworkAgg">
+        SELECT
+            network_form_id AS networkId,
+            MIN(network_name) AS networkName,
+            DATE_FORMAT(finish_time,'%Y-%m-%d %H:00:00') AS `time`,
+            COUNT(1) AS cnt,
+            SUM(revenue) AS revenue,
+            AVG(ecpm) AS ecpm
+        FROM yt_dyz_ad_record
+        WHERE app_id IN
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+        AND DATE(finish_time) = DATE(NOW())
+        GROUP BY network_form_id, DATE_FORMAT(finish_time,'%Y-%m-%d %H:00:00')
+    </select>
+    <select id="getYesterdayAggByNetwork" resultType="com.ytpm.question.view.AgentNetworkAgg">
+        SELECT
+            network_form_id AS networkId,
+            MIN(network_name) AS networkName,
+            NULL AS `time`,
+            COUNT(1) AS cnt,
+            SUM(revenue) AS revenue,
+            AVG(ecpm) AS ecpm
+        FROM yt_dyz_ad_record
+        WHERE app_id IN
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+        AND DATE(finish_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
+        GROUP BY network_form_id
+    </select>
+    <select id="getMonthAggByNetwork" resultType="com.ytpm.question.view.AgentNetworkAgg">
+        SELECT
+            network_form_id AS networkId,
+            MIN(network_name) AS networkName,
+            NULL AS `time`,
+            COUNT(1) AS cnt,
+            SUM(revenue) AS revenue,
+            AVG(ecpm) AS ecpm
+        FROM yt_dyz_ad_record
+        WHERE app_id IN
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+        AND DATE_FORMAT(finish_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
+        GROUP BY network_form_id
+    </select>
     <select id="getByUserId" resultType="com.ytpm.app.model.YtDyzAdRecord">
         select
         record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name,