Browse Source

写入 max-compute

wcc 3 năm trước cách đây
mục cha
commit
cd187d5a6b
20 tập tin đã thay đổi với 2974 bổ sung1532 xóa
  1. 7 0
      flink-ad-monitoring/pom.xml
  2. 159 37
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/KafkaDemoJob.java
  3. 20 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/MaxComputeLog.java
  4. 11 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/MaxComputeParams.java
  5. 89 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/MaxComputeWriter.java
  6. 93 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/sink/MaxComputeSink.java
  7. 115 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/sink/MaxComputeSinkBuffer.java
  8. 4 1
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/dto/AdDataOfMinuteDTO.java
  9. 0 1368
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdDataOfHourODS.java
  10. 454 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdDataOfMinuteODS.java
  11. 4 10
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdStatOfHourDWD.java
  12. 1585 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdStatOfMinuteDWD.java
  13. 0 116
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/PlanStatOfMinuteDWD.java
  14. 11 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/DateUtil.java
  15. 135 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/BeanUtil.java
  16. 15 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/DataMapping.java
  17. 89 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/DataTypeEnum.java
  18. 42 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/FieldInfo.java
  19. 141 0
      flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/ObjectUtil.java
  20. 0 0
      flink-ad-monitoring/src/main/resources/application.properties

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

@@ -142,6 +142,13 @@ under the License.
             <artifactId>clickhouse-jdbc</artifactId>
             <version>0.3.1</version>
         </dependency>
+
+        <!-- Java操作 csv文件 -->
+        <dependency>
+            <groupId>net.sf.supercsv</groupId>
+            <artifactId>super-csv</artifactId>
+            <version>2.4.0</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 159 - 37
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/KafkaDemoJob.java

@@ -1,19 +1,32 @@
 package flink.zanxiangnet.ad.monitoring;
 
+import com.aliyun.odps.Instance;
+import com.aliyun.odps.Odps;
+import com.aliyun.odps.account.Account;
+import com.aliyun.odps.account.AliyunAccount;
+import com.aliyun.odps.data.Record;
+import com.aliyun.odps.task.SQLTask;
 import com.tencent.ads.model.HourlyReportsGetListStruct;
+import flink.zanxiangnet.ad.monitoring.maxcompute.sink.MaxComputeSink;
 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.pojo.dto.AdDataOfMinuteDTO;
+import flink.zanxiangnet.ad.monitoring.pojo.entity.AdDataOfMinuteODS;
+import flink.zanxiangnet.ad.monitoring.pojo.entity.AdStatOfHourDWD;
 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.FilterFunction;
 import org.apache.flink.api.common.functions.ReduceFunction;
+import org.apache.flink.api.common.functions.RichMapFunction;
+import org.apache.flink.api.common.functions.RichReduceFunction;
 import org.apache.flink.api.common.serialization.SimpleStringSchema;
 import org.apache.flink.api.java.functions.KeySelector;
+import org.apache.flink.configuration.Configuration;
 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;
@@ -33,6 +46,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 
 import java.time.Duration;
