فهرست منبع

头条失败重试任务

yumeng 1 سال پیش
والد
کامیت
77bac48c7c

+ 35 - 3
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java

@@ -1,6 +1,8 @@
 package cn.com.ctop.job.bytedance.controller;
 
+import cn.com.ctop.job.bytedance.data.service.IBytedancePromoterReportService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceRefreshTokenService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
 import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
@@ -13,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 
 /**
@@ -28,10 +31,39 @@ public class BytedanceController {
     @Autowired
     private IBytedanceRefreshTokenService refreshTokenService;
 
+    @Autowired
+    private IBytedancePromoterReportService promoterReportService;
+
     @GetMapping("/testRefreshToken")
-    public JSONObject testRefreshToken() {
-        refreshTokenService.bytedanceRefreshToken();
-        return null;
+    public void testRefreshToken() {
+        List<JSONObject> accountList = promoterReportService.getAccountList();
+        if (!Check.isNull(accountList)) {
+            for (int i = 0; i < accountList.size(); i++) {
+                JSONObject jsonObject = accountList.get(i);
+                Long id = jsonObject.getLong("id");
+                Long advertiserId = jsonObject.getLong("advertiserId");
+                String startDate = jsonObject.getString("startDate");
+                String endDate = jsonObject.getString("endDate");
+                String dataDimension = jsonObject.getString("dataDimension");
+                String dataType = jsonObject.getString("dataType");
+                String accessToken = jsonObject.getString("accessToken");
+
+                if ("promoter".equals(dataDimension)) {
+                    if (dataType.equals("hour")) { // 广告时报
+                        promoterReportService.getBytedancePromoterHourReport(id, advertiserId, accessToken, startDate, endDate, 1);
+                    }
+
+                    if (dataType.equals("daily")) { // 广告日报
+                        promoterReportService.getBytedancePromorteDailyReport(id, advertiserId, accessToken, startDate, endDate, 1);
+                    }
+                }
+
+
+            }
+
+        } else {
+            log.info("重试列表为空");
+        }
     }
 
 

+ 351 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedancePromoterReportDaily.java

@@ -0,0 +1,351 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 头条广告日报对象 bytedance_promoter_report_daily
+ *
+ * @author ruoyi
+ * @date 2025-03-07
+ */
+public class BytedancePromoterReportDaily
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 广告主ID */
+    private Long advertiserId;
+
+    /** 数据起始时间 */
+    private Integer statTimeDay;
+
+    /** 项目ID */
+    private Long cdpProjectId;
+
+    /** 项目名称 */
+    private String cdpProjectName;
+
+    /** 广告id */
+    private Long cdpPromotionId;
+
+    /** 广告名称 */
+    private String cdpPromotionName;
+
+    /** 应用下载数据-付费金额 */
+    private BigDecimal statPayAmount;
+
+    /** 展现数据-总花费 */
+    private BigDecimal statCost;
+
+    /** 应用下载数据–激活数 */
+    private Long active;
+
+    /** 应用下载数据-注册数 */
+    private Long eventRegister;
+
+    /** 下载完成数 */
+    private Long downloadFinishCnt;
+
+    /** 次留人数 */
+    private Long attributionNextDayOpenCnt;
+
+    /** 关键行为数 */
+    private Long gameAddiction;
+
+    /** 激活当日在APP内的付费金额 */
+    private BigDecimal attributionGameInAppLtv1day;
+
+    /** 媒体|深度转化数(计费时间) */
+    private Long attributionDeepConvertCnt;
+
+    /** 付费次数 */
+    private Long gamePayCount;
+
+    /** 转化数据-转化数 */
+    private Long convertCnt;
+
+    /** 展现数据-展示数 */
+    private Long showCnt;
+
+    /** 首次付费数 */
+    private Long activePay;
+
+    /** 展现数据-点击数 */
+    private Long clickCnt;
+
+    /** 展现数据-点击数 */
+    private Long clickStartCnt;
+
+    /** 媒体|转化数(计费时间) */
+    private Long attributionConvertCnt;
+
+    /** 转化数据-深度转化数 */
+    private Long deepConvertCnt;
+
+    /** 有效播放数 */
+    private Long validPlay;
+
+    /** 计费当日付费金额 */
+    private BigDecimal attributionBillingGameInAppLtv1day;
+
+    public void setAdvertiserId(Long advertiserId)
+    {
+        this.advertiserId = advertiserId;
+    }
+
+    public Long getAdvertiserId()
+    {
+        return advertiserId;
+    }
+    public void setStatTimeDay(Integer statTimeDay)
+    {
+        this.statTimeDay = statTimeDay;
+    }
+
+    public Integer getStatTimeDay()
+    {
+        return statTimeDay;
+    }
+    public void setCdpProjectId(Long cdpProjectId)
+    {
+        this.cdpProjectId = cdpProjectId;
+    }
+
+    public Long getCdpProjectId()
+    {
+        return cdpProjectId;
+    }
+    public void setCdpProjectName(String cdpProjectName)
+    {
+        this.cdpProjectName = cdpProjectName;
+    }
+
+    public String getCdpProjectName()
+    {
+        return cdpProjectName;
+    }
+    public void setCdpPromotionId(Long cdpPromotionId)
+    {
+        this.cdpPromotionId = cdpPromotionId;
+    }
+
+    public Long getCdpPromotionId()
+    {
+        return cdpPromotionId;
+    }
+    public void setCdpPromotionName(String cdpPromotionName)
+    {
+        this.cdpPromotionName = cdpPromotionName;
+    }
+
+    public String getCdpPromotionName()
+    {
+        return cdpPromotionName;
+    }
+    public void setStatPayAmount(BigDecimal statPayAmount)
+    {
+        this.statPayAmount = statPayAmount;
+    }
+
+    public BigDecimal getStatPayAmount()
+    {
+        return statPayAmount;
+    }
+    public void setStatCost(BigDecimal statCost)
+    {
+        this.statCost = statCost;
+    }
+
+    public BigDecimal getStatCost()
+    {
+        return statCost;
+    }
+    public void setActive(Long active)
+    {
+        this.active = active;
+    }
+
+    public Long getActive()
+    {
+        return active;
+    }
+    public void setEventRegister(Long eventRegister)
+    {
+        this.eventRegister = eventRegister;
+    }
+
+    public Long getEventRegister()
+    {
+        return eventRegister;
+    }
+    public void setDownloadFinishCnt(Long downloadFinishCnt)
+    {
+        this.downloadFinishCnt = downloadFinishCnt;
+    }
+
+    public Long getDownloadFinishCnt()
+    {
+        return downloadFinishCnt;
+    }
+    public void setAttributionNextDayOpenCnt(Long attributionNextDayOpenCnt)
+    {
+        this.attributionNextDayOpenCnt = attributionNextDayOpenCnt;
+    }
+
+    public Long getAttributionNextDayOpenCnt()
+    {
+        return attributionNextDayOpenCnt;
+    }
+    public void setGameAddiction(Long gameAddiction)
+    {
+        this.gameAddiction = gameAddiction;
+    }
+
+    public Long getGameAddiction()
+    {
+        return gameAddiction;
+    }
+    public void setAttributionGameInAppLtv1day(BigDecimal attributionGameInAppLtv1day)
+    {
+        this.attributionGameInAppLtv1day = attributionGameInAppLtv1day;
+    }
+
+    public BigDecimal getAttributionGameInAppLtv1day()
+    {
+        return attributionGameInAppLtv1day;
+    }
+    public void setAttributionDeepConvertCnt(Long attributionDeepConvertCnt)
+    {
+        this.attributionDeepConvertCnt = attributionDeepConvertCnt;
+    }
+
+    public Long getAttributionDeepConvertCnt()
+    {
+        return attributionDeepConvertCnt;
+    }
+    public void setGamePayCount(Long gamePayCount)
+    {
+        this.gamePayCount = gamePayCount;
+    }
+
+    public Long getGamePayCount()
+    {
+        return gamePayCount;
+    }
+    public void setConvertCnt(Long convertCnt)
+    {
+        this.convertCnt = convertCnt;
+    }
+
+    public Long getConvertCnt()
+    {
+        return convertCnt;
+    }
+    public void setShowCnt(Long showCnt)
+    {
+        this.showCnt = showCnt;
+    }
+
+    public Long getShowCnt()
+    {
+        return showCnt;
+    }
+    public void setActivePay(Long activePay)
+    {
+        this.activePay = activePay;
+    }
+
+    public Long getActivePay()
+    {
+        return activePay;
+    }
+    public void setClickCnt(Long clickCnt)
+    {
+        this.clickCnt = clickCnt;
+    }
+
+    public Long getClickCnt()
+    {
+        return clickCnt;
+    }
+    public void setClickStartCnt(Long clickStartCnt)
+    {
+        this.clickStartCnt = clickStartCnt;
+    }
+
+    public Long getClickStartCnt()
+    {
+        return clickStartCnt;
+    }
+    public void setAttributionConvertCnt(Long attributionConvertCnt)
+    {
+        this.attributionConvertCnt = attributionConvertCnt;
+    }
+
+    public Long getAttributionConvertCnt()
+    {
+        return attributionConvertCnt;
+    }
+    public void setDeepConvertCnt(Long deepConvertCnt)
+    {
+        this.deepConvertCnt = deepConvertCnt;
+    }
+
+    public Long getDeepConvertCnt()
+    {
+        return deepConvertCnt;
+    }
+    public void setValidPlay(Long validPlay)
+    {
+        this.validPlay = validPlay;
+    }
+
+    public Long getValidPlay()
+    {
+        return validPlay;
+    }
+    public void setAttributionBillingGameInAppLtv1day(BigDecimal attributionBillingGameInAppLtv1day)
+    {
+        this.attributionBillingGameInAppLtv1day = attributionBillingGameInAppLtv1day;
+    }
+
+    public BigDecimal getAttributionBillingGameInAppLtv1day()
+    {
+        return attributionBillingGameInAppLtv1day;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("advertiserId", getAdvertiserId())
+                .append("statTimeDay", getStatTimeDay())
+                .append("cdpProjectId", getCdpProjectId())
+                .append("cdpProjectName", getCdpProjectName())
+                .append("cdpPromotionId", getCdpPromotionId())
+                .append("cdpPromotionName", getCdpPromotionName())
+                .append("statPayAmount", getStatPayAmount())
+                .append("statCost", getStatCost())
+                .append("active", getActive())
+                .append("eventRegister", getEventRegister())
+                .append("downloadFinishCnt", getDownloadFinishCnt())
+                .append("attributionNextDayOpenCnt", getAttributionNextDayOpenCnt())
+                .append("gameAddiction", getGameAddiction())
+                .append("attributionGameInAppLtv1day", getAttributionGameInAppLtv1day())
+                .append("attributionDeepConvertCnt", getAttributionDeepConvertCnt())
+                .append("gamePayCount", getGamePayCount())
+                .append("convertCnt", getConvertCnt())
+                .append("showCnt", getShowCnt())
+                .append("activePay", getActivePay())
+                .append("clickCnt", getClickCnt())
+                .append("clickStartCnt", getClickStartCnt())
+                .append("attributionConvertCnt", getAttributionConvertCnt())
+                .append("deepConvertCnt", getDeepConvertCnt())
+                .append("validPlay", getValidPlay())
+                .append("attributionBillingGameInAppLtv1day", getAttributionBillingGameInAppLtv1day())
+
+                .toString();
+    }
+}

