Pārlūkot izejas kodu

初始化项目

wcc 3 gadi atpakaļ
revīzija
d3ec085c36

+ 34 - 0
.gitignore

@@ -0,0 +1,34 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+document/

+ 252 - 0
flink-ad-monitoring/pom.xml

@@ -0,0 +1,252 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>flink.zanxiangnet.ad.monitoring</groupId>
+    <artifactId>flink-ad-monitoring</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>Flink Walkthrough DataStream Java</name>
+    <url>https://flink.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <flink.version>1.14.0</flink.version>
+        <target.java.version>1.8</target.java.version>
+        <scala.binary.version>2.11</scala.binary.version>
+        <maven.compiler.source>${target.java.version}</maven.compiler.source>
+        <maven.compiler.target>${target.java.version}</maven.compiler.target>
+        <log4j.version>2.14.1</log4j.version>
+        <jackson.version>2.13.0</jackson.version>
+        <odps.version>0.37.10-public</odps.version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>apache.snapshots</id>
+            <name>Apache Development Snapshot Repository</name>
+            <url>https://repository.apache.org/content/repositories/snapshots/</url>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <dependencies>
+
+        <!-- This dependency is provided, because it should not be packaged into the JAR file. -->
+        <dependency>
+            <groupId>org.apache.flink</groupId>
+            <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
+            <version>${flink.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.flink</groupId>
+            <artifactId>flink-clients_${scala.binary.version}</artifactId>
+            <version>${flink.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+
+        <!-- Add connector dependencies here. They must be in the default scope (compile). -->
+
+        <!-- kafka作为数据源 -->
+        <dependency>
+            <groupId>org.apache.flink</groupId>
+            <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId>
+            <version>${flink.version}</version>
+        </dependency>
+
+        <!-- Add logging framework, to produce console output when running in the IDE. -->
+        <!-- These dependencies are excluded from the application JAR by default. -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <version>${log4j.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <version>${log4j.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <version>${log4j.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun.odps</groupId>
+            <artifactId>odps-sdk-core</artifactId>
+            <version>${odps.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tencent.ads</groupId>
+            <artifactId>marketing-api-java-sdk</artifactId>
+            <version>1.1.29</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.2</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+            <version>5.2.9.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>ru.yandex.clickhouse</groupId>
+            <artifactId>clickhouse-jdbc</artifactId>
+            <version>0.3.1</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+
+            <!-- Java Compiler -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${target.java.version}</source>
+                    <target>${target.java.version}</target>
+                </configuration>
+            </plugin>
+
+            <!-- We use the maven-shade plugin to create a fat jar that contains all necessary dependencies. -->
+            <!-- Change the value of <mainClass>...</mainClass> if your program entry point changes. -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>3.0.0</version>
+                <executions>
+                    <!-- Run shade goal on package phase -->
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <artifactSet>
+                                <excludes>
+                                    <exclude>org.apache.flink:flink-shaded-force-shading</exclude>
+                                    <exclude>com.google.code.findbugs:jsr305</exclude>
+                                    <exclude>org.slf4j:*</exclude>
+                                    <exclude>org.apache.logging.log4j:*</exclude>
+                                </excludes>
+                            </artifactSet>
+                            <filters>
+                                <filter>
+                                    <!-- Do not copy the signatures in the META-INF folder.
+                                    Otherwise, this might cause SecurityExceptions when using the JAR. -->
+                                    <artifact>*:*</artifact>
+                                    <excludes>
+                                        <exclude>META-INF/*.SF</exclude>
+                                        <exclude>META-INF/*.DSA</exclude>
+                                        <exclude>META-INF/*.RSA</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                            <transformers>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                    <mainClass>flink.zanxiangnet.ad.monitoring.KafkaDemoJob</mainClass>
+                                </transformer>
+                            </transformers>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+
+                <!-- This improves the out-of-the-box experience in Eclipse by resolving some warnings. -->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-shade-plugin</artifactId>
+                                        <versionRange>[3.0.0,)</versionRange>
+                                        <goals>
+                                            <goal>shade</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore/>
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-compiler-plugin</artifactId>
+                                        <versionRange>[3.1,)</versionRange>
+                                        <goals>
+                                            <goal>testCompile</goal>
+                                            <goal>compile</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore/>
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>

+ 153 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/KafkaDemoJob.java

@@ -0,0 +1,153 @@
+package flink.zanxiangnet.ad.monitoring;
+
+import com.tencent.ads.model.HourlyReportsGetListStruct;
+import flink.zanxiangnet.ad.monitoring.pojo.AdInfo;
+import flink.zanxiangnet.ad.monitoring.pojo.PlanInfo;
+import flink.zanxiangnet.ad.monitoring.pojo.StatInfo;
+import flink.zanxiangnet.ad.monitoring.pojo.dto.AdDataOfHourDTO;
+import flink.zanxiangnet.ad.monitoring.util.DateUtil;
+import flink.zanxiangnet.ad.monitoring.util.JsonUtil;
+import flink.zanxiangnet.ad.monitoring.util.NumberUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.flink.api.common.eventtime.SerializableTimestampAssigner;
+import org.apache.flink.api.common.eventtime.WatermarkStrategy;
+import org.apache.flink.api.common.functions.ReduceFunction;
+import org.apache.flink.api.common.serialization.SimpleStringSchema;
+import org.apache.flink.api.java.functions.KeySelector;
+import org.apache.flink.connector.kafka.source.KafkaSource;
+import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
+import org.apache.flink.streaming.api.datastream.DataStreamSource;
+import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
+import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
+import org.apache.flink.streaming.api.functions.sink.SinkFunction;
+import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
+import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows;
+import org.apache.flink.streaming.api.windowing.time.Time;
+import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
+import org.apache.flink.util.Collector;
+import org.apache.kafka.clients.CommonClientConfigs;
+import org.apache.kafka.common.config.SaslConfigs;
+import org.apache.kafka.common.config.SslConfigs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+
+import java.time.Duration;
+import java.util.Properties;
+
+public class KafkaDemoJob {
+
+    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.trustStorePassword", "KafkaOnsClient");
+        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
+
+        Properties props = new Properties();
+        // props.put(SaslConfigs.SASL_JAAS_CONFIG, "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"alikafka_pre-cn-tl32fsx4l00x\" password=\"VOEdhZLjOrL76lrl5bqPtydtoEkbs0Ny\";");
+        props.put(SaslConfigs.SASL_JAAS_CONFIG, "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"alikafka_pre-cn-tl32fsx4l00x\" password=\"VOEdhZLjOrL76lrl5bqPtydtoEkbs0Ny\";");
+        props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, "D:\\Downloads\\kafka.client.truststore.jks");
+        props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, "KafkaOnsClient");
+        props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");
+        props.put(SaslConfigs.SASL_MECHANISM, "PLAIN");
+        props.put(SslConfigs.SSL_ENDPOINT_IDENTIFICATION_ALGORITHM_CONFIG, "");
+        KafkaSource<String> kafkaSource = KafkaSource.<String>builder()
+                .setBootstrapServers("114.55.59.94:9093,112.124.33.132:9093")
+                .setTopics("ad_cost_topic")
+                .setGroupId("ad_cost_group")
+                .setProperties(props)
+                .setStartingOffsets(OffsetsInitializer.earliest())
+                .setValueOnlyDeserializer(new SimpleStringSchema())
+                .build();
+
+        /*DataStreamSource<String> in = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "Kafka Source");
+
+        SingleOutputStreamOperator<String> adInfo = in.filter(StringUtils::isNotBlank).map(str -> {
+            File file = new File("C:\\Users\\hi\\Desktop\\temp\\ff.txt");
+            if (!file.exists()) {
+                file.createNewFile();
+            }
+            FileWriter writer = new FileWriter(file, true);
+            writer.write(str + "\r\n");
+            writer.close();
+            return str;
+        });*/
+
+        DataStreamSource<String> in = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "adDataOfMinuteSource_kafka");
+
+        // 广告流
+        SingleOutputStreamOperator<AdInfo> adStream = in.filter(StringUtils::isNotBlank)
+                .map(str -> JsonUtil.toObj(str, AdDataOfHourDTO.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();
+    }
+
+    public static final class PlanOfHourReduceFunction implements ReduceFunction<AdInfo> {
+        @Override
+        public AdInfo reduce(AdInfo oldValue, AdInfo newValue) {
+            HourlyReportsGetListStruct oldStruct = oldValue.getHourlyReportsGetListStruct();
+            HourlyReportsGetListStruct newStruct = newValue.getHourlyReportsGetListStruct();
+            HourlyReportsGetListStruct struct = new HourlyReportsGetListStruct();
+            org.springframework.beans.BeanUtils.copyProperties(newStruct, struct);
+            struct.setCostDeviationRate(NumberUtil.add(oldStruct.getCostDeviationRate(), struct.getCostDeviationRate()));
+            struct.setCost(NumberUtil.add(oldStruct.getCost(), struct.getCost()));
+            struct.setCompensationAmount(NumberUtil.add(oldStruct.getCompensationAmount(), struct.getCompensationAmount()));
+            struct.setViewCount(NumberUtil.add(oldStruct.getViewCount(), struct.getViewCount()));
+
+            AdDataOfHourDTO result = new AdDataOfHourDTO();
+            result.setCreateTime(newValue.getCreateTime());
+            result.setAccountId(newValue.getAccountId());
+            result.setChannel(newValue.getChannel());
+            result.setHourlyReportsGetListStruct(struct);
+            return result;
+        }
+    }
+
+    public static class PrintSink<T> implements SinkFunction<T> {
+        private static final long serialVersionUID = 1L;
+        private static final Logger LOG = LoggerFactory.getLogger(PrintSink.class);
+
+        @Override
+        public void invoke(T value) {
+            LOG.info(value == null ? "null" : JsonUtil.toString(value));
+        }
+    }
+}

+ 15 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/AdGroupInfo.java

@@ -0,0 +1,15 @@
+package flink.zanxiangnet.ad.monitoring.pojo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AdGroupInfo {
+    /**
+     * 广告组 id
+     */
+    private Long adgroupId;
+
+    private List<AdInfo> adList;
+}

+ 64 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/AdInfo.java

@@ -0,0 +1,64 @@
+package flink.zanxiangnet.ad.monitoring.pojo;
+
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class AdInfo {
+
+    /**
+     * 统计时间
+     */
+    private Long statTime;
+
+    /**
+     * 统计的日期
+     */
+    private LocalDate statDay;
+
+    /**
+     * 统计的小时
+     */
+    private Integer hour;
+
+    /**
+     * 腾讯广告应用的账号 id
+     */
+    private Long accountId;
+
+    /**
+     * 计划 id
+     */
+    private Long campaignId;
+
+    /**
+     * 服务商账号 id
+     */
+    private Long agencyAccountId;
+
+    /**
+     * 微信账号id
+     */
+    private String wechatAccountId;
+
+    /**
+     * 微信服务商id
+     */
+    private String wechatAgencyId;
+
+    /**
+     * 广告组 id
+     */
+    private Long adgroupId;
+
+    /**
+     * 广告 id
+     */
+    private Long adId;
+
+    /**
+     * 统计信息
+     */
+    private StatInfo statInfo;
+}

+ 39 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/PlanInfo.java

@@ -0,0 +1,39 @@
+package flink.zanxiangnet.ad.monitoring.pojo;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+public class PlanInfo {
+
+    /**
+     * 统计时间
+     */
+    private Long statTime;
+
+    /**
+     * 统计的日期
+     */
+    private LocalDate statDay;
+
+    /**
+     * 统计的小时
+     */
+    private Integer hour;
+
+    /**
+     * 腾讯广告应用的账号 id
+     */
+    private Long accountId;
+
+    /**
+     * 计划 id
+     */
+    private Long campaignId;
+
+    /**
+     * 计划中的广告组
+     */
+    private List<AdGroupInfo> adGroupList;
+}

+ 1324 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/StatInfo.java

@@ -0,0 +1,1324 @@
+package flink.zanxiangnet.ad.monitoring.pojo;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+@Data
+public class StatInfo {
+    @SerializedName("cost_deviation_rate")
+    private Double costDeviationRate;
+
+    @SerializedName("cost")
+    private Long cost;
+
+    @SerializedName("compensation_amount")
+    private Long compensationAmount;
+
+    @SerializedName("view_count")
+    private Long viewCount;
+
+    @SerializedName("thousand_display_price")
+    private Long thousandDisplayPrice;
+
+    @SerializedName("avg_view_per_user")
+    private Double avgViewPerUser;
+
+    @SerializedName("special_page_exp_uv")
+    private Long specialPageExpUv;
+
+    @SerializedName("special_page_exp_cost")
+    private Long specialPageExpCost;
+
+    @SerializedName("valid_click_count")
+    private Long validClickCount;
+
+    @SerializedName("ctr")
+    private Double ctr;
+
+    @SerializedName("cpc")
+    private Long cpc;
+
+    @SerializedName("valuable_click_count")
+    private Long valuableClickCount;
+
+    @SerializedName("valuable_click_rate")
+    private Double valuableClickRate;
+
+    @SerializedName("valuable_click_cost")
+    private Long valuableClickCost;
+
+    @SerializedName("click_image_count")
+    private Long clickImageCount;
+
+    @SerializedName("image_click_user_count")
+    private Long imageClickUserCount;
+
+    @SerializedName("video_play_count")
+    private Long videoPlayCount;
+
+    @SerializedName("video_click_user_count")
+    private Long videoClickUserCount;
+
+    @SerializedName("click_detail_count")
+    private Long clickDetailCount;
+
+    @SerializedName("link_click_user_count")
+    private Long linkClickUserCount;
+
+    @SerializedName("click_head_count")
+    private Long clickHeadCount;
+
+    @SerializedName("portrait_click_user_count")
+    private Long portraitClickUserCount;
+
+    @SerializedName("click_nick_count")
+    private Long clickNickCount;
+
+
+
+
+    @SerializedName("download_count")
+    private Long downloadCount;
+
+    @SerializedName("activated_count")
+    private Long activatedCount;
+
+    @SerializedName("activated_rate")
+    private Double activatedRate;
+
+    @SerializedName("key_page_view_cost")
+    private Long keyPageViewCost;
+
+    @SerializedName("coupon_click_count")
+    private Long couponClickCount;
+
+    @SerializedName("coupon_issue_count")
+    private Long couponIssueCount;
+
+    @SerializedName("coupon_get_count")
+    private Long couponGetCount;
+
+    @SerializedName("platform_page_view_count")
+    private Long platformPageViewCount;
+
+    @SerializedName("platform_page_view_rate")
+    private Double platformPageViewRate;
+
+    @SerializedName("web_commodity_page_view_count")
+    private Long webCommodityPageViewCount;
+
+    @SerializedName("web_commodity_page_view_cost")
+    private Long webCommodityPageViewCost;
+
+    @SerializedName("web_register_count")
+    private Long webRegisterCount;
+
+    @SerializedName("page_consult_count")
+    private Long pageConsultCount;
+
+    @SerializedName("page_consult_cost")
+    private Long pageConsultCost;
+
+    @SerializedName("page_phone_call_direct_count")
+    private Long pagePhoneCallDirectCount;
+
+    @SerializedName("page_phone_call_direct_cost")
+    private Long pagePhoneCallDirectCost;
+
+    @SerializedName("page_phone_call_back_count")
+    private Long pagePhoneCallBackCount;
+
+    @SerializedName("page_phone_call_back_cost")
+    private Long pagePhoneCallBackCost;
+
+    @SerializedName("own_page_navigation_count")
+    private Long ownPageNavigationCount;
+
+    @SerializedName("own_page_navi_cost")
+    private Long ownPageNaviCost;
+
+    @SerializedName("platform_page_navigation_count")
+    private Long platformPageNavigationCount;
+
+    @SerializedName("platform_page_navigation_cost")
+    private Long platformPageNavigationCost;
+
+    @SerializedName("platform_shop_navigation_count")
+    private Long platformShopNavigationCount;
+
+    @SerializedName("platform_shop_navigation_cost")
+    private Long platformShopNavigationCost;
+
+    @SerializedName("web_application_count")
+    private Long webApplicationCount;
+
+    @SerializedName("web_application_cost")
+    private Long webApplicationCost;
+
+    @SerializedName("page_reservation_count")
+    private Long pageReservationCount;
+
+    @SerializedName("page_reservation_rate")
+    private Double pageReservationRate;
+
+    @SerializedName("page_reservation_cost")
+    private Long pageReservationCost;
+
+    @SerializedName("page_reservation_cost_with_people")
+    private Long pageReservationCostWithPeople;
+
+    @SerializedName("add_to_cart_price")
+    private Long addToCartPrice;
+
+    @SerializedName("own_page_coupon_get_count")
+    private Long ownPageCouponGetCount;
+
+    @SerializedName("own_page_coupon_get_cost")
+    private Long ownPageCouponGetCost;
+
+    @SerializedName("platform_coupon_get_count")
+    private Long platformCouponGetCount;
+
+    @SerializedName("platform_coupon_get_cost")
+    private Long platformCouponGetCost;
+
+    @SerializedName("web_order_count")
+    private Long webOrderCount;
+
+    @SerializedName("web_order_rate")
+    private Double webOrderRate;
+
+    @SerializedName("app_order_rate")
+    private Double appOrderRate;
+
+    @SerializedName("web_order_cost")
+    private Long webOrderCost;
+
+    @SerializedName("web_checkout_amount")
+    private Long webCheckoutAmount;
+
+    @SerializedName("web_checkout_count")
+    private Long webCheckoutCount;
+
+    @SerializedName("web_checkout_cost")
+    private Long webCheckoutCost;
+
+    @SerializedName("order_amount")
+    private Long orderAmount;
+
+    @SerializedName("order_unit_price")
+    private Long orderUnitPrice;
+
+    @SerializedName("order_roi")
+    private Double orderRoi;
+
+    @SerializedName("deliver_count")
+    private Long deliverCount;
+
+    @SerializedName("deliver_cost")
+    private Long deliverCost;
+
+    @SerializedName("sign_in_count")
+    private Long signInCount;
+
+    @SerializedName("sign_in_cost")
+    private Long signInCost;
+
+    @SerializedName("download_rate")
+    private Double downloadRate;
+
+    @SerializedName("download_cost")
+    private Long downloadCost;
+
+    @SerializedName("install_count")
+    private Long installCount;
+
+    @SerializedName("install_cost")
+    private Long installCost;
+
+    @SerializedName("click_activated_rate")
+    private Double clickActivatedRate;
+
+    @SerializedName("activated_cost")
+    private Long activatedCost;
+
+    @SerializedName("retention_count")
+    private Long retentionCount;
+
+    @SerializedName("retention_rate")
+    private Double retentionRate;
+
+    @SerializedName("app_key_page_retention_rate")
+    private Double appKeyPageRetentionRate;
+
+    @SerializedName("retention_cost")
+    private Long retentionCost;
+
+    @SerializedName("key_page_view_count")
+    private Long keyPageViewCount;
+
+    @SerializedName("app_commodity_page_view_count")
+    private Long appCommodityPageViewCount;
+
+    @SerializedName("app_commodity_page_view_rate")
+    private Double appCommodityPageViewRate;
+
+    @SerializedName("web_commodity_page_view_rate")
+    private Double webCommodityPageViewRate;
+
+    @SerializedName("app_commodity_page_view_cost")
+    private Long appCommodityPageViewCost;
+
+    @SerializedName("app_register_count")
+    private Long appRegisterCount;
+
+    @SerializedName("app_register_cost")
+    private Long appRegisterCost;
+
+    @SerializedName("web_register_cost")
+    private Long webRegisterCost;
+
+    @SerializedName("app_application_count")
+    private Long appApplicationCount;
+
+    @SerializedName("app_application_cost")
+    private Long appApplicationCost;
+
+    @SerializedName("app_add_to_cart_count")
+    private Long appAddToCartCount;
+
+    @SerializedName("add_to_cart_amount")
+    private Long addToCartAmount;
+
+    @SerializedName("app_add_to_cart_cost")
+    private Long appAddToCartCost;
+
+    @SerializedName("app_order_count")
+    private Long appOrderCount;
+
+    @SerializedName("app_order_cost")
+    private Long appOrderCost;
+
+    @SerializedName("app_checkout_count")
+    private Long appCheckoutCount;
+
+    @SerializedName("app_checkout_amount")
+    private Long appCheckoutAmount;
+
+    @SerializedName("app_checkout_cost")
+    private Long appCheckoutCost;
+
+    @SerializedName("platform_coupon_click_count")
+    private Long platformCouponClickCount;
+
+    @SerializedName("platform_coupon_get_rate")
+    private Double platformCouponGetRate;
+
+    @SerializedName("coupon_usage_number")
+    private Long couponUsageNumber;
+
+    @SerializedName("coupon_usage_cost")
+    private Long couponUsageCost;
+
+    @SerializedName("coupon_usage_rate")
+    private Double couponUsageRate;
+
+    @SerializedName("coupon_purchase_rate")
+    private Double couponPurchaseRate;
+
+    @SerializedName("follow_count")
+    private Long followCount;
+
+    @SerializedName("follow_cost")
+    private Long followCost;
+
+    @SerializedName("forward_count")
+    private Long forwardCount;
+
+    @SerializedName("forward_cost")
+    private Long forwardCost;
+
+    @SerializedName("read_count")
+    private Long readCount;
+
+    @SerializedName("read_cost")
+    private Long readCost;
+
+    @SerializedName("praise_count")
+    private Long praiseCount;
+
+    @SerializedName("praise_cost")
+    private Long praiseCost;
+
+    @SerializedName("comment_count")
+    private Long commentCount;
+
+    @SerializedName("comment_cost")
+    private Long commentCost;
+
+    @SerializedName("inte_phone_count")
+    private Long intePhoneCount;
+
+    @SerializedName("phone_call_count")
+    private Long phoneCallCount;
+
+    @SerializedName("external_form_reservation_count")
+    private Long externalFormReservationCount;
+
+    @SerializedName("app_ad_paying_users")
+    private Long appAdPayingUsers;
+
+    @SerializedName("ad_pur_val_web")
+    private Long adPurValWeb;
+
+    @SerializedName("ad_pur_val_app")
+    private Long adPurValApp;
+
+    @SerializedName("order_24h_count")
+    private Long order24hCount;
+
+    @SerializedName("order_24h_rate")
+    private Double order24hRate;
+
+    @SerializedName("order_24h_cost")
+    private Long order24hCost;
+
+    @SerializedName("order_24h_amount")
+    private Long order24hAmount;
+
+    @SerializedName("order_24h_roi")
+    private Double order24hRoi;
+
+    @SerializedName("game_create_role_count")
+    private Long gameCreateRoleCount;
+
+    @SerializedName("game_authorize_count")
+    private Long gameAuthorizeCount;
+
+    @SerializedName("game_tutorial_finish_count")
+    private Long gameTutorialFinishCount;
+
+    @SerializedName("effective_leads_count")
+    private Long effectiveLeadsCount;
+
+    @SerializedName("effective_cost")
+    private Long effectiveCost;
+
+    @SerializedName("effective_reserve_count")
+    private Long effectiveReserveCount;
+
+    @SerializedName("effective_consult_count")
+    private Long effectiveConsultCount;
+
+    @SerializedName("effective_phone_count")
+    private Long effectivePhoneCount;
+
+    @SerializedName("potential_reserve_count")
+    private Long potentialReserveCount;
+
+    @SerializedName("potential_consult_count")
+    private Long potentialConsultCount;
+
+    @SerializedName("potential_phone_count")
+    private Long potentialPhoneCount;
+
+    @SerializedName("app_checkout_rate")
+    private Double appCheckoutRate;
+
+    @SerializedName("web_checkout_rate")
+    private Double webCheckoutRate;
+
+    @SerializedName("app_activated_checkout_rate")
+    private Double appActivatedCheckoutRate;
+
+    @SerializedName("web_activated_checkout_rate")
+    private Double webActivatedCheckoutRate;
+
+    @SerializedName("app_register_rate")
+    private Double appRegisterRate;
+
+    @SerializedName("web_reg_rate")
+    private Double webRegRate;
+
+    @SerializedName("page_phone_call_direct_rate")
+    private Double pagePhoneCallDirectRate;
+
+    @SerializedName("page_phone_call_back_rate")
+    private Double pagePhoneCallBackRate;
+
+    @SerializedName("page_consult_rate")
+    private Double pageConsultRate;
+
+    @SerializedName("deliver_rate")
+    private Double deliverRate;
+
+    @SerializedName("install_rate")
+    private Double installRate;
+
+    @SerializedName("arppu_cost")
+    private Long arppuCost;
+
+    @SerializedName("arpu_cost")
+    private Long arpuCost;
+
+    @SerializedName("web_arppu_cost")
+    private Long webArppuCost;
+
+    @SerializedName("web_arpu_cost")
+    private Long webArpuCost;
+
+    @SerializedName("app_ad_pur_arpu_cost")
+    private Long appAdPurArpuCost;
+
+    @SerializedName("app_ad_pur_arppu_cost")
+    private Long appAdPurArppuCost;
+
+    @SerializedName("web_ad_pur_arpu_cost")
+    private Long webAdPurArpuCost;
+
+    @SerializedName("cheout_fd")
+    private Long cheoutFd;
+
+    @SerializedName("cheout_td")
+    private Long cheoutTd;
+
+    @SerializedName("cheout_ow")
+    private Long cheoutOw;
+
+    @SerializedName("cheout_tw")
+    private Long cheoutTw;
+
+    @SerializedName("cheout_om")
+    private Long cheoutOm;
+
+    @SerializedName("cheout_fd_reward")
+    private Double cheoutFdReward;
+
+    @SerializedName("cheout_td_reward")
+    private Double cheoutTdReward;
+
+    @SerializedName("cheout_ow_reward")
+    private Double cheoutOwReward;
+
+    @SerializedName("cheout_tw_reward")
+    private Double cheoutTwReward;
+
+    @SerializedName("cheout_om_reward")
+    private Double cheoutOmReward;
+
+    @SerializedName("cheout_total_reward")
+    private Double cheoutTotalReward;
+
+    @SerializedName("from_follow_uv")
+    private Long fromFollowUv;
+
+    @SerializedName("from_follow_cost")
+    private Long fromFollowCost;
+
+    @SerializedName("add_desktop_pv")
+    private Long addDesktopPv;
+
+    @SerializedName("add_desktop_cost")
+    private Long addDesktopCost;
+
+    @SerializedName("first_pay_count")
+    private Long firstPayCount;
+
+    @SerializedName("first_pay_rate")
+    private Double firstPayRate;
+
+    @SerializedName("pre_cre_web")
+    private Long preCreWeb;
+
+    @SerializedName("pre_cre_app")
+    private Long preCreApp;
+
+    @SerializedName("pre_cre_web_val")
+    private Long preCreWebVal;
+
+    @SerializedName("pre_cre_app_val")
+    private Long preCreAppVal;
+
+    @SerializedName("cre_web")
+    private Long creWeb;
+
+    @SerializedName("cre_app")
+    private Long creApp;
+
+    @SerializedName("cre_web_val")
+    private Long creWebVal;
+
+    @SerializedName("cre_app_val")
+    private Long creAppVal;
+
+    @SerializedName("withdr_dep_web")
+    private Long withdrDepWeb;
+
+    @SerializedName("withdr_dep_app")
+    private Long withdrDepApp;
+
+    @SerializedName("withdr_dep_web_val")
+    private Long withdrDepWebVal;
+
+    @SerializedName("withdr_dep_app_val")
+    private Long withdrDepAppVal;
+
+    @SerializedName("first_pay_cost")
+    private Long firstPayCost;
+
+    @SerializedName("landing_page_click_count")
+    private Long landingPageClickCount;
+
+    @SerializedName("web_cart_amount")
+    private Long webCartAmount;
+
+    @SerializedName("scan_follow_count")
+    private Long scanFollowCount;
+
+    @SerializedName("scan_follow_user_count")
+    private Long scanFollowUserCount;
+
+    @SerializedName("scan_follow_user_cost")
+    private Long scanFollowUserCost;
+
+    @SerializedName("scan_follow_user_rate")
+    private Double scanFollowUserRate;
+
+    @SerializedName("app_order_amount")
+    private Long appOrderAmount;
+
+    @SerializedName("web_order_amount")
+    private Long webOrderAmount;
+
+    @SerializedName("phone_consult_count")
+    private Long phoneConsultCount;
+
+    @SerializedName("tool_consult_count")
+    private Long toolConsultCount;
+
+    @SerializedName("lottery_leads_count")
+    private Long lotteryLeadsCount;
+
+    @SerializedName("lottery_leads_cost")
+    private Long lotteryLeadsCost;
+
+    @SerializedName("conversions_count")
+    private Long conversionsCount;
+
+    @SerializedName("conversions_rate")
+    private Double conversionsRate;
+
+    @SerializedName("conversions_cost")
+    private Long conversionsCost;
+
+    @SerializedName("deep_conversions_count")
+    private Long deepConversionsCount;
+
+    @SerializedName("deep_conversions_rate")
+    private Double deepConversionsRate;
+
+    @SerializedName("deep_conversions_cost")
+    private Long deepConversionsCost;
+
+    @SerializedName("first_memcard_web_count")
+    private Long firstMemcardWebCount;
+
+    @SerializedName("first_memcard_app_count")
+    private Long firstMemcardAppCount;
+
+    @SerializedName("memcard_web_count")
+    private Long memcardWebCount;
+
+    @SerializedName("memcard_app_count")
+    private Long memcardAppCount;
+
+    @SerializedName("first_memcard_web_rate")
+    private Double firstMemcardWebRate;
+
+    @SerializedName("first_memcard_app_rate")
+    private Double firstMemcardAppRate;
+
+    @SerializedName("first_memcard_web_cost")
+    private Long firstMemcardWebCost;
+
+    @SerializedName("first_memcard_app_cost")
+    private Long firstMemcardAppCost;
+
+    @SerializedName("click_poi_count")
+    private Long clickPoiCount;
+
+    @SerializedName("video_inner_play_count")
+    private Long videoInnerPlayCount;
+
+    @SerializedName("lan_button_click_count")
+    private Long lanButtonClickCount;
+
+    @SerializedName("lan_jump_button_clickers")
+    private Long lanJumpButtonClickers;
+
+    @SerializedName("lan_jump_button_click_cost")
+    private Long lanJumpButtonClickCost;
+
+    @SerializedName("lan_jump_button_ctr")
+    private Double lanJumpButtonCtr;
+
+    @SerializedName("lan_button_click_cost")
+    private Long lanButtonClickCost;
+
+    @SerializedName("cpn_click_button_count")
+    private Long cpnClickButtonCount;
+
+    @SerializedName("cpn_click_button_uv")
+    private Long cpnClickButtonUv;
+
+    @SerializedName("key_page_uv")
+    private Long keyPageUv;
+
+    @SerializedName("view_commodity_page_uv")
+    private Long viewCommodityPageUv;
+
+    @SerializedName("effect_leads_purchase_count")
+    private Long effectLeadsPurchaseCount;
+
+    @SerializedName("reservation_uv")
+    private Long reservationUv;
+
+    @SerializedName("overall_leads_purchase_count")
+    private Long overallLeadsPurchaseCount;
+
+    @SerializedName("leads_purchase_count")
+    private Long leadsPurchaseCount;
+
+    @SerializedName("leads_purchase_rate")
+    private Double leadsPurchaseRate;
+
+    @SerializedName("leads_purchase_cost")
+    private Long leadsPurchaseCost;
+
+    @SerializedName("leads_purchase_uv")
+    private Long leadsPurchaseUv;
+
+    @SerializedName("valid_leads_uv")
+    private Long validLeadsUv;
+
+    @SerializedName("phone_call_uv")
+    private Long phoneCallUv;
+
+    @SerializedName("valid_phone_uv")
+    private Long validPhoneUv;
+
+    @SerializedName("potential_customer_phone_uv")
+    private Long potentialCustomerPhoneUv;
+
+    @SerializedName("web_register_uv")
+    private Long webRegisterUv;
+
+    @SerializedName("web_apply_uv")
+    private Long webApplyUv;
+
+    @SerializedName("web_credit_uv")
+    private Long webCreditUv;
+
+    @SerializedName("app_apply_uv")
+    private Long appApplyUv;
+
+    @SerializedName("app_pre_credit_uv")
+    private Long appPreCreditUv;
+
+    @SerializedName("app_credit_uv")
+    private Long appCreditUv;
+
+    @SerializedName("app_withdraw_uv")
+    private Long appWithdrawUv;
+
+    @SerializedName("wechat_app_register_uv")
+    private Long wechatAppRegisterUv;
+
+    @SerializedName("no_interest_count")
+    private Long noInterestCount;
+
+    @SerializedName("first_day_order_count")
+    private Long firstDayOrderCount;
+
+    @SerializedName("first_day_order_amount")
+    private Long firstDayOrderAmount;
+
+    @SerializedName("add_wishlist_count")
+    private Long addWishlistCount;
+
+    @SerializedName("video_outer_play10_count")
+    private Long videoOuterPlay10Count;
+
+    @SerializedName("video_outer_play25_count")
+    private Long videoOuterPlay25Count;
+
+    @SerializedName("video_outer_play50_count")
+    private Long videoOuterPlay50Count;
+
+    @SerializedName("video_outer_play75_count")
+    private Long videoOuterPlay75Count;
+
+    @SerializedName("video_outer_play95_count")
+    private Long videoOuterPlay95Count;
+
+    @SerializedName("video_outer_play100_count")
+    private Long videoOuterPlay100Count;
+
+    @SerializedName("video_outer_play_time_count")
+    private Double videoOuterPlayTimeCount;
+
+    @SerializedName("video_outer_play_time_avg_rate")
+    private Double videoOuterPlayTimeAvgRate;
+
+    @SerializedName("video_outer_play_rate")
+    private Double videoOuterPlayRate;
+
+    @SerializedName("video_outer_play_cost")
+    private Long videoOuterPlayCost;
+
+    @SerializedName("video_outer_play_count")
+    private Long videoOuterPlayCount;
+
+    @SerializedName("video_outer_play3s_count")
+    private Long videoOuterPlay3sCount;
+
+    @SerializedName("video_outer_play5s_count")
+    private Long videoOuterPlay5sCount;
+
+    @SerializedName("video_outer_play7s_count")
+    private Long videoOuterPlay7sCount;
+
+    @SerializedName("effect_leads_purchase_cost")
+    private Long effectLeadsPurchaseCost;
+
+    @SerializedName("cre_web_cost")
+    private Long creWebCost;
+
+    @SerializedName("cre_app_cost")
+    private Long creAppCost;
+
+    @SerializedName("pre_cre_web_cost")
+    private Long preCreWebCost;
+
+    @SerializedName("pre_cre_app_cost")
+    private Long preCreAppCost;
+
+    @SerializedName("store_visitor")
+    private Long storeVisitor;
+
+    @SerializedName("try_out_user")
+    private Long tryOutUser;
+
+    @SerializedName("consult_leave_info_users")
+    private Long consultLeaveInfoUsers;
+
+    @SerializedName("active_page_views")
+    private Long activePageViews;
+
+    @SerializedName("active_page_viewers")
+    private Long activePageViewers;
+
+    @SerializedName("active_page_interaction_amount")
+    private Long activePageInteractionAmount;
+
+    @SerializedName("active_page_interaction_users")
+    private Long activePageInteractionUsers;
+
+    @SerializedName("join_chat_group_amount")
+    private Long joinChatGroupAmount;
+
+    @SerializedName("join_chat_group_number_of_people")
+    private Long joinChatGroupNumberOfPeople;
+
+    @SerializedName("join_chat_group_cost_by_people")
+    private Long joinChatGroupCostByPeople;
+
+    @SerializedName("guide_to_follow_page_views")
+    private Long guideToFollowPageViews;
+
+    @SerializedName("guide_to_follow_page_viewers")
+    private Long guideToFollowPageViewers;
+
+    @SerializedName("guide_to_follow_page_interaction_amount")
+    private Long guideToFollowPageInteractionAmount;
+
+    @SerializedName("guide_to_follow_page_interaction_users")
+    private Long guideToFollowPageInteractionUsers;
+
+    @SerializedName("mini_game_register_users")
+    private Long miniGameRegisterUsers;
+
+    @SerializedName("mini_game_register_cost")
+    private Long miniGameRegisterCost;
+
+    @SerializedName("mini_game_register_rate")
+    private Double miniGameRegisterRate;
+
+    @SerializedName("mini_game_ad_monetization_users")
+    private Long miniGameAdMonetizationUsers;
+
+    @SerializedName("mini_game_paying_count")
+    private Long miniGamePayingCount;
+
+    @SerializedName("mini_game_paying_amount")
+    private Long miniGamePayingAmount;
+
+    @SerializedName("mini_game_first_paying_users")
+    private Long miniGameFirstPayingUsers;
+
+    @SerializedName("mini_game_create_role_users")
+    private Long miniGameCreateRoleUsers;
+
+    @SerializedName("mini_game_create_role_cost")
+    private Long miniGameCreateRoleCost;
+
+    @SerializedName("mini_game_retention_d1")
+    private Long miniGameRetentionD1;
+
+    @SerializedName("mini_game_key_page_viewers")
+    private Long miniGameKeyPageViewers;
+
+    @SerializedName("mini_game_key_page_view_cost")
+    private Long miniGameKeyPageViewCost;
+
+    @SerializedName("mini_game_ad_monetization_amount")
+    private Long miniGameAdMonetizationAmount;
+
+    @SerializedName("mini_game_paying_amount_by_upload")
+    private Long miniGamePayingAmountByUpload;
+
+    @SerializedName("mini_game_paying_count_by_upload")
+    private Long miniGamePayingCountByUpload;
+
+    @SerializedName("consult_leave_info_cost")
+    private Long consultLeaveInfoCost;
+
+    @SerializedName("purchase_amount_with_coupon")
+    private Long purchaseAmountWithCoupon;
+
+    @SerializedName("purchase_amount_with_coupon_cost")
+    private Long purchaseAmountWithCouponCost;
+
+    @SerializedName("mini_game_paying_amount_click_d1_by_upload")
+    private Long miniGamePayingAmountClickD1ByUpload;
+
+    @SerializedName("mini_game_retention_d1_rate")
+    private Double miniGameRetentionD1Rate;
+
+    @SerializedName("mini_game_retention_d1_cost")
+    private Long miniGameRetentionD1Cost;
+
+    @SerializedName("key_page_view_rate")
+    private Double keyPageViewRate;
+
+    @SerializedName("wechat_cost_stage1")
+    private Long wechatCostStage1;
+
+    @SerializedName("wechat_cost_stage2")
+    private Long wechatCostStage2;
+
+    @SerializedName("wechat_deep_conversions_count_stage1")
+    private Long wechatDeepConversionsCountStage1;
+
+    @SerializedName("wechat_deep_conversions_count_stage2")
+    private Long wechatDeepConversionsCountStage2;
+
+    @SerializedName("wechat_shallow_conversions_count_stage1")
+    private Long wechatShallowConversionsCountStage1;
+
+    @SerializedName("wechat_shallow_conversions_count_stage2")
+    private Long wechatShallowConversionsCountStage2;
+
+    @SerializedName("activate_register_rate")
+    private Double activateRegisterRate;
+
+    @SerializedName("key_behavior_conversions_count")
+    private Long keyBehaviorConversionsCount;
+
+    @SerializedName("key_behavior_conversions_cost")
+    private Long keyBehaviorConversionsCost;
+
+    @SerializedName("key_behavior_conversions_rate")
+    private Double keyBehaviorConversionsRate;
+
+    @SerializedName("first_day_order_roi")
+    private Double firstDayOrderRoi;
+
+    @SerializedName("mini_game_ad_monetization_cost")
+    private Long miniGameAdMonetizationCost;
+
+    @SerializedName("mini_game_ad_monetization_roi")
+    private Double miniGameAdMonetizationRoi;
+
+    @SerializedName("mini_game_ad_monetization_arpu")
+    private Long miniGameAdMonetizationArpu;
+
+    @SerializedName("mini_game_paying_roi")
+    private Double miniGamePayingRoi;
+
+    @SerializedName("mini_game_paying_arpu")
+    private Long miniGamePayingArpu;
+
+    @SerializedName("request_conversions_count")
+    private Long requestConversionsCount;
+
+    @SerializedName("request_conversions_cost")
+    private Long requestConversionsCost;
+
+    @SerializedName("income_val_1")
+    private Long incomeVal1;
+
+    @SerializedName("income_val_3")
+    private Long incomeVal3;
+
+    @SerializedName("income_val_7")
+    private Long incomeVal7;
+
+    @SerializedName("income_val_14")
+    private Long incomeVal14;
+
+    @SerializedName("income_roi_1")
+    private Double incomeRoi1;
+
+    @SerializedName("income_roi_3")
+    private Double incomeRoi3;
+
+    @SerializedName("income_roi_7")
+    private Double incomeRoi7;
+
+    @SerializedName("income_roi_14")
+    private Double incomeRoi14;
+
+    @SerializedName("activated_total_payment_cost")
+    private Long activatedTotalPaymentCost;
+
+    @SerializedName("payment_amount_activated_d3")
+    private Long paymentAmountActivatedD3;
+
+    @SerializedName("payment_amount_activated_d7")
+    private Long paymentAmountActivatedD7;
+
+    @SerializedName("payment_amount_activated_d14")
+    private Long paymentAmountActivatedD14;
+
+    @SerializedName("payment_amount_activated_d30")
+    private Long paymentAmountActivatedD30;
+
+    @SerializedName("first_day_pay_count")
+    private Long firstDayPayCount;
+
+    @SerializedName("first_day_pay_cost")
+    private Long firstDayPayCost;
+
+    @SerializedName("first_day_first_pay_cost")
+    private Long firstDayFirstPayCost;
+
+    @SerializedName("first_day_first_pay_count")
+    private Long firstDayFirstPayCount;
+
+    @SerializedName("payment_cost_activated_d1")
+    private Long paymentCostActivatedD1;
+
+    @SerializedName("first_day_pay_amount")
+    private Long firstDayPayAmount;
+
+    @SerializedName("roi_activated_d1")
+    private Double roiActivatedD1;
+
+    @SerializedName("roi_activated_d3")
+    private Double roiActivatedD3;
+
+    @SerializedName("roi_activated_d7")
+    private Double roiActivatedD7;
+
+    @SerializedName("roi_activated_d14")
+    private Double roiActivatedD14;
+
+    @SerializedName("first_day_ad_pur_arppu_cost")
+    private Long firstDayAdPurArppuCost;
+
+    @SerializedName("first_day_pay_amount_arpu")
+    private Long firstDayPayAmountArpu;
+
+    @SerializedName("first_day_pay_amount_arppu")
+    private Long firstDayPayAmountArppu;
+
+    @SerializedName("roi_activated_d30")
+    private Double roiActivatedD30;
+
+    @SerializedName("first_day_first_pay_rate")
+    private Double firstDayFirstPayRate;
+
+    @SerializedName("mini_game_first_day_ad_monetization_users")
+    private Long miniGameFirstDayAdMonetizationUsers;
+
+    @SerializedName("mini_game_first_day_ad_monetization_amount")
+    private Long miniGameFirstDayAdMonetizationAmount;
+
+    @SerializedName("mini_game_first_day_ad_paying_cost")
+    private Long miniGameFirstDayAdPayingCost;
+
+    @SerializedName("mini_game_income_roi_1")
+    private Double miniGameIncomeRoi1;
+
+    @SerializedName("mini_game_first_day_ad_paying_arpu")
+    private Long miniGameFirstDayAdPayingArpu;
+
+    @SerializedName("mini_game_paying_users_d1")
+    private Long miniGamePayingUsersD1;
+
+    @SerializedName("mini_game_paying_amount_d1")
+    private Long miniGamePayingAmountD1;
+
+    @SerializedName("mini_game_first_day_paying_roi")
+    private Double miniGameFirstDayPayingRoi;
+
+    @SerializedName("mini_game_paying_amount_d1_by_upload")
+    private Long miniGamePayingAmountD1ByUpload;
+
+    @SerializedName("mixed_monetization_roi_d1")
+    private Double mixedMonetizationRoiD1;
+
+    @SerializedName("mixed_monetization_roi_d3")
+    private Double mixedMonetizationRoiD3;
+
+    @SerializedName("mixed_monetization_roi_d7")
+    private Double mixedMonetizationRoiD7;
+
+    @SerializedName("mixed_monetization_roi_d14")
+    private Double mixedMonetizationRoiD14;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d1")
+    private Double miniGameMixedMonetizationRoiD1;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d1_by_reporting")
+    private Double miniGameMixedMonetizationRoiD1ByReporting;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d3")
+    private Double miniGameMixedMonetizationRoiD3;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d3_by_reporting")
+    private Double miniGameMixedMonetizationRoiD3ByReporting;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d7")
+    private Double miniGameMixedMonetizationRoiD7;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d7_by_reporting")
+    private Double miniGameMixedMonetizationRoiD7ByReporting;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d14")
+    private Double miniGameMixedMonetizationRoiD14;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d14_by_reporting")
+    private Double miniGameMixedMonetizationRoiD14ByReporting;
+
+    @SerializedName("ad_paying_users_d1")
+    private Long adPayingUsersD1;
+
+    @SerializedName("ad_paying_cost_d1")
+    private Long adPayingCostD1;
+
+    @SerializedName("ad_pur_arpu_cost_d1")
+    private Long adPurArpuCostD1;
+
+    @SerializedName("ad_monetization_penetration_rat_d1")
+    private Double adMonetizationPenetrationRatD1;
+
+    @SerializedName("mini_game_paying_arpu_d1")
+    private Long miniGamePayingArpuD1;
+
+    @SerializedName("web_add_to_cart_count")
+    private Long webAddToCartCount;
+
+    @SerializedName("web_add_to_cart_cost")
+    private Long webAddToCartCost;
+
+    @SerializedName("preview_conversions_count")
+    private Long previewConversionsCount;
+
+    @SerializedName("preview_deep_conversions_count")
+    private Long previewDeepConversionsCount;
+
+    @SerializedName("promoted_object_type")
+    private String promotedObjectType;
+
+    @SerializedName("promoted_object_id")
+    private String promotedObjectId;
+
+    @SerializedName("nickname_click_user_count")
+    private Long nicknameClickUserCount;
+
+    @SerializedName("poi_click_user_count")
+    private Long poiClickUserCount;
+
+    @SerializedName("platform_key_page_view_user_count")
+    private Long platformKeyPageViewUserCount;
+
+    @SerializedName("platform_key_page_avg_view_per_user")
+    private Double platformKeyPageAvgViewPerUser;
+
+    @SerializedName("platform_key_page_view_duration")
+    private Double platformKeyPageViewDuration;
+
+    @SerializedName("cpn_click_button_cost")
+    private Long cpnClickButtonCost;
+
+    @SerializedName("praise_user_count")
+    private Long praiseUserCount;
+
+    @SerializedName("comment_user_count")
+    private Long commentUserCount;
+
+    @SerializedName("order_count")
+    private Long orderCount;
+
+    @SerializedName("order_rate")
+    private Double orderRate;
+
+    @SerializedName("quest_reservation_pv_cost")
+    private Long questReservationPvCost;
+
+    @SerializedName("leads_rate")
+    private Double leadsRate;
+
+    @SerializedName("leads_user_count")
+    private Long leadsUserCount;
+
+    @SerializedName("leads_cost")
+    private Long leadsCost;
+
+    @SerializedName("leads_user_rate")
+    private Double leadsUserRate;
+
+    @SerializedName("valid_leads_cost")
+    private Long validLeadsCost;
+
+    @SerializedName("valid_leads_rate")
+    private Double validLeadsRate;
+
+    @SerializedName("page_consult_user_count")
+    private Long pageConsultUserCount;
+
+    @SerializedName("valid_page_consult_user_count")
+    private Long validPageConsultUserCount;
+
+    @SerializedName("withdr_dep_web_user_count")
+    private Long withdrDepWebUserCount;
+
+    @SerializedName("wechat_minigame_register_cost")
+    private Long wechatMinigameRegisterCost;
+
+    @SerializedName("wechat_minigame_register_rate")
+    private Double wechatMinigameRegisterRate;
+
+    @SerializedName("wechat_minigame_arpu")
+    private Double wechatMinigameArpu;
+
+    @SerializedName("wechat_minigame_retention_count")
+    private Long wechatMinigameRetentionCount;
+
+    @SerializedName("wechat_minigame_checkout_count")
+    private Long wechatMinigameCheckoutCount;
+
+    @SerializedName("wechat_minigame_checkout_amount")
+    private Long wechatMinigameCheckoutAmount;
+
+    @SerializedName("official_account_follow_count")
+    private Long officialAccountFollowCount;
+
+    @SerializedName("official_account_follow_cost")
+    private Long officialAccountFollowCost;
+
+    @SerializedName("official_account_follow_rate")
+    private Double officialAccountFollowRate;
+
+    @SerializedName("official_account_register_user_count")
+    private Long officialAccountRegisterUserCount;
+
+    @SerializedName("official_account_register_rate")
+    private Double officialAccountRegisterRate;
+
+    @SerializedName("official_account_register_cost")
+    private Long officialAccountRegisterCost;
+
+    @SerializedName("official_account_register_amount")
+    private Long officialAccountRegisterAmount;
+
+    @SerializedName("official_account_register_roi")
+    private Long officialAccountRegisterRoi;
+
+    @SerializedName("official_account_apply_count")
+    private Long officialAccountApplyCount;
+
+    @SerializedName("official_account_apply_user_count")
+    private Long officialAccountApplyUserCount;
+
+    @SerializedName("official_account_apply_rate")
+    private Double officialAccountApplyRate;
+
+    @SerializedName("official_account_apply_cost")
+    private Long officialAccountApplyCost;
+
+    @SerializedName("official_account_apply_amount")
+    private Long officialAccountApplyAmount;
+
+    @SerializedName("official_account_apply_roi")
+    private Long officialAccountApplyRoi;
+
+    @SerializedName("official_account_order_count")
+    private Long officialAccountOrderCount;
+
+    @SerializedName("official_account_first_day_order_count")
+    private Long officialAccountFirstDayOrderCount;
+
+    @SerializedName("official_account_order_user_count")
+    private Long officialAccountOrderUserCount;
+
+    @SerializedName("official_account_order_rate")
+    private Double officialAccountOrderRate;
+
+    @SerializedName("official_account_order_cost")
+    private Long officialAccountOrderCost;
+
+    @SerializedName("official_account_order_amount")
+    private Long officialAccountOrderAmount;
+
+    @SerializedName("official_account_first_day_order_amount")
+    private Long officialAccountFirstDayOrderAmount;
+
+    @SerializedName("official_account_order_roi")
+    private Long officialAccountOrderRoi;
+
+    @SerializedName("official_account_consult_count")
+    private Long officialAccountConsultCount;
+
+    @SerializedName("official_account_reader_count")
+    private Long officialAccountReaderCount;
+
+    @SerializedName("official_account_credit_apply_user_count")
+    private Long officialAccountCreditApplyUserCount;
+
+    @SerializedName("official_account_credit_user_count")
+    private Long officialAccountCreditUserCount;
+
+    @SerializedName("coupon_get_cost")
+    private Long couponGetCost;
+
+    @SerializedName("coupon_get_rate")
+    private Double couponGetRate;
+
+    @SerializedName("coupon_use_count")
+    private Long couponUseCount;
+
+    @SerializedName("forward_user_count")
+    private Long forwardUserCount;
+
+    @SerializedName("video_outer_play_user_count")
+    private Long videoOuterPlayUserCount;
+
+    @SerializedName("video_inner_play_user_count")
+    private Long videoInnerPlayUserCount;
+
+    @SerializedName("poi_id")
+    private String poiId;
+}

+ 28 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/dto/AdDataOfHourDTO.java

@@ -0,0 +1,28 @@
+package flink.zanxiangnet.ad.monitoring.pojo.dto;
+
+import com.tencent.ads.model.HourlyReportsGetListStruct;
+import lombok.Data;
+
+@Data
+public class AdDataOfHourDTO {
+
+    /**
+     * 创建时间
+     */
+    private Long createTime;
+
+    /**
+     * 账号
+     */
+    private String channel;
+
+    /**
+     * 账号
+     */
+    private Long accountId;
+
+    /**
+     * 消耗数据文本
+     */
+    private HourlyReportsGetListStruct hourlyReportsGetListStruct;
+}

+ 1368 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdDataOfHourODS.java

@@ -0,0 +1,1368 @@
+package flink.zanxiangnet.ad.monitoring.pojo.entity;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+/**
+ * 原始数据
+ * 按小时统计的广告数据
+ */
+@Data
+public class AdDataOfHourODS {
+
+    /**
+     * 统计时间
+     */
+    private Long statTime;
+
+    /**
+     * 账号 id
+     */
+    private Long accountId;
+
+    /**
+     * 服务商账号 id
+     */
+    private Long agencyAccountId;
+
+    @SerializedName("hour")
+    private Integer hour;
+
+    @SerializedName("view_count")
+    private Long viewCount;
+
+    @SerializedName("download_count")
+    private Long downloadCount;
+
+    @SerializedName("activated_count")
+    private Long activatedCount;
+
+    @SerializedName("activated_rate")
+    private Double activatedRate;
+
+    @SerializedName("thousand_display_price")
+    private Long thousandDisplayPrice;
+
+    @SerializedName("valid_click_count")
+    private Long validClickCount;
+
+    @SerializedName("ctr")
+    private Double ctr;
+
+    @SerializedName("cpc")
+    private Long cpc;
+
+    @SerializedName("cost")
+    private Long cost;
+
+    @SerializedName("key_page_view_cost")
+    private Long keyPageViewCost;
+
+    @SerializedName("coupon_click_count")
+    private Long couponClickCount;
+
+    @SerializedName("coupon_issue_count")
+    private Long couponIssueCount;
+
+    @SerializedName("coupon_get_count")
+    private Long couponGetCount;
+
+    @SerializedName("platform_page_view_count")
+    private Long platformPageViewCount;
+
+    @SerializedName("platform_page_view_rate")
+    private Double platformPageViewRate;
+
+    @SerializedName("web_commodity_page_view_count")
+    private Long webCommodityPageViewCount;
+
+    @SerializedName("web_commodity_page_view_cost")
+    private Long webCommodityPageViewCost;
+
+    @SerializedName("web_register_count")
+    private Long webRegisterCount;
+
+    @SerializedName("page_consult_count")
+    private Long pageConsultCount;
+
+    @SerializedName("page_consult_cost")
+    private Long pageConsultCost;
+
+    @SerializedName("page_phone_call_direct_count")
+    private Long pagePhoneCallDirectCount;
+
+    @SerializedName("page_phone_call_direct_cost")
+    private Long pagePhoneCallDirectCost;
+
+    @SerializedName("page_phone_call_back_count")
+    private Long pagePhoneCallBackCount;
+
+    @SerializedName("page_phone_call_back_cost")
+    private Long pagePhoneCallBackCost;
+
+    @SerializedName("own_page_navigation_count")
+    private Long ownPageNavigationCount;
+
+    @SerializedName("own_page_navi_cost")
+    private Long ownPageNaviCost;
+
+    @SerializedName("platform_page_navigation_count")
+    private Long platformPageNavigationCount;
+
+    @SerializedName("platform_page_navigation_cost")
+    private Long platformPageNavigationCost;
+
+    @SerializedName("platform_shop_navigation_count")
+    private Long platformShopNavigationCount;
+
+    @SerializedName("platform_shop_navigation_cost")
+    private Long platformShopNavigationCost;
+
+    @SerializedName("web_application_count")
+    private Long webApplicationCount;
+
+    @SerializedName("web_application_cost")
+    private Long webApplicationCost;
+
+    @SerializedName("page_reservation_count")
+    private Long pageReservationCount;
+
+    @SerializedName("page_reservation_rate")
+    private Double pageReservationRate;
+
+    @SerializedName("page_reservation_cost")
+    private Long pageReservationCost;
+
+    @SerializedName("page_reservation_cost_with_people")
+    private Long pageReservationCostWithPeople;
+
+    @SerializedName("add_to_cart_price")
+    private Long addToCartPrice;
+
+    @SerializedName("own_page_coupon_get_count")
+    private Long ownPageCouponGetCount;
+
+    @SerializedName("own_page_coupon_get_cost")
+    private Long ownPageCouponGetCost;
+
+    @SerializedName("platform_coupon_get_count")
+    private Long platformCouponGetCount;
+
+    @SerializedName("platform_coupon_get_cost")
+    private Long platformCouponGetCost;
+
+    @SerializedName("web_order_count")
+    private Long webOrderCount;
+
+    @SerializedName("web_order_rate")
+    private Double webOrderRate;
+
+    @SerializedName("app_order_rate")
+    private Double appOrderRate;
+
+    @SerializedName("web_order_cost")
+    private Long webOrderCost;
+
+    @SerializedName("web_checkout_amount")
+    private Long webCheckoutAmount;
+
+    @SerializedName("web_checkout_count")
+    private Long webCheckoutCount;
+
+    @SerializedName("web_checkout_cost")
+    private Long webCheckoutCost;
+
+    @SerializedName("order_amount")
+    private Long orderAmount;
+
+    @SerializedName("order_unit_price")
+    private Long orderUnitPrice;
+
+    @SerializedName("order_roi")
+    private Double orderRoi;
+
+    @SerializedName("deliver_count")
+    private Long deliverCount;
+
+    @SerializedName("deliver_cost")
+    private Long deliverCost;
+
+    @SerializedName("sign_in_count")
+    private Long signInCount;
+
+    @SerializedName("sign_in_cost")
+    private Long signInCost;
+
+    @SerializedName("download_rate")
+    private Double downloadRate;
+
+    @SerializedName("download_cost")
+    private Long downloadCost;
+
+    @SerializedName("install_count")
+    private Long installCount;
+
+    @SerializedName("install_cost")
+    private Long installCost;
+
+    @SerializedName("click_activated_rate")
+    private Double clickActivatedRate;
+
+    @SerializedName("activated_cost")
+    private Long activatedCost;
+
+    @SerializedName("retention_count")
+    private Long retentionCount;
+
+    @SerializedName("retention_rate")
+    private Double retentionRate;
+
+    @SerializedName("app_key_page_retention_rate")
+    private Double appKeyPageRetentionRate;
+
+    @SerializedName("retention_cost")
+    private Long retentionCost;
+
+    @SerializedName("key_page_view_count")
+    private Long keyPageViewCount;
+
+    @SerializedName("app_commodity_page_view_count")
+    private Long appCommodityPageViewCount;
+
+    @SerializedName("app_commodity_page_view_rate")
+    private Double appCommodityPageViewRate;
+
+    @SerializedName("web_commodity_page_view_rate")
+    private Double webCommodityPageViewRate;
+
+    @SerializedName("app_commodity_page_view_cost")
+    private Long appCommodityPageViewCost;
+
+    @SerializedName("app_register_count")
+    private Long appRegisterCount;
+
+    @SerializedName("app_register_cost")
+    private Long appRegisterCost;
+
+    @SerializedName("web_register_cost")
+    private Long webRegisterCost;
+
+    @SerializedName("app_application_count")
+    private Long appApplicationCount;
+
+    @SerializedName("app_application_cost")
+    private Long appApplicationCost;
+
+    @SerializedName("app_add_to_cart_count")
+    private Long appAddToCartCount;
+
+    @SerializedName("add_to_cart_amount")
+    private Long addToCartAmount;
+
+    @SerializedName("app_add_to_cart_cost")
+    private Long appAddToCartCost;
+
+    @SerializedName("app_order_count")
+    private Long appOrderCount;
+
+    @SerializedName("app_order_cost")
+    private Long appOrderCost;
+
+    @SerializedName("app_checkout_count")
+    private Long appCheckoutCount;
+
+    @SerializedName("app_checkout_amount")
+    private Long appCheckoutAmount;
+
+    @SerializedName("app_checkout_cost")
+    private Long appCheckoutCost;
+
+    @SerializedName("platform_coupon_click_count")
+    private Long platformCouponClickCount;
+
+    @SerializedName("platform_coupon_get_rate")
+    private Double platformCouponGetRate;
+
+    @SerializedName("coupon_usage_number")
+    private Long couponUsageNumber;
+
+    @SerializedName("coupon_usage_cost")
+    private Long couponUsageCost;
+
+    @SerializedName("coupon_usage_rate")
+    private Double couponUsageRate;
+
+    @SerializedName("coupon_purchase_rate")
+    private Double couponPurchaseRate;
+
+    @SerializedName("follow_count")
+    private Long followCount;
+
+    @SerializedName("follow_cost")
+    private Long followCost;
+
+    @SerializedName("forward_count")
+    private Long forwardCount;
+
+    @SerializedName("forward_cost")
+    private Long forwardCost;
+
+    @SerializedName("read_count")
+    private Long readCount;
+
+    @SerializedName("read_cost")
+    private Long readCost;
+
+    @SerializedName("praise_count")
+    private Long praiseCount;
+
+    @SerializedName("praise_cost")
+    private Long praiseCost;
+
+    @SerializedName("comment_count")
+    private Long commentCount;
+
+    @SerializedName("comment_cost")
+    private Long commentCost;
+
+    @SerializedName("inte_phone_count")
+    private Long intePhoneCount;
+
+    @SerializedName("phone_call_count")
+    private Long phoneCallCount;
+
+    @SerializedName("external_form_reservation_count")
+    private Long externalFormReservationCount;
+
+    @SerializedName("app_ad_paying_users")
+    private Long appAdPayingUsers;
+
+    @SerializedName("ad_pur_val_web")
+    private Long adPurValWeb;
+
+    @SerializedName("ad_pur_val_app")
+    private Long adPurValApp;
+
+    @SerializedName("order_24h_count")
+    private Long order24hCount;
+
+    @SerializedName("order_24h_rate")
+    private Double order24hRate;
+
+    @SerializedName("order_24h_cost")
+    private Long order24hCost;
+
+    @SerializedName("order_24h_amount")
+    private Long order24hAmount;
+
+    @SerializedName("order_24h_roi")
+    private Double order24hRoi;
+
+    @SerializedName("game_create_role_count")
+    private Long gameCreateRoleCount;
+
+    @SerializedName("game_authorize_count")
+    private Long gameAuthorizeCount;
+
+    @SerializedName("game_tutorial_finish_count")
+    private Long gameTutorialFinishCount;
+
+    @SerializedName("effective_leads_count")
+    private Long effectiveLeadsCount;
+
+    @SerializedName("effective_cost")
+    private Long effectiveCost;
+
+    @SerializedName("effective_reserve_count")
+    private Long effectiveReserveCount;
+
+    @SerializedName("effective_consult_count")
+    private Long effectiveConsultCount;
+
+    @SerializedName("effective_phone_count")
+    private Long effectivePhoneCount;
+
+    @SerializedName("potential_reserve_count")
+    private Long potentialReserveCount;
+
+    @SerializedName("potential_consult_count")
+    private Long potentialConsultCount;
+
+    @SerializedName("potential_phone_count")
+    private Long potentialPhoneCount;
+
+    @SerializedName("app_checkout_rate")
+    private Double appCheckoutRate;
+
+    @SerializedName("web_checkout_rate")
+    private Double webCheckoutRate;
+
+    @SerializedName("app_activated_checkout_rate")
+    private Double appActivatedCheckoutRate;
+
+    @SerializedName("web_activated_checkout_rate")
+    private Double webActivatedCheckoutRate;
+
+    @SerializedName("app_register_rate")
+    private Double appRegisterRate;
+
+    @SerializedName("web_reg_rate")
+    private Double webRegRate;
+
+    @SerializedName("page_phone_call_direct_rate")
+    private Double pagePhoneCallDirectRate;
+
+    @SerializedName("page_phone_call_back_rate")
+    private Double pagePhoneCallBackRate;
+
+    @SerializedName("page_consult_rate")
+    private Double pageConsultRate;
+
+    @SerializedName("deliver_rate")
+    private Double deliverRate;
+
+    @SerializedName("install_rate")
+    private Double installRate;
+
+    @SerializedName("arppu_cost")
+    private Long arppuCost;
+
+    @SerializedName("arpu_cost")
+    private Long arpuCost;
+
+    @SerializedName("web_arppu_cost")
+    private Long webArppuCost;
+
+    @SerializedName("web_arpu_cost")
+    private Long webArpuCost;
+
+    @SerializedName("app_ad_pur_arpu_cost")
+    private Long appAdPurArpuCost;
+
+    @SerializedName("app_ad_pur_arppu_cost")
+    private Long appAdPurArppuCost;
+
+    @SerializedName("web_ad_pur_arpu_cost")
+    private Long webAdPurArpuCost;
+
+    @SerializedName("cheout_fd")
+    private Long cheoutFd;
+
+    @SerializedName("cheout_td")
+    private Long cheoutTd;
+
+    @SerializedName("cheout_ow")
+    private Long cheoutOw;
+
+    @SerializedName("cheout_tw")
+    private Long cheoutTw;
+
+    @SerializedName("cheout_om")
+    private Long cheoutOm;
+
+    @SerializedName("cheout_fd_reward")
+    private Double cheoutFdReward;
+
+    @SerializedName("cheout_td_reward")
+    private Double cheoutTdReward;
+
+    @SerializedName("cheout_ow_reward")
+    private Double cheoutOwReward;
+
+    @SerializedName("cheout_tw_reward")
+    private Double cheoutTwReward;
+
+    @SerializedName("cheout_om_reward")
+    private Double cheoutOmReward;
+
+    @SerializedName("cheout_total_reward")
+    private Double cheoutTotalReward;
+
+    @SerializedName("from_follow_uv")
+    private Long fromFollowUv;
+
+    @SerializedName("from_follow_cost")
+    private Long fromFollowCost;
+
+    @SerializedName("add_desktop_pv")
+    private Long addDesktopPv;
+
+    @SerializedName("add_desktop_cost")
+    private Long addDesktopCost;
+
+    @SerializedName("first_pay_count")
+    private Long firstPayCount;
+
+    @SerializedName("first_pay_rate")
+    private Double firstPayRate;
+
+    @SerializedName("pre_cre_web")
+    private Long preCreWeb;
+
+    @SerializedName("pre_cre_app")
+    private Long preCreApp;
+
+    @SerializedName("pre_cre_web_val")
+    private Long preCreWebVal;
+
+    @SerializedName("pre_cre_app_val")
+    private Long preCreAppVal;
+
+    @SerializedName("cre_web")
+    private Long creWeb;
+
+    @SerializedName("cre_app")
+    private Long creApp;
+
+    @SerializedName("cre_web_val")
+    private Long creWebVal;
+
+    @SerializedName("cre_app_val")
+    private Long creAppVal;
+
+    @SerializedName("withdr_dep_web")
+    private Long withdrDepWeb;
+
+    @SerializedName("withdr_dep_app")
+    private Long withdrDepApp;
+
+    @SerializedName("withdr_dep_web_val")
+    private Long withdrDepWebVal;
+
+    @SerializedName("withdr_dep_app_val")
+    private Long withdrDepAppVal;
+
+    @SerializedName("first_pay_cost")
+    private Long firstPayCost;
+
+    @SerializedName("landing_page_click_count")
+    private Long landingPageClickCount;
+
+    @SerializedName("web_cart_amount")
+    private Long webCartAmount;
+
+    @SerializedName("scan_follow_count")
+    private Long scanFollowCount;
+
+    @SerializedName("scan_follow_user_count")
+    private Long scanFollowUserCount;
+
+    @SerializedName("scan_follow_user_cost")
+    private Long scanFollowUserCost;
+
+    @SerializedName("scan_follow_user_rate")
+    private Double scanFollowUserRate;
+
+    @SerializedName("app_order_amount")
+    private Long appOrderAmount;
+
+    @SerializedName("web_order_amount")
+    private Long webOrderAmount;
+
+    @SerializedName("phone_consult_count")
+    private Long phoneConsultCount;
+
+    @SerializedName("tool_consult_count")
+    private Long toolConsultCount;
+
+    @SerializedName("lottery_leads_count")
+    private Long lotteryLeadsCount;
+
+    @SerializedName("lottery_leads_cost")
+    private Long lotteryLeadsCost;
+
+    @SerializedName("conversions_count")
+    private Long conversionsCount;
+
+    @SerializedName("conversions_rate")
+    private Double conversionsRate;
+
+    @SerializedName("conversions_cost")
+    private Long conversionsCost;
+
+    @SerializedName("deep_conversions_count")
+    private Long deepConversionsCount;
+
+    @SerializedName("deep_conversions_rate")
+    private Double deepConversionsRate;
+
+    @SerializedName("deep_conversions_cost")
+    private Long deepConversionsCost;
+
+    @SerializedName("first_memcard_web_count")
+    private Long firstMemcardWebCount;
+
+    @SerializedName("first_memcard_app_count")
+    private Long firstMemcardAppCount;
+
+    @SerializedName("memcard_web_count")
+    private Long memcardWebCount;
+
+    @SerializedName("memcard_app_count")
+    private Long memcardAppCount;
+
+    @SerializedName("first_memcard_web_rate")
+    private Double firstMemcardWebRate;
+
+    @SerializedName("first_memcard_app_rate")
+    private Double firstMemcardAppRate;
+
+    @SerializedName("first_memcard_web_cost")
+    private Long firstMemcardWebCost;
+
+    @SerializedName("first_memcard_app_cost")
+    private Long firstMemcardAppCost;
+
+    @SerializedName("valuable_click_count")
+    private Long valuableClickCount;
+
+    @SerializedName("valuable_click_rate")
+    private Double valuableClickRate;
+
+    @SerializedName("valuable_click_cost")
+    private Long valuableClickCost;
+
+    @SerializedName("video_play_count")
+    private Long videoPlayCount;
+
+    @SerializedName("click_image_count")
+    private Long clickImageCount;
+
+    @SerializedName("click_detail_count")
+    private Long clickDetailCount;
+
+    @SerializedName("click_head_count")
+    private Long clickHeadCount;
+
+    @SerializedName("click_nick_count")
+    private Long clickNickCount;
+
+    @SerializedName("click_poi_count")
+    private Long clickPoiCount;
+
+    @SerializedName("video_inner_play_count")
+    private Long videoInnerPlayCount;
+
+    @SerializedName("lan_button_click_count")
+    private Long lanButtonClickCount;
+
+    @SerializedName("lan_jump_button_clickers")
+    private Long lanJumpButtonClickers;
+
+    @SerializedName("lan_jump_button_click_cost")
+    private Long lanJumpButtonClickCost;
+
+    @SerializedName("lan_jump_button_ctr")
+    private Double lanJumpButtonCtr;
+
+    @SerializedName("lan_button_click_cost")
+    private Long lanButtonClickCost;
+
+    @SerializedName("cpn_click_button_count")
+    private Long cpnClickButtonCount;
+
+    @SerializedName("cpn_click_button_uv")
+    private Long cpnClickButtonUv;
+
+    @SerializedName("key_page_uv")
+    private Long keyPageUv;
+
+    @SerializedName("special_page_exp_uv")
+    private Long specialPageExpUv;
+
+    @SerializedName("special_page_exp_cost")
+    private Long specialPageExpCost;
+
+    @SerializedName("view_commodity_page_uv")
+    private Long viewCommodityPageUv;
+
+    @SerializedName("effect_leads_purchase_count")
+    private Long effectLeadsPurchaseCount;
+
+    @SerializedName("reservation_uv")
+    private Long reservationUv;
+
+    @SerializedName("overall_leads_purchase_count")
+    private Long overallLeadsPurchaseCount;
+
+    @SerializedName("leads_purchase_count")
+    private Long leadsPurchaseCount;
+
+    @SerializedName("leads_purchase_rate")
+    private Double leadsPurchaseRate;
+
+    @SerializedName("leads_purchase_cost")
+    private Long leadsPurchaseCost;
+
+    @SerializedName("leads_purchase_uv")
+    private Long leadsPurchaseUv;
+
+    @SerializedName("valid_leads_uv")
+    private Long validLeadsUv;
+
+    @SerializedName("phone_call_uv")
+    private Long phoneCallUv;
+
+    @SerializedName("valid_phone_uv")
+    private Long validPhoneUv;
+
+    @SerializedName("potential_customer_phone_uv")
+    private Long potentialCustomerPhoneUv;
+
+    @SerializedName("web_register_uv")
+    private Long webRegisterUv;
+
+    @SerializedName("web_apply_uv")
+    private Long webApplyUv;
+
+    @SerializedName("web_credit_uv")
+    private Long webCreditUv;
+
+    @SerializedName("app_apply_uv")
+    private Long appApplyUv;
+
+    @SerializedName("app_pre_credit_uv")
+    private Long appPreCreditUv;
+
+    @SerializedName("app_credit_uv")
+    private Long appCreditUv;
+
+    @SerializedName("app_withdraw_uv")
+    private Long appWithdrawUv;
+
+    @SerializedName("wechat_app_register_uv")
+    private Long wechatAppRegisterUv;
+
+    @SerializedName("no_interest_count")
+    private Long noInterestCount;
+
+    @SerializedName("first_day_order_count")
+    private Long firstDayOrderCount;
+
+    @SerializedName("first_day_order_amount")
+    private Long firstDayOrderAmount;
+
+    @SerializedName("add_wishlist_count")
+    private Long addWishlistCount;
+
+    @SerializedName("video_outer_play10_count")
+    private Long videoOuterPlay10Count;
+
+    @SerializedName("video_outer_play25_count")
+    private Long videoOuterPlay25Count;
+
+    @SerializedName("video_outer_play50_count")
+    private Long videoOuterPlay50Count;
+
+    @SerializedName("video_outer_play75_count")
+    private Long videoOuterPlay75Count;
+
+    @SerializedName("video_outer_play95_count")
+    private Long videoOuterPlay95Count;
+
+    @SerializedName("video_outer_play100_count")
+    private Long videoOuterPlay100Count;
+
+    @SerializedName("video_outer_play_time_count")
+    private Double videoOuterPlayTimeCount;
+
+    @SerializedName("video_outer_play_time_avg_rate")
+    private Double videoOuterPlayTimeAvgRate;
+
+    @SerializedName("video_outer_play_rate")
+    private Double videoOuterPlayRate;
+
+    @SerializedName("video_outer_play_cost")
+    private Long videoOuterPlayCost;
+
+    @SerializedName("video_outer_play_count")
+    private Long videoOuterPlayCount;
+
+    @SerializedName("video_outer_play3s_count")
+    private Long videoOuterPlay3sCount;
+
+    @SerializedName("video_outer_play5s_count")
+    private Long videoOuterPlay5sCount;
+
+    @SerializedName("video_outer_play7s_count")
+    private Long videoOuterPlay7sCount;
+
+    @SerializedName("effect_leads_purchase_cost")
+    private Long effectLeadsPurchaseCost;
+
+    @SerializedName("cre_web_cost")
+    private Long creWebCost;
+
+    @SerializedName("cre_app_cost")
+    private Long creAppCost;
+
+    @SerializedName("pre_cre_web_cost")
+    private Long preCreWebCost;
+
+    @SerializedName("pre_cre_app_cost")
+    private Long preCreAppCost;
+
+    @SerializedName("store_visitor")
+    private Long storeVisitor;
+
+    @SerializedName("try_out_user")
+    private Long tryOutUser;
+
+    @SerializedName("consult_leave_info_users")
+    private Long consultLeaveInfoUsers;
+
+    @SerializedName("active_page_views")
+    private Long activePageViews;
+
+    @SerializedName("active_page_viewers")
+    private Long activePageViewers;
+
+    @SerializedName("active_page_interaction_amount")
+    private Long activePageInteractionAmount;
+
+    @SerializedName("active_page_interaction_users")
+    private Long activePageInteractionUsers;
+
+    @SerializedName("join_chat_group_amount")
+    private Long joinChatGroupAmount;
+
+    @SerializedName("join_chat_group_number_of_people")
+    private Long joinChatGroupNumberOfPeople;
+
+    @SerializedName("join_chat_group_cost_by_people")
+    private Long joinChatGroupCostByPeople;
+
+    @SerializedName("guide_to_follow_page_views")
+    private Long guideToFollowPageViews;
+
+    @SerializedName("guide_to_follow_page_viewers")
+    private Long guideToFollowPageViewers;
+
+    @SerializedName("guide_to_follow_page_interaction_amount")
+    private Long guideToFollowPageInteractionAmount;
+
+    @SerializedName("guide_to_follow_page_interaction_users")
+    private Long guideToFollowPageInteractionUsers;
+
+    @SerializedName("mini_game_register_users")
+    private Long miniGameRegisterUsers;
+
+    @SerializedName("mini_game_register_cost")
+    private Long miniGameRegisterCost;
+
+    @SerializedName("mini_game_register_rate")
+    private Double miniGameRegisterRate;
+
+    @SerializedName("mini_game_ad_monetization_users")
+    private Long miniGameAdMonetizationUsers;
+
+    @SerializedName("mini_game_paying_count")
+    private Long miniGamePayingCount;
+
+    @SerializedName("mini_game_paying_amount")
+    private Long miniGamePayingAmount;
+
+    @SerializedName("mini_game_first_paying_users")
+    private Long miniGameFirstPayingUsers;
+
+    @SerializedName("mini_game_create_role_users")
+    private Long miniGameCreateRoleUsers;
+
+    @SerializedName("mini_game_create_role_cost")
+    private Long miniGameCreateRoleCost;
+
+    @SerializedName("mini_game_retention_d1")
+    private Long miniGameRetentionD1;
+
+    @SerializedName("mini_game_key_page_viewers")
+    private Long miniGameKeyPageViewers;
+
+    @SerializedName("mini_game_key_page_view_cost")
+    private Long miniGameKeyPageViewCost;
+
+    @SerializedName("mini_game_ad_monetization_amount")
+    private Long miniGameAdMonetizationAmount;
+
+    @SerializedName("mini_game_paying_amount_by_upload")
+    private Long miniGamePayingAmountByUpload;
+
+    @SerializedName("mini_game_paying_count_by_upload")
+    private Long miniGamePayingCountByUpload;
+
+    @SerializedName("consult_leave_info_cost")
+    private Long consultLeaveInfoCost;
+
+    @SerializedName("purchase_amount_with_coupon")
+    private Long purchaseAmountWithCoupon;
+
+    @SerializedName("purchase_amount_with_coupon_cost")
+    private Long purchaseAmountWithCouponCost;
+
+    @SerializedName("mini_game_paying_amount_click_d1_by_upload")
+    private Long miniGamePayingAmountClickD1ByUpload;
+
+    @SerializedName("mini_game_retention_d1_rate")
+    private Double miniGameRetentionD1Rate;
+
+    @SerializedName("mini_game_retention_d1_cost")
+    private Long miniGameRetentionD1Cost;
+
+    @SerializedName("key_page_view_rate")
+    private Double keyPageViewRate;
+
+    @SerializedName("wechat_cost_stage1")
+    private Long wechatCostStage1;
+
+    @SerializedName("wechat_cost_stage2")
+    private Long wechatCostStage2;
+
+    @SerializedName("wechat_deep_conversions_count_stage1")
+    private Long wechatDeepConversionsCountStage1;
+
+    @SerializedName("wechat_deep_conversions_count_stage2")
+    private Long wechatDeepConversionsCountStage2;
+
+    @SerializedName("wechat_shallow_conversions_count_stage1")
+    private Long wechatShallowConversionsCountStage1;
+
+    @SerializedName("wechat_shallow_conversions_count_stage2")
+    private Long wechatShallowConversionsCountStage2;
+
+    @SerializedName("activate_register_rate")
+    private Double activateRegisterRate;
+
+    @SerializedName("key_behavior_conversions_count")
+    private Long keyBehaviorConversionsCount;
+
+    @SerializedName("key_behavior_conversions_cost")
+    private Long keyBehaviorConversionsCost;
+
+    @SerializedName("key_behavior_conversions_rate")
+    private Double keyBehaviorConversionsRate;
+
+    @SerializedName("first_day_order_roi")
+    private Double firstDayOrderRoi;
+
+    @SerializedName("mini_game_ad_monetization_cost")
+    private Long miniGameAdMonetizationCost;
+
+    @SerializedName("mini_game_ad_monetization_roi")
+    private Double miniGameAdMonetizationRoi;
+
+    @SerializedName("mini_game_ad_monetization_arpu")
+    private Long miniGameAdMonetizationArpu;
+
+    @SerializedName("mini_game_paying_roi")
+    private Double miniGamePayingRoi;
+
+    @SerializedName("mini_game_paying_arpu")
+    private Long miniGamePayingArpu;
+
+    @SerializedName("request_conversions_count")
+    private Long requestConversionsCount;
+
+    @SerializedName("request_conversions_cost")
+    private Long requestConversionsCost;
+
+    @SerializedName("income_val_1")
+    private Long incomeVal1;
+
+    @SerializedName("income_val_3")
+    private Long incomeVal3;
+
+    @SerializedName("income_val_7")
+    private Long incomeVal7;
+
+    @SerializedName("income_val_14")
+    private Long incomeVal14;
+
+    @SerializedName("income_roi_1")
+    private Double incomeRoi1;
+
+    @SerializedName("income_roi_3")
+    private Double incomeRoi3;
+
+    @SerializedName("income_roi_7")
+    private Double incomeRoi7;
+
+    @SerializedName("income_roi_14")
+    private Double incomeRoi14;
+
+    @SerializedName("activated_total_payment_cost")
+    private Long activatedTotalPaymentCost;
+
+    @SerializedName("payment_amount_activated_d3")
+    private Long paymentAmountActivatedD3;
+
+    @SerializedName("payment_amount_activated_d7")
+    private Long paymentAmountActivatedD7;
+
+    @SerializedName("payment_amount_activated_d14")
+    private Long paymentAmountActivatedD14;
+
+    @SerializedName("payment_amount_activated_d30")
+    private Long paymentAmountActivatedD30;
+
+    @SerializedName("first_day_pay_count")
+    private Long firstDayPayCount;
+
+    @SerializedName("first_day_pay_cost")
+    private Long firstDayPayCost;
+
+    @SerializedName("first_day_first_pay_cost")
+    private Long firstDayFirstPayCost;
+
+    @SerializedName("first_day_first_pay_count")
+    private Long firstDayFirstPayCount;
+
+    @SerializedName("payment_cost_activated_d1")
+    private Long paymentCostActivatedD1;
+
+    @SerializedName("first_day_pay_amount")
+    private Long firstDayPayAmount;
+
+    @SerializedName("roi_activated_d1")
+    private Double roiActivatedD1;
+
+    @SerializedName("roi_activated_d3")
+    private Double roiActivatedD3;
+
+    @SerializedName("roi_activated_d7")
+    private Double roiActivatedD7;
+
+    @SerializedName("roi_activated_d14")
+    private Double roiActivatedD14;
+
+    @SerializedName("first_day_ad_pur_arppu_cost")
+    private Long firstDayAdPurArppuCost;
+
+    @SerializedName("first_day_pay_amount_arpu")
+    private Long firstDayPayAmountArpu;
+
+    @SerializedName("first_day_pay_amount_arppu")
+    private Long firstDayPayAmountArppu;
+
+    @SerializedName("roi_activated_d30")
+    private Double roiActivatedD30;
+
+    @SerializedName("first_day_first_pay_rate")
+    private Double firstDayFirstPayRate;
+
+    @SerializedName("mini_game_first_day_ad_monetization_users")
+    private Long miniGameFirstDayAdMonetizationUsers;
+
+    @SerializedName("mini_game_first_day_ad_monetization_amount")
+    private Long miniGameFirstDayAdMonetizationAmount;
+
+    @SerializedName("mini_game_first_day_ad_paying_cost")
+    private Long miniGameFirstDayAdPayingCost;
+
+    @SerializedName("mini_game_income_roi_1")
+    private Double miniGameIncomeRoi1;
+
+    @SerializedName("mini_game_first_day_ad_paying_arpu")
+    private Long miniGameFirstDayAdPayingArpu;
+
+    @SerializedName("mini_game_paying_users_d1")
+    private Long miniGamePayingUsersD1;
+
+    @SerializedName("mini_game_paying_amount_d1")
+    private Long miniGamePayingAmountD1;
+
+    @SerializedName("mini_game_first_day_paying_roi")
+    private Double miniGameFirstDayPayingRoi;
+
+    @SerializedName("mini_game_paying_amount_d1_by_upload")
+    private Long miniGamePayingAmountD1ByUpload;
+
+    @SerializedName("mixed_monetization_roi_d1")
+    private Double mixedMonetizationRoiD1;
+
+    @SerializedName("mixed_monetization_roi_d3")
+    private Double mixedMonetizationRoiD3;
+
+    @SerializedName("mixed_monetization_roi_d7")
+    private Double mixedMonetizationRoiD7;
+
+    @SerializedName("mixed_monetization_roi_d14")
+    private Double mixedMonetizationRoiD14;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d1")
+    private Double miniGameMixedMonetizationRoiD1;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d1_by_reporting")
+    private Double miniGameMixedMonetizationRoiD1ByReporting;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d3")
+    private Double miniGameMixedMonetizationRoiD3;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d3_by_reporting")
+    private Double miniGameMixedMonetizationRoiD3ByReporting;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d7")
+    private Double miniGameMixedMonetizationRoiD7;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d7_by_reporting")
+    private Double miniGameMixedMonetizationRoiD7ByReporting;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d14")
+    private Double miniGameMixedMonetizationRoiD14;
+
+    @SerializedName("mini_game_mixed_monetization_roi_d14_by_reporting")
+    private Double miniGameMixedMonetizationRoiD14ByReporting;
+
+    @SerializedName("ad_paying_users_d1")
+    private Long adPayingUsersD1;
+
+    @SerializedName("ad_paying_cost_d1")
+    private Long adPayingCostD1;
+
+    @SerializedName("ad_pur_arpu_cost_d1")
+    private Long adPurArpuCostD1;
+
+    @SerializedName("ad_monetization_penetration_rat_d1")
+    private Double adMonetizationPenetrationRatD1;
+
+    @SerializedName("mini_game_paying_arpu_d1")
+    private Long miniGamePayingArpuD1;
+
+    @SerializedName("campaign_id")
+    private Long campaignId;
+
+    @SerializedName("campaign_name")
+    private String campaignName;
+
+    @SerializedName("web_add_to_cart_count")
+    private Long webAddToCartCount;
+
+    @SerializedName("web_add_to_cart_cost")
+    private Long webAddToCartCost;
+
+    @SerializedName("adgroup_id")
+    private Long adgroupId;
+
+    @SerializedName("adgroup_name")
+    private String adgroupName;
+
+    @SerializedName("preview_conversions_count")
+    private Long previewConversionsCount;
+
+    @SerializedName("preview_deep_conversions_count")
+    private Long previewDeepConversionsCount;
+
+    @SerializedName("ad_id")
+    private Long adId;
+
+    @SerializedName("ad_name")
+    private String adName;
+
+    @SerializedName("promoted_object_type")
+    private String promotedObjectType;
+
+    @SerializedName("promoted_object_id")
+    private String promotedObjectId;
+
+    @SerializedName("wechat_account_id")
+    private String wechatAccountId;
+
+    @SerializedName("wechat_agency_id")
+    private String wechatAgencyId;
+
+    @SerializedName("cost_deviation_rate")
+    private Double costDeviationRate;
+
+    @SerializedName("compensation_amount")
+    private Long compensationAmount;
+
+    @SerializedName("avg_view_per_user")
+    private Double avgViewPerUser;
+
+    @SerializedName("image_click_user_count")
+    private Long imageClickUserCount;
+
+    @SerializedName("video_click_user_count")
+    private Long videoClickUserCount;
+
+    @SerializedName("link_click_user_count")
+    private Long linkClickUserCount;
+
+    @SerializedName("portrait_click_user_count")
+    private Long portraitClickUserCount;
+
+    @SerializedName("nickname_click_user_count")
+    private Long nicknameClickUserCount;
+
+    @SerializedName("poi_click_user_count")
+    private Long poiClickUserCount;
+
+    @SerializedName("platform_key_page_view_user_count")
+    private Long platformKeyPageViewUserCount;
+
+    @SerializedName("platform_key_page_avg_view_per_user")
+    private Double platformKeyPageAvgViewPerUser;
+
+    @SerializedName("platform_key_page_view_duration")
+    private Double platformKeyPageViewDuration;
+
+    @SerializedName("cpn_click_button_cost")
+    private Long cpnClickButtonCost;
+
+    @SerializedName("praise_user_count")
+    private Long praiseUserCount;
+
+    @SerializedName("comment_user_count")
+    private Long commentUserCount;
+
+    @SerializedName("order_count")
+    private Long orderCount;
+
+    @SerializedName("order_rate")
+    private Double orderRate;
+
+    @SerializedName("quest_reservation_pv_cost")
+    private Long questReservationPvCost;
+
+    @SerializedName("leads_rate")
+    private Double leadsRate;
+
+    @SerializedName("leads_user_count")
+    private Long leadsUserCount;
+
+    @SerializedName("leads_cost")
+    private Long leadsCost;
+
+    @SerializedName("leads_user_rate")
+    private Double leadsUserRate;
+
+    @SerializedName("valid_leads_cost")
+    private Long validLeadsCost;
+
+    @SerializedName("valid_leads_rate")
+    private Double validLeadsRate;
+
+    @SerializedName("page_consult_user_count")
+    private Long pageConsultUserCount;
+
+    @SerializedName("valid_page_consult_user_count")
+    private Long validPageConsultUserCount;
+
+    @SerializedName("withdr_dep_web_user_count")
+    private Long withdrDepWebUserCount;
+
+    @SerializedName("wechat_minigame_register_cost")
+    private Long wechatMinigameRegisterCost;
+
+    @SerializedName("wechat_minigame_register_rate")
+    private Double wechatMinigameRegisterRate;
+
+    @SerializedName("wechat_minigame_arpu")
+    private Double wechatMinigameArpu;
+
+    @SerializedName("wechat_minigame_retention_count")
+    private Long wechatMinigameRetentionCount;
+
+    @SerializedName("wechat_minigame_checkout_count")
+    private Long wechatMinigameCheckoutCount;
+
+    @SerializedName("wechat_minigame_checkout_amount")
+    private Long wechatMinigameCheckoutAmount;
+
+    @SerializedName("official_account_follow_count")
+    private Long officialAccountFollowCount;
+
+    @SerializedName("official_account_follow_cost")
+    private Long officialAccountFollowCost;
+
+    @SerializedName("official_account_follow_rate")
+    private Double officialAccountFollowRate;
+
+    @SerializedName("official_account_register_user_count")
+    private Long officialAccountRegisterUserCount;
+
+    @SerializedName("official_account_register_rate")
+    private Double officialAccountRegisterRate;
+
+    @SerializedName("official_account_register_cost")
+    private Long officialAccountRegisterCost;
+
+    @SerializedName("official_account_register_amount")
+    private Long officialAccountRegisterAmount;
+
+    @SerializedName("official_account_register_roi")
+    private Long officialAccountRegisterRoi;
+
+    @SerializedName("official_account_apply_count")
+    private Long officialAccountApplyCount;
+
+    @SerializedName("official_account_apply_user_count")
+    private Long officialAccountApplyUserCount;
+
+    @SerializedName("official_account_apply_rate")
+    private Double officialAccountApplyRate;
+
+    @SerializedName("official_account_apply_cost")
+    private Long officialAccountApplyCost;
+
+    @SerializedName("official_account_apply_amount")
+    private Long officialAccountApplyAmount;
+
+    @SerializedName("official_account_apply_roi")
+    private Long officialAccountApplyRoi;
+
+    @SerializedName("official_account_order_count")
+    private Long officialAccountOrderCount;
+
+    @SerializedName("official_account_first_day_order_count")
+    private Long officialAccountFirstDayOrderCount;
+
+    @SerializedName("official_account_order_user_count")
+    private Long officialAccountOrderUserCount;
+
+    @SerializedName("official_account_order_rate")
+    private Double officialAccountOrderRate;
+
+    @SerializedName("official_account_order_cost")
+    private Long officialAccountOrderCost;
+
+    @SerializedName("official_account_order_amount")
+    private Long officialAccountOrderAmount;
+
+    @SerializedName("official_account_first_day_order_amount")
+    private Long officialAccountFirstDayOrderAmount;
+
+    @SerializedName("official_account_order_roi")
+    private Long officialAccountOrderRoi;
+
+    @SerializedName("official_account_consult_count")
+    private Long officialAccountConsultCount;
+
+    @SerializedName("official_account_reader_count")
+    private Long officialAccountReaderCount;
+
+    @SerializedName("official_account_credit_apply_user_count")
+    private Long officialAccountCreditApplyUserCount;
+
+    @SerializedName("official_account_credit_user_count")
+    private Long officialAccountCreditUserCount;
+
+    @SerializedName("coupon_get_cost")
+    private Long couponGetCost;
+
+    @SerializedName("coupon_get_rate")
+    private Double couponGetRate;
+
+    @SerializedName("coupon_use_count")
+    private Long couponUseCount;
+
+    @SerializedName("forward_user_count")
+    private Long forwardUserCount;
+
+    @SerializedName("video_outer_play_user_count")
+    private Long videoOuterPlayUserCount;
+
+    @SerializedName("video_inner_play_user_count")
+    private Long videoInnerPlayUserCount;
+
+    @SerializedName("poi_id")
+    private String poiId;
+}

+ 1207 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdStatOfHourDWD.java

@@ -0,0 +1,1207 @@
+package flink.zanxiangnet.ad.monitoring.pojo.entity;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * 广告维度的小时统计数据
+ */
+@Data
+public class AdStatOfHourDWD {
+
+    /**
+     * 统计的日期(用于 MaxCompute分区)
+     */
+    @SerializedName("stat_day_str")
+    private LocalDate statDayStr;
+
+    /**
+     * 统计的日期
+     */
+    @SerializedName("stat_day")
+    private LocalDate statDay;
+
+    /**
+     * 统计的小时
+     */
+    @SerializedName("hour")
+    private Integer hour;
+
+    /**
+     * 腾讯广告应用的账号 id
+     */
+    @SerializedName("account_id")
+    private Long accountId;
+
+    /**
+     * 计划 id
+     */
+    @SerializedName("campaign_id")
+    private Long campaignId;
+
+    /**
+     * 服务商账号 id
+     */
+    @SerializedName("agency_account_id")
+    private Long agencyAccountId;
+
+    /**
+     * 微信账号id
+     */
+    @SerializedName("wechat_account_id")
+    private String wechatAccountId;
+
+    /**
+     * 微信服务商id
+     */
+    @SerializedName("wechat_agency_id")
+    private String wechatAgencyId;
+
+    /**
+     * 广告组 id
+     */
+    @SerializedName("adgroup_id")
+    private Long adgroupId;
+
+    /**
+     * 广告 id
+     */
+    @SerializedName("ad_id")
+    private Long adId;
+
+    /**
+     * 当日成本偏差。反映广告今日的实际成本与目标成本直接的差异,注:该项成本相关数据按小时更新,与实时更新的「转化目标成本」数据存在出入属于正常情况。
+     */
+    @SerializedName("cost_deviation_rate_all")
+    private Double costDeviationRateAll;
+
+    /**
+     * 当日成本偏差。反映广告今日的实际成本与目标成本直接的差异,注:该项成本相关数据按小时更新,与实时更新的「转化目标成本」数据存在出入属于正常情况。
+     */
+    @SerializedName("cost_deviation_rate_day")
+    private Double costDeviationRateDay;
+
+    /**
+     * 当日成本偏差。反映广告今日的实际成本与目标成本直接的差异,注:该项成本相关数据按小时更新,与实时更新的「转化目标成本」数据存在出入属于正常情况。
+     */
+    @SerializedName("cost_deviation_rate_hour")
+    private Double costDeviationRateHour;
+
+    /**
+     * 消耗
+     */
+    @SerializedName("cost_total")
+    private Long costTotal;
+
+    /**
+     * 消耗
+     */
+    @SerializedName("cost_day")
+    private Long costDay;
+
+    /**
+     * 消耗
+     */
+    @SerializedName("cost_hour")
+    private Long costHour;
+
+    /**
+     * 赔付金额。智能优化成本保障政策下,广告超成本时的赔付金额。
+     */
+    @SerializedName("compensation_amount_total")
+    private Long compensationAmountTotal;
+
+    /**
+     * 赔付金额。智能优化成本保障政策下,广告超成本时的赔付金额。
+     */
+    @SerializedName("compensation_amount_day")
+    private Long compensationAmountDay;
+
+    /**
+     * 赔付金额。智能优化成本保障政策下,广告超成本时的赔付金额。
+     */
+    @SerializedName("compensation_amount_hour")
+    private Long compensationAmountHour;
+
+    /**
+     * 曝光次数。用户观看广告的次数。
+     */
+    @SerializedName("view_count_total")
+    private Long viewCountTotal;
+
+    /**
+     * 曝光次数。用户观看广告的次数。
+     */
+    @SerializedName("view_count_day")
+    private Long viewCountDay;
+
+    /**
+     * 曝光次数。用户观看广告的次数。
+     */
+    @SerializedName("view_count_hour")
+    private Long viewCountHour;
+
+    /**
+     * 千次曝光成本。平均每千次曝光的花费。
+     */
+    @SerializedName("thousand_display_price_all")
+    private Long thousandDisplayPriceAll;
+
+    /**
+     * 千次曝光成本。平均每千次曝光的花费。
+     */
+    @SerializedName("thousand_display_price_day")
+    private Long thousandDisplayPriceDay;
+
+    /**
+     * 千次曝光成本。平均每千次曝光的花费。
+     */
+    @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;
+
+    /**
+     * 人均曝光次数。每个用户观看广告的平均次数。
+     */
+    @SerializedName("avg_view_per_user_hour")
+    private Double avgViewPerUserHour;
+
+    /**
+     * 点击次数。用户在广告外层进行点击操作的次数。包括点击图片/视频,及朋友圈广告“文字链、头像、昵称、门店、选择按钮”等所有广告外层区域的点击。
+     */
+    @SerializedName("valid_click_count_total")
+    private Long validClickCountTotal;
+
+    /**
+     * 点击次数。用户在广告外层进行点击操作的次数。包括点击图片/视频,及朋友圈广告“文字链、头像、昵称、门店、选择按钮”等所有广告外层区域的点击。
+     */
+    @SerializedName("valid_click_count_day")
+    private Long validClickCountDay;
+
+    /**
+     * 点击次数。用户在广告外层进行点击操作的次数。包括点击图片/视频,及朋友圈广告“文字链、头像、昵称、门店、选择按钮”等所有广告外层区域的点击。
+     */
+    @SerializedName("valid_click_count_hour")
+    private Long validClickCountHour;
+
+    /**
+     * 点击率。看到广告后执行点击操作的百分比。计算逻辑:广告点击次数/广告曝光次数。
+     */
+    @SerializedName("ctr_all")
+    private Double ctrAll;
+
+    /**
+     * 点击率。看到广告后执行点击操作的百分比。计算逻辑:广告点击次数/广告曝光次数。
+     */
+    @SerializedName("ctr_day")
+    private Double ctrDay;
+
+    /**
+     * 点击率。看到广告后执行点击操作的百分比。计算逻辑:广告点击次数/广告曝光次数。
+     */
+    @SerializedName("ctr_hour")
+    private Double ctrHour;
+
+    /**
+     * 点击均价。一次广告点击的平均花费。计算逻辑:广告花费/广告点击次数。
+     */
+    @SerializedName("cpc_all")
+    private Long cpcAll;
+
+    /**
+     * 点击均价。一次广告点击的平均花费。计算逻辑:广告花费/广告点击次数。
+     */
+    @SerializedName("cpc_day")
+    private Long cpcDay;
+
+    /**
+     * 点击均价。一次广告点击的平均花费。计算逻辑:广告花费/广告点击次数。
+     */
+    @SerializedName("cpc_hour")
+    private Long cpcHour;
+
+    /**
+     * 可转化点击次数。朋友圈:可转化点击是指可能产生转化的外层点击次数。对于“公众号推广”的广告,包括外层的公众号头像、公众号昵称、详情页查看、原生推广页查看; 对于其他类型的广告,包括外层的详情页查看和原生推广页查看。公众号:可转化点击是指可能产生转化的点击次数。
+     */
+    @SerializedName("valuable_click_count_total")
+    private Long valuableClickCountTotal;
+
+    /**
+     * 可转化点击次数。朋友圈:可转化点击是指可能产生转化的外层点击次数。对于“公众号推广”的广告,包括外层的公众号头像、公众号昵称、详情页查看、原生推广页查看; 对于其他类型的广告,包括外层的详情页查看和原生推广页查看。公众号:可转化点击是指可能产生转化的点击次数。
+     */
+    @SerializedName("valuable_click_count_day")
+    private Long valuableClickCountDay;
+
+    /**
+     * 可转化点击次数。朋友圈:可转化点击是指可能产生转化的外层点击次数。对于“公众号推广”的广告,包括外层的公众号头像、公众号昵称、详情页查看、原生推广页查看; 对于其他类型的广告,包括外层的详情页查看和原生推广页查看。公众号:可转化点击是指可能产生转化的点击次数。
+     */
+    @SerializedName("valuable_click_count_hour")
+    private Long valuableClickCountHour;
+
+    /**
+     * 可转化点击率。用户看到广告后执行可转化点击操作的百分比。计算逻辑:广告可转化点击次数/广告曝光次数。
+     */
+    @SerializedName("valuable_click_rate_all")
+    private Double valuableClickRateAll;
+
+    /**
+     * 可转化点击率。用户看到广告后执行可转化点击操作的百分比。计算逻辑:广告可转化点击次数/广告曝光次数。
+     */
+    @SerializedName("valuable_click_rate_day")
+    private Double valuableClickRateDay;
+
+    /**
+     * 可转化点击率。用户看到广告后执行可转化点击操作的百分比。计算逻辑:广告可转化点击次数/广告曝光次数。
+     */
+    @SerializedName("valuable_click_rate_hour")
+    private Double valuableClickRateHour;
+
+    /**
+     * 可转化点击成本。一次可转化点击的平均花费。计算逻辑:广告花费/可转化点击次数。
+     */
+    @SerializedName("valuable_click_cost_all")
+    private Long valuableClickCostAll;
+
+    /**
+     * 可转化点击成本。一次可转化点击的平均花费。计算逻辑:广告花费/可转化点击次数。
+     */
+    @SerializedName("valuable_click_cost_day")
+    private Long valuableClickCostDay;
+
+    /**
+     * 可转化点击成本。一次可转化点击的平均花费。计算逻辑:广告花费/可转化点击次数。
+     */
+    @SerializedName("valuable_click_cost_hour")
+    private Long valuableClickCostHour;
+
+    /**
+     * 转化目标量。「转化目标」的具体数量,代表该广告的转化效果量级。
+     */
+    @SerializedName("conversions_count_total")
+    private Long conversionsCountTotal;
+
+    /**
+     * 转化目标量。「转化目标」的具体数量,代表该广告的转化效果量级。
+     */
+    @SerializedName("conversions_count_day")
+    private Long conversionsCountDay;
+
+    /**
+     * 转化目标量。「转化目标」的具体数量,代表该广告的转化效果量级。
+     */
+    @SerializedName("conversions_count_hour")
+    private Long conversionsCountHour;
+
+    /**
+     * 转化目标成本。广告产生一次转化目标的平均费用。计算逻辑:广告花费/转化目标量。
+     */
+    @SerializedName("conversions_cost_all")
+    private Long conversionsCostAll;
+
+    /**
+     * 转化目标成本。广告产生一次转化目标的平均费用。计算逻辑:广告花费/转化目标量。
+     */
+    @SerializedName("conversions_cost_day")
+    private Long conversionsCostDay;
+
+    /**
+     * 转化目标成本。广告产生一次转化目标的平均费用。计算逻辑:广告花费/转化目标量。
+     */
+    @SerializedName("conversions_cost_hour")
+    private Long conversionsCostHour;
+
+    /**
+     * 目标转化率。朋友圈:转化目标量/可转化点击次数。公众号:转化目标量/点击次数。
+     */
+    @SerializedName("conversions_rate_all")
+    private Double conversionsRateAll;
+
+    /**
+     * 目标转化率。朋友圈:转化目标量/可转化点击次数。公众号:转化目标量/点击次数。
+     */
+    @SerializedName("conversions_rate_day")
+    private Double conversionsRateDay;
+
+    /**
+     * 目标转化率。朋友圈:转化目标量/可转化点击次数。公众号:转化目标量/点击次数。
+     */
+    @SerializedName("conversions_rate_hour")
+    private Double conversionsRateHour;
+
+    /**
+     * 深度转化目标量-灰度中。根据您选择的深度智能优化目标,该广告对应的具体数量。部分需接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_count_total")
+    private Long deepConversionsCountTotal;
+
+    /**
+     * 深度转化目标量-灰度中。根据您选择的深度智能优化目标,该广告对应的具体数量。部分需接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_count_day")
+    private Long deepConversionsCountDay;
+
+    /**
+     * 深度转化目标量-灰度中。根据您选择的深度智能优化目标,该广告对应的具体数量。部分需接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_count_hour")
+    private Long deepConversionsCountHour;
+
+    /**
+     * 深度转化目标成本-灰度中。根据您选择的深度智能优化目标,该广告产生一次转化的平均费用。计算逻辑:广告花费/深度转化目标量。部分需接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_cost_all")
+    private Long deepConversionsCostAll;
+
+    /**
+     * 深度转化目标成本-灰度中。根据您选择的深度智能优化目标,该广告产生一次转化的平均费用。计算逻辑:广告花费/深度转化目标量。部分需接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_cost_day")
+    private Long deepConversionsCostDay;
+
+    /**
+     * 深度转化目标成本-灰度中。根据您选择的深度智能优化目标,该广告产生一次转化的平均费用。计算逻辑:广告花费/深度转化目标量。部分需接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_cost_hour")
+    private Long deepConversionsCostHour;
+
+    /**
+     * 深度目标转化率-灰度中。朋友圈:深度转化目标量/可转化点击次数。公众号:深度转化目标量/点击次数。指标随深度转化功能灰度中。接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_rate_all")
+    private Double deepConversionsRateAll;
+
+    /**
+     * 深度目标转化率-灰度中。朋友圈:深度转化目标量/可转化点击次数。公众号:深度转化目标量/点击次数。指标随深度转化功能灰度中。接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_rate_day")
+    private Double deepConversionsRateDay;
+
+    /**
+     * 深度目标转化率-灰度中。朋友圈:深度转化目标量/可转化点击次数。公众号:深度转化目标量/点击次数。指标随深度转化功能灰度中。接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_rate_hour")
+    private Double deepConversionsRateHour;
+
+    /**
+     * 下单量。用户通过该广告进行商品成交(如下单提交、在线支付)的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_count_total")
+    private Long orderCountTotal;
+
+    /**
+     * 下单量。用户通过该广告进行商品成交(如下单提交、在线支付)的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_count_day")
+    private Long orderCountDay;
+
+    /**
+     * 下单量。用户通过该广告进行商品成交(如下单提交、在线支付)的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_count_hour")
+    private Long orderCountHour;
+
+    /**
+     * 首日新增下单量。广告推广获取的用户,点击广告当日,带来的下单次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("first_day_order_count_total")
+    private Long firstDayOrderCountTotal;
+
+    /**
+     * 首日新增下单量。广告推广获取的用户,点击广告当日,带来的下单次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("first_day_order_count_day")
+    private Long firstDayOrderCountDay;
+
+    /**
+     * 首日新增下单量。广告推广获取的用户,点击广告当日,带来的下单次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("first_day_order_count_hour")
+    private Long firstDayOrderCountHour;
+
+    /**
+     * 下单成本(次数)。产生一次下单的成本。
+     */
+    @SerializedName("web_order_cost_all")
+    private Long webOrderCostAll;
+
+    /**
+     * 下单成本(次数)。产生一次下单的成本。
+     */
+    @SerializedName("web_order_cost_day")
+    private Long webOrderCostDay;
+
+    /**
+     * 下单成本(次数)。产生一次下单的成本。
+     */
+    @SerializedName("web_order_cost_hour")
+    private Long webOrderCostHour;
+
+    /**
+     * 下单率。一次点击到下单的转化率。
+     */
+    @SerializedName("order_rate_all")
+    private Double orderRateAll;
+
+    /**
+     * 下单率。一次点击到下单的转化率。
+     */
+    @SerializedName("order_rate_day")
+    private Double orderRateDay;
+
+    /**
+     * 下单率。一次点击到下单的转化率。
+     */
+    @SerializedName("order_rate_hour")
+    private Double orderRateHour;
+
+    /**
+     * 下单金额。广告带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_amount_total")
+    private Long orderAmountTotal;
+
+    /**
+     * 下单金额。广告带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_amount_day")
+    private Long orderAmountDay;
+
+    /**
+     * 下单金额。广告带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_amount_hour")
+    private Long orderAmountHour;
+
+    /**
+     * 首日新增下单金额。广告推广获取的用户,点击广告当日,带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("first_day_order_amount_total")
+    private Long firstDayOrderAmountTotal;
+
+    /**
+     * 首日新增下单金额。广告推广获取的用户,点击广告当日,带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("first_day_order_amount_day")
+    private Long firstDayOrderAmountDay;
+
+    /**
+     * 首日新增下单金额。广告推广获取的用户,点击广告当日,带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("first_day_order_amount_hour")
+    private Long firstDayOrderAmountHour;
+
+    /**
+     * 下单客单价。下单金额/下单量。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_unit_price_all")
+    private Long orderUnitPriceAll;
+
+    /**
+     * 下单客单价。下单金额/下单量。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_unit_price_day")
+    private Long orderUnitPriceDay;
+
+    /**
+     * 下单客单价。下单金额/下单量。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_unit_price_hour")
+    private Long orderUnitPriceHour;
+
+    /**
+     * 下单ROI。下单金额/广告花费。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_roi_all")
+    private Double orderRoiAll;
+
+    /**
+     * 下单ROI。下单金额/广告花费。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_roi_day")
+    private Double orderRoiDay;
+
+    /**
+     * 下单ROI。下单金额/广告花费。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_roi_hour")
+    private Double orderRoiHour;
+
+    /**
+     * 签收次数。签收从广告主处购买的商品的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("sign_in_count_total")
+    private Long signInCountTotal;
+
+    /**
+     * 签收次数。签收从广告主处购买的商品的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("sign_in_count_day")
+    private Long signInCountDay;
+
+    /**
+     * 签收次数。签收从广告主处购买的商品的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("sign_in_count_hour")
+    private Long signInCountHour;
+
+    /**
+     * 加企业微信客服人数。添加企业微信好友成功的独立用户数。
+     */
+    @SerializedName("scan_follow_count_total")
+    private Long scanFollowCountTotal;
+
+    /**
+     * 加企业微信客服人数。添加企业微信好友成功的独立用户数。
+     */
+    @SerializedName("scan_follow_count_day")
+    private Long scanFollowCountDay;
+
+    /**
+     * 加企业微信客服人数。添加企业微信好友成功的独立用户数。
+     */
+    @SerializedName("scan_follow_count_hour")
+    private Long scanFollowCountHour;
+
+    /**
+     * 小游戏注册人数。通过广告首次登录小游戏的独立用户数。
+     */
+    @SerializedName("wechat_app_register_uv_total")
+    private Long wechatAppRegisterUvTotal;
+
+    /**
+     * 小游戏注册人数。通过广告首次登录小游戏的独立用户数。
+     */
+    @SerializedName("wechat_app_register_uv_day")
+    private Long wechatAppRegisterUvDay;
+
+    /**
+     * 小游戏注册人数。通过广告首次登录小游戏的独立用户数。
+     */
+    @SerializedName("wechat_app_register_uv_hour")
+    private Long wechatAppRegisterUvHour;
+
+    /**
+     * 小游戏注册成本(人数)。产生一个小游戏注册人数的成本。
+     */
+    @SerializedName("wechat_minigame_register_cost_all")
+    private Long wechatMinigameRegisterCostAll;
+
+    /**
+     * 小游戏注册成本(人数)。产生一个小游戏注册人数的成本。
+     */
+    @SerializedName("wechat_minigame_register_cost_day")
+    private Long wechatMinigameRegisterCostDay;
+
+    /**
+     * 小游戏注册成本(人数)。产生一个小游戏注册人数的成本。
+     */
+    @SerializedName("wechat_minigame_register_cost_hour")
+    private Long wechatMinigameRegisterCostHour;
+
+    /**
+     * 小游戏注册率。一次点击到小游戏注册的转化率。
+     */
+    @SerializedName("wechat_minigame_register_rate_all")
+    private Double wechatMinigameRegisterRateAll;
+
+    /**
+     * 小游戏注册率。一次点击到小游戏注册的转化率。
+     */
+    @SerializedName("wechat_minigame_register_rate_day")
+    private Double wechatMinigameRegisterRateDay;
+
+    /**
+     * 小游戏注册率。一次点击到小游戏注册的转化率。
+     */
+    @SerializedName("wechat_minigame_register_rate_hour")
+    private Double wechatMinigameRegisterRateHour;
+
+    /**
+     * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
+     */
+    @SerializedName("wechat_minigame_arpu_all")
+    private Double wechatMinigameArpu_all;
+
+    /**
+     * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
+     */
+    @SerializedName("wechat_minigame_arpu_day")
+    private Double wechatMinigameArpu_day;
+
+    /**
+     * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
+     */
+    @SerializedName("wechat_minigame_arpu_hour")
+    private Double wechatMinigameArpu_hour;
+
+    /**
+     * 小游戏次留人数。通过广告首次登录小游戏,并在第二天再次登录的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_retention_count_total")
+    private Long wechatMinigameRetentionCountTotal;
+
+    /**
+     * 小游戏次留人数。通过广告首次登录小游戏,并在第二天再次登录的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_retention_count_day")
+    private Long wechatMinigameRetentionCountDay;
+
+    /**
+     * 小游戏次留人数。通过广告首次登录小游戏,并在第二天再次登录的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_retention_count_hour")
+    private Long wechatMinigameRetentionCountHour;
+
+    /**
+     * 小游戏付费次数。通过广告进入小游戏并完成付费的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_checkout_count_total")
+    private Long wechatMinigameCheckoutCountTotal;
+
+    /**
+     * 小游戏付费次数。通过广告进入小游戏并完成付费的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_checkout_count_day")
+    private Long wechatMinigameCheckoutCountDay;
+
+    /**
+     * 小游戏付费次数。通过广告进入小游戏并完成付费的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_checkout_count_hour")
+    private Long wechatMinigameCheckoutCountHour;
+
+    /**
+     * 小游戏付费金额。通过广告进入小游戏并完成付费的金额。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_checkout_amount_total")
+    private Long wechatMinigameCheckoutAmountTotal;
+
+    /**
+     * 小游戏付费金额。通过广告进入小游戏并完成付费的金额。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_checkout_amount_day")
+    private Long wechatMinigameCheckoutAmountDay;
+
+    /**
+     * 小游戏付费金额。通过广告进入小游戏并完成付费的金额。接入转化跟踪后可统计。
+     */
+    @SerializedName("wechat_minigame_checkout_amount_hour")
+    private Long wechatMinigameCheckoutAmountHour;
+
+    /**
+     * 公众号关注次数。用户通过广告关注公众号成功的次数。
+     */
+    @SerializedName("official_account_follow_count_total")
+    private Long officialAccountFollowCountTotal;
+
+    /**
+     * 公众号关注次数。用户通过广告关注公众号成功的次数。
+     */
+    @SerializedName("official_account_follow_count_day")
+    private Long officialAccountFollowCountDay;
+
+    /**
+     * 公众号关注次数。用户通过广告关注公众号成功的次数。
+     */
+    @SerializedName("official_account_follow_count_hour")
+    private Long officialAccountFollowCountHour;
+
+    /**
+     * 公众号关注率。一次点击到公众号关注的转化率。
+     */
+    @SerializedName("official_account_follow_rate_all")
+    private Double officialAccountFollowRateAll;
+
+    /**
+     * 公众号关注率。一次点击到公众号关注的转化率。
+     */
+    @SerializedName("official_account_follow_rate_day")
+    private Double officialAccountFollowRateDay;
+
+    /**
+     * 公众号关注率。一次点击到公众号关注的转化率。
+     */
+    @SerializedName("official_account_follow_rate_hour")
+    private Double officialAccountFollowRateHour;
+
+    /**
+     * 公众号内注册人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的注册行为的人数(UV)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_user_count_total")
+    private Long officialAccountRegisterUserCountTotal;
+
+    /**
+     * 公众号内注册人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的注册行为的人数(UV)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_user_count_day")
+    private Long officialAccountRegisterUserCountDay;
+
+    /**
+     * 公众号内注册人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的注册行为的人数(UV)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_user_count_hour")
+    private Long officialAccountRegisterUserCountHour;
+
+    /**
+     * 公众号内注册比例。公众号内注册独立用户数/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_rate_all")
+    private Double officialAccountRegisterRateAll;
+
+    /**
+     * 公众号内注册比例。公众号内注册独立用户数/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_rate_day")
+    private Double officialAccountRegisterRateDay;
+
+    /**
+     * 公众号内注册比例。公众号内注册独立用户数/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_rate_hour")
+    private Double officialAccountRegisterRateHour;
+
+    /**
+     * 公众号内注册成本。广告花费/广告产生的注册行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_cost_all")
+    private Long officialAccountRegisterCostAll;
+
+    /**
+     * 公众号内注册成本。广告花费/广告产生的注册行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_cost_day")
+    private Long officialAccountRegisterCostDay;
+
+    /**
+     * 公众号内注册成本。广告花费/广告产生的注册行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_cost_hour")
+    private Long officialAccountRegisterCostHour;
+
+    /**
+     * 公众号内注册订单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的订单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_amount_total")
+    private Long officialAccountRegisterAmountTotal;
+
+    /**
+     * 公众号内注册订单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的订单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_amount_day")
+    private Long officialAccountRegisterAmountDay;
+
+    /**
+     * 公众号内注册订单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的订单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_amount_hour")
+    private Long officialAccountRegisterAmountHour;
+
+    /**
+     * 公众号内注册ROI。注册产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_roi_all")
+    private Long officialAccountRegisterRoiAll;
+
+    /**
+     * 公众号内注册ROI。注册产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_roi_day")
+    private Long officialAccountRegisterRoiDay;
+
+    /**
+     * 公众号内注册ROI。注册产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_roi_hour")
+    private Long officialAccountRegisterRoiHour;
+
+    /**
+     * 公众号内填单次数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的数量。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_count_total")
+    private Long officialAccountApplyCountTotal;
+
+    /**
+     * 公众号内填单次数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的数量。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_count_day")
+    private Long officialAccountApplyCountDay;
+
+    /**
+     * 公众号内填单次数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的数量。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_count_hour")
+    private Long officialAccountApplyCountHour;
+
+    /**
+     * 公众号内填单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_user_count_total")
+    private Long officialAccountApplyUserCountTotal;
+
+    /**
+     * 公众号内填单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_user_count_day")
+    private Long officialAccountApplyUserCountDay;
+
+    /**
+     * 公众号内填单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_user_count_hour")
+    private Long officialAccountApplyUserCountHour;
+
+    /**
+     * 公众号内填单比例。公众号内填单的独立用户数/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_rate_all")
+    private Double officialAccountApplyRateAll;
+
+    /**
+     * 公众号内填单比例。公众号内填单的独立用户数/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_rate_day")
+    private Double officialAccountApplyRateDay;
+
+    /**
+     * 公众号内填单比例。公众号内填单的独立用户数/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_rate_hour")
+    private Double officialAccountApplyRateHour;
+
+    /**
+     * 公众号内填单成本。广告花费/广告产生的填单行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_apply_cost_all")
+    private Long officialAccountApplyCostAll;
+
+    /**
+     * 公众号内填单成本。广告花费/广告产生的填单行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_apply_cost_day")
+    private Long officialAccountApplyCostDay;
+
+    /**
+     * 公众号内填单成本。广告花费/广告产生的填单行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_apply_cost_hour")
+    private Long officialAccountApplyCostHour;
+
+    /**
+     * 公众号内填单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_amount_total")
+    private Long officialAccountApplyAmountTotal;
+
+    /**
+     * 公众号内填单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_amount_day")
+    private Long officialAccountApplyAmountDay;
+
+    /**
+     * 公众号内填单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_amount_hour")
+    private Long officialAccountApplyAmountHour;
+
+    /**
+     * 公众号内填单ROI。填单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_apply_roi_all")
+    private Long officialAccountApplyRoiAll;
+
+    /**
+     * 公众号内填单ROI。填单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_apply_roi_day")
+    private Long officialAccountApplyRoiDay;
+
+    /**
+     * 公众号内填单ROI。填单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_apply_roi_hour")
+    private Long officialAccountApplyRoiHour;
+
+    /**
+     * 公众号内下单次数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_count_total")
+    private Long officialAccountOrderCountTotal;
+
+    /**
+     * 公众号内下单次数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_count_day")
+    private Long officialAccountOrderCountDay;
+
+    /**
+     * 公众号内下单次数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_count_hour")
+    private Long officialAccountOrderCountHour;
+
+    /**
+     * 首日公众号内下单次数。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为数量。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_first_day_order_count_total")
+    private Long officialAccountFirstDayOrderCountTotal;
+
+    /**
+     * 首日公众号内下单次数。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为数量。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_first_day_order_count_day")
+    private Long officialAccountFirstDayOrderCountDay;
+
+    /**
+     * 首日公众号内下单次数。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为数量。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_first_day_order_count_hour")
+    private Long officialAccountFirstDayOrderCountHour;
+
+    /**
+     * 公众号内下单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_user_count_total")
+    private Long officialAccountOrderUserCountTotal;
+
+    /**
+     * 公众号内下单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_user_count_day")
+    private Long officialAccountOrderUserCountDay;
+
+    /**
+     * 公众号内下单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_user_count_hour")
+    private Long officialAccountOrderUserCountHour;
+
+    /**
+     * 公众号内下单比例。公众号内下单独立用户数(UV)/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_rate_all")
+    private Double officialAccountOrderRateAll;
+
+    /**
+     * 公众号内下单比例。公众号内下单独立用户数(UV)/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_rate_day")
+    private Double officialAccountOrderRateDay;
+
+    /**
+     * 公众号内下单比例。公众号内下单独立用户数(UV)/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_rate_hour")
+    private Double officialAccountOrderRateHour;
+
+    /**
+     * 公众号内下单成本。广告花费/广告产生的下单行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_cost_all")
+    private Long officialAccountOrderCostAll;
+
+    /**
+     * 公众号内下单成本。广告花费/广告产生的下单行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_cost_day")
+    private Long officialAccountOrderCostDay;
+
+    /**
+     * 公众号内下单成本。广告花费/广告产生的下单行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_cost_hour")
+    private Long officialAccountOrderCostHour;
+
+    /**
+     * 公众号内下单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_amount_total")
+    private Long officialAccountOrderAmountTotal;
+
+    /**
+     * 公众号内下单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_amount_day")
+    private Long officialAccountOrderAmountDay;
+
+    /**
+     * 公众号内下单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_amount_hour")
+    private Long officialAccountOrderAmountHour;
+
+    /**
+     * 首日公众号内下单金额。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_first_day_order_amount_total")
+    private Long officialAccountFirstDayOrderAmountTotal;
+
+    /**
+     * 首日公众号内下单金额。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_first_day_order_amount_day")
+    private Long officialAccountFirstDayOrderAmountDay;
+
+    /**
+     * 首日公众号内下单金额。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_first_day_order_amount_hour")
+    private Long officialAccountFirstDayOrderAmountHour;
+
+    /**
+     * 公众号内下单ROI。下单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_roi_all")
+    private Long officialAccountOrderRoiAll;
+
+    /**
+     * 公众号内下单ROI。下单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_roi_day")
+    private Long officialAccountOrderRoiDay;
+
+    /**
+     * 公众号内下单ROI。下单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_roi_hour")
+    private Long officialAccountOrderRoiHour;
+
+    /**
+     * 公众号内发消息人数。用户关注公众号后,在公众号对话框内发送消息的独立用户数。
+     */
+    @SerializedName("official_account_consult_count_total")
+    private Long officialAccountConsultCountTotal;
+
+    /**
+     * 公众号内发消息人数。用户关注公众号后,在公众号对话框内发送消息的独立用户数。
+     */
+    @SerializedName("official_account_consult_count_day")
+    private Long officialAccountConsultCountDay;
+
+    /**
+     * 公众号内发消息人数。用户关注公众号后,在公众号对话框内发送消息的独立用户数。
+     */
+    @SerializedName("official_account_consult_count_hour")
+    private Long officialAccountConsultCountHour;
+
+    /**
+     * 阅读粉丝量。近3日新增的粉丝中产生阅读行为的用户数。
+     */
+    @SerializedName("official_account_reader_count_total")
+    private Long officialAccountReaderCountTotal;
+
+    /**
+     * 阅读粉丝量。近3日新增的粉丝中产生阅读行为的用户数。
+     */
+    @SerializedName("official_account_reader_count_day")
+    private Long officialAccountReaderCountDay;
+
+    /**
+     * 阅读粉丝量。近3日新增的粉丝中产生阅读行为的用户数。
+     */
+    @SerializedName("official_account_reader_count_hour")
+    private Long officialAccountReaderCountHour;
+
+    /**
+     * 公众号内进件人数。在公众号内完整提交贷款申请资料的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_credit_apply_user_count_total")
+    private Long officialAccountCreditApplyUserCountTotal;
+
+    /**
+     * 公众号内进件人数。在公众号内完整提交贷款申请资料的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_credit_apply_user_count_day")
+    private Long officialAccountCreditApplyUserCountTotalDay;
+
+    /**
+     * 公众号内进件人数。在公众号内完整提交贷款申请资料的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_credit_apply_user_count_hour")
+    private Long officialAccountCreditApplyUserCountHour;
+
+    /**
+     * 公众号内授信人数。在公众号内完整提交贷款申请资料,并通过放款方的资质审核的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_credit_user_count_total")
+    private Long officialAccountCreditUserCountTotal;
+
+    /**
+     * 公众号内授信人数。在公众号内完整提交贷款申请资料,并通过放款方的资质审核的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_credit_user_count_day")
+    private Long officialAccountCreditUserCountDay;
+
+    /**
+     * 公众号内授信人数。在公众号内完整提交贷款申请资料,并通过放款方的资质审核的独立用户数。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_credit_user_count_hour")
+    private Long officialAccountCreditUserCountHour;
+
+    /**
+     * 广告分享次数。用户将广告落地页分享给好友和朋友圈的次数。
+     */
+    @SerializedName("forward_count_total")
+    private Long forwardCountTotal;
+
+    /**
+     * 广告分享次数。用户将广告落地页分享给好友和朋友圈的次数。
+     */
+    @SerializedName("forward_count_day")
+    private Long forwardCountDay;
+
+    /**
+     * 广告分享次数。用户将广告落地页分享给好友和朋友圈的次数。
+     */
+    @SerializedName("forward_count_hour")
+    private Long forwardCountHour;
+
+    /**
+     * 广告分享人数。将广告落地页分享给好友和朋友圈的独立用户数。
+     */
+    @SerializedName("forward_user_count_total")
+    private Long forwardUserCountTotal;
+
+    /**
+     * 广告分享人数。将广告落地页分享给好友和朋友圈的独立用户数。
+     */
+    @SerializedName("forward_user_count_day")
+    private Long forwardUserCountDay;
+
+    /**
+     * 广告分享人数。将广告落地页分享给好友和朋友圈的独立用户数。
+     */
+    @SerializedName("forward_user_count_hour")
+    private Long forwardUserCountHour;
+
+    /**
+     * 不感兴趣点击次数。用户点击“不感兴趣”的次数。
+     */
+    @SerializedName("no_interest_count_total")
+    private Long noInterestCountTotal;
+
+    /**
+     * 不感兴趣点击次数。用户点击“不感兴趣”的次数。
+     */
+    @SerializedName("no_interest_count_day")
+    private Long noInterestCountDay;
+
+    /**
+     * 不感兴趣点击次数。用户点击“不感兴趣”的次数。
+     */
+    @SerializedName("no_interest_count_hour")
+    private Long noInterestCountHour;
+}

+ 116 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/PlanStatOfMinuteDWD.java

@@ -0,0 +1,116 @@
+package flink.zanxiangnet.ad.monitoring.pojo.entity;
+
+import lombok.Data;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 每 5分钟统计的一条数据
+ */
+@Data
+public class PlanStatOfMinuteDWD {
+
+    /**
+     * 统计时间
+     */
+    private Long statTime;
+
+    /**
+     * 统计日期 yyyy-mm-dd
+     */
+    private String statDay;
+
+    /**
+     * 统计的小时
+     */
+    private Integer hour;
+
+    /**
+     * 账号 id
+     */
+    private Long accountId;
+
+    /**
+     * 服务商账号 id
+     */
+    private Long agencyAccountId;
+
+    /**
+     * 计划的广告组与广告的映射
+     */
+    private Map<Long, Set<Long>> adMapping;
+
+    /**
+     * 当日成本偏差
+     */
+    private Double costDeviationRate;
+
+    private Long costAll;
+
+    private Long costDay;
+
+    private Long costHour;
+
+    private Long costMinute;
+
+    private Long compensationAmountTotal;
+
+    private Long compensationAmountMinute;
+
+    private Long viewCountTotal;
+
+    private Long viewCountDay;
+
+    private Long viewCountHour;
+
+    private Long viewCountMinute;
+
+    private Long thousandDisplayPriceAll;
+
+    private Long thousandDisplayPriceDay;
+
+    private Long thousandDisplayPriceHour;
+
+    private Long thousandDisplayPriceMinute;
+
+    private Double avgViewPerUserAll;
+
+    private Double avgViewPerUserDay;
+
+    private Double avgViewPerUserHour;
+
+    private Double avgViewPerUserMinute;
+
+    private Long specialPageExpUvTotal;
+
+    private Long specialPageExpUvMinute;
+
+    private Long specialPageExpCostAll;
+
+    private Long specialPageExpCostMinute;
+
+    private Long validClickCountTotal;
+
+    private Long validClickCountDay;
+
+    private Long validClickCountHour;
+
+    private Long validClickCountMinute;
+
+    private Double ctrAll;
+
+    private Double ctrDay;
+
+    private Double ctrHour;
+
+    private Double ctrMinute;
+
+    private Long cpcAll;
+
+    private Long cpcDay;
+
+    private Long cpcHour;
+
+    private Long cpcMinute;
+}

+ 70 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/DateUtil.java

@@ -0,0 +1,70 @@
+package flink.zanxiangnet.ad.monitoring.util;
+
+import java.time.*;
+import java.util.Date;
+
+public class DateUtil {
+    public static long localDateToSecond(LocalDate localDate) {
+        return localDate.atStartOfDay(ZoneOffset.ofHours(8)).toEpochSecond();
+    }
+
+    public static long localDateToMilli(LocalDate localDate) {
+        return localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
+    }
+
+    public static Date localDateToDate(LocalDate localDate) {
+        return Date.from(localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant());
+    }
+
+    public static LocalDateTime localDateToLocalDateTime(LocalDate localDate) {
+        return LocalDateTime.of(localDate, LocalTime.MIN);
+    }
+
+    public static long localDateTimeToSecond(LocalDateTime localDateTime) {
+        return localDateTime.toEpochSecond(ZoneOffset.ofHours(8));
+    }
+
+    public static long localDateTimeToMilli(LocalDateTime localDateTime) {
+        return localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
+    }
+
+    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
+        return Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
+    }
+
+    public static LocalDate secondToLocalDate(long second) {
+        return Instant.ofEpochSecond(second).atZone(ZoneOffset.ofHours(8)).toLocalDate();
+    }
+
+    public static LocalDate milliToLocalDate(long milli) {
+        return Instant.ofEpochMilli(milli).atZone(ZoneOffset.ofHours(8)).toLocalDate();
+    }
+
+    public static long milliToSecond(long milli) {
+        return milli / 1000;
+    }
+
+    public static LocalDateTime secondToLocalDateTime(long second) {
+        return Instant.ofEpochSecond(second).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
+    }
+
+    public static long secondToMilli(int second) {
+        return second * 1000L;
+    }
+
+    public static long secondToMilli(long second) {
+        return second * 1000;
+    }
+
+    public static LocalDateTime milliToLocalDateTime(long milli) {
+        return Instant.ofEpochMilli(milli).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
+    }
+
+    public static LocalDate dateToLocalDate(Date date) {
+        return date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDate();
+    }
+
+    public static LocalDateTime dateToLocalDateTime(Date date) {
+        return date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
+    }
+}

+ 172 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/JsonUtil.java

@@ -0,0 +1,172 @@
+package flink.zanxiangnet.ad.monitoring.util;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * @Author wcc
+ * @Date 2020/11/17 20:37
+ * @Version 1.0
+ * @Description
+ */
+public class JsonUtil {
+    private static final Logger log = LoggerFactory.getLogger(JsonUtil.class);
+
+    /**
+     * 序列化和反序列化不带 @class属性
+     */
+    public static final ObjectMapper JACKSON = new ObjectMapper()
+            // json字符串转对象多余属性不报错
+            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+            // 对象转 json为 null不显示
+            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
+            // 指定要序列化的域,只序列化字段(包括 private字段),不对 get、set及 isXxx进行序列化。ANY指所有作用域的字段,包括 private
+            .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
+            .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
+            .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
+            .setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE)
+            .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+
+    /**
+     * 序列化和反序列化带 @class属性
+     */
+    public static final ObjectMapper JACKSON_WITH_CLASS = new ObjectMapper()
+            // json字符串转对象多余属性不报错
+            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+            // 对象转 json为 null不显示
+            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
+            // 指定要序列化的域,只序列化字段(包括 private字段),不对 get、set及 isXxx进行序列化。ANY指所有作用域的字段,包括 private
+            .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
+            .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
+            .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
+            .setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE)
+            // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+            .activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
+                    ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY)
+            .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+
+    static {// 解决 java.time包里面的类的序列化问题
+        JACKSON.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        JACKSON_WITH_CLASS.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        JavaTimeModule timeModule = new JavaTimeModule();
+        timeModule.addDeserializer(LocalDate.class,
+                new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        timeModule.addDeserializer(LocalDateTime.class,
+                new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        timeModule.addSerializer(LocalDate.class,
+                new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        timeModule.addSerializer(LocalDateTime.class,
+                new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        JACKSON.registerModule(timeModule);
+        JACKSON_WITH_CLASS.registerModule(timeModule);
+    }
+
+    public static String toString(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        try {
+            return JACKSON.writeValueAsString(obj);
+        } catch (JsonProcessingException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static String toStringWithClass(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        try {
+            return JACKSON_WITH_CLASS.writeValueAsString(obj);
+        } catch (JsonProcessingException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static <T> T toObj(String json, Class<T> clazz) {
+        try {
+            return JACKSON.readValue(json, clazz);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static Object toObjWithClass(String json) {
+        try {
+            return JACKSON_WITH_CLASS.readValue(json, Object.class);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static <T> Collection<T> toList(String json, Class<? extends Collection> collectionClazz, Class<T> tClass) {
+        try {
+            return JACKSON.readValue(json, JACKSON.getTypeFactory().constructCollectionType(collectionClazz, tClass));
+        } catch (JsonProcessingException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static Collection<Object> toListWithClass(String json, Class<? extends Collection> collectionClazz) {
+        try {
+            return JACKSON_WITH_CLASS.readValue(json, JACKSON_WITH_CLASS.getTypeFactory().constructCollectionType(collectionClazz, Object.class));
+        } catch (JsonProcessingException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static <V> Map<String, V> toMap(String json, Class<? extends Map> mapClazz, Class<V> vClass) {
+        try {
+            return JACKSON.readValue(json, JACKSON.getTypeFactory().constructMapType(mapClazz, String.class, vClass));
+        } catch (JsonProcessingException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static Map<String, Object> toMapWithClass(String json, Class<? extends Map> mapClazz) {
+        try {
+            return JACKSON_WITH_CLASS.readValue(json, JACKSON_WITH_CLASS.getTypeFactory().constructMapType(mapClazz, String.class, Object.class));
+        } catch (JsonProcessingException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public static <K, V> Map<K, V> toMap(String json, Class<? extends Map> mapClazz, Class<K> kClass, Class<V> vClass) {
+        try {
+            return JACKSON.readValue(json, JACKSON.getTypeFactory().constructMapType(mapClazz, kClass, vClass));
+        } catch (JsonProcessingException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+}

+ 41 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/NumberUtil.java

@@ -0,0 +1,41 @@
+package flink.zanxiangnet.ad.monitoring.util;
+
+import java.math.BigDecimal;
+
+public class NumberUtil {
+
+    public static Integer add(Integer val1, Integer val2) {
+        if (val1 == null) {
+            return val2 == null ? 0 : val2;
+        }
+        return val2 == null ? val1 : val1 + val2;
+    }
+
+    public static Long add(Long val1, Long val2) {
+        if (val1 == null) {
+            return val2 == null ? 0 : val2;
+        }
+        return val2 == null ? val1 : val1 + val2;
+    }
+
+    public static Double add(Float val1, Float val2) {
+        if (val1 == null) {
+            return (double) (val2 == null ? 0 : val2);
+        }
+        return (double) (val2 == null ? val1 : val1 + val2);
+    }
+
+    public static Double add(Double val1, Double val2) {
+        if (val1 == null) {
+            return val2 == null ? 0 : val2;
+        }
+        return val2 == null ? val1 : val1 + val2;
+    }
+
+    public static BigDecimal add(BigDecimal val1, BigDecimal val2) {
+        if (val1 == null) {
+            return val2 == null ? BigDecimal.ZERO : val2;
+        }
+        return val2 == null ? val1 : val1.add(val2);
+    }
+}

BIN
flink-ad-monitoring/src/main/resources/kafka.client.truststore.jks


+ 28 - 0
flink-ad-monitoring/src/main/resources/log4j2.properties

@@ -0,0 +1,28 @@
+################################################################################
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+rootLogger.level = WARN
+rootLogger.appenderRef.console.ref = ConsoleAppender
+
+logger.sink.name = org.apache.flink.walkthrough.common.sink.AlertSink
+logger.sink.level = INFO
+
+appender.console.name = ConsoleAppender
+appender.console.type = CONSOLE
+appender.console.layout.type = PatternLayout
+appender.console.layout.pattern = %d{HH:mm:ss,SSS} %-5p %-60c %x - %m%n