+import java.time.LocalDateTime;
 import java.util.Properties;
 
 public class KafkaDemoJob {
@@ -74,9 +88,148 @@ public class KafkaDemoJob {
 
         DataStreamSource<String> in = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "adDataOfMinuteSource_kafka");
 
+        SingleOutputStreamOperator<AdDataOfMinuteODS> adOdsStream = in.filter(StringUtils::isNotBlank)
+                .map(str -> {
+                    AdDataOfMinuteDTO dto = JsonUtil.toObj(str, AdDataOfMinuteDTO.class);
+                    LocalDateTime statTime = DateUtil.milliToLocalDateTime(dto.getCreateTime());
+                    AdDataOfMinuteODS adOds = new AdDataOfMinuteODS();
+                    adOds.setStatDay(DateUtil.formatLocalDate(statTime.toLocalDate()));
+                    adOds.setHour(dto.getHourlyReportsGetListStruct().getHour().intValue());
+                    adOds.setStatTime(dto.getCreateTime());
+                    adOds.setAccountId(dto.getAccountId());
+                    adOds.setAgencyAccountId(dto.getHourlyReportsGetListStruct().getAccountId());
+                    BeanUtils.copyProperties(dto.getHourlyReportsGetListStruct(), adOds);
+                    return adOds;
+                })
+                // 打水印,延迟 12分钟,同时指定时间流
+                .assignTimestampsAndWatermarks(WatermarkStrategy.<AdDataOfMinuteODS>forBoundedOutOfOrderness(Duration.ofMinutes(12L))
+                        .withTimestampAssigner((SerializableTimestampAssigner<AdDataOfMinuteODS>) (adOds, l) -> adOds.getStatTime())
+                );
+
+        adOdsStream.addSink(new MaxComputeSink<>(AdDataOfMinuteODS.class, "statDay"));
+
+        // 获取指定广告的历史统计信息(用于统计总的消耗信息等)
+        /*SingleOutputStreamOperator<AdStatOfHourDWD> oldAdStream = adOdsStream.map(new RichMapFunction<AdDataOfMinuteODS, AdStatOfHourDWD>() {
+            // 在这里初始化 MaxCompute连接实例
+            private Odps odps;
+            @Override
+            public void open(Configuration parameters) throws Exception {
+                Account account = new AliyunAccount("LTAI5tFuLw65UsH3tqru2K1h", "p1F8my4ovgcEfs3HVORdmeLlLUUKRp");
+                odps = new Odps(account);
+                // odps.setEndpoint("http://service.odps.aliyun.com/api");
+                odps.setEndpoint("http://service.cn-hangzhou.maxcompute.aliyun.com/api");
+                // http://dt.cn-hangzhou.maxcompute.aliyun.com
+                odps.setDefaultProject("ZxData_dev");
+            }
+            @Override
+            public AdStatOfHourDWD map(AdDataOfMinuteODS adDataOfMinuteODS) throws Exception {
+                Instance i = SQLTask.run(odps, "SELECT * FROM ");
+                i.waitForSuccess();
+                for(Record record : SQLTask.getResult(i)) {
+                    record.get(0);
+                }
+                return null;
+            }
+        });*/
+
+        /*adOdsStream.join(oldAdStream)
+                .where((KeySelector<AdDataOfMinuteODS, Long>) AdDataOfMinuteODS::getAdId)
+                .equalTo((KeySelector<AdStatOfHourDWD, Long>) AdStatOfHourDWD::getAdId)
+                .window(TumblingEventTimeWindows.of(Time.minutes(5L)));*/
+
+        // 统计广告小时数据
+        /*adOdsStream.map(adOds -> {
+                    AdStatOfHourDWD adStatOfHour = new AdStatOfHourDWD();
+                    adStatOfHour.setStatDay(adOds.getStatDay());
+                    adStatOfHour.setHour(adOds.getHour());
+                    adStatOfHour.setAccountId(adOds.getAccountId());
+                    adStatOfHour.setCampaignId(adOds.getCampaignId());
+                    adStatOfHour.setAgencyAccountId(adOds.getAgencyAccountId());
+                    adStatOfHour.setWechatAccountId(adOds.getWechatAccountId());
+                    adStatOfHour.setWechatAgencyId(adOds.getWechatAgencyId());
+                    adStatOfHour.setAdgroupId(adOds.getAdgroupId());
+                    adStatOfHour.setAdId(adOds.getAdId());
+                    adStatOfHour.setCostDeviationRateHour(adOds.getCostDeviationRate());
+                    adStatOfHour.setCostHour(adOds.getCost());
+                    adStatOfHour.setCompensationAmountHour(adOds.getCompensationAmount());
+                    adStatOfHour.setViewCountHour(adOds.getViewCount());
+                    adStatOfHour.setThousandDisplayPriceHour(adOds.getThousandDisplayPrice());
+                    adStatOfHour.setAvgViewPerUserHour(adOds.getAvgViewPerUser());
+                    adStatOfHour.setValidClickCountHour(adOds.getValidClickCount());
+                    adStatOfHour.setCtrHour(adOds.getCtr());
+                    adStatOfHour.setCpcHour(adOds.getCpc());
+                    adStatOfHour.setValuableClickCountHour(adOds.getValuableClickCount());
+                    adStatOfHour.setValuableClickRateHour(adOds.getValuableClickRate());
+                    adStatOfHour.setValuableClickCostHour(adOds.getValuableClickCost());
+                    adStatOfHour.setConversionsCountHour(adOds.getConversionsCount());
+                    adStatOfHour.setConversionsCostHour(adOds.getConversionsCost());
+                    adStatOfHour.setConversionsRateHour(adOds.getConversionsRate());
+                    adStatOfHour.setDeepConversionsCountHour(adOds.getDeepConversionsCount());
+                    adStatOfHour.setDeepConversionsCostHour(adOds.getDeepConversionsCost());
+                    adStatOfHour.setDeepConversionsRateHour(adOds.getDeepConversionsRate());
+                    adStatOfHour.setOrderCountHour(adOds.getOrderCount());
+                    adStatOfHour.setFirstDayOrderCountHour(adOds.getFirstDayOrderCount());
+                    adStatOfHour.setWebOrderCostHour(adOds.getWebOrderCost());
+                    adStatOfHour.setOrderRateHour(adOds.getOrderRate());
+                    adStatOfHour.setOrderAmountHour(adOds.getOrderAmount());
+                    adStatOfHour.setFirstDayOrderAmountHour(adOds.getFirstDayOrderAmount());
+                    adStatOfHour.setOrderUnitPriceHour(adOds.getOrderUnitPrice());
+                    adStatOfHour.setOrderRoiHour(adOds.getOrderRoi());
+                    adStatOfHour.setSignInCountHour(adOds.getSignInCount());
+                    adStatOfHour.setScanFollowCountHour(adOds.getScanFollowCount());
+                    adStatOfHour.setWechatAppRegisterUvHour(adOds.getWechatAppRegisterUv());
+                    adStatOfHour.setWechatMinigameRegisterCostHour(adOds.getWechatMinigameRegisterCost());
+                    adStatOfHour.setWechatMinigameRegisterRateHour(adOds.getWechatMinigameRegisterRate());
+                    adStatOfHour.setWechatMinigameArpuHour(adOds.getWechatMinigameArpu());
+                    adStatOfHour.setWechatMinigameRetentionCountHour(adOds.getWechatMinigameRetentionCount());
+                    adStatOfHour.setWechatMinigameCheckoutCountHour(adOds.getWechatMinigameCheckoutCount());
+                    adStatOfHour.setWechatMinigameCheckoutAmountHour(adOds.getWechatMinigameCheckoutAmount());
+                    adStatOfHour.setOfficialAccountFollowCountHour(adOds.getOfficialAccountFollowCount());
+                    adStatOfHour.setOfficialAccountFollowRateHour(adOds.getOfficialAccountFollowRate());
+                    adStatOfHour.setOfficialAccountRegisterUserCountHour(adOds.getOfficialAccountRegisterUserCount());
+                    adStatOfHour.setOfficialAccountRegisterRateHour(adOds.getOfficialAccountRegisterRate());
+                    adStatOfHour.setOfficialAccountRegisterCostHour(adOds.getOfficialAccountRegisterCost());
+                    adStatOfHour.setOfficialAccountRegisterAmountHour(adOds.getOfficialAccountRegisterAmount());
+                    adStatOfHour.setOfficialAccountRegisterRoiHour(adOds.getOfficialAccountRegisterRoi());
+                    adStatOfHour.setOfficialAccountApplyCountHour(adOds.getOfficialAccountApplyCount());
+                    adStatOfHour.setOfficialAccountApplyUserCountHour(adOds.getOfficialAccountApplyUserCount());
+                    adStatOfHour.setOfficialAccountApplyRateHour(adOds.getOfficialAccountApplyRate());
+                    adStatOfHour.setOfficialAccountApplyCostHour(adOds.getOfficialAccountApplyCost());
+                    adStatOfHour.setOfficialAccountApplyAmountHour(adOds.getOfficialAccountApplyAmount());
+                    adStatOfHour.setOfficialAccountApplyRoiHour(adOds.getOfficialAccountApplyRoi());
+                    adStatOfHour.setOfficialAccountOrderCountHour(adOds.getOfficialAccountOrderCount());
+                    adStatOfHour.setOfficialAccountFirstDayOrderCountHour(adOds.getOfficialAccountFirstDayOrderCount());
+                    adStatOfHour.setOfficialAccountOrderUserCountHour(adOds.getOfficialAccountOrderUserCount());
+                    adStatOfHour.setOfficialAccountOrderRateHour(adOds.getOfficialAccountOrderRate());
+                    adStatOfHour.setOfficialAccountOrderCostHour(adOds.getOfficialAccountOrderCost());
+                    adStatOfHour.setOfficialAccountOrderAmountHour(adOds.getOfficialAccountOrderAmount());
+                    adStatOfHour.setOfficialAccountFirstDayOrderAmountHour(adOds.getOfficialAccountFirstDayOrderAmount());
+                    adStatOfHour.setOfficialAccountOrderRoiHour(adOds.getOfficialAccountOrderRoi());
+                    adStatOfHour.setOfficialAccountConsultCountHour(adOds.getOfficialAccountConsultCount());
+                    adStatOfHour.setOfficialAccountReaderCountHour(adOds.getOfficialAccountReaderCount());
+                    adStatOfHour.setOfficialAccountCreditApplyUserCountHour(adOds.getOfficialAccountCreditApplyUserCount());
+                    adStatOfHour.setOfficialAccountCreditUserCountHour(adOds.getOfficialAccountCreditUserCount());
+                    adStatOfHour.setForwardCountHour(adOds.getForwardCount());
+                    adStatOfHour.setForwardUserCountHour(adOds.getForwardUserCount());
+                    adStatOfHour.setNoInterestCountHour(adOds.getNoInterestCount());
+                    return adStatOfHour;
+                }).keyBy((KeySelector<AdStatOfHourDWD, Long>) AdStatOfHourDWD::getAdId)
+                // 开一个 5分钟的滚动窗口
+                .window(TumblingEventTimeWindows.of(Time.minutes(5L)))
+                // 数据聚合
+                .reduce(new RichReduceFunction<AdStatOfHourDWD>() {
+                    @Override
+                    public void open(Configuration parameters) throws Exception {
+                    }
+                    @Override
+                    public AdStatOfHourDWD reduce(AdStatOfHourDWD adStatOfHourDWD, AdStatOfHourDWD t1) throws Exception {
+                        return null;
+                    }
+                });*/
+
         // 广告流
-        SingleOutputStreamOperator<AdInfo> adStream = in.filter(StringUtils::isNotBlank)
-                .map(str -> JsonUtil.toObj(str, AdDataOfHourDTO.class))
+        /*SingleOutputStreamOperator<AdInfo> adStream = in.filter(StringUtils::isNotBlank)
+                .map(str -> JsonUtil.toObj(str, AdDataOfMinuteDTO.class))
                 .map(dto -> {
                     HourlyReportsGetListStruct struct = dto.getHourlyReportsGetListStruct();
                     StatInfo statInfo = new StatInfo();
@@ -109,45 +262,14 @@ public class KafkaDemoJob {
                             collector.collect(adInfo);
                         }
                     }
-                });
+                });*/
 
-        SingleOutputStreamOperator<PlanInfo> planStream = adStream.keyBy((KeySelector<AdInfo, Long>) AdInfo::getCampaignId)
+        /*SingleOutputStreamOperator<PlanInfo> planStream = adStream.keyBy((KeySelector<AdInfo, Long>) AdInfo::getCampaignId)
                 .map()
                 .window(TumblingEventTimeWindows.of(Time.minutes(5L)))
                 .reduce(new PlanOfHourReduceFunction()).map();
-        planStream.print();
+        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));
-        }
-    }
 }

+ 20 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/MaxComputeLog.java

@@ -0,0 +1,20 @@
+package flink.zanxiangnet.ad.monitoring.maxcompute;
+
+import com.aliyun.odps.OdpsException;
+import com.aliyun.odps.rest.RestClient;
+
+public class MaxComputeLog extends RestClient.RetryLogger {
+    @Override
+    public void onRetryLog(Throwable e, long retryCount, long sleepTime) {
+        if (e instanceof OdpsException) {
+            String requestId = ((OdpsException) e).getRequestId();
+            if (requestId != null) {
+                System.err.println(String.format(
+                        "Warning: ODPS request failed, requestID:%s, retryCount:%d, will retry in %d seconds.", requestId, retryCount, sleepTime));
+                return;
+            }
+        }
+        System.err.println(String.format(
+                "Warning: ODPS request failed:%s, retryCount:%d, will retry in %d seconds.", e.getMessage(), retryCount, sleepTime));
+    }
+}

+ 11 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/MaxComputeParams.java

@@ -0,0 +1,11 @@
+package flink.zanxiangnet.ad.monitoring.maxcompute;
+
+public class MaxComputeParams {
+
+    public static final String ACCESS_ID = "max";
+
+    private String accessId;
+    private String accessKey;
+    private String odpsUrl;
+    private String tunnelUrl;
+}

+ 89 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/MaxComputeWriter.java

@@ -0,0 +1,89 @@
+package flink.zanxiangnet.ad.monitoring.maxcompute;
+
+import com.aliyun.odps.data.Record;
+import com.aliyun.odps.data.RecordWriter;
+import com.aliyun.odps.tunnel.TableTunnel;
+import flink.zanxiangnet.ad.monitoring.util.JsonUtil;
+import flink.zanxiangnet.ad.monitoring.util.bean.BeanUtil;
+import flink.zanxiangnet.ad.monitoring.util.bean.FieldInfo;
+import flink.zanxiangnet.ad.monitoring.util.bean.ObjectUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+/**
+ * 实际执行 MaxCompute写入逻辑
+ */
+public class MaxComputeWriter<T> implements Runnable {
+    private static final Logger log = LoggerFactory.getLogger(MaxComputeWriter.class);
+
+    private final TableTunnel.UploadSession uploadSession;
+    private final RecordWriter recordWriter;
+    private final Class<T> clazz;
+    private final List<T> dataList;
+
+    public MaxComputeWriter(Class<T> clazz, TableTunnel.UploadSession uploadSession, RecordWriter recordWriter, List<T> dataList) {
+        this.clazz = clazz;
+        this.uploadSession = uploadSession;
+        this.recordWriter = recordWriter;
+        this.dataList = dataList;
+    }
+
+    @Override
+    public void run() {
+        if (CollectionUtils.isEmpty(dataList)) {
+            return;
+        }
+        List<FieldInfo> fieldInfoList = BeanUtil.parseBeanField(clazz);
+        try {
+            int i = 0;
+            for(T t : dataList) {
+                Record record = uploadSession.newRecord();
+                for (FieldInfo fieldInfo : fieldInfoList) {
+                    Object obj = fieldInfo.getGetMethod().invoke(t);
+                    switch (fieldInfo.getColumnType()) {
+                        case TINYINT:
+                        case SMALLINT:
+                        case INT:
+                        case BIGINT:
+                            record.setBigint(fieldInfo.getColumnName(), ObjectUtil.toLong(obj));
+                            break;
+                        case FLOAT:
+                        case DOUBLE:
+                            record.setDouble(fieldInfo.getColumnName(), ObjectUtil.toDouble(obj));
+                            break;
+                        case DECIMAL:
+                            record.setDecimal(fieldInfo.getColumnName(), ObjectUtil.toDecimal(obj));
+                            break;
+                        case VARCHAR:
+                        case CHAR:
+                        case STRING:
+                            record.setString(fieldInfo.getColumnName(), obj == null ? null : obj.toString());
+                            break;
+                        case DATE:
+                        case TIMESTAMP:
+                        case DATETIME:
+                            record.setDatetime(fieldInfo.getColumnName(), ObjectUtil.toDate(obj));
+                            break;
+                        case BOOLEAN:
+                            record.setBoolean(fieldInfo.getColumnName(), ObjectUtil.toBoolean(obj));
+                            break;
+                        default:
+                            throw new RuntimeException("Unknown column type: " + JsonUtil.toString(fieldInfo));
+                    }
+                }
+                if (i++ < 20) {
+                    System.out.println(JsonUtil.toString(record));
+                }
+                recordWriter.write(record);
+            }
+        } catch (IOException | InvocationTargetException | IllegalAccessException e) {
+            log.error(e.getMessage(), e);
+            throw new RuntimeException("Failed writer to MaxCompute!!! Error msg: " + e.getMessage());
+        }
+    }
+}

+ 93 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/sink/MaxComputeSink.java

@@ -0,0 +1,93 @@
+package flink.zanxiangnet.ad.monitoring.maxcompute.sink;
+
+import com.aliyun.odps.Odps;
+import com.aliyun.odps.account.Account;
+import com.aliyun.odps.account.AliyunAccount;
+import com.aliyun.odps.tunnel.TableTunnel;
+import flink.zanxiangnet.ad.monitoring.maxcompute.MaxComputeLog;
+import flink.zanxiangnet.ad.monitoring.util.JsonUtil;
+import flink.zanxiangnet.ad.monitoring.util.bean.BeanUtil;
+import org.apache.flink.configuration.Configuration;
+import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+public class MaxComputeSink<IN> extends RichSinkFunction<IN> {
+    private static final Logger log = LoggerFactory.getLogger(MaxComputeSink.class);
+
+    // 对象锁,防止MaxCompute的 Tunnel对象多次初始化
+    private static final Object DUMMY_LOCK = new Object();
+
+    private final Class<IN> clazz;
+    // private final Method partitionFieldMethod;
+    private final String methodName;
+
+    private volatile transient MaxComputeSinkBuffer<IN> sinkBuffer;
+
+    public MaxComputeSink(Class<IN> clazz, String partitionFieldName) {
+        this.clazz = clazz;
+        methodName = "get" + partitionFieldName.substring(0, 1).toUpperCase() + partitionFieldName.substring(1);
+        /*try {
+            this.clazz = clazz;
+            Field field = clazz.getDeclaredField(partitionFieldName);
+            partitionFieldMethod = BeanUtil.methodOfGet(clazz, field);
+        } catch (NoSuchFieldException e) {
+            throw new RuntimeException("Can't found field: " + partitionFieldName);
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException("Can't found getMethod: " + partitionFieldName);
+        }*/
+    }
+
+    @Override
+    public void open(Configuration config) {
+        if (sinkBuffer == null) {
+            synchronized (DUMMY_LOCK) {
+                if (sinkBuffer == null) {
+                    Map<String, String> params = getRuntimeContext()
+                            .getExecutionConfig()
+                            .getGlobalJobParameters()
+                            .toMap();
+
+                    Account account = new AliyunAccount("LTAI5tFuLw65UsH3tqru2K1h", "p1F8my4ovgcEfs3HVORdmeLlLUUKRp");
+                    Odps odps = new Odps(account);
+                    odps.getRestClient().setRetryLogger(new MaxComputeLog());
+                    odps.setEndpoint("http://service.cn-hangzhou.maxcompute.aliyun.com/api");
+                    odps.setDefaultProject("ZxData_dev");
+                    TableTunnel tunnel = new TableTunnel(odps);
+                    tunnel.setEndpoint("http://dt.cn-hangzhou.maxcompute.aliyun.com");
+                    sinkBuffer = new MaxComputeSinkBuffer<>(360000L, 64000L, 6, clazz, tunnel, "ZxData_dev", "ad_data_of_minute_ods");
+                }
+            }
+        }
+    }
+
+    /**
+     * 将值写入到 Sink。每个值都会调用此函数
+     * @param value
+     * @param context
+     * @throws Exception
+     */
+    @Override
+    public void invoke(IN value, Context context) throws Exception {
+        Object obj = clazz.getMethod(methodName).invoke(value);
+        if (obj == null) {
+            throw new RuntimeException("The value of the partition field cannot be null!!!");
+        }
+        sinkBuffer.put(obj.toString(), value);
+    }
+
+    @Override
+    public void close() throws Exception {
+        if (sinkBuffer != null) {
+            synchronized (DUMMY_LOCK) {
+                sinkBuffer.close();
+            }
+        }
+
+        super.close();
+    }
+}

+ 115 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/maxcompute/sink/MaxComputeSinkBuffer.java

@@ -0,0 +1,115 @@
+package flink.zanxiangnet.ad.monitoring.maxcompute.sink;
+
+import com.aliyun.odps.PartitionSpec;
+import com.aliyun.odps.tunnel.TableTunnel;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import flink.zanxiangnet.ad.monitoring.maxcompute.MaxComputeWriter;
+import flink.zanxiangnet.ad.monitoring.util.JsonUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.concurrent.*;
+
+/**
+ * 缓存要写入 MaxCompute的数据
+ */
+public class MaxComputeSinkBuffer<T> {
+    private static final Logger log = LoggerFactory.getLogger(MaxComputeSinkBuffer.class);
+
+    private final TableTunnel tunnel;
+    private final String projectName;
+    private final String tableName;
+    private final long buffRefreshTime;
+    private final long maxBuffer;
+    private final ExecutorService threadPool;
+    private final Map<String, List<T>> partitionData;
+    private final Class<T> clazz;
+
+    private Thread coreThread;
+
+    public MaxComputeSinkBuffer(
+            long buffRefreshTime,
+            long maxBuffer,
+            int partitionCount,
+            Class<T> clazz,
+            TableTunnel tunnel,
+            String projectName,
+            String tableName
+    ) {
+        this.clazz = clazz;
+        this.tunnel = tunnel;
+        this.projectName = projectName;
+        this.tableName = tableName;
+        this.buffRefreshTime = buffRefreshTime;
+        this.maxBuffer = maxBuffer;
+        partitionData = new ConcurrentHashMap<>(partitionCount);
+
+        threadPool = new ThreadPoolExecutor(
+                partitionCount,
+                partitionCount,
+                0L,
+                TimeUnit.MILLISECONDS,
+                new LinkedBlockingQueue<>(),
+                new ThreadFactoryBuilder()
+                        .setNameFormat("maxcompute-writer-%d").build());
+        start();
+    }
+
+    /**
+     * 写入数据
+     * @param partition 数据分区
+     * @param t 数据
+     */
+    public void put(String partition, T t) {
+        List<T> list = partitionData.computeIfAbsent(partition, key -> new ArrayList<>());
+        list.add(t);
+    }
+
+    public void close() {
+        coreThread.interrupt();
+    }
+
+    private void start() {
+        coreThread = new Thread(() -> {
+            Map<String, Long> lastSaveTime = new HashMap<>();
+            // 开启一个定时轮询缓存数据的线程
+            while (true) {
+                try {
+                    if (CollectionUtils.isEmpty(partitionData)) {
+                        // 没有数据,等 5s
+                        Thread.sleep(5000L);
+                        continue;
+                    }
+                    long now = System.currentTimeMillis();
+                    List<String> saveKeys = new ArrayList<>(partitionData.size());
+                    for (Map.Entry<String, List<T>> entry : partitionData.entrySet()) {
+                        Long lastSaveTimeOfKey = lastSaveTime.computeIfAbsent(entry.getKey(), key -> now);
+                        boolean save = now - lastSaveTimeOfKey > buffRefreshTime;
+                        if (save || entry.getValue().size() > maxBuffer) {
+                            saveKeys.add(entry.getKey());
+                        }
+                    }
+                    if (CollectionUtils.isEmpty(saveKeys)) {
+                        Thread.sleep(5000L);
+                        continue;
+                    } else {
+                        System.out.println("===>实际写入数据2:" + JsonUtil.toString(saveKeys));
+                        for (int i = 0; i < saveKeys.size(); i++) {
+                            String key = saveKeys.get(i);
+                            List<T> datas = partitionData.remove(key);
+                            System.out.println("===>实际写入数据3:" + datas.size());
+                            lastSaveTime.remove(key);
+                            TableTunnel.UploadSession uploadSession = tunnel.createUploadSession(projectName, tableName, new PartitionSpec(key));
+                            threadPool.submit(new MaxComputeWriter<>(clazz, uploadSession, uploadSession.openRecordWriter(i), datas));
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+        });
+        coreThread.start();
+    }
+}

+ 4 - 1
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/dto/AdDataOfHourDTO.java → flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/dto/AdDataOfMinuteDTO.java

@@ -3,8 +3,11 @@ package flink.zanxiangnet.ad.monitoring.pojo.dto;
 import com.tencent.ads.model.HourlyReportsGetListStruct;
 import lombok.Data;
 
+/**
+ * 每 5分钟拉去的广告数据
+ */
 @Data
-public class AdDataOfHourDTO {
+public class AdDataOfMinuteDTO {
 
     /**
      * 创建时间

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

@@ -1,1368 +0,0 @@
-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;
-}

+ 454 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdDataOfMinuteODS.java

@@ -0,0 +1,454 @@
+package flink.zanxiangnet.ad.monitoring.pojo.entity;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * 原始数据
+ * 每 5分钟拉取的广告原始数据
+ */
+@Data
+public class AdDataOfMinuteODS implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 统计日期(用于 MaxCompute分区)
+     */
+    @SerializedName("stat_day")
+    private String statDay;
+
+    /**
+     * 统计的小时
+     */
+    @SerializedName("hour")
+    private Integer hour;
+
+    /**
+     * 统计发起时间
+     */
+    @SerializedName("stat_time")
+    private Long statTime;
+
+    /**
+     * 应用下的账号 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")
+    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("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("conversions_count")
+    private Long conversionsCount;
+
+    /**
+     * 转化目标成本。广告产生一次转化目标的平均费用。计算逻辑:广告花费/转化目标量。
+     */
+    @SerializedName("conversions_cost")
+    private Long conversionsCost;
+
+    /**
+     * 目标转化率。朋友圈:转化目标量/可转化点击次数。公众号:转化目标量/点击次数。
+     */
+    @SerializedName("conversions_rate")
+    private Double conversionsRate;
+
+    /**
+     * 深度转化目标量-灰度中。根据您选择的深度智能优化目标,该广告对应的具体数量。部分需接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_count")
+    private Long deepConversionsCount;
+
+    /**
+     * 深度转化目标成本-灰度中。根据您选择的深度智能优化目标,该广告产生一次转化的平均费用。计算逻辑:广告花费/深度转化目标量。部分需接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_cost")
+    private Long deepConversionsCost;
+
+    /**
+     * 深度目标转化率-灰度中。朋友圈:深度转化目标量/可转化点击次数。公众号:深度转化目标量/点击次数。指标随深度转化功能灰度中。接入转化跟踪后可统计。
+     */
+    @SerializedName("deep_conversions_rate")
+    private Double deepConversionsRate;
+
+    /**
+     * 下单量。用户通过该广告进行商品成交(如下单提交、在线支付)的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_count")
+    private Long orderCount;
+
+    /**
+     * 首日新增下单量。广告推广获取的用户,点击广告当日,带来的下单次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("first_day_order_count")
+    private Long firstDayOrderCount;
+
+    /**
+     * 下单成本(次数)。产生一次下单的成本。
+     */
+    @SerializedName("web_order_cost")
+    private Long webOrderCost;
+
+    /**
+     * 下单率。一次点击到下单的转化率。
+     */
+    @SerializedName("order_rate")
+    private Double orderRate;
+
+    /**
+     * 下单金额。广告带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_amount")
+    private Long orderAmount;
+
+    /**
+     * 首日新增下单金额。广告推广获取的用户,点击广告当日,带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("first_day_order_amount")
+    private Long firstDayOrderAmount;
+
+    /**
+     * 下单客单价。下单金额/下单量。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_unit_price")
+    private Long orderUnitPrice;
+
+    /**
+     * 下单ROI。下单金额/广告花费。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_roi")
+    private Double orderRoi;
+
+    /**
+     * 签收次数。签收从广告主处购买的商品的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("sign_in_count")
+    private Long signInCount;
+
+    /**
+     * 加企业微信客服人数。添加企业微信好友成功的独立用户数。
+     */
+    @SerializedName("scan_follow_count")
+    private Long scanFollowCount;
+
+    /**
+     * 小游戏注册人数。通过广告首次登录小游戏的独立用户数。
+     */
+    @SerializedName("wechat_app_register_uv")
+    private Long wechatAppRegisterUv;
+
+    /**
+     * 小游戏注册成本(人数)。产生一个小游戏注册人数的成本。
+     */
+    @SerializedName("wechat_minigame_register_cost")
+    private Long wechatMinigameRegisterCost;
+
+    /**
+     * 小游戏注册率。一次点击到小游戏注册的转化率。
+     */
+    @SerializedName("wechat_minigame_register_rate")
+    private Double wechatMinigameRegisterRate;
+
+    /**
+     * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
+     */
+    @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_rate")
+    private Double officialAccountFollowRate;
+
+    /**
+     * 公众号内注册人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的注册行为的人数(UV)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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;
+
+    /**
+     * 公众号内注册ROI。注册产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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;
+
+    /**
+     * 公众号内填单ROI。填单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @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;
+
+    /**
+     * 公众号内下单比例。公众号内下单独立用户数(UV)/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @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;
+
+    /**
+     * 公众号内下单ROI。下单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_roi")
+    private Long officialAccountOrderRoi;
+
+    /**
+     * 公众号内发消息人数。用户关注公众号后,在公众号对话框内发送消息的独立用户数。
+     */
+    @SerializedName("official_account_consult_count")
+    private Long officialAccountConsultCount;
+
+    /**
+     * 阅读粉丝量。近3日新增的粉丝中产生阅读行为的用户数。
+     */
+    @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("forward_count")
+    private Long forwardCount;
+
+    /**
+     * 广告分享人数。将广告落地页分享给好友和朋友圈的独立用户数。
+     */
+    @SerializedName("forward_user_count")
+    private Long forwardUserCount;
+
+    /**
+     * 不感兴趣点击次数。用户点击“不感兴趣”的次数。
+     */
+    @SerializedName("no_interest_count")
+    private Long noInterestCount;
+}

+ 4 - 10
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/pojo/entity/AdStatOfHourDWD.java

@@ -14,14 +14,8 @@ public class AdStatOfHourDWD {
     /**
      * 统计的日期(用于 MaxCompute分区)
      */
-    @SerializedName("stat_day_str")
-    private LocalDate statDayStr;
-
-    /**
-     * 统计的日期
-     */
     @SerializedName("stat_day")
-    private LocalDate statDay;
+    private String statDay;
 
     /**
      * 统计的小时
@@ -633,19 +627,19 @@ public class AdStatOfHourDWD {
      * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
      */
     @SerializedName("wechat_minigame_arpu_all")
-    private Double wechatMinigameArpu_all;
+    private Double wechatMinigameArpuAll;
 
     /**
      * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
      */
     @SerializedName("wechat_minigame_arpu_day")
-    private Double wechatMinigameArpu_day;
+    private Double wechatMinigameArpuDay;
 
     /**
      * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
      */
     @SerializedName("wechat_minigame_arpu_hour")
-    private Double wechatMinigameArpu_hour;
+    private Double wechatMinigameArpuHour;
 
     /**
      * 小游戏次留人数。通过广告首次登录小游戏,并在第二天再次登录的独立用户数。接入转化跟踪后可统计。

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

@@ -0,0 +1,1585 @@
+package flink.zanxiangnet.ad.monitoring.pojo.entity;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * 广告维度的小时统计数据
+ */
+@Data
+public class AdStatOfMinuteDWD {
+
+    /**
+     * 统计的日期(用于 MaxCompute分区)
+     */
+    @SerializedName("stat_day")
+    private LocalDate statDay;
+
+    /**
+     * 统计的小时
+     */
+    @SerializedName("hour")
+    private Integer hour;
+
+    /**
+     * 统计发起时间
+     */
+    @SerializedName("stat_time")
+    private Long statTime;
+
+    /**
+     * 腾讯广告应用的账号 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_deviation_rate_minute")
+    private Double costDeviationRateMinute;
+
+    /**
+     * 消耗
+     */
+    @SerializedName("cost_total")
+    private Long costTotal;
+
+    /**
+     * 消耗
+     */
+    @SerializedName("cost_day")
+    private Long costDay;
+
+    /**
+     * 消耗
+     */
+    @SerializedName("cost_hour")
+    private Long costHour;
+
+    /**
+     * 消耗
+     */
+    @SerializedName("cost_minute")
+    private Long costMinute;
+
+    /**
+     * 赔付金额。智能优化成本保障政策下,广告超成本时的赔付金额。
+     */
+    @SerializedName("compensation_amount_total")
+    private Long compensationAmountTotal;
+
+    /**
+     * 赔付金额。智能优化成本保障政策下,广告超成本时的赔付金额。
+     */
+    @SerializedName("compensation_amount_day")
+    private Long compensationAmountDay;
+
+    /**
+     * 赔付金额。智能优化成本保障政策下,广告超成本时的赔付金额。
+     */
+    @SerializedName("compensation_amount_hour")
+    private Long compensationAmountHour;
+
+    /**
+     * 赔付金额。智能优化成本保障政策下,广告超成本时的赔付金额。
+     */
+    @SerializedName("compensation_amount_minute")
+    private Long compensationAmountMinute;
+
+    /**
+     * 曝光次数。用户观看广告的次数。
+     */
+    @SerializedName("view_count_total")
+    private Long viewCountTotal;
+
+    /**
+     * 曝光次数。用户观看广告的次数。
+     */
+    @SerializedName("view_count_day")
+    private Long viewCountDay;
+
+    /**
+     * 曝光次数。用户观看广告的次数。
+     */
+    @SerializedName("view_count_hour")
+    private Long viewCountHour;
+
+    /**
+     * 曝光次数。用户观看广告的次数。
+     */
+    @SerializedName("view_count_minute")
+    private Long viewCountMinute;
+
+    /**
+     * 千次曝光成本。平均每千次曝光的花费。
+     */
+    @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("thousand_display_price_minute")
+    private Long thousandDisplayPriceMinute;
+
+    /**
+     * 人均曝光次数。每个用户观看广告的平均次数。
+     */
+    @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("avg_view_per_user_minute")
+    private Double avgViewPerUserMinute;
+
+    /**
+     * 点击次数。用户在广告外层进行点击操作的次数。包括点击图片/视频,及朋友圈广告“文字链、头像、昵称、门店、选择按钮”等所有广告外层区域的点击。
+     */
+    @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("valid_click_count_minute")
+    private Long validClickCountMinute;
+
+    /**
+     * 点击率。看到广告后执行点击操作的百分比。计算逻辑:广告点击次数/广告曝光次数。
+     */
+    @SerializedName("ctr_all")
+    private Double ctrAll;
+
+    /**
+     * 点击率。看到广告后执行点击操作的百分比。计算逻辑:广告点击次数/广告曝光次数。
+     */
+    @SerializedName("ctr_day")
+    private Double ctrDay;
+
+    /**
+     * 点击率。看到广告后执行点击操作的百分比。计算逻辑:广告点击次数/广告曝光次数。
+     */
+    @SerializedName("ctr_hour")
+    private Double ctrHour;
+
+    /**
+     * 点击率。看到广告后执行点击操作的百分比。计算逻辑:广告点击次数/广告曝光次数。
+     */
+    @SerializedName("ctr_minute")
+    private Double ctrMinute;
+
+    /**
+     * 点击均价。一次广告点击的平均花费。计算逻辑:广告花费/广告点击次数。
+     */
+    @SerializedName("cpc_all")
+    private Long cpcAll;
+
+    /**
+     * 点击均价。一次广告点击的平均花费。计算逻辑:广告花费/广告点击次数。
+     */
+    @SerializedName("cpc_day")
+    private Long cpcDay;
+
+    /**
+     * 点击均价。一次广告点击的平均花费。计算逻辑:广告花费/广告点击次数。
+     */
+    @SerializedName("cpc_hour")
+    private Long cpcHour;
+
+    /**
+     * 点击均价。一次广告点击的平均花费。计算逻辑:广告花费/广告点击次数。
+     */
+    @SerializedName("cpc_minute")
+    private Long cpcMinute;
+
+    /**
+     * 可转化点击次数。朋友圈:可转化点击是指可能产生转化的外层点击次数。对于“公众号推广”的广告,包括外层的公众号头像、公众号昵称、详情页查看、原生推广页查看; 对于其他类型的广告,包括外层的详情页查看和原生推广页查看。公众号:可转化点击是指可能产生转化的点击次数。
+     */
+    @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_count_minute")
+    private Long valuableClickCountMinute;
+
+    /**
+     * 可转化点击率。用户看到广告后执行可转化点击操作的百分比。计算逻辑:广告可转化点击次数/广告曝光次数。
+     */
+    @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_rate_minute")
+    private Double valuableClickRateMinute;
+
+    /**
+     * 可转化点击成本。一次可转化点击的平均花费。计算逻辑:广告花费/可转化点击次数。
+     */
+    @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("valuable_click_cost_minute")
+    private Long valuableClickCostMinute;
+
+    /**
+     * 转化目标量。「转化目标」的具体数量,代表该广告的转化效果量级。
+     */
+    @SerializedName("conversions_count_total")
+    private Long conversionsCountTotal;
+
+    /**
+     * 转化目标量。「转化目标」的具体数量,代表该广告的转化效果量级。
+     */
+    @SerializedName("conversions_count_day")
+    private Long conversionsCountDay;
+
+    /**
+     * 转化目标量。「转化目标」的具体数量,代表该广告的转化效果量级。
+     */
+    @SerializedName("conversions_count_hour")
+    private Long conversionsCountHour;
+
+    /**
+     * 转化目标量。「转化目标」的具体数量,代表该广告的转化效果量级。
+     */
+    @SerializedName("conversions_count_minute")
+    private Long conversionsCountMinute;
+
+    /**
+     * 转化目标成本。广告产生一次转化目标的平均费用。计算逻辑:广告花费/转化目标量。
+     */
+    @SerializedName("conversions_cost_all")
+    private Long conversionsCostAll;
+
+    /**
+     * 转化目标成本。广告产生一次转化目标的平均费用。计算逻辑:广告花费/转化目标量。
+     */
+    @SerializedName("conversions_cost_day")
+    private Long conversionsCostDay;
+
+    /**
+     * 转化目标成本。广告产生一次转化目标的平均费用。计算逻辑:广告花费/转化目标量。
+     */
+    @SerializedName("conversions_cost_hour")
+    private Long conversionsCostHour;
+
+    /**
+     * 转化目标成本。广告产生一次转化目标的平均费用。计算逻辑:广告花费/转化目标量。
+     */
+    @SerializedName("conversions_cost_minute")
+    private Long conversionsCostMinute;
+
+    /**
+     * 目标转化率。朋友圈:转化目标量/可转化点击次数。公众号:转化目标量/点击次数。
+     */
+    @SerializedName("conversions_rate_all")
+    private Double conversionsRateAll;
+
+    /**
+     * 目标转化率。朋友圈:转化目标量/可转化点击次数。公众号:转化目标量/点击次数。
+     */
+    @SerializedName("conversions_rate_day")
+    private Double conversionsRateDay;
+
+    /**
+     * 目标转化率。朋友圈:转化目标量/可转化点击次数。公众号:转化目标量/点击次数。
+     */
+    @SerializedName("conversions_rate_hour")
+    private Double conversionsRateHour;
+
+    /**
+     * 目标转化率。朋友圈:转化目标量/可转化点击次数。公众号:转化目标量/点击次数。
+     */
+    @SerializedName("conversions_rate_minute")
+    private Double conversionsRateMinute;
+
+    /**
+     * 深度转化目标量-灰度中。根据您选择的深度智能优化目标,该广告对应的具体数量。部分需接入转化跟踪后可统计。
+     */
+    @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_count_minute")
+    private Long deepConversionsCountMinute;
+
+    /**
+     * 深度转化目标成本-灰度中。根据您选择的深度智能优化目标,该广告产生一次转化的平均费用。计算逻辑:广告花费/深度转化目标量。部分需接入转化跟踪后可统计。
+     */
+    @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_cost_minute")
+    private Long deepConversionsCostMinute;
+
+    /**
+     * 深度目标转化率-灰度中。朋友圈:深度转化目标量/可转化点击次数。公众号:深度转化目标量/点击次数。指标随深度转化功能灰度中。接入转化跟踪后可统计。
+     */
+    @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("deep_conversions_rate_minute")
+    private Double deepConversionsRateMinute;
+
+    /**
+     * 下单量。用户通过该广告进行商品成交(如下单提交、在线支付)的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_count_total")
+    private Long orderCountTotal;
+
+    /**
+     * 下单量。用户通过该广告进行商品成交(如下单提交、在线支付)的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_count_day")
+    private Long orderCountDay;
+
+    /**
+     * 下单量。用户通过该广告进行商品成交(如下单提交、在线支付)的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_count_hour")
+    private Long orderCountHour;
+
+    /**
+     * 下单量。用户通过该广告进行商品成交(如下单提交、在线支付)的次数。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_count_minute")
+    private Long orderCountMinute;
+
+    /**
+     * 首日新增下单量。广告推广获取的用户,点击广告当日,带来的下单次数。接入转化跟踪后可统计。
+     */
+    @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("first_day_order_count_minute")
+    private Long firstDayOrderCountMinute;
+
+    /**
+     * 下单成本(次数)。产生一次下单的成本。
+     */
+    @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("web_order_cost_minute")
+    private Long webOrderCostMinute;
+
+    /**
+     * 下单率。一次点击到下单的转化率。
+     */
+    @SerializedName("order_rate_all")
+    private Double orderRateAll;
+
+    /**
+     * 下单率。一次点击到下单的转化率。
+     */
+    @SerializedName("order_rate_day")
+    private Double orderRateDay;
+
+    /**
+     * 下单率。一次点击到下单的转化率。
+     */
+    @SerializedName("order_rate_hour")
+    private Double orderRateHour;
+
+    /**
+     * 下单率。一次点击到下单的转化率。
+     */
+    @SerializedName("order_rate_minute")
+    private Double orderRateMinute;
+
+    /**
+     * 下单金额。广告带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_amount_total")
+    private Long orderAmountTotal;
+
+    /**
+     * 下单金额。广告带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_amount_day")
+    private Long orderAmountDay;
+
+    /**
+     * 下单金额。广告带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_amount_hour")
+    private Long orderAmountHour;
+
+    /**
+     * 下单金额。广告带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_amount_minute")
+    private Long orderAmountMinute;
+
+    /**
+     * 首日新增下单金额。广告推广获取的用户,点击广告当日,带来的总订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @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("first_day_order_amount_minute")
+    private Long firstDayOrderAmountMinute;
+
+    /**
+     * 下单客单价。下单金额/下单量。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_unit_price_all")
+    private Long orderUnitPriceAll;
+
+    /**
+     * 下单客单价。下单金额/下单量。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_unit_price_day")
+    private Long orderUnitPriceDay;
+
+    /**
+     * 下单客单价。下单金额/下单量。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_unit_price_hour")
+    private Long orderUnitPriceHour;
+
+    /**
+     * 下单客单价。下单金额/下单量。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_unit_price_minute")
+    private Long orderUnitPriceMinute;
+
+    /**
+     * 下单ROI。下单金额/广告花费。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_roi_all")
+    private Double orderRoiAll;
+
+    /**
+     * 下单ROI。下单金额/广告花费。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_roi_day")
+    private Double orderRoiDay;
+
+    /**
+     * 下单ROI。下单金额/广告花费。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_roi_hour")
+    private Double orderRoiHour;
+
+    /**
+     * 下单ROI。下单金额/广告花费。接入转化跟踪后可统计。
+     */
+    @SerializedName("order_roi_minute")
+    private Double orderRoiMinute;
+
+    /**
+     * 签收次数。签收从广告主处购买的商品的次数。接入转化跟踪后可统计。
+     */
+    @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("sign_in_count_minute")
+    private Long signInCountMinute;
+
+    /**
+     * 加企业微信客服人数。添加企业微信好友成功的独立用户数。
+     */
+    @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("scan_follow_count_minute")
+    private Long scanFollowCountMinute;
+
+    /**
+     * 小游戏注册人数。通过广告首次登录小游戏的独立用户数。
+     */
+    @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_app_register_uv_minute")
+    private Long wechatAppRegisterUvMinute;
+
+    /**
+     * 小游戏注册成本(人数)。产生一个小游戏注册人数的成本。
+     */
+    @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_cost_minute")
+    private Long wechatMinigameRegisterCostMinute;
+
+    /**
+     * 小游戏注册率。一次点击到小游戏注册的转化率。
+     */
+    @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;
+
+    /**
+     * 小游戏注册率。一次点击到小游戏注册的转化率。
+     */
+    @SerializedName("wechat_minigame_register_rate_minute")
+    private Double wechatMinigameRegisterRateMinute;
+
+    /**
+     * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
+     */
+    @SerializedName("wechat_minigame_arpu_all")
+    private Double wechatMinigameArpuAll;
+
+    /**
+     * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
+     */
+    @SerializedName("wechat_minigame_arpu_day")
+    private Double wechatMinigameArpuDay;
+
+    /**
+     * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
+     */
+    @SerializedName("wechat_minigame_arpu_hour")
+    private Double wechatMinigameArpuHour;
+
+    /**
+     * 首日新增广告ARPU。广告带来的注册用户,在注册当日,产生的平均广告变现收入。注:该指标天更新,可以查看昨天及以前的数据。
+     */
+    @SerializedName("wechat_minigame_arpu_minute")
+    private Double wechatMinigameArpuMinute;
+
+    /**
+     * 小游戏次留人数。通过广告首次登录小游戏,并在第二天再次登录的独立用户数。接入转化跟踪后可统计。
+     */
+    @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_retention_count_minute")
+    private Long wechatMinigameRetentionCountMinute;
+
+    /**
+     * 小游戏付费次数。通过广告进入小游戏并完成付费的次数。接入转化跟踪后可统计。
+     */
+    @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_count_minute")
+    private Long wechatMinigameCheckoutCountMinute;
+
+    /**
+     * 小游戏付费金额。通过广告进入小游戏并完成付费的金额。接入转化跟踪后可统计。
+     */
+    @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("wechat_minigame_checkout_amount_minute")
+    private Long wechatMinigameCheckoutAmountMinute;
+
+    /**
+     * 公众号关注次数。用户通过广告关注公众号成功的次数。
+     */
+    @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_count_minute")
+    private Long officialAccountFollowCountMinute;
+
+    /**
+     * 公众号关注率。一次点击到公众号关注的转化率。
+     */
+    @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;
+
+    /**
+     * 公众号关注率。一次点击到公众号关注的转化率。
+     */
+    @SerializedName("official_account_follow_rate_minute")
+    private Double officialAccountFollowRateMinute;
+
+    /**
+     * 公众号内注册人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的注册行为的人数(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;
+
+    /**
+     * 公众号内注册人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的注册行为的人数(UV)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_user_count_minute")
+    private Long officialAccountRegisterUserCountMinute;
+
+    /**
+     * 公众号内注册比例。公众号内注册独立用户数/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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_rate_minute")
+    private Double officialAccountRegisterRateMinute;
+
+    /**
+     * 公众号内注册成本。广告花费/广告产生的注册行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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_cost_minute")
+    private Long officialAccountRegisterCostMinute;
+
+    /**
+     * 公众号内注册订单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的订单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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;
+
+    /**
+     * 公众号内注册订单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的订单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_amount_minute")
+    private Long officialAccountRegisterAmountMinute;
+
+    /**
+     * 公众号内注册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;
+
+    /**
+     * 公众号内注册ROI。注册产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_register_roi_minute")
+    private Long officialAccountRegisterRoiMinute;
+
+    /**
+     * 公众号内填单次数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的数量。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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_count_minute")
+    private Long officialAccountApplyCountMinute;
+
+    /**
+     * 公众号内填单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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_user_count_minute")
+    private Long officialAccountApplyUserCountMinute;
+
+    /**
+     * 公众号内填单比例。公众号内填单的独立用户数/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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_rate_minute")
+    private Double officialAccountApplyRateMinute;
+
+    /**
+     * 公众号内填单成本。广告花费/广告产生的填单行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @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_cost_minute")
+    private Long officialAccountApplyCostMinute;
+
+    /**
+     * 公众号内填单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @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;
+
+    /**
+     * 公众号内填单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的填单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放)。
+     */
+    @SerializedName("official_account_apply_amount_minute")
+    private Long officialAccountApplyAmountMinute;
+
+    /**
+     * 公众号内填单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;
+
+    /**
+     * 公众号内填单ROI。填单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_apply_roi_minute")
+    private Long officialAccountApplyRoiMinute;
+
+    /**
+     * 公众号内下单次数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @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_order_count_minute")
+    private Long officialAccountOrderCountMinute;
+
+    /**
+     * 首日公众号内下单次数。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为数量。接入转化跟踪后可统计。
+     */
+    @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_first_day_order_count_minute")
+    private Long officialAccountFirstDayOrderCountMinute;
+
+    /**
+     * 公众号内下单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @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;
+
+    /**
+     * 公众号内下单人数。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的独立用户数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_user_count_minute")
+    private Long officialAccountOrderUserCountMinute;
+
+    /**
+     * 公众号内下单比例。公众号内下单独立用户数(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;
+
+    /**
+     * 公众号内下单比例。公众号内下单独立用户数(UV)/公众号关注次数。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_rate_minute")
+    private Double officialAccountOrderRateMinute;
+
+    /**
+     * 公众号内下单成本。广告花费/广告产生的下单行为数量。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @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_cost_minute")
+    private Long officialAccountOrderCostMinute;
+
+    /**
+     * 公众号内下单金额。用户通过关注类广告关注公众号后,在公众号内部产生了广告主定义的下单行为的订单金额(即销售额)。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @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_order_amount_minute")
+    private Long officialAccountOrderAmountMinute;
+
+    /**
+     * 首日公众号内下单金额。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @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;
+
+    /**
+     * 首日公众号内下单金额。广告推广获取的用户,在关注公众号当日,在公众号内部产生了广告主定义的下单行为订单金额(即销售额)。接入转化跟踪后可统计。
+     */
+    @SerializedName("official_account_first_day_order_amount_minute")
+    private Long officialAccountFirstDayOrderAmountMinute;
+
+    /**
+     * 公众号内下单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;
+
+    /**
+     * 公众号内下单ROI。下单产生的订单金额累计/广告花费。接入转化跟踪后可统计(公众号接入暂未全量开放) 。
+     */
+    @SerializedName("official_account_order_roi_minute")
+    private Long officialAccountOrderRoiMinute;
+
+    /**
+     * 公众号内发消息人数。用户关注公众号后,在公众号对话框内发送消息的独立用户数。
+     */
+    @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;
+
+    /**
+     * 公众号内发消息人数。用户关注公众号后,在公众号对话框内发送消息的独立用户数。
+     */
+    @SerializedName("official_account_consult_count_minute")
+    private Long officialAccountConsultCountMinute;
+
+    /**
+     * 阅读粉丝量。近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;
+
+    /**
+     * 阅读粉丝量。近3日新增的粉丝中产生阅读行为的用户数。
+     */
+    @SerializedName("official_account_reader_count_minute")
+    private Long officialAccountReaderCountMinute;
+
+    /**
+     * 公众号内进件人数。在公众号内完整提交贷款申请资料的独立用户数。接入转化跟踪后可统计。
+     */
+    @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_apply_user_count_minute")
+    private Long officialAccountCreditApplyUserCountMinute;
+
+    /**
+     * 公众号内授信人数。在公众号内完整提交贷款申请资料,并通过放款方的资质审核的独立用户数。接入转化跟踪后可统计。
+     */
+    @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("official_account_credit_user_count_minute")
+    private Long officialAccountCreditUserCountMinute;
+
+    /**
+     * 广告分享次数。用户将广告落地页分享给好友和朋友圈的次数。
+     */
+    @SerializedName("forward_count_total")
+    private Long forwardCountTotal;
+
+    /**
+     * 广告分享次数。用户将广告落地页分享给好友和朋友圈的次数。
+     */
+    @SerializedName("forward_count_day")
+    private Long forwardCountDay;
+
+    /**
+     * 广告分享次数。用户将广告落地页分享给好友和朋友圈的次数。
+     */
+    @SerializedName("forward_count_hour")
+    private Long forwardCountHour;
+
+    /**
+     * 广告分享次数。用户将广告落地页分享给好友和朋友圈的次数。
+     */
+    @SerializedName("forward_count_minute")
+    private Long forwardCountMinute;
+
+    /**
+     * 广告分享人数。将广告落地页分享给好友和朋友圈的独立用户数。
+     */
+    @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("forward_user_count_minute")
+    private Long forwardUserCountMinute;
+
+    /**
+     * 不感兴趣点击次数。用户点击“不感兴趣”的次数。
+     */
+    @SerializedName("no_interest_count_total")
+    private Long noInterestCountTotal;
+
+    /**
+     * 不感兴趣点击次数。用户点击“不感兴趣”的次数。
+     */
+    @SerializedName("no_interest_count_day")
+    private Long noInterestCountDay;
+
+    /**
+     * 不感兴趣点击次数。用户点击“不感兴趣”的次数。
+     */
+    @SerializedName("no_interest_count_hour")
+    private Long noInterestCountHour;
+
+    /**
+     * 不感兴趣点击次数。用户点击“不感兴趣”的次数。
+     */
+    @SerializedName("no_interest_count_minute")
+    private Long noInterestCountMinute;
+}

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

@@ -1,116 +0,0 @@
-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;
-}

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

@@ -1,9 +1,20 @@
 package flink.zanxiangnet.ad.monitoring.util;
 
 import java.time.*;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
 
 public class DateUtil {
+
+
+    public static final DateTimeFormatter FORMAT_DATETIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    public static final DateTimeFormatter FORMAT_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    public static final DateTimeFormatter FORMAT_TIME = DateTimeFormatter.ofPattern("HH:mm:ss");
+
+    public static String formatLocalDate(LocalDate date) {
+        return date.format(FORMAT_DATE);
+    }
+
     public static long localDateToSecond(LocalDate localDate) {
         return localDate.atStartOfDay(ZoneOffset.ofHours(8)).toEpochSecond();
     }

+ 135 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/BeanUtil.java

@@ -0,0 +1,135 @@
+package flink.zanxiangnet.ad.monitoring.util.bean;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class BeanUtil {
+    private static final Pattern humpPattern = Pattern.compile("[A-Z]");
+    private static final Pattern linePattern = Pattern.compile("_(\\w)");
+
+    /**
+     * 解析 javabean的字段
+     * @param clazz
+     * @return
+     */
+    public static List<FieldInfo> parseBeanField(Class<?> clazz) {
+        List<Field> fieldList = new ArrayList<>();
+        Class<?> tempClazz = clazz;
+        while (tempClazz != null) {
+            Field[] fields = tempClazz.getDeclaredFields();
+            if (fields.length != 0) {
+                fieldList.addAll(Arrays.asList(fields));
+            }
+            tempClazz = tempClazz.getSuperclass();
+        }
+        if (fieldList.size() == 0) {
+            throw new RuntimeException("Failed parsed class[" + clazz.getName() + "]. No Field!");
+        }
+        List<FieldInfo> fieldInfoList = new ArrayList<>(fieldList.size());
+        for(Field field : fieldList) {
+            DataMapping annotation = field.getAnnotation(DataMapping.class);
+            FieldInfo fieldInfo = new FieldInfo();
+            fieldInfo.setField(field);
+            fieldInfo.setFieldName(field.getName());
+            try {
+                fieldInfo.setGetMethod(methodOfGet(clazz, field));
+                fieldInfo.setSetMethod(methodOfSet(clazz, field));
+            } catch (NoSuchMethodException e) {
+                throw new RuntimeException("Failed parsed class[" + clazz.getName() + "]. The get or set method of [" + field.getName() + "] was not found!");
+            }
+            if (annotation != null) {
+                if (annotation.ignore()) {
+                    continue;
+                }
+                if (StringUtils.isNotBlank(annotation.columnName())) {
+                    fieldInfo.setColumnName(annotation.columnName());
+                } else {
+                    fieldInfo.setColumnName(humpToLine(fieldInfo.getFieldName()));
+                }
+                fieldInfo.setColumnType(annotation.dataType());
+            } else {
+                fieldInfo.setColumnName(humpToLine(fieldInfo.getFieldName()));
+                DataTypeEnum columnType = null;
+                if (fieldInfo.getFieldType() == Byte.class) {
+                    columnType = DataTypeEnum.INT;
+                } else if (fieldInfo.getFieldType() == Integer.class) {
+                    columnType = DataTypeEnum.INT;
+                } else if (fieldInfo.getFieldType() == Long.class) {
+                    columnType = DataTypeEnum.BIGINT;
+                } else if (fieldInfo.getFieldType() == Float.class) {
+                    columnType = DataTypeEnum.DOUBLE;
+                } else if (fieldInfo.getFieldType() == Double.class) {
+                    columnType = DataTypeEnum.DOUBLE;
+                } else if (fieldInfo.getFieldType() == BigDecimal.class) {
+                    columnType = DataTypeEnum.DECIMAL;
+                } else if (fieldInfo.getFieldType() == Date.class) {
+                    columnType = DataTypeEnum.DATETIME;
+                } else if (fieldInfo.getFieldType() == LocalDate.class) {
+                    columnType = DataTypeEnum.DATE;
+                } else if (fieldInfo.getFieldType() == LocalDateTime.class) {
+                    columnType = DataTypeEnum.DATETIME;
+                } else if (fieldInfo.getFieldType() == Boolean.class) {
+                    columnType = DataTypeEnum.BOOLEAN;
+                } else if (fieldInfo.getFieldType() == String.class) {
+                    columnType = DataTypeEnum.STRING;
+                } else {
+                    throw new RuntimeException("Failed parse class[" + clazz.getName() + "]. The field [" + field.getName() + "] type unknown!");
+                }
+                fieldInfo.setColumnType(columnType);
+            }
+            fieldInfoList.add(fieldInfo);
+        }
+        return fieldInfoList;
+    }
+
+    /**
+     * 驼峰转下划线
+     * @param str
+     * @return
+     */
+    public static String humpToLine(String str) {
+        Matcher matcher = humpPattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    /**
+     * 下划线转驼峰
+     * @param str
+     * @return
+     */
+    public static String lineToHump(String str) {
+        str = str.toLowerCase();
+        Matcher matcher = linePattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    public static <T> Method methodOfGet(Class<T> clazz, Field field) throws NoSuchMethodException {
+        String fieldName = field.getName();
+        String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
+        return clazz.getMethod(methodName);
+    }
+
+    public static <T> Method methodOfSet(Class<T> clazz, Field field) throws NoSuchMethodException {
+        String fieldName = field.getName();
+        String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
+        return clazz.getMethod(methodName, field.getType());
+    }
+}

+ 15 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/DataMapping.java

@@ -0,0 +1,15 @@
+package flink.zanxiangnet.ad.monitoring.util.bean;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DataMapping {
+
+    boolean ignore() default false;
+
+    String columnName() default "";
+
+    DataTypeEnum dataType();
+}

+ 89 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/DataTypeEnum.java

@@ -0,0 +1,89 @@
+package flink.zanxiangnet.ad.monitoring.util.bean;
+
+import lombok.Getter;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Getter
+public enum DataTypeEnum {
+    /**
+     * 8位有符号整型。
+     * 取值范围:-128~127。
+     */
+    TINYINT(Byte.class),
+    /**
+     * 16位有符号整型。
+     * 取值范围:-32768~32767。
+     */
+    SMALLINT(Integer.class),
+    /**
+     * 32位有符号整型。
+     * 取值范围:-2 31~2 31-1。
+     */
+    INT(Integer.class),
+    /**
+     * 64位有符号整型。
+     * 取值范围:-2 63+1~2 63 -1。
+     */
+    BIGINT(Long.class),
+    /**
+     * 二进制数据类型,目前长度限制为8MB。
+     */
+    // BINARY(Byte[].class),
+    /**
+     * 32位二进制浮点型。
+     */
+    FLOAT(Double.class),
+    /**
+     * 64位二进制浮点型。
+     */
+    DOUBLE(Double.class),
+    /**
+     * DECIMAL(precision,scale) 10进制精确数字类型。
+     * precision:表示最多可以表示多少位的数字。取值范围:1 <= precision <= 38。
+     * scale:表示小数部分的位数。取值范围:0 <= scale <= 38。
+     * 如果不指定以上两个参数,则默认为decimal(10,0)。
+     */
+    DECIMAL(BigDecimal.class),
+    /**
+     * 变长字符类型,n为长度。
+     * 取值范围:1~65535。
+     */
+    VARCHAR(String.class),
+    /**
+     * 固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。
+     */
+    CHAR(String.class),
+    /**
+     * 字符串类型,长度限制为8 MB。
+     */
+    STRING(String.class),
+    /**
+     * 日期类型,格式为yyyy-mm-dd。
+     * 取值范围:0000-01-01~9999-12-31。
+     */
+    DATE(LocalDate.class),
+    /**
+     * 日期类型,格式为yyyy-mm-dd。
+     * 取值范围:0000-01-01~9999-12-31。
+     */
+    DATETIME(LocalDateTime.class),
+    /**
+     * 与时区无关的时间戳类型。
+     * 取值范围:0000-01-01 00:00:00.000000000~9999-12-31 23.59:59.999999999,精确到纳秒。
+     */
+    TIMESTAMP(LocalDateTime.class),
+    /**
+     * 与时区无关的时间戳类型。
+     * 取值范围:0000-01-01 00:00:00.000000000~9999-12-31 23.59:59.999999999,精确到纳秒。
+     */
+    BOOLEAN(Boolean.class);
+
+    private final Class<?> defaultJavaType;
+
+    DataTypeEnum(Class<?> javaType) {
+        this.defaultJavaType = javaType;
+    }
+}

+ 42 - 0
flink-ad-monitoring/src/main/java/flink/zanxiangnet/ad/monitoring/util/bean/FieldInfo.java

@@ -0,0 +1,42 @@
+package flink.zanxiangnet.ad.monitoring.util.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+/**
+ * @Author wcc
+ * @Date 2020/12/3 16:08
+ * @Version 1.0
+ * @Description excel中列的信息
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class FieldInfo {
+    /**
+     * 字段名
+     */
+    private String fieldName;
+    /**
+     * 数据库中的列名
+     */
+    private String columnName;
+
+    private Class<?> fieldType;
+    /**
+     * 数据库中保存的类型
+     */
+    private DataTypeEnum columnType;
+
+    private Field field;
+
+    private Method getMethod;
+
+    private Method setMethod;
+}

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

@@ -0,0 +1,141 @@
+package flink.zanxiangnet.ad.monitoring.util.bean;
+
+import flink.zanxiangnet.ad.monitoring.util.DateUtil;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+public class ObjectUtil {
+
+    public static Long toLong(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (obj instanceof Integer) {
+            return ((Integer) obj).longValue();
+        }
+        if (obj instanceof Long) {
+            return (Long) obj;
+        }
+        if (obj instanceof String) {
+            return Long.valueOf((String) obj);
+        }
+        if (obj instanceof BigDecimal) {
+            return ((BigDecimal) obj).longValue();
+        }
+        if (obj instanceof BigInteger) {
+            return ((BigInteger) obj).longValue();
+        }
+        throw new RuntimeException("unknow data type! Class: " + obj.getClass());
+    }
+
+    public static Integer toInt(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (obj instanceof Integer) {
+            return (Integer) obj;
+        }
+        if (obj instanceof Long) {
+            return ((Long) obj).intValue();
+        }
+        if (obj instanceof String) {
+            return Integer.valueOf((String) obj);
+        }
+        if (obj instanceof BigDecimal) {
+            return ((BigDecimal) obj).intValue();
+        }
+        if (obj instanceof BigInteger) {
+            return ((BigInteger) obj).intValue();
+        }
+        throw new RuntimeException("unknow data type! Class: " + obj.getClass());
+    }
+
+    public static Double toDouble(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (obj instanceof Double) {
+            return (Double) obj;
+        }
+        if (obj instanceof Float) {
+            return ((Float) obj).doubleValue();
+        }
+        if (obj instanceof Integer) {
+            return new Double((Integer) obj);
+        }
+        if (obj instanceof Long) {
+            return new Double((Long) obj);
+        }
+        if (obj instanceof String) {
+            return new Double((String) obj);
+        }
+        if (obj instanceof BigDecimal) {
+            return ((BigDecimal) obj).doubleValue();
+        }
+        if (obj instanceof BigInteger) {
+            return (double) ((BigInteger) obj).longValue();
+        }
+        throw new RuntimeException("unknow data type! Class: " + obj.getClass());
+    }
+
+    public static BigDecimal toDecimal(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (obj instanceof BigDecimal) {
+            return (BigDecimal) obj;
+        }
+        if (obj instanceof Double) {
+            return BigDecimal.valueOf((Double) obj);
+        }
+        if (obj instanceof Float) {
+            return BigDecimal.valueOf((Float) obj);
+        }
+        if (obj instanceof Integer) {
+            return BigDecimal.valueOf((Integer) obj);
+        }
+        if (obj instanceof Long) {
+            return BigDecimal.valueOf((Long) obj);
+        }
+        if (obj instanceof String) {
+            return new BigDecimal((String) obj);
+        }
+        throw new RuntimeException("unknow data type! Class: " + obj.getClass());
+    }
+
+    public static Date toDate(Object obj) {
+        if(obj == null) {
+            return null;
+        }
+        if (obj instanceof Date) {
+            return (Date) obj;
+        }
+        if (obj instanceof LocalDate) {
+            return DateUtil.localDateToDate((LocalDate) obj);
+        }
+        if (obj instanceof LocalDateTime) {
+            return DateUtil.localDateTimeToDate((LocalDateTime) obj);
+        }
+        if (obj instanceof Long) {
+            return new Date((Long) obj);
+        }
+        if (obj instanceof Integer) {
+            return new Date(((Integer) obj).longValue() * 1000);
+        }
+        throw new RuntimeException("unknow data type! Class: " + obj.getClass());
+    }
+
+    public static Boolean toBoolean(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (obj instanceof Boolean) {
+            return (Boolean) obj;
+        }
+        return toInt(obj) != 0;
+    }
+}

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