+ 387 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedancePromoterReportHour.java

@@ -0,0 +1,387 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 头条广告时报对象 bytedance_promoter_report_hour
+ *
+ * @author ruoyi
+ * @date 2025-03-07
+ */
+public class BytedancePromoterReportHour {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 广告主ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 数据起始时间
+     */
+    private Integer statTimeDay;
+
+    /**
+     * 小时
+     */
+    private Integer hour;
+
+    /**
+     * 项目ID
+     */
+    private Long cdpProjectId;
+
+    /**
+     * 项目名称
+     */
+    private String cdpProjectName;
+
+    /**
+     * 广告id
+     */
+    private Long cdpPromotionId;
+
+    /**
+     * 广告名称
+     */
+    private String cdpPromotionName;
+
+    /**
+     * 应用下载数据-付费金额
+     */
+    private BigDecimal statPayAmount;
+
+    /**
+     * 展现数据-总花费
+     */
+    private BigDecimal statCost;
+
+    /**
+     * 应用下载数据–激活数
+     */
+    private Long active;
+
+    /**
+     * 应用下载数据-注册数
+     */
+    private Long eventRegister;
+
+    /**
+     * 下载完成数
+     */
+    private Long downloadFinishCnt;
+
+    /**
+     * 次留人数
+     */
+    private Long attributionNextDayOpenCnt;
+
+    /**
+     * 关键行为数
+     */
+    private Long gameAddiction;
+
+    /**
+     * 激活当日在APP内的付费金额
+     */
+    private BigDecimal attributionGameInAppLtv1day;
+
+    /**
+     * 媒体|深度转化数(计费时间)
+     */
+    private Long attributionDeepConvertCnt;
+
+    /**
+     * 付费次数
+     */
+    private Long gamePayCount;
+
+    /**
+     * 转化数据-转化数
+     */
+    private Long convertCnt;
+
+    /**
+     * 展现数据-展示数
+     */
+    private Long showCnt;
+
+    /**
+     * 首次付费数
+     */
+    private Long activePay;
+
+    /**
+     * 展现数据-点击数
+     */
+    private Long clickCnt;
+
+    /**
+     * 展现数据-点击数
+     */
+    private Long clickStartCnt;
+
+    /**
+     * 媒体|转化数(计费时间)
+     */
+    private Long attributionConvertCnt;
+
+    /**
+     * 转化数据-深度转化数
+     */
+    private Long deepConvertCnt;
+
+    /**
+     * 有效播放数
+     */
+    private Long validPlay;
+
+    /**
+     * 计费当日付费金额
+     */
+    private BigDecimal attributionBillingGameInAppLtv1day;
+
+    public void setAdvertiserId(Long advertiserId) {
+        this.advertiserId = advertiserId;
+    }
+
+    public Long getAdvertiserId() {
+        return advertiserId;
+    }
+
+    public void setStatTimeDay(Integer statTimeDay) {
+        this.statTimeDay = statTimeDay;
+    }
+
+    public Integer getStatTimeDay() {
+        return statTimeDay;
+    }
+
+    public void setHour(Integer hour) {
+        this.hour = hour;
+    }
+
+    public Integer getHour() {
+        return hour;
+    }
+
+    public void setCdpProjectId(Long cdpProjectId) {
+        this.cdpProjectId = cdpProjectId;
+    }
+
+    public Long getCdpProjectId() {
+        return cdpProjectId;
+    }
+
+    public void setCdpProjectName(String cdpProjectName) {
+        this.cdpProjectName = cdpProjectName;
+    }
+
+    public String getCdpProjectName() {
+        return cdpProjectName;
+    }
+
+    public void setCdpPromotionId(Long cdpPromotionId) {
+        this.cdpPromotionId = cdpPromotionId;
+    }
+
+    public Long getCdpPromotionId() {
+        return cdpPromotionId;
+    }
+
+    public void setCdpPromotionName(String cdpPromotionName) {
+        this.cdpPromotionName = cdpPromotionName;
+    }
+
+    public String getCdpPromotionName() {
+        return cdpPromotionName;
+    }
+
+    public void setStatPayAmount(BigDecimal statPayAmount) {
+        this.statPayAmount = statPayAmount;
+    }
+
+    public BigDecimal getStatPayAmount() {
+        return statPayAmount;
+    }
+
+    public void setStatCost(BigDecimal statCost) {
+        this.statCost = statCost;
+    }
+
+    public BigDecimal getStatCost() {
+        return statCost;
+    }
+
+    public void setActive(Long active) {
+        this.active = active;
+    }
+
+    public Long getActive() {
+        return active;
+    }
+
+    public void setEventRegister(Long eventRegister) {
+        this.eventRegister = eventRegister;
+    }
+
+    public Long getEventRegister() {
+        return eventRegister;
+    }
+
+    public void setDownloadFinishCnt(Long downloadFinishCnt) {
+        this.downloadFinishCnt = downloadFinishCnt;
+    }
+
+    public Long getDownloadFinishCnt() {
+        return downloadFinishCnt;
+    }
+
+    public void setAttributionNextDayOpenCnt(Long attributionNextDayOpenCnt) {
+        this.attributionNextDayOpenCnt = attributionNextDayOpenCnt;
+    }
+
+    public Long getAttributionNextDayOpenCnt() {
+        return attributionNextDayOpenCnt;
+    }
+
+    public void setGameAddiction(Long gameAddiction) {
+        this.gameAddiction = gameAddiction;
+    }
+
+    public Long getGameAddiction() {
+        return gameAddiction;
+    }
+
+    public void setAttributionGameInAppLtv1day(BigDecimal attributionGameInAppLtv1day) {
+        this.attributionGameInAppLtv1day = attributionGameInAppLtv1day;
+    }
+
+    public BigDecimal getAttributionGameInAppLtv1day() {
+        return attributionGameInAppLtv1day;
+    }
+
+    public void setAttributionDeepConvertCnt(Long attributionDeepConvertCnt) {
+        this.attributionDeepConvertCnt = attributionDeepConvertCnt;
+    }
+
+    public Long getAttributionDeepConvertCnt() {
+        return attributionDeepConvertCnt;
+    }
+
+    public void setGamePayCount(Long gamePayCount) {
+        this.gamePayCount = gamePayCount;
+    }
+
+    public Long getGamePayCount() {
+        return gamePayCount;
+    }
+
+    public void setConvertCnt(Long convertCnt) {
+        this.convertCnt = convertCnt;
+    }
+
+    public Long getConvertCnt() {
+        return convertCnt;
+    }
+
+    public void setShowCnt(Long showCnt) {
+        this.showCnt = showCnt;
+    }
+
+    public Long getShowCnt() {
+        return showCnt;
+    }
+
+    public void setActivePay(Long activePay) {
+        this.activePay = activePay;
+    }
+
+    public Long getActivePay() {
+        return activePay;
+    }
+
+    public void setClickCnt(Long clickCnt) {
+        this.clickCnt = clickCnt;
+    }
+
+    public Long getClickCnt() {
+        return clickCnt;
+    }
+
+    public void setClickStartCnt(Long clickStartCnt) {
+        this.clickStartCnt = clickStartCnt;
+    }
+
+    public Long getClickStartCnt() {
+        return clickStartCnt;
+    }
+
+    public void setAttributionConvertCnt(Long attributionConvertCnt) {
+        this.attributionConvertCnt = attributionConvertCnt;
+    }
+
+    public Long getAttributionConvertCnt() {
+        return attributionConvertCnt;
+    }
+
+    public void setDeepConvertCnt(Long deepConvertCnt) {
+        this.deepConvertCnt = deepConvertCnt;
+    }
+
+    public Long getDeepConvertCnt() {
+        return deepConvertCnt;
+    }
+
+    public void setValidPlay(Long validPlay) {
+        this.validPlay = validPlay;
+    }
+
+    public Long getValidPlay() {
+        return validPlay;
+    }
+
+    public void setAttributionBillingGameInAppLtv1day(BigDecimal attributionBillingGameInAppLtv1day) {
+        this.attributionBillingGameInAppLtv1day = attributionBillingGameInAppLtv1day;
+    }
+
+    public BigDecimal getAttributionBillingGameInAppLtv1day() {
+        return attributionBillingGameInAppLtv1day;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("advertiserId", getAdvertiserId())
+                .append("statTimeDay", getStatTimeDay())
+                .append("hour", getHour())
+                .append("cdpProjectId", getCdpProjectId())
+                .append("cdpProjectName", getCdpProjectName())
+                .append("cdpPromotionId", getCdpPromotionId())
+                .append("cdpPromotionName", getCdpPromotionName())
+                .append("statPayAmount", getStatPayAmount())
+                .append("statCost", getStatCost())
+                .append("active", getActive())
+                .append("eventRegister", getEventRegister())
+                .append("downloadFinishCnt", getDownloadFinishCnt())
+                .append("attributionNextDayOpenCnt", getAttributionNextDayOpenCnt())
+                .append("gameAddiction", getGameAddiction())
+                .append("attributionGameInAppLtv1day", getAttributionGameInAppLtv1day())
+                .append("attributionDeepConvertCnt", getAttributionDeepConvertCnt())
+                .append("gamePayCount", getGamePayCount())
+                .append("convertCnt", getConvertCnt())
+                .append("showCnt", getShowCnt())
+                .append("activePay", getActivePay())
+                .append("clickCnt", getClickCnt())
+                .append("clickStartCnt", getClickStartCnt())
+                .append("attributionConvertCnt", getAttributionConvertCnt())
+                .append("deepConvertCnt", getDeepConvertCnt())
+                .append("validPlay", getValidPlay())
+                .append("attributionBillingGameInAppLtv1day", getAttributionBillingGameInAppLtv1day())
+                .toString();
+    }
+}

