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

广告的小时数据完善

wcc 3 роки тому
батько
коміт
6f1db5307a

+ 137 - 151
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/KafkaDemoJob.java

@@ -1,8 +1,11 @@
 package flink.zanxiangnet.ad.monitoring;
 
+import com.aliyun.odps.Instance;
 import com.aliyun.odps.Odps;
 import com.aliyun.odps.account.Account;
 import com.aliyun.odps.account.AliyunAccount;
+import com.aliyun.odps.data.Record;
+import com.aliyun.odps.task.SQLTask;
 import com.tencent.ads.model.DailyReportsGetListStruct;
 import com.tencent.ads.model.HourlyReportsGetListStruct;
 import flink.zanxiangnet.ad.monitoring.maxcompute.MaxComputeLog;
@@ -52,13 +55,17 @@ import org.springframework.beans.BeanUtils;
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
+import java.time.LocalTime;
+import java.util.*;
+import java.util.stream.Collectors;
 
 public class KafkaDemoJob {
 
+    /**
+     * 可能有数据的最早日期
+     */
+    private static final String OLDEST_DAY = "2019-01-01";
+
     public static void main(String[] args) throws Exception {
         // System.setProperty("javax.net.ssl.trustStore", "D:\\Downloads\\kafka.client.truststore.jks");
         System.setProperty("javax.net.ssl.trustStore", "/root/flink-1.13.2/kafka.client.truststore.jks");
@@ -134,13 +141,79 @@ public class KafkaDemoJob {
         adMinuteOdsStream.addSink(new TunnelBatchSink<>(AdDataOfMinuteODS.class, 36000L, 64000L, 3));
 
         // 小时流(直接写到小时报表的 ods)
-        SingleOutputStreamOperator<AdDataOfHourODS> adHourOdsStream = adOdsStream.getSideOutput(adHourStreamTag)
-                // 打水印,允许延迟 10天(应为允许回滚 10天),同时指定事件时间
-                .assignTimestampsAndWatermarks(WatermarkStrategy.<AdDataOfHourODS>forBoundedOutOfOrderness(Duration.ofDays(10L))
-                        .withTimestampAssigner((SerializableTimestampAssigner<AdDataOfHourODS>) (adOds, l) -> adOds.getStatTime())
-                );
+        DataStream<AdDataOfHourODS> adHourOdsStream = adOdsStream.getSideOutput(adHourStreamTag);
         // 写入原始表
         adHourOdsStream.addSink(new TunnelBatchSink<>(AdDataOfHourODS.class, 36000L, 64000L, 10));
+        adHourOdsStream.keyBy(AdDataOfHourODS::getAdId)
+                .countWindow(1).process(new ProcessWindowFunction<AdDataOfHourODS, AdStatOfHourDWD, Long, GlobalWindow>() {
+                    private Odps odps;
+                    private long lastQueryTime = System.currentTimeMillis();
+                    private Map<String, Map<Integer, AdStatOfHourDWD>> historyData;
+
+                    @Override
+                    public void open(Configuration conf) {
+                        Map<String, String> params = getRuntimeContext()
+                                .getExecutionConfig()
+                                .getGlobalJobParameters()
+                                .toMap();
+                        Account account = new AliyunAccount(params.get(ApplicationProperties.MAX_COMPUTE_ACCOUNT_ID),
+                                params.get(ApplicationProperties.MAX_COMPUTE_ACCOUNT_KEY));
+                        odps = new Odps(account);
+                        odps.getRestClient().setRetryLogger(new MaxComputeLog());
+                        odps.setEndpoint(params.get(ApplicationProperties.MAX_COMPUTE_ACCOUNT_ENDPOINT));
+                        odps.setDefaultProject(params.get(ApplicationProperties.MAX_COMPUTE_ACCOUNT_PROJECT_NAME));
+                    }
+
+                    @Override
+                    public void process(Long elementsCount, ProcessWindowFunction<AdDataOfHourODS, AdStatOfHourDWD, Long, GlobalWindow>.Context context, Iterable<AdDataOfHourODS> iterable, Collector<AdStatOfHourDWD> collector) throws Exception {
+                        AdDataOfHourODS element = iterable.iterator().next();
+                        LocalDate statDay = DateUtil.parseLocalDate(element.getStatDay());
+                        int hour = element.getHour();
+                        long now = System.currentTimeMillis();
+                        // 拉取指定 key的数据
+                        if (historyData == null || (now - lastQueryTime) > 60 * 60 * 1000) {
+                            LocalDate endTime = LocalDate.now(), beginTime = statDay.minusDays(40);
+                            Instance instance = SQLTask.run(odps, "SELECT * FROM ad_stat_of_hour_dwd WHERE stat_day >= \"" + DateUtil.formatLocalDate(beginTime) + "\" AND stat_day <= \"" + DateUtil.formatLocalDate(endTime) + "\" AND ad_id = " + element.getAdId() + ";");
+                            instance.waitForSuccess();
+                            List<Record> records = SQLTask.getResult(instance);
+                            List<AdStatOfHourDWD> historyList = records.stream()
+                                    .map(AdStatOfHourDWD::byMaxCompute)
+                                    .sorted((o1, o2) -> new Long(o1.getCreateTime().getTime() - o2.getCreateTime().getTime()).intValue())
+                                    .collect(Collectors.toList());
+                            historyData = new HashMap<>();
+                            for (AdStatOfHourDWD adStatOfHourDWD : historyList) {
+                                Map<Integer, AdStatOfHourDWD> hourMapping = historyData.computeIfAbsent(adStatOfHourDWD.getStatDay(), key -> new HashMap<>());
+                                hourMapping.put(adStatOfHourDWD.getHour(), adStatOfHourDWD);
+                            }
+                            lastQueryTime = now;
+                        }
+                        // 找到这个号当天内上个小时统计的数据
+                        AdStatOfHourDWD lastHourData = null;
+                        // 往前查 40天,找到上一条数据
+                        for (int i = 0; i < 40; i++) {
+                            Map<Integer, AdStatOfHourDWD> mapData = historyData.get(DateUtil.formatLocalDate(statDay.minusDays(i)));
+                            if (mapData == null || mapData.isEmpty()) {
+                                continue;
+                            }
+                            for (Map.Entry<Integer, AdStatOfHourDWD> temp : mapData.entrySet()) {
+                                if (temp.getKey() >= hour) {
+                                    continue;
+                                }
+                                if (lastHourData != null && lastHourData.getHour() >= temp.getKey()) {
+                                    continue;
+                                }
+                                lastHourData = temp.getValue();
+                            }
+                            if (lastHourData != null) {
+                                break;
+                            }
+                        }
+                        AdStatOfHourDWD newStatData = AdStatOfHourDWD.reduce(lastHourData, element, now);
+                        Map<Integer, AdStatOfHourDWD> hourDataMapping = historyData.computeIfAbsent(newStatData.getStatDay(), key -> new HashMap<>());
+                        hourDataMapping.put(newStatData.getHour(), newStatData);
+                        collector.collect(newStatData);
+                    }
+                }).addSink(new TunnelBatchSink<>(AdStatOfHourDWD.class, 30000L, 365L, 6));
 
         // 获取指定广告的历史统计信息(用于统计总的消耗信息等)
         /*SingleOutputStreamOperator<AdStatOfHourDWD> adHourDWDStream = adHourOdsStream.map(AdStatOfHourDWD::byODS)
@@ -233,165 +306,78 @@ public class KafkaDemoJob {
             }
         });
 
-        SingleOutputStreamOperator<AdDataOfDayODS> adDayOdsOfDayStream = adDayOdsStreamSplit.getSideOutput(adDayStreamRollDayTag)
+        adDayOdsStreamSplit.getSideOutput(adDayStreamRollDayTag)
                 // 打水印,允许延迟 10天(应为允许回滚 10天),同时指定事件时间
                 .assignTimestampsAndWatermarks(WatermarkStrategy.<AdDataOfDayODS>forBoundedOutOfOrderness(Duration.ofDays(10L))
                         .withTimestampAssigner((SerializableTimestampAssigner<AdDataOfDayODS>) (adDay, l) -> DateUtil.localDateToMilli(DateUtil.parseLocalDate(adDay.getStatDay())))
-                );
+                ).keyBy(AdDataOfDayODS::getAdId)
+                .countWindow(1).process(new ProcessWindowFunction<AdDataOfDayODS, AdStatOfDayDWD, Long, GlobalWindow>() {
+                    private Odps odps;
+                    private long lastQueryTime = System.currentTimeMillis();
+                    private Map<String, AdStatOfDayDWD> historyData;
+
+                    @Override
+                    public void open(Configuration conf) {
+                        Map<String, String> params = getRuntimeContext()
+                                .getExecutionConfig()
+                                .getGlobalJobParameters()
+                                .toMap();
+                        Account account = new AliyunAccount(params.get(ApplicationProperties.MAX_COMPUTE_ACCOUNT_ID),
+                                params.get(ApplicationProperties.MAX_COMPUTE_ACCOUNT_KEY));
+                        odps = new Odps(account);
+                        odps.getRestClient().setRetryLogger(new MaxComputeLog());
+                        odps.setEndpoint(params.get(ApplicationProperties.MAX_COMPUTE_ACCOUNT_ENDPOINT));
+                        odps.setDefaultProject(params.get(ApplicationProperties.MAX_COMPUTE_ACCOUNT_PROJECT_NAME));
+                    }
+
+                    @Override
+                    public void process(Long elementsCount, ProcessWindowFunction<AdDataOfDayODS, AdStatOfDayDWD, Long, GlobalWindow>.Context context, Iterable<AdDataOfDayODS> iterable, Collector<AdStatOfDayDWD> collector) throws Exception {
+                        AdDataOfDayODS element = iterable.iterator().next();
+                        LocalDate statDay = DateUtil.parseLocalDate(element.getStatDay());
+                        long now = System.currentTimeMillis();
+                        // 拉取指定 key的数据
+                        if (historyData == null || (now - lastQueryTime) > 60 * 60 * 1000) {
+                            LocalDate endTime = LocalDate.now(), beginTime = statDay.minusDays(60);
+                            Instance instance = SQLTask.run(odps, "SELECT * FROM ad_stat_of_day_dwd WHERE stat_day >= \"" + DateUtil.formatLocalDate(beginTime) + "\" AND stat_day <= \"" + DateUtil.formatLocalDate(endTime) + "\" AND ad_id = " + element.getAdId() + ";");
+                            instance.waitForSuccess();
+                            List<Record> records = SQLTask.getResult(instance);
+                            historyData = records.stream()
+                                    .map(AdStatOfDayDWD::byMaxCompute)
+                                    .sorted((o1, o2) -> new Long(o1.getCreateTime().getTime() - o2.getCreateTime().getTime()).intValue())
+                                    .collect(Collectors.toMap(AdStatOfDayDWD::getStatDay, value -> value, (val1, val2) -> val2));
+                            lastQueryTime = now;
+                        }
+                        AdStatOfDayDWD newStatData = null;
+                        for (int i = 1; i <= 60; i++) {
+                            AdStatOfDayDWD oldStatData = historyData.get(DateUtil.formatLocalDate(statDay.minusDays(i)));
+                            if (oldStatData == null) {
+                                continue;
+                            }
+                            newStatData = AdStatOfDayDWD.reduce(oldStatData, element, now);
+                            break;
+                        }
+                        if (newStatData == null) {
+                            newStatData = AdStatOfDayDWD.reduce(null, element, now);
+                        }
+                        historyData.put(newStatData.getStatDay(), newStatData);
+                        collector.collect(newStatData);
+                    }
+                }).addSink(new TunnelBatchSink<>(AdStatOfDayDWD.class, 30000L, 365L, 6));
 
         adDayOdsStreamSplit.getSideOutput(adDayStreamRollYearTag)
                 .keyBy((KeySelector<AdDataOfDayODS, Long>) AdDataOfDayODS::getAdId)
                 .countWindow(1).process(new ProcessWindowFunction<AdDataOfDayODS, AdStatOfDayDWD, Long, GlobalWindow>() {
-                    private Long reduceCount = 0L;
                     // 上次聚合的结果
                     private AdStatOfDayDWD lastReduce;
 
                     @Override
                     public void process(Long elementsCount, ProcessWindowFunction<AdDataOfDayODS, AdStatOfDayDWD, Long, GlobalWindow>.Context context, Iterable<AdDataOfDayODS> elements, Collector<AdStatOfDayDWD> out) {
                         AdDataOfDayODS element = elements.iterator().next();
-                        lastReduce = AdStatOfDayDWD.reduce(reduceCount++, lastReduce, element);
+                        lastReduce = AdStatOfDayDWD.reduce(lastReduce, element, System.currentTimeMillis());
                         out.collect(lastReduce);
                     }
                 }).addSink(new TunnelBatchSink<>(AdStatOfDayDWD.class, 30000L, 365L, 6));
 
-        /*adOdsStream.join(oldAdStream)
-                .where((KeySelector<AdDataOfMinuteODS, Long>) AdDataOfMinuteODS::getAdId)
-                .equalTo((KeySelector<AdStatOfHourDWD, Long>) AdStatOfHourDWD::getAdId)
-                .window(TumblingEventTimeWindows.of(Time.minutes(5L)));*/
-
-        // 统计广告小时数据
-        /*adOdsStream.map(adOds -> {
-                    AdStatOfHourDWD adStatOfHour = new AdStatOfHourDWD();
-                    adStatOfHour.setStatDay(adOds.getStatDay());
-                    adStatOfHour.setHour(adOds.getHour());
-                    adStatOfHour.setAccountId(adOds.getAccountId());
-                    adStatOfHour.setCampaignId(adOds.getCampaignId());
-                    adStatOfHour.setAgencyAccountId(adOds.getAgencyAccountId());
-                    adStatOfHour.setWechatAccountId(adOds.getWechatAccountId());
-                    adStatOfHour.setWechatAgencyId(adOds.getWechatAgencyId());
-                    adStatOfHour.setAdgroupId(adOds.getAdgroupId());
-                    adStatOfHour.setAdId(adOds.getAdId());
-                    adStatOfHour.setCostDeviationRateHour(adOds.getCostDeviationRate());
-                    adStatOfHour.setCostHour(adOds.getCost());
-                    adStatOfHour.setCompensationAmountHour(adOds.getCompensationAmount());
-                    adStatOfHour.setViewCountHour(adOds.getViewCount());
-                    adStatOfHour.setThousandDisplayPriceHour(adOds.getThousandDisplayPrice());
-                    adStatOfHour.setAvgViewPerUserHour(adOds.getAvgViewPerUser());
-                    adStatOfHour.setValidClickCountHour(adOds.getValidClickCount());
-                    adStatOfHour.setCtrHour(adOds.getCtr());
-                    adStatOfHour.setCpcHour(adOds.getCpc());
-                    adStatOfHour.setValuableClickCountHour(adOds.getValuableClickCount());
-                    adStatOfHour.setValuableClickRateHour(adOds.getValuableClickRate());
-                    adStatOfHour.setValuableClickCostHour(adOds.getValuableClickCost());
-                    adStatOfHour.setConversionsCountHour(adOds.getConversionsCount());
-                    adStatOfHour.setConversionsCostHour(adOds.getConversionsCost());
-                    adStatOfHour.setConversionsRateHour(adOds.getConversionsRate());
-                    adStatOfHour.setDeepConversionsCountHour(adOds.getDeepConversionsCount());
-                    adStatOfHour.setDeepConversionsCostHour(adOds.getDeepConversionsCost());
-                    adStatOfHour.setDeepConversionsRateHour(adOds.getDeepConversionsRate());
-                    adStatOfHour.setOrderCountHour(adOds.getOrderCount());
-                    adStatOfHour.setFirstDayOrderCountHour(adOds.getFirstDayOrderCount());
-                    adStatOfHour.setWebOrderCostHour(adOds.getWebOrderCost());
-                    adStatOfHour.setOrderRateHour(adOds.getOrderRate());
-                    adStatOfHour.setOrderAmountHour(adOds.getOrderAmount());
-                    adStatOfHour.setFirstDayOrderAmountHour(adOds.getFirstDayOrderAmount());
-                    adStatOfHour.setOrderUnitPriceHour(adOds.getOrderUnitPrice());
-                    adStatOfHour.setOrderRoiHour(adOds.getOrderRoi());
-                    adStatOfHour.setSignInCountHour(adOds.getSignInCount());
-                    adStatOfHour.setScanFollowCountHour(adOds.getScanFollowCount());
-                    adStatOfHour.setWechatAppRegisterUvHour(adOds.getWechatAppRegisterUv());
-                    adStatOfHour.setWechatMinigameRegisterCostHour(adOds.getWechatMinigameRegisterCost());
-                    adStatOfHour.setWechatMinigameRegisterRateHour(adOds.getWechatMinigameRegisterRate());
-                    adStatOfHour.setWechatMinigameArpuHour(adOds.getWechatMinigameArpu());
-                    adStatOfHour.setWechatMinigameRetentionCountHour(adOds.getWechatMinigameRetentionCount());
-                    adStatOfHour.setWechatMinigameCheckoutCountHour(adOds.getWechatMinigameCheckoutCount());
-                    adStatOfHour.setWechatMinigameCheckoutAmountHour(adOds.getWechatMinigameCheckoutAmount());
-                    adStatOfHour.setOfficialAccountFollowCountHour(adOds.getOfficialAccountFollowCount());
-                    adStatOfHour.setOfficialAccountFollowRateHour(adOds.getOfficialAccountFollowRate());
-                    adStatOfHour.setOfficialAccountRegisterUserCountHour(adOds.getOfficialAccountRegisterUserCount());
-                    adStatOfHour.setOfficialAccountRegisterRateHour(adOds.getOfficialAccountRegisterRate());
-                    adStatOfHour.setOfficialAccountRegisterCostHour(adOds.getOfficialAccountRegisterCost());
-                    adStatOfHour.setOfficialAccountRegisterAmountHour(adOds.getOfficialAccountRegisterAmount());
-                    adStatOfHour.setOfficialAccountRegisterRoiHour(adOds.getOfficialAccountRegisterRoi());
-                    adStatOfHour.setOfficialAccountApplyCountHour(adOds.getOfficialAccountApplyCount());
-                    adStatOfHour.setOfficialAccountApplyUserCountHour(adOds.getOfficialAccountApplyUserCount());
-                    adStatOfHour.setOfficialAccountApplyRateHour(adOds.getOfficialAccountApplyRate());
-                    adStatOfHour.setOfficialAccountApplyCostHour(adOds.getOfficialAccountApplyCost());
-                    adStatOfHour.setOfficialAccountApplyAmountHour(adOds.getOfficialAccountApplyAmount());
-                    adStatOfHour.setOfficialAccountApplyRoiHour(adOds.getOfficialAccountApplyRoi());
-                    adStatOfHour.setOfficialAccountOrderCountHour(adOds.getOfficialAccountOrderCount());
-                    adStatOfHour.setOfficialAccountFirstDayOrderCountHour(adOds.getOfficialAccountFirstDayOrderCount());
-                    adStatOfHour.setOfficialAccountOrderUserCountHour(adOds.getOfficialAccountOrderUserCount());
-                    adStatOfHour.setOfficialAccountOrderRateHour(adOds.getOfficialAccountOrderRate());
-                    adStatOfHour.setOfficialAccountOrderCostHour(adOds.getOfficialAccountOrderCost());
-                    adStatOfHour.setOfficialAccountOrderAmountHour(adOds.getOfficialAccountOrderAmount());
-                    adStatOfHour.setOfficialAccountFirstDayOrderAmountHour(adOds.getOfficialAccountFirstDayOrderAmount());
-                    adStatOfHour.setOfficialAccountOrderRoiHour(adOds.getOfficialAccountOrderRoi());
-                    adStatOfHour.setOfficialAccountConsultCountHour(adOds.getOfficialAccountConsultCount());
-                    adStatOfHour.setOfficialAccountReaderCountHour(adOds.getOfficialAccountReaderCount());
-                    adStatOfHour.setOfficialAccountCreditApplyUserCountHour(adOds.getOfficialAccountCreditApplyUserCount());
-                    adStatOfHour.setOfficialAccountCreditUserCountHour(adOds.getOfficialAccountCreditUserCount());
-                    adStatOfHour.setForwardCountHour(adOds.getForwardCount());
-                    adStatOfHour.setForwardUserCountHour(adOds.getForwardUserCount());
-                    adStatOfHour.setNoInterestCountHour(adOds.getNoInterestCount());
-                    return adStatOfHour;
-                }).keyBy((KeySelector<AdStatOfHourDWD, Long>) AdStatOfHourDWD::getAdId)
-                // 开一个 5分钟的滚动窗口
-                .window(TumblingEventTimeWindows.of(Time.minutes(5L)))
-                // 数据聚合
-                .reduce(new RichReduceFunction<AdStatOfHourDWD>() {
-                    @Override
-                    public void open(Configuration parameters) throws Exception {
-                    }
-                    @Override
-                    public AdStatOfHourDWD reduce(AdStatOfHourDWD adStatOfHourDWD, AdStatOfHourDWD t1) throws Exception {
-                        return null;
-                    }
-                });*/
-
-        // 广告流
-        /*SingleOutputStreamOperator<AdInfo> adStream = in.filter(StringUtils::isNotBlank)
-                .map(str -> JsonUtil.toObj(str, AdDataOfMinuteDTO.class))
-                .map(dto -> {
-                    HourlyReportsGetListStruct struct = dto.getHourlyReportsGetListStruct();
-                    StatInfo statInfo = new StatInfo();
-                    BeanUtils.copyProperties(struct, statInfo);
-                    AdInfo adInfo = new AdInfo();
-                    adInfo.setStatTime(dto.getCreateTime());
-                    adInfo.setStatDay(DateUtil.milliToLocalDate(dto.getCreateTime()));
-                    adInfo.setHour(dto.getHourlyReportsGetListStruct().getHour().intValue());
-                    adInfo.setAccountId(dto.getAccountId());
-                    adInfo.setCampaignId(struct.getCampaignId());
-                    adInfo.setAgencyAccountId(struct.getAccountId());
-                    adInfo.setWechatAccountId(struct.getWechatAccountId());
-                    adInfo.setWechatAgencyId(struct.getWechatAgencyId());
-                    adInfo.setAdgroupId(struct.getAdgroupId());
-                    adInfo.setAdId(struct.getAdId());
-                    adInfo.setStatInfo(statInfo);
-                    return adInfo;
-                })
-                // 打水印,延迟 12分钟,同时指定时间流
-                .assignTimestampsAndWatermarks(WatermarkStrategy.<AdInfo>forBoundedOutOfOrderness(Duration.ofMinutes(12L))
-                        .withTimestampAssigner((SerializableTimestampAssigner<AdInfo>) (adInfo, l) -> adInfo.getStatTime())
-                );
-
-        adStream.keyBy((KeySelector<AdInfo, Long>) AdInfo::getAdId)
-                .window(TumblingEventTimeWindows.of(Time.minutes(5L)))
-                .apply(new WindowFunction<AdInfo, AdInfo, Long, TimeWindow>() {
-                    @Override
-                    public void apply(Long key, TimeWindow timeWindow, Iterable<AdInfo> iterable, Collector<AdInfo> collector) throws Exception {
-                        for (AdInfo adInfo : iterable) {
-                            collector.collect(adInfo);
-                        }
-                    }
-                });*/
-
-        /*SingleOutputStreamOperator<PlanInfo> planStream = adStream.keyBy((KeySelector<AdInfo, Long>) AdInfo::getCampaignId)
-                .map()
-                .window(TumblingEventTimeWindows.of(Time.minutes(5L)))
-                .reduce(new PlanOfHourReduceFunction()).map();
-        planStream.print();*/
-        // planStatStream.addSink(new PrintSink<>()).name("msg-print");
         env.execute();
     }
 

+ 5 - 7
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/Test.java

@@ -75,18 +75,16 @@ public class Test {
                 }).print();*/
         pojoStream.keyBy(Pojo::getUserId).countWindow(1)
                 .process(new ProcessWindowFunction<Pojo, String, Integer, GlobalWindow>() {
+                    private Integer lastUserId = null;
                     private Tuple3<LocalDateTime, LocalDateTime, List<Pojo>> oldData = null;
                     @Override
                     public void process(Integer integer, ProcessWindowFunction<Pojo, String, Integer, GlobalWindow>.Context context, Iterable<Pojo> elements, Collector<String> out) throws Exception {
-                        System.out.println(integer);
-                        Pojo pojo = null;
-                        for(Pojo obj : elements) {
-                            pojo = obj;
-                        }
+                        Pojo pojo = elements.iterator().next();
                         LocalDateTime createTime = DateUtil.milliToLocalDateTime(pojo.getCreateTime());
                         if (oldData == null || createTime.getDayOfYear() != oldData.f1.getDayOfYear()) {
                             oldData = new Tuple3<>(createTime, createTime, new ArrayList<>(200));
                         }
+                        lastUserId = pojo.getUserId();
                         oldData.f2.add(pojo);
                         oldData.setField(createTime, 1);
                         out.collect(JsonUtil.toString(oldData.f2.stream().map(Pojo::getIndex).collect(Collectors.toList())));
@@ -174,7 +172,7 @@ public class Test {
                         System.out.println("1发送: " + pojo);
                         sourceContext.collect(pojo);
                     }
-                    /*long user2 = index2.incrementAndGet();
+                    long user2 = index2.incrementAndGet();
                     Pojo pojo2 = Pojo.builder()
                             .userId(2)
                             .index(user2)
@@ -194,7 +192,7 @@ public class Test {
                     } else {
                         System.out.println("2发送: " + pojo2);
                         sourceContext.collect(pojo2);
-                    }*/
+                    }
                     Thread.sleep(1000);
                 } catch (Exception e) {
                     e.printStackTrace();

+ 183 - 21
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdStatOfDayDWD.java

@@ -1,8 +1,10 @@
 package flink.zanxiangnet.ad.monitoring.pojo.entity;
 
+import com.aliyun.odps.data.Record;
 import com.google.gson.annotations.SerializedName;
 import flink.zanxiangnet.ad.monitoring.maxcompute.bean.annotation.MaxComputeColumn;
 import flink.zanxiangnet.ad.monitoring.maxcompute.bean.annotation.MaxComputeTable;
+import flink.zanxiangnet.ad.monitoring.util.ObjectUtil;
 import lombok.Data;
 import org.springframework.beans.BeanUtils;
 
@@ -11,7 +13,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
-@MaxComputeTable("ad_data_of_day_ods")
+@MaxComputeTable("ad_stat_of_day_dwd")
 public class AdStatOfDayDWD implements Serializable {
     private static final long serialVersionUID = 1L;
 
@@ -289,8 +291,8 @@ public class AdStatOfDayDWD implements Serializable {
     /**
      * 深度转化目标成本-灰度中。根据您选择的深度智能优化目标,该广告产生一次转化的平均费用。计算逻辑:广告花费/深度转化目标量。部分需接入转化跟踪后可统计。
      */
-    @SerializedName("deep_conversions_cost_total")
-    private Long deepConversionsCostTotal;
+    @SerializedName("deep_conversions_cost_all")
+    private Long deepConversionsCostAll;
 
     /**
      * 深度转化目标成本-灰度中。根据您选择的深度智能优化目标,该广告产生一次转化的平均费用。计算逻辑:广告花费/深度转化目标量。部分需接入转化跟踪后可统计。
@@ -301,8 +303,8 @@ public class AdStatOfDayDWD implements Serializable {
     /**
      * 深度目标转化率-灰度中。朋友圈:深度转化目标量/可转化点击次数。公众号:深度转化目标量/点击次数。指标随深度转化功能灰度中。接入转化跟踪后可统计。
      */
-    @SerializedName("deep_conversions_rate_total")
-    private Double deepConversionsRateTotal;
+    @SerializedName("deep_conversions_rate_all")
+    private Double deepConversionsRateAll;
 
     /**
      * 深度目标转化率-灰度中。朋友圈:深度转化目标量/可转化点击次数。公众号:深度转化目标量/点击次数。指标随深度转化功能灰度中。接入转化跟踪后可统计。
@@ -529,8 +531,8 @@ public class AdStatOfDayDWD implements Serializable {
     /**
      * 小游戏注册成本(人数)。产生一个小游戏注册人数的成本。
      */
-    @SerializedName("wechat_minigame_register_cost_total")
-    private Long wechatMinigameRegisterCostTotal;
+    @SerializedName("wechat_minigame_register_cost_all")
+    private Long wechatMinigameRegisterCostAll;
 
     /**
      * 小游戏注册成本(人数)。产生一个小游戏注册人数的成本。
@@ -1036,14 +1038,15 @@ public class AdStatOfDayDWD implements Serializable {
     /**
      * 聚合
      *
-     * @param reduceCount 之前聚合的次数
-     * @param value1      之前聚合的值(可能为 null)
-     * @param value2      新值
+     * @param value1     之前聚合的值(可能为 null)
+     * @param value2     新值
+     * @param createTime 聚合时间
      * @return
      */
-    public static AdStatOfDayDWD reduce(Long reduceCount, AdStatOfDayDWD value1, AdDataOfDayODS value2) {
+    public static AdStatOfDayDWD reduce(AdStatOfDayDWD value1, AdDataOfDayODS value2, long createTime) {
         AdStatOfDayDWD result = new AdStatOfDayDWD();
         BeanUtils.copyProperties(value2, result);
+        result.setCreateTime(new Date(createTime));
         if (value1 == null) {
             result.setCostDeviationRateTotal(value2.getCostDeviationRate());
             result.setCostDeviationRateDay(value2.getCostDeviationRate());
@@ -1081,9 +1084,9 @@ public class AdStatOfDayDWD implements Serializable {
             result.setConversionsRateDay(value2.getConversionsRate());
             result.setDeepConversionsCountTotal(value2.getDeepConversionsCount());
             result.setDeepConversionsCountDay(value2.getDeepConversionsCount());
-            result.setDeepConversionsCostTotal(value2.getDeepConversionsCost());
+            result.setDeepConversionsCostAll(value2.getDeepConversionsCost());
             result.setDeepConversionsCostDay(value2.getDeepConversionsCost());
-            result.setDeepConversionsRateTotal(value2.getDeepConversionsRate());
+            result.setDeepConversionsRateAll(value2.getDeepConversionsRate());
             result.setDeepConversionsRateDay(value2.getDeepConversionsRate());
             result.setKeyPageUvTotal(value2.getKeyPageUv());
             result.setKeyPageUvDay(value2.getKeyPageUv());
@@ -1121,7 +1124,7 @@ public class AdStatOfDayDWD implements Serializable {
             result.setScanFollowCountDay(value2.getScanFollowCount());
             result.setWechatAppRegisterUvTotal(value2.getWechatAppRegisterUv());
             result.setWechatAppRegisterUvDay(value2.getWechatAppRegisterUv());
-            result.setWechatMinigameRegisterCostTotal(value2.getWechatMinigameRegisterCost());
+            result.setWechatMinigameRegisterCostAll(value2.getWechatMinigameRegisterCost());
             result.setWechatMinigameRegisterCostDay(value2.getWechatMinigameRegisterCost());
             result.setWechatMinigameRegisterRateAll(value2.getWechatMinigameRegisterRate());
             result.setWechatMinigameRegisterRateDay(value2.getWechatMinigameRegisterRate());
@@ -1241,10 +1244,10 @@ public class AdStatOfDayDWD implements Serializable {
             result.setDeepConversionsCountTotal(value1.getDeepConversionsCountTotal() + value2.getDeepConversionsCount());
             result.setDeepConversionsCountDay(value2.getDeepConversionsCount());
             // 广告花费/深度转化目标量
-            result.setDeepConversionsCostTotal(result.getDeepConversionsCountTotal() == 0 ? 0 : result.getCostTotal() / result.getDeepConversionsCountTotal());
+            result.setDeepConversionsCostAll(result.getDeepConversionsCountTotal() == 0 ? 0 : result.getCostTotal() / result.getDeepConversionsCountTotal());
             result.setDeepConversionsCostDay(value2.getDeepConversionsCost());
             // 深度转化目标量/可转化点击次数
-            result.setDeepConversionsRateTotal(result.getValuableClickCountTotal() == 0 ? 0.0 : result.getDeepConversionsCountTotal() / result.getValuableClickCountTotal());
+            result.setDeepConversionsRateAll(result.getValuableClickCountTotal() == 0 ? 0.0 : result.getDeepConversionsCountTotal() / result.getValuableClickCountTotal());
             result.setDeepConversionsRateDay(value2.getDeepConversionsRate());
             result.setKeyPageUvTotal(value1.getKeyPageUvTotal() + value2.getKeyPageUv());
             result.setKeyPageUvDay(value2.getKeyPageUv());
@@ -1291,14 +1294,13 @@ public class AdStatOfDayDWD implements Serializable {
             result.setWechatAppRegisterUvTotal(value1.getWechatAppRegisterUvTotal() + value2.getWechatAppRegisterUv());
             result.setWechatAppRegisterUvDay(value2.getWechatAppRegisterUv());
             // 广告消耗 / 小游戏注册人数
-            result.setWechatMinigameRegisterCostTotal(result.getWechatAppRegisterUvTotal() == 0 ? 0 : result.getCostTotal() / result.getWechatAppRegisterUvTotal());
+            result.setWechatMinigameRegisterCostAll(result.getWechatAppRegisterUvTotal() == 0 ? 0 : result.getCostTotal() / result.getWechatAppRegisterUvTotal());
             result.setWechatMinigameRegisterCostDay(value2.getWechatMinigameRegisterCost());
             // 小游戏注册人数 / 广告点击次数
             result.setWechatMinigameRegisterRateAll(result.getValidClickCountTotal() == 0 ? 0.0 : result.getWechatAppRegisterUvTotal() / result.getValidClickCountTotal());
             result.setWechatMinigameRegisterRateDay(value2.getWechatMinigameRegisterRate());
-
-            //------------------未知
-            result.setWechatMinigameArpuAll(value1.getWechatMinigameArpuAll() + value2.getWechatMinigameArpu());
+            // 总收益 / 总人数
+            result.setWechatMinigameArpuAll(result.getWechatAppRegisterUvTotal() == 0 ? 0.0 : result.getOrderAmountTotal() / result.getWechatAppRegisterUvTotal());
             result.setWechatMinigameArpuDay(value2.getWechatMinigameArpu());
             result.setWechatMinigameRetentionCountTotal(value1.getWechatMinigameRetentionCountTotal() + value2.getWechatMinigameRetentionCount());
             result.setWechatMinigameRetentionCountDay(value2.getWechatMinigameRetentionCount());
@@ -1333,7 +1335,7 @@ public class AdStatOfDayDWD implements Serializable {
             result.setOfficialAccountApplyUserCountDay(value2.getOfficialAccountApplyUserCount());
             // 公众号内填单的独立用户数/公众号关注次数
             result.setOfficialAccountApplyRateAll(result.getOfficialAccountFollowCountTotal() == 0 ? 0.0 : result.getOfficialAccountApplyUserCountTotal() / result.getOfficialAccountFollowCountTotal());
-            result.setOfficialAccountApplyRateDay( value2.getOfficialAccountApplyRate());
+            result.setOfficialAccountApplyRateDay(value2.getOfficialAccountApplyRate());
             // 广告花费/广告产生的填单行为数量
             result.setOfficialAccountApplyCostAll(result.getOfficialAccountApplyUserCountTotal() == 0 ? 0 : result.getCostTotal() / result.getOfficialAccountApplyUserCountTotal());
             result.setOfficialAccountApplyCostDay(value2.getOfficialAccountApplyCost());
@@ -1378,4 +1380,164 @@ public class AdStatOfDayDWD implements Serializable {
         }
         return result;
     }
+
+    public static AdStatOfDayDWD byMaxCompute(Record record) {
+        AdStatOfDayDWD result = new AdStatOfDayDWD();
+        result.setStatDay(ObjectUtil.toString(record.get("stat_day")));
+        result.setAccountId(ObjectUtil.toLong(record.get("account_id")));
+        result.setCampaignId(ObjectUtil.toLong(record.get("campaign_id")));
+        result.setAgencyAccountId(ObjectUtil.toLong(record.get("agency_account_id")));
+        result.setWechatAccountId(ObjectUtil.toString(record.get("wechat_account_id")));
+        result.setWechatAgencyId(ObjectUtil.toString(record.get("wechat_agency_id")));
+        result.setAdgroupId(ObjectUtil.toLong(record.get("adgroup_id")));
+        result.setAdId(ObjectUtil.toLong(record.get("ad_id")));
+        result.setCreateTime(ObjectUtil.toDate(record.get("create_time")));
+        result.setCostDeviationRateTotal(ObjectUtil.toDouble(record.get("cost_deviation_rate_total")));
+        result.setCostDeviationRateDay(ObjectUtil.toDouble(record.get("cost_deviation_rate_day")));
+        result.setCostTotal(ObjectUtil.toLong(record.get("cost_total")));
+        result.setCostDay(ObjectUtil.toLong(record.get("cost_day")));
+        result.setCompensationAmountTotal(ObjectUtil.toLong(record.get("compensation_amount_total")));
+        result.setCompensationAmountDay(ObjectUtil.toLong(record.get("compensation_amount_day")));
+        result.setViewCountTotal(ObjectUtil.toLong(record.get("view_count_total")));
+        result.setViewCountDay(ObjectUtil.toLong(record.get("view_count_day")));
+        result.setThousandDisplayPriceAll(ObjectUtil.toLong(record.get("thousand_display_price_all")));
+        result.setThousandDisplayPriceDay(ObjectUtil.toLong(record.get("thousand_display_price_day")));
+        result.setViewUserCountTotal(ObjectUtil.toLong(record.get("view_user_count_total")));
+        result.setViewUserCountDay(ObjectUtil.toLong(record.get("view_user_count_day")));
+        result.setAvgViewPerUserAll(ObjectUtil.toDouble(record.get("avg_view_per_user_all")));
+        result.setAvgViewPerUserDay(ObjectUtil.toDouble(record.get("avg_view_per_user_day")));
+        result.setValidClickCountTotal(ObjectUtil.toLong(record.get("valid_click_count_total")));
+        result.setValidClickCountDay(ObjectUtil.toLong(record.get("valid_click_count_day")));
+        result.setClickUserCountTotal(ObjectUtil.toLong(record.get("click_user_count_total")));
+        result.setClickUserCountDay(ObjectUtil.toLong(record.get("click_user_count_day")));
+        result.setCtrAll(ObjectUtil.toDouble(record.get("ctr_all")));
+        result.setCtrDay(ObjectUtil.toDouble(record.get("ctr_day")));
+        result.setCpcAll(ObjectUtil.toLong(record.get("cpc_all")));
+        result.setCpcDay(ObjectUtil.toLong(record.get("cpc_day")));
+        result.setValuableClickCountTotal(ObjectUtil.toLong(record.get("valuable_click_count_total")));
+        result.setValuableClickCountDay(ObjectUtil.toLong(record.get("valuable_click_count_day")));
+        result.setValuableClickRateAll(ObjectUtil.toDouble(record.get("valuable_click_rate_all")));
+        result.setValuableClickRateDay(ObjectUtil.toDouble(record.get("valuable_click_rate_day")));
+        result.setValuableClickCostAll(ObjectUtil.toLong(record.get("valuable_click_cost_all")));
+        result.setValuableClickCostDay(ObjectUtil.toLong(record.get("valuable_click_cost_day")));
+        result.setConversionsCountTotal(ObjectUtil.toLong(record.get("conversions_count_total")));
+        result.setConversionsCountDay(ObjectUtil.toLong(record.get("conversions_count_day")));
+        result.setConversionsCostAll(ObjectUtil.toLong(record.get("conversions_cost_all")));
+        result.setConversionsCostDay(ObjectUtil.toLong(record.get("conversions_cost_day")));
+        result.setConversionsRateAll(ObjectUtil.toDouble(record.get("conversions_rate_all")));
+        result.setConversionsRateDay(ObjectUtil.toDouble(record.get("conversions_rate_day")));
+        result.setDeepConversionsCountTotal(ObjectUtil.toLong(record.get("deep_conversions_count_total")));
+        result.setDeepConversionsCountDay(ObjectUtil.toLong(record.get("deep_conversions_count_day")));
+        result.setDeepConversionsCostAll(ObjectUtil.toLong(record.get("deep_conversions_cost_all")));
+        result.setDeepConversionsCostDay(ObjectUtil.toLong(record.get("deep_conversions_cost_day")));
+        result.setDeepConversionsRateAll(ObjectUtil.toDouble(record.get("deep_conversions_rate_all")));
+        result.setDeepConversionsRateDay(ObjectUtil.toDouble(record.get("deep_conversions_rate_day")));
+        result.setKeyPageUvTotal(ObjectUtil.toLong(record.get("key_page_uv_total")));
+        result.setKeyPageUvDay(ObjectUtil.toLong(record.get("key_page_uv_day")));
+        result.setOrderCountTotal(ObjectUtil.toLong(record.get("order_count_total")));
+        result.setOrderCountDay(ObjectUtil.toLong(record.get("order_count_day")));
+        result.setFirstDayOrderCountTotal(ObjectUtil.toLong(record.get("first_day_order_count_total")));
+        result.setFirstDayOrderCountDay(ObjectUtil.toLong(record.get("first_day_order_count_day")));
+        result.setWebOrderCostAll(ObjectUtil.toLong(record.get("web_order_cost_all")));
+        result.setWebOrderCostDay(ObjectUtil.toLong(record.get("web_order_cost_day")));
+        result.setOrderRateAll(ObjectUtil.toDouble(record.get("order_rate_all")));
+        result.setOrderRateDay(ObjectUtil.toDouble(record.get("order_rate_day")));
+        result.setOrderAmountTotal(ObjectUtil.toLong(record.get("order_amount_total")));
+        result.setOrderAmountDay(ObjectUtil.toLong(record.get("order_amount_day")));
+        result.setFirstDayOrderAmountTotal(ObjectUtil.toLong(record.get("first_day_order_amount_total")));
+        result.setFirstDayOrderAmountDay(ObjectUtil.toLong(record.get("first_day_order_amount_day")));
+        result.setOrderUnitPriceAll(ObjectUtil.toLong(record.get("order_unit_price_all")));
+        result.setOrderUnitPriceDay(ObjectUtil.toLong(record.get("order_unit_price_day")));
+        result.setOrderRoiAll(ObjectUtil.toDouble(record.get("order_roi_all")));
+        result.setOrderRoiDay(ObjectUtil.toDouble(record.get("order_roi_day")));
+        result.setSignInCountTotal(ObjectUtil.toLong(record.get("sign_in_count_total")));
+        result.setSignInCountDay(ObjectUtil.toLong(record.get("sign_in_count_day")));
+        result.setAddWishlistCountTotal(ObjectUtil.toLong(record.get("add_wishlist_count_total")));
+        result.setAddWishlistCountDay(ObjectUtil.toLong(record.get("add_wishlist_count_day")));
+        result.setViewCommodityPageUvTotal(ObjectUtil.toLong(record.get("view_commodity_page_uv_total")));
+        result.setViewCommodityPageUvDay(ObjectUtil.toLong(record.get("view_commodity_page_uv_day")));
+        result.setPageReservationCountTotal(ObjectUtil.toLong(record.get("page_reservation_count_total")));
+        result.setPageReservationCountDay(ObjectUtil.toLong(record.get("page_reservation_count_day")));
+        result.setLeadsPurchaseUvTotal(ObjectUtil.toLong(record.get("leads_purchase_uv_total")));
+        result.setLeadsPurchaseUvDay(ObjectUtil.toLong(record.get("leads_purchase_uv_day")));
+        result.setLeadsPurchaseCostAll(ObjectUtil.toLong(record.get("leads_purchase_cost_all")));
+        result.setLeadsPurchaseCostDay(ObjectUtil.toLong(record.get("leads_purchase_cost_day")));
+        result.setLeadsPurchaseRateAll(ObjectUtil.toDouble(record.get("leads_purchase_rate_all")));
+        result.setLeadsPurchaseRateDay(ObjectUtil.toDouble(record.get("leads_purchase_rate_day")));
+        result.setScanFollowCountTotal(ObjectUtil.toLong(record.get("scan_follow_count_total")));
+        result.setScanFollowCountDay(ObjectUtil.toLong(record.get("scan_follow_count_day")));
+        result.setWechatAppRegisterUvTotal(ObjectUtil.toLong(record.get("wechat_app_register_uv_total")));
+        result.setWechatAppRegisterUvDay(ObjectUtil.toLong(record.get("wechat_app_register_uv_day")));
+        result.setWechatMinigameRegisterCostAll(ObjectUtil.toLong(record.get("wechat_minigame_register_cost_all")));
+        result.setWechatMinigameRegisterCostDay(ObjectUtil.toLong(record.get("wechat_minigame_register_cost_day")));
+        result.setWechatMinigameRegisterRateAll(ObjectUtil.toDouble(record.get("wechat_minigame_register_rate_all")));
+        result.setWechatMinigameRegisterRateDay(ObjectUtil.toDouble(record.get("wechat_minigame_register_rate_day")));
+        result.setWechatMinigameArpuAll(ObjectUtil.toDouble(record.get("wechat_minigame_arpu_all")));
+        result.setWechatMinigameArpuDay(ObjectUtil.toDouble(record.get("wechat_minigame_arpu_day")));
+        result.setWechatMinigameRetentionCountTotal(ObjectUtil.toLong(record.get("wechat_minigame_retention_count_total")));
+        result.setWechatMinigameRetentionCountDay(ObjectUtil.toLong(record.get("wechat_minigame_retention_count_day")));
+        result.setWechatMinigameCheckoutCountTotal(ObjectUtil.toLong(record.get("wechat_minigame_checkout_count_total")));
+        result.setWechatMinigameCheckoutCountDay(ObjectUtil.toLong(record.get("wechat_minigame_checkout_count_day")));
+        result.setWechatMinigameCheckoutAmountTotal(ObjectUtil.toLong(record.get("wechat_minigame_checkout_amount_total")));
+        result.setWechatMinigameCheckoutAmountDay(ObjectUtil.toLong(record.get("wechat_minigame_checkout_amount_day")));
+        result.setOfficialAccountFollowCountTotal(ObjectUtil.toLong(record.get("official_account_follow_count_total")));
+        result.setOfficialAccountFollowCountDay(ObjectUtil.toLong(record.get("official_account_follow_count_day")));
+        result.setOfficialAccountFollowCostAll(ObjectUtil.toLong(record.get("official_account_follow_cost_all")));
+        result.setOfficialAccountFollowCostDay(ObjectUtil.toLong(record.get("official_account_follow_cost_day")));
+        result.setOfficialAccountFollowRateAll(ObjectUtil.toDouble(record.get("official_account_follow_rate_all")));
+        result.setOfficialAccountFollowRateDay(ObjectUtil.toDouble(record.get("official_account_follow_rate_day")));
+        result.setOfficialAccountRegisterUserCountTotal(ObjectUtil.toLong(record.get("official_account_register_user_count_total")));
+        result.setOfficialAccountRegisterUserCountDay(ObjectUtil.toLong(record.get("official_account_register_user_count_day")));
+        result.setOfficialAccountRegisterRateAll(ObjectUtil.toDouble(record.get("official_account_register_rate_all")));
+        result.setOfficialAccountRegisterRateDay(ObjectUtil.toDouble(record.get("official_account_register_rate_day")));
+        result.setOfficialAccountRegisterCostAll(ObjectUtil.toLong(record.get("official_account_register_cost_all")));
+        result.setOfficialAccountRegisterCostDay(ObjectUtil.toLong(record.get("official_account_register_cost_day")));
+        result.setOfficialAccountRegisterAmountTotal(ObjectUtil.toLong(record.get("official_account_register_amount_total")));
+        result.setOfficialAccountRegisterAmountDay(ObjectUtil.toLong(record.get("official_account_register_amount_day")));
+        result.setOfficialAccountRegisterRoiAll(ObjectUtil.toLong(record.get("official_account_register_roi_all")));
+        result.setOfficialAccountRegisterRoiDay(ObjectUtil.toLong(record.get("official_account_register_roi_day")));
+        result.setOfficialAccountApplyCountTotal(ObjectUtil.toLong(record.get("official_account_apply_count_total")));
+        result.setOfficialAccountApplyCountDay(ObjectUtil.toLong(record.get("official_account_apply_count_day")));
+        result.setOfficialAccountApplyUserCountTotal(ObjectUtil.toLong(record.get("official_account_apply_user_count_total")));
+        result.setOfficialAccountApplyUserCountDay(ObjectUtil.toLong(record.get("official_account_apply_user_count_day")));
+        result.setOfficialAccountApplyRateAll(ObjectUtil.toDouble(record.get("official_account_apply_rate_all")));
+        result.setOfficialAccountApplyRateDay(ObjectUtil.toDouble(record.get("official_account_apply_rate_day")));
+        result.setOfficialAccountApplyCostAll(ObjectUtil.toLong(record.get("official_account_apply_cost_all")));
+        result.setOfficialAccountApplyCostDay(ObjectUtil.toLong(record.get("official_account_apply_cost_day")));
+        result.setOfficialAccountApplyAmountTotal(ObjectUtil.toLong(record.get("official_account_apply_amount_total")));
+        result.setOfficialAccountApplyAmountDay(ObjectUtil.toLong(record.get("official_account_apply_amount_day")));
+        result.setOfficialAccountApplyRoiAll(ObjectUtil.toLong(record.get("official_account_apply_roi_all")));
+        result.setOfficialAccountApplyRoiDay(ObjectUtil.toLong(record.get("official_account_apply_roi_day")));
+        result.setOfficialAccountOrderCountTotal(ObjectUtil.toLong(record.get("official_account_order_count_total")));
+        result.setOfficialAccountOrderCountDay(ObjectUtil.toLong(record.get("official_account_order_count_day")));
+        result.setOfficialAccountFirstDayOrderCountTotal(ObjectUtil.toLong(record.get("official_account_first_day_order_count_total")));
+        result.setOfficialAccountFirstDayOrderCountDay(ObjectUtil.toLong(record.get("official_account_first_day_order_count_day")));
+        result.setOfficialAccountOrderUserCountTotal(ObjectUtil.toLong(record.get("official_account_order_user_count_total")));
+        result.setOfficialAccountOrderUserCountDay(ObjectUtil.toLong(record.get("official_account_order_user_count_day")));
+        result.setOfficialAccountOrderRateAll(ObjectUtil.toDouble(record.get("official_account_order_rate_all")));
+        result.setOfficialAccountOrderRateDay(ObjectUtil.toDouble(record.get("official_account_order_rate_day")));
+        result.setOfficialAccountOrderCostAll(ObjectUtil.toLong(record.get("official_account_order_cost_all")));
+        result.setOfficialAccountOrderCostDay(ObjectUtil.toLong(record.get("official_account_order_cost_day")));
+        result.setOfficialAccountOrderAmountTotal(ObjectUtil.toLong(record.get("official_account_order_amount_total")));
+        result.setOfficialAccountOrderAmountDay(ObjectUtil.toLong(record.get("official_account_order_amount_day")));
+        result.setOfficialAccountFirstDayOrderAmountTotal(ObjectUtil.toLong(record.get("official_account_first_day_order_amount_total")));
+        result.setOfficialAccountFirstDayOrderAmountDay(ObjectUtil.toLong(record.get("official_account_first_day_order_amount_day")));
+        result.setOfficialAccountOrderRoiAll(ObjectUtil.toLong(record.get("official_account_order_roi_all")));
+        result.setOfficialAccountOrderRoiDay(ObjectUtil.toLong(record.get("official_account_order_roi_day")));
+        result.setOfficialAccountConsultCountTotal(ObjectUtil.toLong(record.get("official_account_consult_count_total")));
+        result.setOfficialAccountConsultCountDay(ObjectUtil.toLong(record.get("official_account_consult_count_day")));
+        result.setOfficialAccountReaderCountTotal(ObjectUtil.toLong(record.get("official_account_reader_count_total")));
+        result.setOfficialAccountReaderCountDay(ObjectUtil.toLong(record.get("official_account_reader_count_day")));
+        result.setOfficialAccountCreditApplyUserCountTotal(ObjectUtil.toLong(record.get("official_account_credit_apply_user_count_total")));
+        result.setOfficialAccountCreditApplyUserCountDay(ObjectUtil.toLong(record.get("official_account_credit_apply_user_count_day")));
+        result.setOfficialAccountCreditUserCountTotal(ObjectUtil.toLong(record.get("official_account_credit_user_count_total")));
+        result.setOfficialAccountCreditUserCountDay(ObjectUtil.toLong(record.get("official_account_credit_user_count_day")));
+        result.setForwardCountTotal(ObjectUtil.toLong(record.get("forward_count_total")));
+        result.setForwardCountDay(ObjectUtil.toLong(record.get("forward_count_day")));
+        result.setForwardUserCountTotal(ObjectUtil.toLong(record.get("forward_user_count_total")));
+        result.setForwardUserCountDay(ObjectUtil.toLong(record.get("forward_user_count_day")));
+        result.setNoInterestCountTotal(ObjectUtil.toLong(record.get("no_interest_count_total")));
+        result.setNoInterestCountDay(ObjectUtil.toLong(record.get("no_interest_count_day")));
+        return result;
+    }
 }

+ 616 - 88
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdStatOfHourDWD.java

@@ -1,13 +1,14 @@
 package flink.zanxiangnet.ad.monitoring.pojo.entity;
 
+import com.aliyun.odps.data.Record;
 import com.google.gson.annotations.SerializedName;
 import flink.zanxiangnet.ad.monitoring.maxcompute.bean.annotation.MaxComputeColumn;
 import flink.zanxiangnet.ad.monitoring.maxcompute.bean.annotation.MaxComputeTable;
-import flink.zanxiangnet.ad.monitoring.util.NumberUtil;
+import flink.zanxiangnet.ad.monitoring.util.ObjectUtil;
 import lombok.Data;
 import org.springframework.beans.BeanUtils;
 
-import java.time.LocalDate;
+import java.util.Date;
 
 /**
  * 广告维度的小时统计数据
@@ -71,11 +72,17 @@ public class AdStatOfHourDWD {
     @SerializedName("ad_id")
     private Long adId;
 
+    /**
+     * 记录创建时间
+     */
+    @SerializedName("create_time")
+    private Date createTime;
+
     /**
      * 当日成本偏差。反映广告今日的实际成本与目标成本直接的差异,注:该项成本相关数据按小时更新,与实时更新的「转化目标成本」数据存在出入属于正常情况。
      */
-    @SerializedName("cost_deviation_rate_all")
-    private Double costDeviationRateAll;
+    @SerializedName("cost_deviation_rate_total")
+    private Double costDeviationRateTotal;
 
     /**
      * 当日成本偏差。反映广告今日的实际成本与目标成本直接的差异,注:该项成本相关数据按小时更新,与实时更新的「转化目标成本」数据存在出入属于正常情况。
@@ -161,18 +168,6 @@ public class AdStatOfHourDWD {
     @SerializedName("thousand_display_price_hour")
     private Long thousandDisplayPriceHour;
 
-    /**
-     * 人均曝光次数。每个用户观看广告的平均次数。
-     */
-    @SerializedName("avg_view_per_user_all")
-    private Double avgViewPerUserAll;
-
-    /**
-     * 人均曝光次数。每个用户观看广告的平均次数。
-     */
-    @SerializedName("avg_view_per_user_day")
-    private Double avgViewPerUserDay;
-
     /**
      * 人均曝光次数。每个用户观看广告的平均次数。
      */
@@ -1125,7 +1120,7 @@ public class AdStatOfHourDWD {
      * 公众号内进件人数。在公众号内完整提交贷款申请资料的独立用户数。接入转化跟踪后可统计。
      */
     @SerializedName("official_account_credit_apply_user_count_day")
-    private Long officialAccountCreditApplyUserCountTotalDay;
+    private Long officialAccountCreditApplyUserCountDay;
 
     /**
      * 公众号内进件人数。在公众号内完整提交贷款申请资料的独立用户数。接入转化跟踪后可统计。
@@ -1282,79 +1277,612 @@ public class AdStatOfHourDWD {
         return adStatOfHour;
     }
 
-    private AdStatOfHourDWD reduce(AdStatOfHourDWD value1, AdStatOfHourDWD value2) {
+    public static AdStatOfHourDWD reduce(AdStatOfHourDWD value1, AdDataOfHourODS value2, long createTime) {
         AdStatOfHourDWD result = new AdStatOfHourDWD();
         BeanUtils.copyProperties(result, value2);
-        //??
-        result.setCostDeviationRateAll(NumberUtil.add(value1.getCostDeviationRateHour(), value2.getCostDeviationRateHour()));
-        result.setCostTotal(NumberUtil.add(value1.getCostHour(), value2.getCostHour()));
-        result.setCompensationAmountTotal(NumberUtil.add(value1.getCompensationAmountHour(), value2.getCompensationAmountHour()));
-        result.setViewCountTotal(NumberUtil.add(value1.getViewCountHour(), value2.getViewCountHour()));
-        //
-        result.setThousandDisplayPriceAll(NumberUtil.add(value1.getThousandDisplayPriceHour(), value2.getThousandDisplayPriceHour()));
-        //
-        result.setAvgViewPerUserAll(NumberUtil.add(value1.getAvgViewPerUserHour(), value2.getAvgViewPerUserHour()));
-        result.setValidClickCountTotal(NumberUtil.add(value1.getValidClickCountHour(), value2.getValidClickCountHour()));
-        //
-        result.setCtrAll(NumberUtil.add(value1.getCtrHour(), value2.getCtrHour()));
-        //
-        result.setCpcAll(NumberUtil.add(value1.getCpcHour(), value2.getCpcHour()));
-        result.setValuableClickCountTotal(NumberUtil.add(value1.getValuableClickCountHour(), value2.getValuableClickCountHour()));
-        //
-        result.setValuableClickRateAll(NumberUtil.add(value1.getValuableClickRateHour(), value2.getValuableClickRateHour()));
-        //
-        result.setValuableClickCostAll(NumberUtil.add(value1.getValuableClickCostHour(), value2.getValuableClickCostHour()));
-        result.setConversionsCountTotal(NumberUtil.add(value1.getConversionsCountHour(), value2.getConversionsCountHour()));
-        result.setConversionsCostAll(NumberUtil.add(value1.getConversionsCostHour(), value2.getConversionsCostHour()));
-        result.setConversionsRateAll(NumberUtil.add(value1.getConversionsRateHour(), value2.getConversionsRateHour()));
-        result.setDeepConversionsCountTotal(NumberUtil.add(value1.getDeepConversionsCountHour(), value2.getDeepConversionsCountHour()));
-        result.setDeepConversionsCostAll(NumberUtil.add(value1.getDeepConversionsCostHour(), value2.getDeepConversionsCostHour()));
-        result.setDeepConversionsRateAll(NumberUtil.add(value1.getDeepConversionsRateHour(), value2.getDeepConversionsRateHour()));
-        result.setOrderCountTotal(NumberUtil.add(value1.getOrderCountHour(), value2.getOrderCountHour()));
-        result.setFirstDayOrderCountTotal(NumberUtil.add(value1.getFirstDayOrderCountHour(), value2.getFirstDayOrderCountHour()));
-        result.setWebOrderCostAll(NumberUtil.add(value1.getWebOrderCostHour(), value2.getWebOrderCostHour()));
-        result.setOrderRateAll(NumberUtil.add(value1.getOrderRateHour(), value2.getOrderRateHour()));
-        result.setOrderAmountTotal(NumberUtil.add(value1.getOrderAmountHour(), value2.getOrderAmountHour()));
-        result.setFirstDayOrderAmountTotal(NumberUtil.add(value1.getFirstDayOrderAmountHour(), value2.getFirstDayOrderAmountHour()));
-        result.setOrderUnitPriceAll(NumberUtil.add(value1.getOrderUnitPriceHour(), value2.getOrderUnitPriceHour()));
-        result.setOrderRoiAll(NumberUtil.add(value1.getOrderRoiHour(), value2.getOrderRoiHour()));
-        result.setSignInCountTotal(NumberUtil.add(value1.getSignInCountHour(), value2.getSignInCountHour()));
-        result.setScanFollowCountTotal(NumberUtil.add(value1.getScanFollowCountHour(), value2.getScanFollowCountHour()));
-        result.setWechatAppRegisterUvTotal(NumberUtil.add(value1.getWechatAppRegisterUvHour(), value2.getWechatAppRegisterUvHour()));
-        result.setWechatMinigameRegisterCostAll(NumberUtil.add(value1.getWechatMinigameRegisterCostHour(), value2.getWechatMinigameRegisterCostHour()));
-        result.setWechatMinigameRegisterRateAll(NumberUtil.add(value1.getWechatMinigameRegisterRateHour(), value2.getWechatMinigameRegisterRateHour()));
-        result.setWechatMinigameArpuAll(NumberUtil.add(value1.getWechatMinigameArpuHour(), value2.getWechatMinigameArpuHour()));
-        result.setWechatMinigameRetentionCountTotal(NumberUtil.add(value1.getWechatMinigameRetentionCountHour(), value2.getWechatMinigameRetentionCountHour()));
-        result.setWechatMinigameCheckoutCountTotal(NumberUtil.add(value1.getWechatMinigameCheckoutCountHour(), value2.getWechatMinigameCheckoutCountHour()));
-        result.setWechatMinigameCheckoutAmountTotal(NumberUtil.add(value1.getWechatMinigameCheckoutAmountHour(), value2.getWechatMinigameCheckoutAmountHour()));
-        result.setOfficialAccountFollowCountTotal(NumberUtil.add(value1.getOfficialAccountFollowCountHour(), value2.getOfficialAccountFollowCountHour()));
-        result.setOfficialAccountFollowRateAll(NumberUtil.add(value1.getOfficialAccountFollowRateHour(), value2.getOfficialAccountFollowRateHour()));
-        result.setOfficialAccountRegisterUserCountTotal(NumberUtil.add(value1.getOfficialAccountRegisterUserCountHour(), value2.getOfficialAccountRegisterUserCountHour()));
-        result.setOfficialAccountRegisterRateAll(NumberUtil.add(value1.getOfficialAccountRegisterRateHour(), value2.getOfficialAccountRegisterRateHour()));
-        result.setOfficialAccountRegisterCostAll(NumberUtil.add(value1.getOfficialAccountRegisterCostHour(), value2.getOfficialAccountRegisterCostHour()));
-        result.setOfficialAccountRegisterAmountTotal(NumberUtil.add(value1.getOfficialAccountRegisterAmountHour(), value2.getOfficialAccountRegisterAmountHour()));
-        result.setOfficialAccountRegisterRoiAll(NumberUtil.add(value1.getOfficialAccountRegisterRoiHour(), value2.getOfficialAccountRegisterRoiHour()));
-        result.setOfficialAccountApplyCountTotal(NumberUtil.add(value1.getOfficialAccountApplyCountHour(), value2.getOfficialAccountApplyCountHour()));
-        result.setOfficialAccountApplyUserCountTotal(NumberUtil.add(value1.getOfficialAccountApplyUserCountHour(), value2.getOfficialAccountApplyUserCountHour()));
-        result.setOfficialAccountApplyRateAll(NumberUtil.add(value1.getOfficialAccountApplyRateHour(), value2.getOfficialAccountApplyRateHour()));
-        result.setOfficialAccountApplyCostAll(NumberUtil.add(value1.getOfficialAccountApplyCostHour(), value2.getOfficialAccountApplyCostHour()));
-        result.setOfficialAccountApplyAmountTotal(NumberUtil.add(value1.getOfficialAccountApplyAmountHour(), value2.getOfficialAccountApplyAmountHour()));
-        result.setOfficialAccountApplyRoiAll(NumberUtil.add(value1.getOfficialAccountApplyRoiHour(), value2.getOfficialAccountApplyRoiHour()));
-        result.setOfficialAccountOrderCountTotal(NumberUtil.add(value1.getOfficialAccountOrderCountHour(), value2.getOfficialAccountOrderCountHour()));
-        result.setOfficialAccountFirstDayOrderCountTotal(NumberUtil.add(value1.getOfficialAccountFirstDayOrderCountHour(), value2.getOfficialAccountFirstDayOrderCountHour()));
-        result.setOfficialAccountOrderUserCountTotal(NumberUtil.add(value1.getOfficialAccountOrderUserCountHour(), value2.getOfficialAccountOrderUserCountHour()));
-        result.setOfficialAccountOrderRateAll(NumberUtil.add(value1.getOfficialAccountOrderRateHour(), value2.getOfficialAccountOrderRateHour()));
-        result.setOfficialAccountOrderCostAll(NumberUtil.add(value1.getOfficialAccountOrderCostHour(), value2.getOfficialAccountOrderCostHour()));
-        result.setOfficialAccountOrderAmountTotal(NumberUtil.add(value1.getOfficialAccountOrderAmountHour(), value2.getOfficialAccountOrderAmountHour()));
-        result.setOfficialAccountFirstDayOrderAmountTotal(NumberUtil.add(value1.getOfficialAccountFirstDayOrderAmountHour(), value2.getOfficialAccountFirstDayOrderAmountHour()));
-        result.setOfficialAccountOrderRoiAll(NumberUtil.add(value1.getOfficialAccountOrderRoiHour(), value2.getOfficialAccountOrderRoiHour()));
-        result.setOfficialAccountConsultCountTotal(NumberUtil.add(value1.getOfficialAccountConsultCountHour(), value2.getOfficialAccountConsultCountHour()));
-        result.setOfficialAccountReaderCountTotal(NumberUtil.add(value1.getOfficialAccountReaderCountHour(), value2.getOfficialAccountReaderCountHour()));
-        result.setOfficialAccountCreditApplyUserCountTotal(NumberUtil.add(value1.getOfficialAccountCreditApplyUserCountHour(), value2.getOfficialAccountCreditApplyUserCountHour()));
-        result.setOfficialAccountCreditUserCountTotal(NumberUtil.add(value1.getOfficialAccountCreditUserCountHour(), value2.getOfficialAccountCreditUserCountHour()));
-        result.setForwardCountTotal(NumberUtil.add(value1.getForwardCountHour(), value2.getForwardCountHour()));
-        result.setForwardUserCountTotal(NumberUtil.add(value1.getForwardUserCountHour(), value2.getForwardUserCountHour()));
-        result.setNoInterestCountTotal(NumberUtil.add(value1.getNoInterestCountHour(), value2.getNoInterestCountHour()));
+        result.setCreateTime(new Date(createTime));
+        if (value1 == null) {
+            result.setCompensationAmountTotal(value2.getCompensationAmount());
+            result.setCompensationAmountDay(value2.getCompensationAmount());
+            result.setCompensationAmountHour(value2.getCompensationAmount());
+            result.setViewCountTotal(value2.getViewCount());
+            result.setViewCountDay(value2.getViewCount());
+            result.setViewCountHour(value2.getViewCount());
+            result.setThousandDisplayPriceAll(value2.getThousandDisplayPrice());
+            result.setThousandDisplayPriceDay(value2.getThousandDisplayPrice());
+            result.setThousandDisplayPriceHour(value2.getThousandDisplayPrice());
+            result.setAvgViewPerUserHour(value2.getAvgViewPerUser());
+            result.setValidClickCountTotal(value2.getValidClickCount());
+            result.setValidClickCountDay(value2.getValidClickCount());
+            result.setValidClickCountHour(value2.getValidClickCount());
+            result.setCtrAll(value2.getCtr());
+            result.setCtrDay(value2.getCtr());
+            result.setCtrHour(value2.getCtr());
+            result.setCpcAll(value2.getCpc());
+            result.setCpcDay(value2.getCpc());
+            result.setCpcHour(value2.getCpc());
+            result.setValuableClickCountTotal(value2.getValuableClickCount());
+            result.setValuableClickCountDay(value2.getValuableClickCount());
+            result.setValuableClickCountHour(value2.getValuableClickCount());
+            result.setValuableClickRateAll(value2.getValuableClickRate());
+            result.setValuableClickRateDay(value2.getValuableClickRate());
+            result.setValuableClickRateHour(value2.getValuableClickRate());
+            result.setValuableClickCostAll(value2.getValuableClickCost());
+            result.setValuableClickCostDay(value2.getValuableClickCost());
+            result.setValuableClickCostHour(value2.getValuableClickCost());
+            result.setConversionsCountTotal(value2.getConversionsCount());
+            result.setConversionsCountDay(value2.getConversionsCount());
+            result.setConversionsCountHour(value2.getConversionsCount());
+            result.setConversionsCostAll(value2.getConversionsCost());
+            result.setConversionsCostDay(value2.getConversionsCost());
+            result.setConversionsCostHour(value2.getConversionsCost());
+            result.setConversionsRateAll(value2.getConversionsRate());
+            result.setConversionsRateDay(value2.getConversionsRate());
+            result.setConversionsRateHour(value2.getConversionsRate());
+            result.setDeepConversionsCountTotal(value2.getDeepConversionsCount());
+            result.setDeepConversionsCountDay(value2.getDeepConversionsCount());
+            result.setDeepConversionsCountHour(value2.getDeepConversionsCount());
+            result.setDeepConversionsCostAll(value2.getDeepConversionsCost());
+            result.setDeepConversionsCostDay(value2.getDeepConversionsCost());
+            result.setDeepConversionsCostHour(value2.getDeepConversionsCost());
+            result.setDeepConversionsRateAll(value2.getDeepConversionsRate());
+            result.setDeepConversionsRateDay(value2.getDeepConversionsRate());
+            result.setDeepConversionsRateHour(value2.getDeepConversionsRate());
+            result.setOrderCountTotal(value2.getOrderCount());
+            result.setOrderCountDay(value2.getOrderCount());
+            result.setOrderCountHour(value2.getOrderCount());
+            result.setFirstDayOrderCountTotal(value2.getFirstDayOrderCount());
+            result.setFirstDayOrderCountDay(value2.getFirstDayOrderCount());
+            result.setFirstDayOrderCountHour(value2.getFirstDayOrderCount());
+            result.setWebOrderCostAll(value2.getWebOrderCost());
+            result.setWebOrderCostDay(value2.getWebOrderCost());
+            result.setWebOrderCostHour(value2.getWebOrderCost());
+            result.setOrderRateAll(value2.getOrderRate());
+            result.setOrderRateDay(value2.getOrderRate());
+            result.setOrderRateHour(value2.getOrderRate());
+            result.setOrderAmountTotal(value2.getOrderAmount());
+            result.setOrderAmountDay(value2.getOrderAmount());
+            result.setOrderAmountHour(value2.getOrderAmount());
+            result.setFirstDayOrderAmountTotal(value2.getFirstDayOrderAmount());
+            result.setFirstDayOrderAmountDay(value2.getFirstDayOrderAmount());
+            result.setFirstDayOrderAmountHour(value2.getFirstDayOrderAmount());
+            result.setOrderUnitPriceAll(value2.getOrderUnitPrice());
+            result.setOrderUnitPriceDay(value2.getOrderUnitPrice());
+            result.setOrderUnitPriceHour(value2.getOrderUnitPrice());
+            result.setOrderRoiAll(value2.getOrderRoi());
+            result.setOrderRoiDay(value2.getOrderRoi());
+            result.setOrderRoiHour(value2.getOrderRoi());
+            result.setSignInCountTotal(value2.getSignInCount());
+            result.setSignInCountDay(value2.getSignInCount());
+            result.setSignInCountHour(value2.getSignInCount());
+            result.setScanFollowCountTotal(value2.getScanFollowCount());
+            result.setScanFollowCountDay(value2.getScanFollowCount());
+            result.setScanFollowCountHour(value2.getScanFollowCount());
+            result.setWechatAppRegisterUvTotal(value2.getWechatAppRegisterUv());
+            result.setWechatAppRegisterUvDay(value2.getWechatAppRegisterUv());
+            result.setWechatAppRegisterUvHour(value2.getWechatAppRegisterUv());
+            result.setWechatMinigameRegisterCostAll(value2.getWechatMinigameRegisterCost());
+            result.setWechatMinigameRegisterCostDay(value2.getWechatMinigameRegisterCost());
+            result.setWechatMinigameRegisterCostHour(value2.getWechatMinigameRegisterCost());
+            result.setWechatMinigameRegisterRateAll(value2.getWechatMinigameRegisterRate());
+            result.setWechatMinigameRegisterRateDay(value2.getWechatMinigameRegisterRate());
+            result.setWechatMinigameRegisterRateHour(value2.getWechatMinigameRegisterRate());
+            result.setWechatMinigameArpuAll(value2.getWechatMinigameArpu());
+            result.setWechatMinigameArpuDay(value2.getWechatMinigameArpu());
+            result.setWechatMinigameArpuHour(value2.getWechatMinigameArpu());
+            result.setWechatMinigameRetentionCountTotal(value2.getWechatMinigameRetentionCount());
+            result.setWechatMinigameRetentionCountDay(value2.getWechatMinigameRetentionCount());
+            result.setWechatMinigameRetentionCountHour(value2.getWechatMinigameRetentionCount());
+            result.setWechatMinigameCheckoutCountTotal(value2.getWechatMinigameCheckoutCount());
+            result.setWechatMinigameCheckoutCountDay(value2.getWechatMinigameCheckoutCount());
+            result.setWechatMinigameCheckoutCountHour(value2.getWechatMinigameCheckoutCount());
+            result.setWechatMinigameCheckoutAmountTotal(value2.getWechatMinigameCheckoutAmount());
+            result.setWechatMinigameCheckoutAmountDay(value2.getWechatMinigameCheckoutAmount());
+            result.setWechatMinigameCheckoutAmountHour(value2.getWechatMinigameCheckoutAmount());
+            result.setOfficialAccountFollowCountTotal(value2.getOfficialAccountFollowCount());
+            result.setOfficialAccountFollowCountDay(value2.getOfficialAccountFollowCount());
+            result.setOfficialAccountFollowCountHour(value2.getOfficialAccountFollowCount());
+            result.setOfficialAccountFollowRateAll(value2.getOfficialAccountFollowRate());
+            result.setOfficialAccountFollowRateDay(value2.getOfficialAccountFollowRate());
+            result.setOfficialAccountFollowRateHour(value2.getOfficialAccountFollowRate());
+            result.setOfficialAccountRegisterUserCountTotal(value2.getOfficialAccountRegisterUserCount());
+            result.setOfficialAccountRegisterUserCountDay(value2.getOfficialAccountRegisterUserCount());
+            result.setOfficialAccountRegisterUserCountHour(value2.getOfficialAccountRegisterUserCount());
+            result.setOfficialAccountRegisterRateAll(value2.getOfficialAccountRegisterRate());
+            result.setOfficialAccountRegisterRateDay(value2.getOfficialAccountRegisterRate());
+            result.setOfficialAccountRegisterRateHour(value2.getOfficialAccountRegisterRate());
+            result.setOfficialAccountRegisterCostAll(value2.getOfficialAccountRegisterCost());
+            result.setOfficialAccountRegisterCostDay(value2.getOfficialAccountRegisterCost());
+            result.setOfficialAccountRegisterCostHour(value2.getOfficialAccountRegisterCost());
+            result.setOfficialAccountRegisterAmountTotal(value2.getOfficialAccountRegisterAmount());
+            result.setOfficialAccountRegisterAmountDay(value2.getOfficialAccountRegisterAmount());
+            result.setOfficialAccountRegisterAmountHour(value2.getOfficialAccountRegisterAmount());
+            result.setOfficialAccountRegisterRoiAll(value2.getOfficialAccountRegisterRoi());
+            result.setOfficialAccountRegisterRoiDay(value2.getOfficialAccountRegisterRoi());
+            result.setOfficialAccountRegisterRoiHour(value2.getOfficialAccountRegisterRoi());
+            result.setOfficialAccountApplyCountTotal(value2.getOfficialAccountApplyCount());
+            result.setOfficialAccountApplyCountDay(value2.getOfficialAccountApplyCount());
+            result.setOfficialAccountApplyCountHour(value2.getOfficialAccountApplyCount());
+            result.setOfficialAccountApplyUserCountTotal(value2.getOfficialAccountApplyUserCount());
+            result.setOfficialAccountApplyUserCountDay(value2.getOfficialAccountApplyUserCount());
+            result.setOfficialAccountApplyUserCountHour(value2.getOfficialAccountApplyUserCount());
+            result.setOfficialAccountApplyRateAll(value2.getOfficialAccountApplyRate());
+            result.setOfficialAccountApplyRateDay(value2.getOfficialAccountApplyRate());
+            result.setOfficialAccountApplyRateHour(value2.getOfficialAccountApplyRate());
+            result.setOfficialAccountApplyCostAll(value2.getOfficialAccountApplyCost());
+            result.setOfficialAccountApplyCostDay(value2.getOfficialAccountApplyCost());
+            result.setOfficialAccountApplyCostHour(value2.getOfficialAccountApplyCost());
+            result.setOfficialAccountApplyAmountTotal(value2.getOfficialAccountApplyAmount());
+            result.setOfficialAccountApplyAmountDay(value2.getOfficialAccountApplyAmount());
+            result.setOfficialAccountApplyAmountHour(value2.getOfficialAccountApplyAmount());
+            result.setOfficialAccountApplyRoiAll(value2.getOfficialAccountApplyRoi());
+            result.setOfficialAccountApplyRoiDay(value2.getOfficialAccountApplyRoi());
+            result.setOfficialAccountApplyRoiHour(value2.getOfficialAccountApplyRoi());
+            result.setOfficialAccountOrderCountTotal(value2.getOfficialAccountOrderCount());
+            result.setOfficialAccountOrderCountDay(value2.getOfficialAccountOrderCount());
+            result.setOfficialAccountOrderCountHour(value2.getOfficialAccountOrderCount());
+            result.setOfficialAccountFirstDayOrderCountTotal(value2.getOfficialAccountFirstDayOrderCount());
+            result.setOfficialAccountFirstDayOrderCountDay(value2.getOfficialAccountFirstDayOrderCount());
+            result.setOfficialAccountFirstDayOrderCountHour(value2.getOfficialAccountFirstDayOrderCount());
+            result.setOfficialAccountOrderUserCountTotal(value2.getOfficialAccountOrderUserCount());
+            result.setOfficialAccountOrderUserCountDay(value2.getOfficialAccountOrderUserCount());
+            result.setOfficialAccountOrderUserCountHour(value2.getOfficialAccountOrderUserCount());
+            result.setOfficialAccountOrderRateAll(value2.getOfficialAccountOrderRate());
+            result.setOfficialAccountOrderRateDay(value2.getOfficialAccountOrderRate());
+            result.setOfficialAccountOrderRateHour(value2.getOfficialAccountOrderRate());
+            result.setOfficialAccountOrderCostAll(value2.getOfficialAccountOrderCost());
+            result.setOfficialAccountOrderCostDay(value2.getOfficialAccountOrderCost());
+            result.setOfficialAccountOrderCostHour(value2.getOfficialAccountOrderCost());
+            result.setOfficialAccountOrderAmountTotal(value2.getOfficialAccountOrderAmount());
+            result.setOfficialAccountOrderAmountDay(value2.getOfficialAccountOrderAmount());
+            result.setOfficialAccountOrderAmountHour(value2.getOfficialAccountOrderAmount());
+            result.setOfficialAccountFirstDayOrderAmountTotal(value2.getOfficialAccountFirstDayOrderAmount());
+            result.setOfficialAccountFirstDayOrderAmountDay(value2.getOfficialAccountFirstDayOrderAmount());
+            result.setOfficialAccountFirstDayOrderAmountHour(value2.getOfficialAccountFirstDayOrderAmount());
+            result.setOfficialAccountOrderRoiAll(value2.getOfficialAccountOrderRoi());
+            result.setOfficialAccountOrderRoiDay(value2.getOfficialAccountOrderRoi());
+            result.setOfficialAccountOrderRoiHour(value2.getOfficialAccountOrderRoi());
+            result.setOfficialAccountConsultCountTotal(value2.getOfficialAccountConsultCount());
+            result.setOfficialAccountConsultCountDay(value2.getOfficialAccountConsultCount());
+            result.setOfficialAccountConsultCountHour(value2.getOfficialAccountConsultCount());
+            result.setOfficialAccountReaderCountTotal(value2.getOfficialAccountReaderCount());
+            result.setOfficialAccountReaderCountDay(value2.getOfficialAccountReaderCount());
+            result.setOfficialAccountReaderCountHour(value2.getOfficialAccountReaderCount());
+            result.setOfficialAccountCreditApplyUserCountTotal(value2.getOfficialAccountCreditApplyUserCount());
+            result.setOfficialAccountCreditApplyUserCountDay(value2.getOfficialAccountCreditApplyUserCount());
+            result.setOfficialAccountCreditApplyUserCountHour(value2.getOfficialAccountCreditApplyUserCount());
+            result.setOfficialAccountCreditUserCountTotal(value2.getOfficialAccountCreditUserCount());
+            result.setOfficialAccountCreditUserCountDay(value2.getOfficialAccountCreditUserCount());
+            result.setOfficialAccountCreditUserCountHour(value2.getOfficialAccountCreditUserCount());
+            result.setForwardCountTotal(value2.getForwardCount());
+            result.setForwardCountDay(value2.getForwardCount());
+            result.setForwardCountHour(value2.getForwardCount());
+            result.setForwardUserCountTotal(value2.getForwardUserCount());
+            result.setForwardUserCountDay(value2.getForwardUserCount());
+            result.setForwardUserCountHour(value2.getForwardUserCount());
+            result.setNoInterestCountTotal(value2.getNoInterestCount());
+            result.setNoInterestCountDay(value2.getNoInterestCount());
+            result.setNoInterestCountHour(value2.getNoInterestCount());
+        } else {
+            // 是否是同一天
+            boolean isUnSameDay = !value1.getStatDay().equals(value2.getStatDay());
+            result.setCostDeviationRateTotal(value1.getCostDeviationRateTotal() + value2.getCostDeviationRate());
+            result.setCostDeviationRateDay(isUnSameDay ? 0: value1.getCostDeviationRateDay() + value2.getCostDeviationRate());
+            result.setCostDeviationRateHour(value2.getCostDeviationRate());
+            result.setCostTotal(value1.getCostTotal() + value2.getCost());
+            result.setCostDay(isUnSameDay ? 0: value1.getCostDay() + value2.getCost());
+            result.setCostHour(value2.getCost());
+            result.setCompensationAmountTotal(value1.getCompensationAmountTotal() + value2.getCompensationAmount());
+            result.setCompensationAmountDay(isUnSameDay ? 0: value1.getCompensationAmountDay() + value2.getCompensationAmount());
+            result.setCompensationAmountHour(value2.getCompensationAmount());
+            result.setViewCountTotal(value1.getViewCountTotal() + value2.getViewCount());
+            result.setViewCountDay(isUnSameDay ? 0: value1.getViewCountDay() + value2.getViewCount());
+            result.setViewCountHour(value2.getViewCount());
+            // 总消耗 / 总曝光
+            result.setThousandDisplayPriceAll(result.getViewCountTotal() == 0 ? 0 : (result.getCostTotal() / result.getViewCountTotal() * 1000));
+            result.setThousandDisplayPriceDay(isUnSameDay ? 0: result.getViewCountDay() == 0 ? 0 : (result.getCostDay() / result.getViewCountDay() * 1000));
+            result.setThousandDisplayPriceHour(value2.getThousandDisplayPrice());
+            // 曝光次数 / 曝光人数(拿不到曝光人数)
+            result.setAvgViewPerUserHour(value2.getAvgViewPerUser());
+            result.setValidClickCountTotal(value1.getValidClickCountTotal() + value2.getValidClickCount());
+            result.setValidClickCountDay(isUnSameDay ? 0: value1.getValidClickCountDay() + value2.getValidClickCount());
+            result.setValidClickCountHour(value2.getValidClickCount());
+            // 广告点击次数 / 广告曝光次数
+            result.setCtrAll(result.getViewCountTotal() == 0 ? 0.0 : result.getValidClickCountTotal() / result.getViewCountTotal());
+            result.setCtrDay(isUnSameDay ? 0: result.getViewCountDay() == 0 ? 0.0 : result.getValidClickCountDay() / result.getViewCountDay());
+            result.setCtrHour(value2.getCtr());
+            // 广告花费/广告点击次数
+            result.setCpcAll(result.getValidClickCountTotal() == 0 ? 0 : result.getCostTotal() / result.getValidClickCountTotal());
+            result.setCpcDay(isUnSameDay ? 0: result.getValidClickCountDay() == 0 ? 0 : result.getCostDay() / result.getValidClickCountDay());
+            result.setCpcHour(value2.getCpc());
+            result.setValuableClickCountTotal(value1.getValuableClickCountTotal() + value2.getValuableClickCount());
+            result.setValuableClickCountDay(isUnSameDay ? 0: value1.getValuableClickCountDay() + value2.getValuableClickCount());
+            result.setValuableClickCountHour(value2.getValuableClickCount());
+            // 广告可转化点击次数/广告曝光次数
+            result.setValuableClickRateAll(result.getViewCountTotal() == 0 ? 0.0 : result.getValuableClickCountTotal() / result.getViewCountTotal());
+            result.setValuableClickRateDay(isUnSameDay ? 0: result.getViewCountDay() == 0 ? 0.0 : result.getValuableClickCountDay() / result.getViewCountDay());
+            result.setValuableClickRateHour(value2.getValuableClickRate());
+            // 广告花费/可转化点击次数
+            result.setValuableClickCostAll(result.getValuableClickCountTotal() == 0 ? 0 : result.getCostTotal() / result.getValuableClickCountTotal());
+            result.setValuableClickCostDay(isUnSameDay ? 0: result.getValuableClickCountDay() == 0 ? 0 : result.getCostDay() / result.getValuableClickCountDay());
+            result.setValuableClickCostHour(value2.getValuableClickCost());
+            result.setConversionsCountTotal(value1.getConversionsCountTotal() + value2.getConversionsCount());
+            result.setConversionsCountDay(isUnSameDay ? 0: value1.getConversionsCountDay() + value2.getConversionsCount());
+            result.setConversionsCountHour(value2.getConversionsCount());
+            // 广告花费/转化目标量
+            result.setConversionsCostAll(result.getConversionsCountTotal() == 0 ? 0 : result.getCostTotal() / result.getConversionsCountTotal());
+            result.setConversionsCostDay(isUnSameDay ? 0: result.getConversionsCountDay() == 0 ? 0 : result.getCostDay() / result.getConversionsCountDay());
+            result.setConversionsCostHour(value2.getConversionsCost());
+            // 公众号:转化目标量/点击次数。
+            result.setConversionsRateAll(result.getValidClickCountTotal() == 0 ? 0.0 : result.getConversionsCountTotal() / result.getValidClickCountTotal());
+            result.setConversionsRateDay(isUnSameDay ? 0: result.getValidClickCountDay() == 0 ? 0.0 : result.getConversionsCountDay() / result.getValidClickCountDay());
+            result.setConversionsRateHour(value2.getConversionsRate());
+            result.setDeepConversionsCountTotal(value1.getDeepConversionsCountTotal() + value2.getDeepConversionsCount());
+            result.setDeepConversionsCountDay(isUnSameDay ? 0: value1.getDeepConversionsCountDay() + value2.getDeepConversionsCount());
+            result.setDeepConversionsCountHour(value2.getDeepConversionsCount());
+            // 广告花费/深度转化目标量
+            result.setDeepConversionsCostAll(result.getDeepConversionsCountTotal() == 0 ? 0 : result.getCostTotal() / result.getDeepConversionsCountTotal());
+            result.setDeepConversionsCostDay(isUnSameDay ? 0: result.getDeepConversionsCountDay() == 0 ? 0 : result.getCostDay() / result.getDeepConversionsCountDay());
+            result.setDeepConversionsCostHour(value2.getDeepConversionsCost());
+            // 深度转化目标量/可转化点击次数
+            result.setDeepConversionsRateAll(result.getValuableClickCountTotal() == 0 ? 0.0 : result.getDeepConversionsCountTotal() / result.getValuableClickCountTotal());
+            result.setDeepConversionsRateDay(isUnSameDay ? 0: result.getValuableClickCountDay() == 0 ? 0.0 : result.getDeepConversionsCountDay() / result.getValuableClickCountDay());
+            result.setDeepConversionsRateHour(value2.getDeepConversionsRate());
+            result.setOrderCountTotal(value1.getOrderCountTotal() + value2.getOrderCount());
+            result.setOrderCountDay(isUnSameDay ? 0: value1.getOrderCountDay() + value2.getOrderCount());
+            result.setOrderCountHour(value2.getOrderCount());
+            result.setFirstDayOrderCountTotal(value1.getFirstDayOrderCountTotal() + value2.getFirstDayOrderCount());
+            result.setFirstDayOrderCountDay(isUnSameDay ? 0: value1.getFirstDayOrderCountDay() + value2.getFirstDayOrderCount());
+            result.setFirstDayOrderCountHour(value2.getFirstDayOrderCount());
+            // 广告花费/下单量
+            result.setWebOrderCostAll(result.getOrderCountTotal() == 0 ? 0 : result.getCostTotal() / result.getOrderCountTotal());
+            result.setWebOrderCostDay(isUnSameDay ? 0: result.getOrderCountDay() == 0 ? 0 : result.getCostDay() / result.getOrderCountDay());
+            result.setWebOrderCostHour(value2.getWebOrderCost());
+            // 下单量/点击次数
+            result.setOrderRateAll(result.getValidClickCountTotal() == 0 ? 0.0 : result.getOrderCountTotal() / result.getValidClickCountTotal());
+            result.setOrderRateDay(isUnSameDay ? 0: result.getValidClickCountDay() == 0 ? 0.0 : result.getOrderCountDay() / result.getValidClickCountDay());
+            result.setOrderRateHour(value2.getOrderRate());
+            result.setOrderAmountTotal(value1.getOrderAmountTotal() + value2.getOrderAmount());
+            result.setOrderAmountDay(isUnSameDay ? 0: value1.getOrderAmountDay() + value2.getOrderAmount());
+            result.setOrderAmountHour(value2.getOrderAmount());
+            result.setFirstDayOrderAmountTotal(value1.getFirstDayOrderAmountTotal() + value2.getFirstDayOrderAmount());
+            result.setFirstDayOrderAmountDay(isUnSameDay ? 0: value1.getFirstDayOrderAmountDay() + value2.getFirstDayOrderAmount());
+            result.setFirstDayOrderAmountHour(value2.getFirstDayOrderAmount());
+            // 下单金额/下单量
+            result.setOrderUnitPriceAll(result.getOrderCountTotal() == 0 ? 0 : result.getOrderAmountTotal() / result.getOrderCountTotal());
+            result.setOrderUnitPriceDay(isUnSameDay ? 0: result.getOrderCountDay() == 0 ? 0 : result.getOrderAmountDay() / result.getOrderCountDay());
+            result.setOrderUnitPriceHour(value2.getOrderUnitPrice());
+            // 下单金额/广告花费
+            result.setOrderRoiAll(result.getCostTotal() == 0 ? 0.0 : result.getOrderAmountTotal() / result.getCostTotal());
+            result.setOrderRoiDay(isUnSameDay ? 0: result.getCostDay() == 0 ? 0.0 : result.getOrderAmountDay() / result.getCostDay());
+            result.setOrderRoiHour(value2.getOrderRoi());
+            result.setSignInCountTotal(value1.getSignInCountTotal() + value2.getSignInCount());
+            result.setSignInCountDay(value1.getSignInCountDay() + value2.getSignInCount());
+            result.setSignInCountHour(value2.getSignInCount());
+            result.setScanFollowCountTotal(value1.getScanFollowCountTotal() + value2.getScanFollowCount());
+            result.setScanFollowCountDay(isUnSameDay ? 0: value1.getScanFollowCountDay() + value2.getScanFollowCount());
+            result.setScanFollowCountHour(value2.getScanFollowCount());
+            result.setWechatAppRegisterUvTotal(value1.getWechatAppRegisterUvTotal() + value2.getWechatAppRegisterUv());
+            result.setWechatAppRegisterUvDay(isUnSameDay ? 0: value1.getWechatAppRegisterUvDay() + value2.getWechatAppRegisterUv());
+            result.setWechatAppRegisterUvHour(value2.getWechatAppRegisterUv());
+            // 广告消耗 / 小游戏注册人数
+            result.setWechatMinigameRegisterCostAll(result.getWechatAppRegisterUvTotal() == 0 ? 0 : result.getCostTotal() / result.getWechatAppRegisterUvTotal());
+            result.setWechatMinigameRegisterCostDay(isUnSameDay ? 0: result.getWechatAppRegisterUvDay() == 0 ? 0 : result.getCostDay() / result.getWechatAppRegisterUvDay());
+            result.setWechatMinigameRegisterCostHour(value2.getWechatMinigameRegisterCost());
+            // 小游戏注册人数 / 广告点击次数
+            result.setWechatMinigameRegisterRateAll(result.getValidClickCountTotal() == 0 ? 0.0 : result.getWechatAppRegisterUvTotal() / result.getValidClickCountTotal());
+            result.setWechatMinigameRegisterRateDay(isUnSameDay ? 0: result.getValidClickCountDay() == 0 ? 0.0 : result.getWechatAppRegisterUvDay() / result.getValidClickCountDay());
+            result.setWechatMinigameRegisterRateHour(value2.getWechatMinigameRegisterRate());
+            // 总收益 / 总人数
+            result.setWechatMinigameArpuAll(result.getWechatAppRegisterUvTotal() == 0 ? 0.0 : result.getOrderAmountTotal() / result.getWechatAppRegisterUvTotal());
+            result.setWechatMinigameArpuDay(isUnSameDay ? 0: result.getWechatAppRegisterUvDay() == 0 ? 0.0 : result.getOrderAmountDay() / result.getWechatAppRegisterUvDay());
+            result.setWechatMinigameArpuHour(value2.getWechatMinigameArpu());
+            result.setWechatMinigameRetentionCountTotal(value1.getWechatMinigameRetentionCountTotal() + value2.getWechatMinigameRetentionCount());
+            result.setWechatMinigameRetentionCountDay(isUnSameDay ? 0: value1.getWechatMinigameRetentionCountDay() + value2.getWechatMinigameRetentionCount());
+            result.setWechatMinigameRetentionCountHour(value2.getWechatMinigameRetentionCount());
+            result.setWechatMinigameCheckoutCountTotal(value1.getWechatMinigameCheckoutCountTotal() + value2.getWechatMinigameCheckoutCount());
+            result.setWechatMinigameCheckoutCountDay(isUnSameDay ? 0: value1.getWechatMinigameCheckoutCountDay() + value2.getWechatMinigameCheckoutCount());
+            result.setWechatMinigameCheckoutCountHour(value2.getWechatMinigameCheckoutCount());
+            result.setWechatMinigameCheckoutAmountTotal(value1.getWechatMinigameCheckoutAmountTotal() + value2.getWechatMinigameCheckoutAmount());
+            result.setWechatMinigameCheckoutAmountDay(isUnSameDay ? 0: value1.getWechatMinigameCheckoutAmountDay() + value2.getWechatMinigameCheckoutAmount());
+            result.setWechatMinigameCheckoutAmountHour(value2.getWechatMinigameCheckoutAmount());
+            result.setOfficialAccountFollowCountTotal(value1.getOfficialAccountFollowCountTotal() + value2.getOfficialAccountFollowCount());
+            result.setOfficialAccountFollowCountDay(isUnSameDay ? 0: value1.getOfficialAccountFollowCountDay() + value2.getOfficialAccountFollowCount());
+            result.setOfficialAccountFollowCountHour(value2.getOfficialAccountFollowCount());
+            // 关注次数 / 点击次数
+            result.setOfficialAccountFollowRateAll(result.getValidClickCountTotal() == 0 ? 0.0 : result.getOfficialAccountFollowCountTotal() / result.getValidClickCountTotal());
+            result.setOfficialAccountFollowRateDay(isUnSameDay ? 0: result.getValidClickCountDay() == 0 ? 0.0 : result.getOfficialAccountFollowCountDay() / result.getValidClickCountDay());
+            result.setOfficialAccountFollowRateHour(value2.getOfficialAccountFollowRate());
+            result.setOfficialAccountRegisterUserCountTotal(value1.getOfficialAccountRegisterUserCountTotal() + value2.getOfficialAccountRegisterUserCount());
+            result.setOfficialAccountRegisterUserCountDay(isUnSameDay ? 0: value1.getOfficialAccountRegisterUserCountDay() + value2.getOfficialAccountRegisterUserCount());
+            result.setOfficialAccountRegisterUserCountHour(value2.getOfficialAccountRegisterUserCount());
+            // 公众号内注册人数 / 公众号关注次数
+            result.setOfficialAccountRegisterRateAll(result.getOfficialAccountFollowCountTotal() == 0 ? 0.0 : result.getOfficialAccountRegisterUserCountTotal() / result.getOfficialAccountFollowCountTotal());
+            result.setOfficialAccountRegisterRateDay(isUnSameDay ? 0: result.getOfficialAccountFollowCountDay() == 0 ? 0.0 : result.getOfficialAccountRegisterUserCountDay() / result.getOfficialAccountFollowCountDay());
+            result.setOfficialAccountRegisterRateHour(value2.getOfficialAccountRegisterRate());
+            // 广告消耗 / 广告注册人数
+            result.setOfficialAccountRegisterCostAll(result.getOfficialAccountRegisterUserCountTotal() == 0 ? 0 : result.getCostTotal() / result.getOfficialAccountRegisterUserCountTotal());
+            result.setOfficialAccountRegisterCostDay(isUnSameDay ? 0: result.getOfficialAccountRegisterUserCountDay() == 0 ? 0 : result.getCostDay() / result.getOfficialAccountRegisterUserCountDay());
+            result.setOfficialAccountRegisterCostHour(value2.getOfficialAccountRegisterCost());
+            result.setOfficialAccountRegisterAmountTotal(value1.getOfficialAccountRegisterAmountTotal() + value2.getOfficialAccountRegisterAmount());
+            result.setOfficialAccountRegisterAmountDay(isUnSameDay ? 0: value1.getOfficialAccountRegisterAmountDay() + value2.getOfficialAccountRegisterAmount());
+            result.setOfficialAccountRegisterAmountHour(value2.getOfficialAccountRegisterAmount());
+            // 注册产生的订单金额累计/广告花费
+            result.setOfficialAccountRegisterRoiAll(result.getCostTotal() == 0 ? 0 : result.getOfficialAccountRegisterAmountTotal() / result.getCostTotal());
+            result.setOfficialAccountRegisterRoiDay(isUnSameDay ? 0: result.getCostDay() == 0 ? 0 : result.getOfficialAccountRegisterAmountDay() / result.getCostDay());
+            result.setOfficialAccountRegisterRoiHour(value2.getOfficialAccountRegisterRoi());
+            result.setOfficialAccountApplyCountTotal(value1.getOfficialAccountApplyCountTotal() + value2.getOfficialAccountApplyCount());
+            result.setOfficialAccountApplyCountDay(isUnSameDay ? 0: value1.getOfficialAccountApplyCountDay() + value2.getOfficialAccountApplyCount());
+            result.setOfficialAccountApplyCountHour(value2.getOfficialAccountApplyCount());
+            result.setOfficialAccountApplyUserCountTotal(value1.getOfficialAccountApplyUserCountTotal() + value2.getOfficialAccountApplyUserCount());
+            result.setOfficialAccountApplyUserCountDay(isUnSameDay ? 0: value1.getOfficialAccountApplyUserCountDay() + value2.getOfficialAccountApplyUserCount());
+            result.setOfficialAccountApplyUserCountHour(value2.getOfficialAccountApplyUserCount());
+            // 公众号内填单的独立用户数/公众号关注次数
+            result.setOfficialAccountApplyRateAll(result.getOfficialAccountFollowCountTotal() == 0 ? 0.0 : result.getOfficialAccountApplyUserCountTotal() / result.getOfficialAccountFollowCountTotal());
+            result.setOfficialAccountApplyRateDay(isUnSameDay ? 0: result.getOfficialAccountFollowCountDay() == 0 ? 0.0 : result.getOfficialAccountApplyUserCountDay() / result.getOfficialAccountFollowCountDay());
+            result.setOfficialAccountApplyRateHour(value2.getOfficialAccountApplyRate());
+            // 广告花费/广告产生的填单行为数量
+            result.setOfficialAccountApplyCostAll(result.getOfficialAccountApplyUserCountTotal() == 0 ? 0 : result.getCostTotal() / result.getOfficialAccountApplyUserCountTotal());
+            result.setOfficialAccountApplyCostDay(isUnSameDay ? 0: result.getOfficialAccountApplyUserCountDay() == 0 ? 0 : result.getCostDay() / result.getOfficialAccountApplyUserCountDay());
+            result.setOfficialAccountApplyCostHour(value2.getOfficialAccountApplyCost());
+            result.setOfficialAccountApplyAmountTotal(value1.getOfficialAccountApplyAmountTotal() + value2.getOfficialAccountApplyAmount());
+            result.setOfficialAccountApplyAmountDay(isUnSameDay ? 0: value1.getOfficialAccountApplyAmountDay() + value2.getOfficialAccountApplyAmount());
+            result.setOfficialAccountApplyAmountHour(value2.getOfficialAccountApplyAmount());
+            // 填单产生的订单金额累计/广告花费
+            result.setOfficialAccountApplyRoiAll(result.getCostTotal() == 0 ? 0 : result.getOfficialAccountApplyAmountTotal() / result.getCostTotal());
+            result.setOfficialAccountApplyRoiDay(isUnSameDay ? 0: result.getCostDay() == 0 ? 0 : result.getOfficialAccountApplyAmountDay() / result.getCostDay());
+            result.setOfficialAccountApplyRoiHour(value2.getOfficialAccountApplyRoi());
+            result.setOfficialAccountOrderCountTotal(value1.getOfficialAccountOrderCountTotal() + value2.getOfficialAccountOrderCount());
+            result.setOfficialAccountOrderCountDay(isUnSameDay ? 0: value1.getOfficialAccountOrderCountDay() + value2.getOfficialAccountOrderCount());
+            result.setOfficialAccountOrderCountHour(value2.getOfficialAccountOrderCount());
+            result.setOfficialAccountFirstDayOrderCountTotal(value1.getOfficialAccountFirstDayOrderCountTotal() + value2.getOfficialAccountFirstDayOrderCount());
+            result.setOfficialAccountFirstDayOrderCountDay(isUnSameDay ? 0: value1.getOfficialAccountFirstDayOrderCountDay() + value2.getOfficialAccountFirstDayOrderCount());
+            result.setOfficialAccountFirstDayOrderCountHour(value2.getOfficialAccountFirstDayOrderCount());
+            result.setOfficialAccountOrderUserCountTotal(value1.getOfficialAccountOrderUserCountTotal() + value2.getOfficialAccountOrderUserCount());
+            result.setOfficialAccountOrderUserCountDay(isUnSameDay ? 0: value1.getOfficialAccountOrderUserCountDay() + value2.getOfficialAccountOrderUserCount());
+            result.setOfficialAccountOrderUserCountHour(value2.getOfficialAccountOrderUserCount());
+            // 公众号内下单独立用户数(UV)/公众号关注次数
+            result.setOfficialAccountOrderRateAll(result.getOfficialAccountFollowCountTotal() == 0 ? 0.0 : result.getOfficialAccountOrderUserCountTotal() / result.getOfficialAccountFollowCountTotal());
+            result.setOfficialAccountOrderRateDay(isUnSameDay ? 0: result.getOfficialAccountFollowCountDay() == 0 ? 0.0 : result.getOfficialAccountOrderUserCountDay() / result.getOfficialAccountFollowCountDay());
+            result.setOfficialAccountOrderRateHour(value2.getOfficialAccountOrderRate());
+            // 广告花费/广告产生的下单行为数量
+            result.setOfficialAccountOrderCostAll(result.getOfficialAccountOrderCountTotal() == 0 ? 0 : result.getCostTotal() / result.getOfficialAccountOrderCountTotal());
+            result.setOfficialAccountOrderCostDay(isUnSameDay ? 0: result.getOfficialAccountOrderCountDay() == 0 ? 0 : result.getCostDay() / result.getOfficialAccountOrderCountDay());
+            result.setOfficialAccountOrderCostHour(value2.getOfficialAccountOrderCost());
+            result.setOfficialAccountOrderAmountTotal(value1.getOfficialAccountOrderAmountTotal() + value2.getOfficialAccountOrderAmount());
+            result.setOfficialAccountOrderAmountDay(isUnSameDay ? 0: value1.getOfficialAccountOrderAmountDay() + value2.getOfficialAccountOrderAmount());
+            result.setOfficialAccountOrderAmountHour(value2.getOfficialAccountOrderAmount());
+            result.setOfficialAccountFirstDayOrderAmountTotal(value1.getOfficialAccountFirstDayOrderAmountTotal() + value2.getOfficialAccountFirstDayOrderAmount());
+            result.setOfficialAccountFirstDayOrderAmountDay(isUnSameDay ? 0: value1.getOfficialAccountFirstDayOrderAmountDay() + value2.getOfficialAccountFirstDayOrderAmount());
+            result.setOfficialAccountFirstDayOrderAmountHour(value2.getOfficialAccountFirstDayOrderAmount());
+            // 下单产生的订单金额累计/广告花费
+            result.setOfficialAccountOrderRoiAll(result.getCostTotal() == 0 ? 0 : result.getOfficialAccountOrderAmountTotal() / result.getCostTotal());
+            result.setOfficialAccountOrderRoiDay(isUnSameDay ? 0: result.getCostDay() == 0 ? 0 : result.getOfficialAccountOrderAmountDay() / result.getCostDay());
+            result.setOfficialAccountOrderRoiHour(value2.getOfficialAccountOrderRoi());
+            result.setOfficialAccountConsultCountTotal(value1.getOfficialAccountConsultCountTotal() + value2.getOfficialAccountConsultCount());
+            result.setOfficialAccountConsultCountDay(isUnSameDay ? 0: value1.getOfficialAccountConsultCountDay() + value2.getOfficialAccountConsultCount());
+            result.setOfficialAccountConsultCountHour(value2.getOfficialAccountConsultCount());
+            result.setOfficialAccountReaderCountTotal(value1.getOfficialAccountReaderCountTotal() + value2.getOfficialAccountReaderCount());
+            result.setOfficialAccountReaderCountDay(isUnSameDay ? 0: value1.getOfficialAccountReaderCountDay() + value2.getOfficialAccountReaderCount());
+            result.setOfficialAccountReaderCountHour(value2.getOfficialAccountReaderCount());
+            result.setOfficialAccountCreditApplyUserCountTotal(value1.getOfficialAccountCreditApplyUserCountTotal() + value2.getOfficialAccountCreditApplyUserCount());
+            result.setOfficialAccountCreditApplyUserCountDay(isUnSameDay ? 0: value1.getOfficialAccountCreditApplyUserCountDay() + value2.getOfficialAccountCreditApplyUserCount());
+            result.setOfficialAccountCreditApplyUserCountHour(value2.getOfficialAccountCreditApplyUserCount());
+            result.setOfficialAccountCreditUserCountTotal(value1.getOfficialAccountCreditUserCountTotal() + value2.getOfficialAccountCreditUserCount());
+            result.setOfficialAccountCreditUserCountDay(isUnSameDay ? 0: value1.getOfficialAccountCreditUserCountDay() + value2.getOfficialAccountCreditUserCount());
+            result.setOfficialAccountCreditUserCountHour(value2.getOfficialAccountCreditUserCount());
+            result.setForwardCountTotal(value1.getForwardCountTotal() + value2.getForwardCount());
+            result.setForwardCountDay(isUnSameDay ? 0: value1.getForwardCountDay() + value2.getForwardCount());
+            result.setForwardCountHour(value2.getForwardCount());
+            result.setForwardUserCountTotal(value1.getForwardUserCountTotal() + value2.getForwardUserCount());
+            result.setForwardUserCountDay(isUnSameDay ? 0: value1.getForwardUserCountDay() + value2.getForwardUserCount());
+            result.setForwardUserCountHour(value2.getForwardUserCount());
+            result.setNoInterestCountTotal(value1.getNoInterestCountTotal() + value2.getNoInterestCount());
+            result.setNoInterestCountDay(isUnSameDay ? 0: value1.getNoInterestCountDay() + value2.getNoInterestCount());
+            result.setNoInterestCountHour(value2.getNoInterestCount());
+        }
+        return result;
+    }
+
+    public static AdStatOfHourDWD byMaxCompute(Record record) {
+        AdStatOfHourDWD result = new AdStatOfHourDWD();
+        result.setStatDay(ObjectUtil.toString(record.get("stat_day")));
+        result.setHour(ObjectUtil.toInt(record.get("hour")));
+        result.setAccountId(ObjectUtil.toLong(record.get("account_id")));
+        result.setCampaignId(ObjectUtil.toLong(record.get("campaign_id")));
+        result.setAgencyAccountId(ObjectUtil.toLong(record.get("agency_account_id")));
+        result.setWechatAccountId(ObjectUtil.toString(record.get("wechat_account_id")));
+        result.setWechatAgencyId(ObjectUtil.toString(record.get("wechat_agency_id")));
+        result.setAdgroupId(ObjectUtil.toLong(record.get("adgroup_id")));
+        result.setAdId(ObjectUtil.toLong(record.get("ad_id")));
+        result.setCreateTime(ObjectUtil.toDate(record.get("create_time")));
+        result.setCostDeviationRateTotal(ObjectUtil.toDouble(record.get("cost_deviation_rate_total")));
+        result.setCostDeviationRateDay(ObjectUtil.toDouble(record.get("cost_deviation_rate_day")));
+        result.setCostDeviationRateHour(ObjectUtil.toDouble(record.get("cost_deviation_rate_hour")));
+        result.setCostTotal(ObjectUtil.toLong(record.get("cost_total")));
+        result.setCostDay(ObjectUtil.toLong(record.get("cost_day")));
+        result.setCostHour(ObjectUtil.toLong(record.get("cost_hour")));
+        result.setCompensationAmountTotal(ObjectUtil.toLong(record.get("compensation_amount_total")));
+        result.setCompensationAmountDay(ObjectUtil.toLong(record.get("compensation_amount_day")));
+        result.setCompensationAmountHour(ObjectUtil.toLong(record.get("compensation_amount_hour")));
+        result.setViewCountTotal(ObjectUtil.toLong(record.get("view_count_total")));
+        result.setViewCountDay(ObjectUtil.toLong(record.get("view_count_day")));
+        result.setViewCountHour(ObjectUtil.toLong(record.get("view_count_hour")));
+        result.setThousandDisplayPriceAll(ObjectUtil.toLong(record.get("thousand_display_price_all")));
+        result.setThousandDisplayPriceDay(ObjectUtil.toLong(record.get("thousand_display_price_day")));
+        result.setThousandDisplayPriceHour(ObjectUtil.toLong(record.get("thousand_display_price_hour")));
+        result.setAvgViewPerUserHour(ObjectUtil.toDouble(record.get("avg_view_per_user_hour")));
+        result.setValidClickCountTotal(ObjectUtil.toLong(record.get("valid_click_count_total")));
+        result.setValidClickCountDay(ObjectUtil.toLong(record.get("valid_click_count_day")));
+        result.setValidClickCountHour(ObjectUtil.toLong(record.get("valid_click_count_hour")));
+        result.setCtrAll(ObjectUtil.toDouble(record.get("ctr_all")));
+        result.setCtrDay(ObjectUtil.toDouble(record.get("ctr_day")));
+        result.setCtrHour(ObjectUtil.toDouble(record.get("ctr_hour")));
+        result.setCpcAll(ObjectUtil.toLong(record.get("cpc_all")));
+        result.setCpcDay(ObjectUtil.toLong(record.get("cpc_day")));
+        result.setCpcHour(ObjectUtil.toLong(record.get("cpc_hour")));
+        result.setValuableClickCountTotal(ObjectUtil.toLong(record.get("valuable_click_count_total")));
+        result.setValuableClickCountDay(ObjectUtil.toLong(record.get("valuable_click_count_day")));
+        result.setValuableClickCountHour(ObjectUtil.toLong(record.get("valuable_click_count_hour")));
+        result.setValuableClickRateAll(ObjectUtil.toDouble(record.get("valuable_click_rate_all")));
+        result.setValuableClickRateDay(ObjectUtil.toDouble(record.get("valuable_click_rate_day")));
+        result.setValuableClickRateHour(ObjectUtil.toDouble(record.get("valuable_click_rate_hour")));
+        result.setValuableClickCostAll(ObjectUtil.toLong(record.get("valuable_click_cost_all")));
+        result.setValuableClickCostDay(ObjectUtil.toLong(record.get("valuable_click_cost_day")));
+        result.setValuableClickCostHour(ObjectUtil.toLong(record.get("valuable_click_cost_hour")));
+        result.setConversionsCountTotal(ObjectUtil.toLong(record.get("conversions_count_total")));
+        result.setConversionsCountDay(ObjectUtil.toLong(record.get("conversions_count_day")));
+        result.setConversionsCountHour(ObjectUtil.toLong(record.get("conversions_count_hour")));
+        result.setConversionsCostAll(ObjectUtil.toLong(record.get("conversions_cost_all")));
+        result.setConversionsCostDay(ObjectUtil.toLong(record.get("conversions_cost_day")));
+        result.setConversionsCostHour(ObjectUtil.toLong(record.get("conversions_cost_hour")));
+        result.setConversionsRateAll(ObjectUtil.toDouble(record.get("conversions_rate_all")));
+        result.setConversionsRateDay(ObjectUtil.toDouble(record.get("conversions_rate_day")));
+        result.setConversionsRateHour(ObjectUtil.toDouble(record.get("conversions_rate_hour")));
+        result.setDeepConversionsCountTotal(ObjectUtil.toLong(record.get("deep_conversions_count_total")));
+        result.setDeepConversionsCountDay(ObjectUtil.toLong(record.get("deep_conversions_count_day")));
+        result.setDeepConversionsCountHour(ObjectUtil.toLong(record.get("deep_conversions_count_hour")));
+        result.setDeepConversionsCostAll(ObjectUtil.toLong(record.get("deep_conversions_cost_all")));
+        result.setDeepConversionsCostDay(ObjectUtil.toLong(record.get("deep_conversions_cost_day")));
+        result.setDeepConversionsCostHour(ObjectUtil.toLong(record.get("deep_conversions_cost_hour")));
+        result.setDeepConversionsRateAll(ObjectUtil.toDouble(record.get("deep_conversions_rate_all")));
+        result.setDeepConversionsRateDay(ObjectUtil.toDouble(record.get("deep_conversions_rate_day")));
+        result.setDeepConversionsRateHour(ObjectUtil.toDouble(record.get("deep_conversions_rate_hour")));
+        result.setOrderCountTotal(ObjectUtil.toLong(record.get("order_count_total")));
+        result.setOrderCountDay(ObjectUtil.toLong(record.get("order_count_day")));
+        result.setOrderCountHour(ObjectUtil.toLong(record.get("order_count_hour")));
+        result.setFirstDayOrderCountTotal(ObjectUtil.toLong(record.get("first_day_order_count_total")));
+        result.setFirstDayOrderCountDay(ObjectUtil.toLong(record.get("first_day_order_count_day")));
+        result.setFirstDayOrderCountHour(ObjectUtil.toLong(record.get("first_day_order_count_hour")));
+        result.setWebOrderCostAll(ObjectUtil.toLong(record.get("web_order_cost_all")));
+        result.setWebOrderCostDay(ObjectUtil.toLong(record.get("web_order_cost_day")));
+        result.setWebOrderCostHour(ObjectUtil.toLong(record.get("web_order_cost_hour")));
+        result.setOrderRateAll(ObjectUtil.toDouble(record.get("order_rate_all")));
+        result.setOrderRateDay(ObjectUtil.toDouble(record.get("order_rate_day")));
+        result.setOrderRateHour(ObjectUtil.toDouble(record.get("order_rate_hour")));
+        result.setOrderAmountTotal(ObjectUtil.toLong(record.get("order_amount_total")));
+        result.setOrderAmountDay(ObjectUtil.toLong(record.get("order_amount_day")));
+        result.setOrderAmountHour(ObjectUtil.toLong(record.get("order_amount_hour")));
+        result.setFirstDayOrderAmountTotal(ObjectUtil.toLong(record.get("first_day_order_amount_total")));
+        result.setFirstDayOrderAmountDay(ObjectUtil.toLong(record.get("first_day_order_amount_day")));
+        result.setFirstDayOrderAmountHour(ObjectUtil.toLong(record.get("first_day_order_amount_hour")));
+        result.setOrderUnitPriceAll(ObjectUtil.toLong(record.get("order_unit_price_all")));
+        result.setOrderUnitPriceDay(ObjectUtil.toLong(record.get("order_unit_price_day")));
+        result.setOrderUnitPriceHour(ObjectUtil.toLong(record.get("order_unit_price_hour")));
+        result.setOrderRoiAll(ObjectUtil.toDouble(record.get("order_roi_all")));
+        result.setOrderRoiDay(ObjectUtil.toDouble(record.get("order_roi_day")));
+        result.setOrderRoiHour(ObjectUtil.toDouble(record.get("order_roi_hour")));
+        result.setSignInCountTotal(ObjectUtil.toLong(record.get("sign_in_count_total")));
+        result.setSignInCountDay(ObjectUtil.toLong(record.get("sign_in_count_day")));
+        result.setSignInCountHour(ObjectUtil.toLong(record.get("sign_in_count_hour")));
+        result.setScanFollowCountTotal(ObjectUtil.toLong(record.get("scan_follow_count_total")));
+        result.setScanFollowCountDay(ObjectUtil.toLong(record.get("scan_follow_count_day")));
+        result.setScanFollowCountHour(ObjectUtil.toLong(record.get("scan_follow_count_hour")));
+        result.setWechatAppRegisterUvTotal(ObjectUtil.toLong(record.get("wechat_app_register_uv_total")));
+        result.setWechatAppRegisterUvDay(ObjectUtil.toLong(record.get("wechat_app_register_uv_day")));
+        result.setWechatAppRegisterUvHour(ObjectUtil.toLong(record.get("wechat_app_register_uv_hour")));
+        result.setWechatMinigameRegisterCostAll(ObjectUtil.toLong(record.get("wechat_minigame_register_cost_all")));
+        result.setWechatMinigameRegisterCostDay(ObjectUtil.toLong(record.get("wechat_minigame_register_cost_day")));
+        result.setWechatMinigameRegisterCostHour(ObjectUtil.toLong(record.get("wechat_minigame_register_cost_hour")));
+        result.setWechatMinigameRegisterRateAll(ObjectUtil.toDouble(record.get("wechat_minigame_register_rate_all")));
+        result.setWechatMinigameRegisterRateDay(ObjectUtil.toDouble(record.get("wechat_minigame_register_rate_day")));
+        result.setWechatMinigameRegisterRateHour(ObjectUtil.toDouble(record.get("wechat_minigame_register_rate_hour")));
+        result.setWechatMinigameArpuAll(ObjectUtil.toDouble(record.get("wechat_minigame_arpu_all")));
+        result.setWechatMinigameArpuDay(ObjectUtil.toDouble(record.get("wechat_minigame_arpu_day")));
+        result.setWechatMinigameArpuHour(ObjectUtil.toDouble(record.get("wechat_minigame_arpu_hour")));
+        result.setWechatMinigameRetentionCountTotal(ObjectUtil.toLong(record.get("wechat_minigame_retention_count_total")));
+        result.setWechatMinigameRetentionCountDay(ObjectUtil.toLong(record.get("wechat_minigame_retention_count_day")));
+        result.setWechatMinigameRetentionCountHour(ObjectUtil.toLong(record.get("wechat_minigame_retention_count_hour")));
+        result.setWechatMinigameCheckoutCountTotal(ObjectUtil.toLong(record.get("wechat_minigame_checkout_count_total")));
+        result.setWechatMinigameCheckoutCountDay(ObjectUtil.toLong(record.get("wechat_minigame_checkout_count_day")));
+        result.setWechatMinigameCheckoutCountHour(ObjectUtil.toLong(record.get("wechat_minigame_checkout_count_hour")));
+        result.setWechatMinigameCheckoutAmountTotal(ObjectUtil.toLong(record.get("wechat_minigame_checkout_amount_total")));
+        result.setWechatMinigameCheckoutAmountDay(ObjectUtil.toLong(record.get("wechat_minigame_checkout_amount_day")));
+        result.setWechatMinigameCheckoutAmountHour(ObjectUtil.toLong(record.get("wechat_minigame_checkout_amount_hour")));
+        result.setOfficialAccountFollowCountTotal(ObjectUtil.toLong(record.get("official_account_follow_count_total")));
+        result.setOfficialAccountFollowCountDay(ObjectUtil.toLong(record.get("official_account_follow_count_day")));
+        result.setOfficialAccountFollowCountHour(ObjectUtil.toLong(record.get("official_account_follow_count_hour")));
+        result.setOfficialAccountFollowRateAll(ObjectUtil.toDouble(record.get("official_account_follow_rate_all")));
+        result.setOfficialAccountFollowRateDay(ObjectUtil.toDouble(record.get("official_account_follow_rate_day")));
+        result.setOfficialAccountFollowRateHour(ObjectUtil.toDouble(record.get("official_account_follow_rate_hour")));
+        result.setOfficialAccountRegisterUserCountTotal(ObjectUtil.toLong(record.get("official_account_register_user_count_total")));
+        result.setOfficialAccountRegisterUserCountDay(ObjectUtil.toLong(record.get("official_account_register_user_count_day")));
+        result.setOfficialAccountRegisterUserCountHour(ObjectUtil.toLong(record.get("official_account_register_user_count_hour")));
+        result.setOfficialAccountRegisterRateAll(ObjectUtil.toDouble(record.get("official_account_register_rate_all")));
+        result.setOfficialAccountRegisterRateDay(ObjectUtil.toDouble(record.get("official_account_register_rate_day")));
+        result.setOfficialAccountRegisterRateHour(ObjectUtil.toDouble(record.get("official_account_register_rate_hour")));
+        result.setOfficialAccountRegisterCostAll(ObjectUtil.toLong(record.get("official_account_register_cost_all")));
+        result.setOfficialAccountRegisterCostDay(ObjectUtil.toLong(record.get("official_account_register_cost_day")));
+        result.setOfficialAccountRegisterCostHour(ObjectUtil.toLong(record.get("official_account_register_cost_hour")));
+        result.setOfficialAccountRegisterAmountTotal(ObjectUtil.toLong(record.get("official_account_register_amount_total")));
+        result.setOfficialAccountRegisterAmountDay(ObjectUtil.toLong(record.get("official_account_register_amount_day")));
+        result.setOfficialAccountRegisterAmountHour(ObjectUtil.toLong(record.get("official_account_register_amount_hour")));
+        result.setOfficialAccountRegisterRoiAll(ObjectUtil.toLong(record.get("official_account_register_roi_all")));
+        result.setOfficialAccountRegisterRoiDay(ObjectUtil.toLong(record.get("official_account_register_roi_day")));
+        result.setOfficialAccountRegisterRoiHour(ObjectUtil.toLong(record.get("official_account_register_roi_hour")));
+        result.setOfficialAccountApplyCountTotal(ObjectUtil.toLong(record.get("official_account_apply_count_total")));
+        result.setOfficialAccountApplyCountDay(ObjectUtil.toLong(record.get("official_account_apply_count_day")));
+        result.setOfficialAccountApplyCountHour(ObjectUtil.toLong(record.get("official_account_apply_count_hour")));
+        result.setOfficialAccountApplyUserCountTotal(ObjectUtil.toLong(record.get("official_account_apply_user_count_total")));
+        result.setOfficialAccountApplyUserCountDay(ObjectUtil.toLong(record.get("official_account_apply_user_count_day")));
+        result.setOfficialAccountApplyUserCountHour(ObjectUtil.toLong(record.get("official_account_apply_user_count_hour")));
+        result.setOfficialAccountApplyRateAll(ObjectUtil.toDouble(record.get("official_account_apply_rate_all")));
+        result.setOfficialAccountApplyRateDay(ObjectUtil.toDouble(record.get("official_account_apply_rate_day")));
+        result.setOfficialAccountApplyRateHour(ObjectUtil.toDouble(record.get("official_account_apply_rate_hour")));
+        result.setOfficialAccountApplyCostAll(ObjectUtil.toLong(record.get("official_account_apply_cost_all")));
+        result.setOfficialAccountApplyCostDay(ObjectUtil.toLong(record.get("official_account_apply_cost_day")));
+        result.setOfficialAccountApplyCostHour(ObjectUtil.toLong(record.get("official_account_apply_cost_hour")));
+        result.setOfficialAccountApplyAmountTotal(ObjectUtil.toLong(record.get("official_account_apply_amount_total")));
+        result.setOfficialAccountApplyAmountDay(ObjectUtil.toLong(record.get("official_account_apply_amount_day")));
+        result.setOfficialAccountApplyAmountHour(ObjectUtil.toLong(record.get("official_account_apply_amount_hour")));
+        result.setOfficialAccountApplyRoiAll(ObjectUtil.toLong(record.get("official_account_apply_roi_all")));
+        result.setOfficialAccountApplyRoiDay(ObjectUtil.toLong(record.get("official_account_apply_roi_day")));
+        result.setOfficialAccountApplyRoiHour(ObjectUtil.toLong(record.get("official_account_apply_roi_hour")));
+        result.setOfficialAccountOrderCountTotal(ObjectUtil.toLong(record.get("official_account_order_count_total")));
+        result.setOfficialAccountOrderCountDay(ObjectUtil.toLong(record.get("official_account_order_count_day")));
+        result.setOfficialAccountOrderCountHour(ObjectUtil.toLong(record.get("official_account_order_count_hour")));
+        result.setOfficialAccountFirstDayOrderCountTotal(ObjectUtil.toLong(record.get("official_account_first_day_order_count_total")));
+        result.setOfficialAccountFirstDayOrderCountDay(ObjectUtil.toLong(record.get("official_account_first_day_order_count_day")));
+        result.setOfficialAccountFirstDayOrderCountHour(ObjectUtil.toLong(record.get("official_account_first_day_order_count_hour")));
+        result.setOfficialAccountOrderUserCountTotal(ObjectUtil.toLong(record.get("official_account_order_user_count_total")));
+        result.setOfficialAccountOrderUserCountDay(ObjectUtil.toLong(record.get("official_account_order_user_count_day")));
+        result.setOfficialAccountOrderUserCountHour(ObjectUtil.toLong(record.get("official_account_order_user_count_hour")));
+        result.setOfficialAccountOrderRateAll(ObjectUtil.toDouble(record.get("official_account_order_rate_all")));
+        result.setOfficialAccountOrderRateDay(ObjectUtil.toDouble(record.get("official_account_order_rate_day")));
+        result.setOfficialAccountOrderRateHour(ObjectUtil.toDouble(record.get("official_account_order_rate_hour")));
+        result.setOfficialAccountOrderCostAll(ObjectUtil.toLong(record.get("official_account_order_cost_all")));
+        result.setOfficialAccountOrderCostDay(ObjectUtil.toLong(record.get("official_account_order_cost_day")));
+        result.setOfficialAccountOrderCostHour(ObjectUtil.toLong(record.get("official_account_order_cost_hour")));
+        result.setOfficialAccountOrderAmountTotal(ObjectUtil.toLong(record.get("official_account_order_amount_total")));
+        result.setOfficialAccountOrderAmountDay(ObjectUtil.toLong(record.get("official_account_order_amount_day")));
+        result.setOfficialAccountOrderAmountHour(ObjectUtil.toLong(record.get("official_account_order_amount_hour")));
+        result.setOfficialAccountFirstDayOrderAmountTotal(ObjectUtil.toLong(record.get("official_account_first_day_order_amount_total")));
+        result.setOfficialAccountFirstDayOrderAmountDay(ObjectUtil.toLong(record.get("official_account_first_day_order_amount_day")));
+        result.setOfficialAccountFirstDayOrderAmountHour(ObjectUtil.toLong(record.get("official_account_first_day_order_amount_hour")));
+        result.setOfficialAccountOrderRoiAll(ObjectUtil.toLong(record.get("official_account_order_roi_all")));
+        result.setOfficialAccountOrderRoiDay(ObjectUtil.toLong(record.get("official_account_order_roi_day")));
+        result.setOfficialAccountOrderRoiHour(ObjectUtil.toLong(record.get("official_account_order_roi_hour")));
+        result.setOfficialAccountConsultCountTotal(ObjectUtil.toLong(record.get("official_account_consult_count_total")));
+        result.setOfficialAccountConsultCountDay(ObjectUtil.toLong(record.get("official_account_consult_count_day")));
+        result.setOfficialAccountConsultCountHour(ObjectUtil.toLong(record.get("official_account_consult_count_hour")));
+        result.setOfficialAccountReaderCountTotal(ObjectUtil.toLong(record.get("official_account_reader_count_total")));
+        result.setOfficialAccountReaderCountDay(ObjectUtil.toLong(record.get("official_account_reader_count_day")));
+        result.setOfficialAccountReaderCountHour(ObjectUtil.toLong(record.get("official_account_reader_count_hour")));
+        result.setOfficialAccountCreditApplyUserCountTotal(ObjectUtil.toLong(record.get("official_account_credit_apply_user_count_total")));
+        result.setOfficialAccountCreditApplyUserCountDay(ObjectUtil.toLong(record.get("official_account_credit_apply_user_count_day")));
+        result.setOfficialAccountCreditApplyUserCountHour(ObjectUtil.toLong(record.get("official_account_credit_apply_user_count_hour")));
+        result.setOfficialAccountCreditUserCountTotal(ObjectUtil.toLong(record.get("official_account_credit_user_count_total")));
+        result.setOfficialAccountCreditUserCountDay(ObjectUtil.toLong(record.get("official_account_credit_user_count_day")));
+        result.setOfficialAccountCreditUserCountHour(ObjectUtil.toLong(record.get("official_account_credit_user_count_hour")));
+        result.setForwardCountTotal(ObjectUtil.toLong(record.get("forward_count_total")));
+        result.setForwardCountDay(ObjectUtil.toLong(record.get("forward_count_day")));
+        result.setForwardCountHour(ObjectUtil.toLong(record.get("forward_count_hour")));
+        result.setForwardUserCountTotal(ObjectUtil.toLong(record.get("forward_user_count_total")));
+        result.setForwardUserCountDay(ObjectUtil.toLong(record.get("forward_user_count_day")));
+        result.setForwardUserCountHour(ObjectUtil.toLong(record.get("forward_user_count_hour")));
+        result.setNoInterestCountTotal(ObjectUtil.toLong(record.get("no_interest_count_total")));
+        result.setNoInterestCountDay(ObjectUtil.toLong(record.get("no_interest_count_day")));
+        result.setNoInterestCountHour(ObjectUtil.toLong(record.get("no_interest_count_hour")));
         return result;
     }
 }

+ 2 - 2
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdStatOfMinuteDWD.java

@@ -74,8 +74,8 @@ public class AdStatOfMinuteDWD {
     /**
      * 当日成本偏差。反映广告今日的实际成本与目标成本直接的差异,注:该项成本相关数据按小时更新,与实时更新的「转化目标成本」数据存在出入属于正常情况。
      */
-    @SerializedName("cost_deviation_rate_all")
-    private Double costDeviationRateAll;
+    @SerializedName("cost_deviation_rate_total")
+    private Double costDeviationRateTotal;
 
     /**
      * 当日成本偏差。反映广告今日的实际成本与目标成本直接的差异,注:该项成本相关数据按小时更新,与实时更新的「转化目标成本」数据存在出入属于正常情况。

+ 10 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/ObjectUtil.java

@@ -8,6 +8,16 @@ import java.util.Date;
 
 public class ObjectUtil {
 
+    public static String toString(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (obj instanceof String) {
+            return (String) obj;
+        }
+        return obj.toString();
+    }
+
     public static Long toLong(Object obj) {
         if (obj == null) {
             return null;