+ 19 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedancePromoterReportMapper.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+
+import cn.com.ctop.job.bytedance.data.entity.BytedancePromoterReportDaily;
+import cn.com.ctop.job.bytedance.data.entity.BytedancePromoterReportHour;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface BytedancePromoterReportMapper {
+    List<JSONObject> getAccountList();
+
+    void replacePromoterReportHour(@Param("list") List<BytedancePromoterReportHour> hours);
+
+    void deleteInfoByErrorId(@Param("errorId") Long errorId);
+
+    void replacePromoterReportDailies(@Param("list") List<BytedancePromoterReportDaily> promoterReportDailies);
+}

+ 140 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedancePromoterReportMapper.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.com.ctop.job.bytedance.data.mapper.BytedancePromoterReportMapper">
+    <delete id="deleteInfoByErrorId">
+        DELETE
+        FROM bytedance_error_log
+        WHERE id = #{errorId}
+    </delete>
+
+    <select id="getAccountList" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT t1.id AS 'id', t1.advertiser_id AS 'advertiserId', t1.start_date AS 'startDate', t1.end_date AS 'endDate', t1.data_dimension AS 'dataDimension', t1.data_type AS 'dataType', t3.access_token AS 'accessToken'
+        FROM bytedance_error_log t1
+                 LEFT JOIN deepthink.bytedance_advertiser_list t2 ON t1.advertiser_id = t2.advertiser_id
+                 LEFT JOIN deepthink.bytedance_auth_list t3 ON t2.admin_advertiser_id = t3.admin_advertiser_id
+    </select>
+
+    <insert id="replacePromoterReportHour">
+        replace into bytedance_promoter_report_hour (
+        advertiser_id,
+        stat_time_day,
+        `hour`,
+        cdp_project_id,
+        cdp_project_name,
+        cdp_promotion_id ,
+        cdp_promotion_name,
+        stat_pay_amount,
+        stat_cost,
+        `active`,
+        event_register,
+        download_finish_cnt,
+        attribution_next_day_open_cnt,
+        game_addiction,
+        attribution_game_in_app_ltv_1day,
+        attribution_deep_convert_cnt,
+        game_pay_count,
+        convert_cnt,
+        show_cnt,
+        active_pay,
+        click_cnt,
+        click_start_cnt,
+        attribution_convert_cnt,
+        deep_convert_cnt,
+        valid_play,
+        attribution_billing_game_in_app_ltv_1day
+
+        )
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.advertiserId},
+            #{item.statTimeDay},
+            #{item.hour},
+            #{item.cdpProjectId},
+            #{item.cdpProjectName},
+            #{item.cdpPromotionId},
+            #{item.cdpPromotionName},
+            #{item.statPayAmount},
+            #{item.statCost},
+            #{item.active},
+            #{item.eventRegister},
+            #{item.downloadFinishCnt},
+            #{item.attributionNextDayOpenCnt},
+            #{item.gameAddiction},
+            #{item.attributionGameInAppLtv1day},
+            #{item.attributionDeepConvertCnt},
+            #{item.gamePayCount},
+            #{item.convertCnt},
+            #{item.showCnt},
+            #{item.activePay},
+            #{item.clickCnt},
+            #{item.clickStartCnt},
+            #{item.attributionConvertCnt},
+            #{item.deepConvertCnt},
+            #{item.validPlay},
+            #{item.attributionBillingGameInAppLtv1day}
+            )
+        </foreach>
+    </insert>
+
+
+    <insert id="replacePromoterReportDailies">
+        replace into bytedance_promoter_report_daily_new (
+        advertiser_id,
+        stat_time_day,
+        cdp_project_id,
+        cdp_project_name,
+        cdp_promotion_id ,
+        cdp_promotion_name,
+        stat_pay_amount,
+        stat_cost,
+        `active`,
+        event_register,
+        download_finish_cnt,
+        attribution_next_day_open_cnt,
+        game_addiction,
+        attribution_game_in_app_ltv_1day,
+        attribution_deep_convert_cnt,
+        game_pay_count,
+        convert_cnt,
+        show_cnt,
+        active_pay,
+        click_cnt,
+        click_start_cnt,
+        attribution_convert_cnt,
+        deep_convert_cnt,
+        valid_play,
+        attribution_billing_game_in_app_ltv_1day
+        )
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.advertiserId},
+            #{item.statTimeDay},
+            #{item.cdpProjectId},
+            #{item.cdpProjectName},
+            #{item.cdpPromotionId},
+            #{item.cdpPromotionName},
+            #{item.statPayAmount},
+            #{item.statCost},
+            #{item.active},
+            #{item.eventRegister},
+            #{item.downloadFinishCnt},
+            #{item.attributionNextDayOpenCnt},
+            #{item.gameAddiction},
+            #{item.attributionGameInAppLtv1day},
+            #{item.attributionDeepConvertCnt},
+            #{item.gamePayCount},
+            #{item.convertCnt},
+            #{item.showCnt},
+            #{item.activePay},
+            #{item.clickCnt},
+            #{item.clickStartCnt},
+            #{item.attributionConvertCnt},
+            #{item.deepConvertCnt},
+            #{item.validPlay},
+            #{item.attributionBillingGameInAppLtv1day}
+            )
+        </foreach>
+    </insert>
+</mapper>

+ 14 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedancePromoterReportService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+
+public interface IBytedancePromoterReportService {
+    List<JSONObject> getAccountList();
+
+    void getBytedancePromoterHourReport(Long errorId, Long advertiserId, String accessToken, String startDate, String endDate, Integer page);
+
+    void getBytedancePromorteDailyReport(Long errorId, Long advertiserId, String accessToken, String startDate, String endDate, Integer page);
+}

+ 182 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedancePromoterReportServiceImpl.java

@@ -0,0 +1,182 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.entity.BytedancePromoterReportDaily;
+import cn.com.ctop.job.bytedance.data.entity.BytedancePromoterReportHour;
+import cn.com.ctop.job.bytedance.data.mapper.BytedancePromoterReportMapper;
+import cn.com.ctop.job.bytedance.data.service.IBytedancePromoterReportService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.FieldsConfig;
+import cn.com.ctop.job.bytedance.data.utils.HttpUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class BytedancePromoterReportServiceImpl implements IBytedancePromoterReportService {
+    @Autowired
+    private BytedancePromoterReportMapper promoterReportMapper;
+    @Override
+    public List<JSONObject> getAccountList() {
+        return promoterReportMapper.getAccountList();
+    }
+
+    @Override
+    public void getBytedancePromoterHourReport(Long errorId, Long advertiserId, String accessToken, String startDate, String endDate, Integer page) {
+        try {
+            String url = "https://api.oceanengine.com/open_api/v3.0/report/custom/get/";
+            Map<String, Object> paramsMap = new HashMap<>();
+            paramsMap.put("advertiser_id", advertiserId);
+            paramsMap.put("start_time", startDate);
+            paramsMap.put("end_time", endDate);
+            paramsMap.put("data_topic", "BASIC_DATA");
+            paramsMap.put("metrics", FieldsConfig.getpromoterMetrics());
+            paramsMap.put("dimensions", FieldsConfig.getpromoterHoutDimensions());
+            paramsMap.put("order_by", new JSONArray());
+            paramsMap.put("filters", new JSONArray());
+            paramsMap.put("page", page);
+            paramsMap.put("page_size", 100);
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", accessToken);
+            headers.put("Content-Type", "application/json;charset=UTF-8");
+            String s = HttpUtils.httpGet(url, paramsMap, headers);
+            JSONObject result = JSONObject.parseObject(s);
+            if (Check.isNull(result)) {
+                log.info("账户id:{},日期:{},广告时报(最细粒度)请求结果返回为空", advertiserId, startDate);
+            }
+            List<BytedancePromoterReportHour> hours = new ArrayList<>();
+            Integer code = result.getInteger("code");
+            if (code == 0) {
+                JSONObject data = result.getJSONObject("data");
+                if (!Check.isNull(data)) {
+                    JSONArray rows = data.getJSONArray("rows");
+                    if (!Check.isNull(rows)) {
+                        for (int i = 0; i < rows.size(); i++) {
+                            JSONObject rowJson = rows.getJSONObject(i);
+                            JSONObject metricsJson = rowJson.getJSONObject("metrics");
+                            JSONObject dimensionsJson = rowJson.getJSONObject("dimensions");
+                            Long cdpProjectId = dimensionsJson.getLong("cdp_project_id");
+                            String cdpProjectName = dimensionsJson.getString("cdp_project_name");
+                            Long cdpPromotionId = dimensionsJson.getLong("cdp_promotion_id");
+                            String cdpPromotionName = dimensionsJson.getString("cdp_promotion_name");
+                            Integer statTimeDay = Integer.valueOf(dimensionsJson.getString("stat_time_day").replace("-", ""));
+                            Integer hour = Integer.valueOf(dimensionsJson.getString("stat_time_hour").substring(11, 13));
+                            BytedancePromoterReportHour bytedancePromoterReportHour = JSONObject.parseObject(metricsJson.toJSONString(), BytedancePromoterReportHour.class);
+                            bytedancePromoterReportHour.setAdvertiserId(advertiserId);
+                            bytedancePromoterReportHour.setCdpProjectId(cdpProjectId);
+                            bytedancePromoterReportHour.setCdpProjectName(cdpProjectName);
+                            bytedancePromoterReportHour.setCdpPromotionId(cdpPromotionId);
+                            bytedancePromoterReportHour.setCdpPromotionName(cdpPromotionName);
+                            bytedancePromoterReportHour.setStatTimeDay(statTimeDay);
+                            bytedancePromoterReportHour.setHour(hour);
+                            hours.add(bytedancePromoterReportHour);
+                        }
+                    }
+                }
+            } else {
+                log.info("账户id:{},日期:{}广告时报(最细粒度)请求结果失败,返回数据:{}", advertiserId, startDate, result);
+
+            }
+            if (!Check.isNull(hours)) {
+                promoterReportMapper.replacePromoterReportHour(hours);
+            }
+            if (hours.size() >= 100) {
+                try {
+                    Thread.sleep(500L);
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
+                getBytedancePromoterHourReport(errorId,advertiserId, accessToken, startDate, endDate, page + 1);
+            } else {
+                log.info("账户ID:{},日期:{},广告时报(最细粒度)数据请求成功", advertiserId, startDate);
+                promoterReportMapper.deleteInfoByErrorId(errorId);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    @Override
+    public void getBytedancePromorteDailyReport(Long errorId, Long advertiserId, String accessToken, String startDate, String endDate, Integer page) {
+        try {
+            String url = "https://api.oceanengine.com/open_api/v3.0/report/custom/get/";
+            Map<String, Object> paramsMap = new HashMap<>();
+            paramsMap.put("advertiser_id", advertiserId);
+            paramsMap.put("start_time", startDate);
+            paramsMap.put("end_time", endDate);
+            paramsMap.put("data_topic", "BASIC_DATA");
+            paramsMap.put("metrics", FieldsConfig.getpromoterMetrics());
+            paramsMap.put("dimensions", FieldsConfig.getpromoterDailyDimensions());
+            paramsMap.put("order_by", new JSONArray());
+            paramsMap.put("filters", new JSONArray());
+            paramsMap.put("page", page);
+            paramsMap.put("page_size", 100);
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", accessToken);
+            headers.put("Content-Type", "application/json");
+            String s = HttpUtils.httpGet(url, paramsMap, headers);
+            JSONObject result = JSONObject.parseObject(s);
+            if (Check.isNull(result)) {
+                log.info("账户id:{},广告日报(最细粒度)请求结果返回为空", advertiserId);
+            }
+            List<BytedancePromoterReportDaily> promoterReportDailies = new ArrayList<>();
+            Integer code = result.getInteger("code");
+            if (code == 0) {
+                JSONObject data = result.getJSONObject("data");
+                if (!Check.isNull(data)) {
+                    JSONArray rows = data.getJSONArray("rows");
+                    if (!Check.isNull(rows)) {
+                        for (int i = 0; i < rows.size(); i++) {
+                            JSONObject rowJson = rows.getJSONObject(i);
+                            JSONObject metricsJson = rowJson.getJSONObject("metrics");
+                            JSONObject dimensionsJson = rowJson.getJSONObject("dimensions");
+                            Long cdpProjectId = dimensionsJson.getLong("cdp_project_id");
+                            String cdpProjectName = dimensionsJson.getString("cdp_project_name");
+                            Long cdpPromotionId = dimensionsJson.getLong("cdp_promotion_id");
+                            String cdpPromotionName = dimensionsJson.getString("cdp_promotion_name");
+                            Integer statTimeDay = Integer.valueOf(dimensionsJson.getString("stat_time_day").replace("-", ""));
+                            BytedancePromoterReportDaily promoterReportDaily = JSONObject.parseObject(metricsJson.toJSONString(), BytedancePromoterReportDaily.class);
+                            promoterReportDaily.setAdvertiserId(advertiserId);
+                            promoterReportDaily.setCdpProjectId(cdpProjectId);
+                            promoterReportDaily.setCdpProjectName(cdpProjectName);
+                            promoterReportDaily.setCdpPromotionId(cdpPromotionId);
+                            promoterReportDaily.setCdpPromotionName(cdpPromotionName);
+                            promoterReportDaily.setStatTimeDay(statTimeDay);
+                            promoterReportDailies.add(promoterReportDaily);
+                        }
+                    }
+                }
+            } else {
+                log.info("账户id:{},日期:{}广告日报(最细粒度)请求结果失败,返回数据:{}", advertiserId, startDate, result);
+
+            }
+            if (!Check.isNull(promoterReportDailies)) {
+                promoterReportMapper.replacePromoterReportDailies(promoterReportDailies);
+                log.info("账户ID:{},广告日报(最细粒度)数据请求成功", advertiserId);
+            }
+            if (promoterReportDailies.size() >= 100) {
+                try {
+                    Thread.sleep(500L);
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
+                getBytedancePromorteDailyReport(errorId,advertiserId, accessToken, startDate, endDate, page + 1);
+            } else {
+                log.info("账户ID:{},日期:{},广告日报(最细粒度)数据请求成功", advertiserId, startDate);
+                promoterReportMapper.deleteInfoByErrorId(errorId);
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        }
+    }
+}

+ 54 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/FieldsConfig.java

@@ -0,0 +1,54 @@
+package cn.com.ctop.job.bytedance.data.utils;
+
+import com.alibaba.fastjson.JSONArray;
+
+public class FieldsConfig {
+
+
+    public static JSONArray getpromoterHoutDimensions() {
+        JSONArray houtDimensions = new JSONArray();
+        houtDimensions.add("stat_time_day");
+        houtDimensions.add("stat_time_hour");
+        houtDimensions.add("cdp_project_id");
+        houtDimensions.add("cdp_project_name");
+        houtDimensions.add("cdp_promotion_id");
+        houtDimensions.add("cdp_promotion_name");
+        return houtDimensions;
+
+    }
+
+    public static JSONArray getpromoterDailyDimensions() {
+        JSONArray houtDimensions = new JSONArray();
+        houtDimensions.add("stat_time_day");
+        houtDimensions.add("cdp_project_id");
+        houtDimensions.add("cdp_project_name");
+        houtDimensions.add("cdp_promotion_id");
+        houtDimensions.add("cdp_promotion_name");
+        return houtDimensions;
+
+    }
+
+    public static JSONArray getpromoterMetrics() {
+        JSONArray metricslds = new JSONArray();
+        metricslds.add("stat_pay_amount");
+        metricslds.add("stat_cost");
+        metricslds.add("active");
+        metricslds.add("download_finish_cnt");
+        metricslds.add("attribution_next_day_open_cnt");
+        metricslds.add("game_addiction");
+        metricslds.add("attribution_game_in_app_ltv_1day");
+        metricslds.add("attribution_deep_convert_cnt");
+        metricslds.add("game_pay_count");
+        metricslds.add("convert_cnt");
+        metricslds.add("show_cnt");
+        metricslds.add("active_pay");
+        metricslds.add("click_cnt");
+        metricslds.add("click_start_cnt");
+        metricslds.add("attribution_convert_cnt");
+        metricslds.add("deep_convert_cnt");
+        metricslds.add("valid_play");
+        metricslds.add("attribution_billing_game_in_app_ltv_1day");
+        return metricslds;
+
+    }
+}

+ 78 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedancePromoterReportJob.java

@@ -0,0 +1,78 @@
+package cn.com.ctop.job.bytedance.handler;
+
+
+import cn.com.ctop.job.bytedance.data.service.IBytedancePromoterReportService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import com.alibaba.fastjson.JSONObject;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+/**
+ * 广告主定时任务
+ *
+ * @throws Exception
+ */
+@Slf4j
+@Component
+public class BytedancePromoterReportJob {
+    @Autowired
+    private IBytedancePromoterReportService promoterReportService;
+    private static ExecutorService dailyExecutorService = Executors.newFixedThreadPool(2);
+    private static ExecutorService hourrExecutorService = Executors.newFixedThreadPool(2);
+
+    @XxlJob("promoterReport")
+    public void promoterReport() throws Exception {
+        List<JSONObject> accountList = promoterReportService.getAccountList();
+        if (!Check.isNull(accountList)) {
+            for (int i = 0; i < accountList.size(); i++) {
+                JSONObject jsonObject = accountList.get(i);
+                Long id = jsonObject.getLong("id");
+                Long advertiserId = jsonObject.getLong("advertiserId");
+                String startDate = jsonObject.getString("startDate");
+                String endDate = jsonObject.getString("endDate");
+                String dataDimension = jsonObject.getString("dataDimension");
+                String dataType = jsonObject.getString("dataType");
+                String accessToken = jsonObject.getString("accessToken");
+
+                if ("promoter".equals(dataDimension)) {
+                    if (dataType.equals("hour")) { // 广告时报
+                        hourrExecutorService.submit(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (!Check.isNull(accessToken)) {
+                                    promoterReportService.getBytedancePromoterHourReport(id, advertiserId, accessToken, startDate, endDate, 1);
+                                }
+                            }
+                        });
+                    }
+                    if (dataType.equals("daily")) { // 广告日报
+                        dailyExecutorService.submit(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (!Check.isNull(accessToken)) {
+                                    promoterReportService.getBytedancePromorteDailyReport(id, advertiserId, accessToken, startDate, endDate, 1);
+
+                                }
+                            }
+                        });
+                    }
+                }
+
+
+            }
+
+        } else {
+            log.info("重试列表为空");
+        }
+
+    }
+
+
+}

+ 1 - 0
job-bytedance/src/main/resources/application.yml

@@ -81,6 +81,7 @@ spring:
       datasource:
         master:
           url: jdbc:mysql://172.16.0.117:3390/media_api?characterEncoding=UTF-8&useUnicode=true&useSSL=false
+         # url: jdbc:mysql://8.147.135.80:3390/media_api?characterEncoding=UTF-8&useUnicode=true&allowMultiQueries=true&useSSL=false
           username: data
           password: hr@2025..
           driver-class-name: com.mysql.jdbc.Driver

+ 2 - 2
job-bytedance/src/main/resources/logback-dev.xml

@@ -8,10 +8,10 @@
     <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
 
     <!-- 定义日志存储的路径,不要配置相对路径 -->
-<!--
     <property name="FILE_PATH" value="/Users/yumeng/log/spring-log.%d{yyyy-MM-dd}.%i.log"/>
--->
+<!--
     <property name="FILE_PATH" value="/data/webapp/hr_job-bytedance/log/spring-log.%d{yyyy-MM-dd}.%i.log"/>
+-->
 
     <!-- 控制台输出日志 -->
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">

+ 2 - 2
job-bytedance/src/main/resources/logback-prod.xml

@@ -8,10 +8,10 @@
     <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
 
     <!-- 定义日志存储的路径,不要配置相对路径 -->
-<!--
     <property name="FILE_PATH" value="/Users/yumeng/logs/spring-log.%d{yyyy-MM-dd}.%i.log"/>
--->
+<!--
     <property name="FILE_PATH" value="/data/webapp/hr_job-bytedance/log/spring-log.%d{yyyy-MM-dd}.%i.log"/>
+-->
 
     <!-- 控制台输出日志 -->
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">

+ 2 - 2
job-bytedance/src/main/resources/logback-test.xml

@@ -8,10 +8,10 @@
     <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
 
     <!-- 定义日志存储的路径,不要配置相对路径 -->
-<!--
         <property name="FILE_PATH" value="/Users/yumeng/log/spring-log.%d{yyyy-MM-dd}.%i.log"/>
-    -->
+<!--
     <property name="FILE_PATH" value="/data/webapp/hr_job-bytedance/log/spring-log.%d{yyyy-MM-dd}.%i.log"/>
+-->
 
     <!-- 控制台输出日志 -->
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">