浏览代码

添加V3 素材、广告报表

zhaoxian 1 年之前
父节点
当前提交
ee5f581d56

+ 22 - 10
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceNewMaterialReport.java

@@ -4,14 +4,32 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
 
 @Data
 public class ByteDanceNewMaterialReport implements Serializable {
     private Long advertiserId;
+    /**
+     * 项目ID
+     */
+
+    private Long cdpProjectId;
+    /**
+     * 项目名称
+     */
+
+    private String cdpProjectName;
+    /**
+     * 广告ID
+     */
+
+    private Long promotionId;
+    /**
+     * 广告名称
+     */
+    private String promotionName;
+    private String adPlatformMaterialName;
     private BigDecimal statCost;
-    private Long materialId;
+    private String materialId;
     private Integer statDatetime;
     //private Integer promotionId;
     //private Integer projectId;
@@ -86,9 +104,7 @@ public class ByteDanceNewMaterialReport implements Serializable {
     private String deliveryMode;
 
 
-
-
-    public static String getParamsFields(){
+    public static String getParamsFields() {
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder.append("[");
         stringBuilder.append("\"stat_cost\"").append(",");
@@ -184,8 +200,4 @@ public class ByteDanceNewMaterialReport implements Serializable {
     }
 
 
-
-
-
-
 }

+ 83 - 14
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceV3AdvertiserReportDTO.java

@@ -5,13 +5,12 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.Data;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
 @Data
-public class ByteDanceV3AdvertiserReportDTO implements Serializable {
+public class ByteDanceV3AdvertiserReportDTO {
 
     private static final long serialVersionUID = 3674054148513217865L;
 
@@ -24,27 +23,25 @@ public class ByteDanceV3AdvertiserReportDTO implements Serializable {
     private Integer page;
     private String orderBy;
     private String filters;
+    private String dataTopic;
 
     public ByteDanceV3AdvertiserReportDTO() {
     }
 
     private static final ObjectMapper mapper = new ObjectMapper();
 
-    public ByteDanceV3AdvertiserReportDTO(Long advertiserId, String type, String startTime, String endTime, Integer pageSize) {
+    public ByteDanceV3AdvertiserReportDTO(Long advertiserId, List<String> dimensions, String dataTopic, String startTime, String endTime, Integer pageSize) {
         try {
             this.advertiserId = advertiserId;
-            List<String> dimensions = new ArrayList<>();
-            dimensions.add(type);
-            /**
-             *stat_time_hour 小时
-             *stat_time_day 每天
-             *cdp_project_id 项目ID
-             *cdp_project_name 项目名称
-             */
-            dimensions.add("cdp_project_id");
-            dimensions.add("cdp_project_name");
             this.dimensions = mapper.writeValueAsString(dimensions);
-            this.metrics = mapper.writeValueAsString(getParamsFields());
+
+            this.dataTopic = dataTopic;
+            if ("MATERIAL_DATA".equals(dataTopic)) {
+                this.metrics = mapper.writeValueAsString(getParamsMaterialFields());
+            }else{
+                this.metrics = mapper.writeValueAsString(getParamsFields());
+            }
+
             this.startTime = startTime;
             this.endTime = endTime;
             this.pageSize = pageSize;
@@ -301,4 +298,76 @@ public class ByteDanceV3AdvertiserReportDTO implements Serializable {
         fields.add("live_component_click_rate");
         return fields;
     }
+
+
+    public static List<String> getParamsMaterialFields() {
+        List<String> fields = new ArrayList<>();
+        fields.add("stat_cost");
+        fields.add("cpm_platform");
+        fields.add("show_cnt");
+        fields.add("click_cnt");
+        fields.add("ctr");
+        fields.add("cpc_platform");
+        fields.add("convert_cnt");
+        fields.add("conversion_cost");
+        fields.add("conversion_rate");
+        fields.add("deep_convert_cnt");
+        fields.add("deep_convert_cost");
+        fields.add("deep_convert_rate");
+        fields.add("click_start_cnt");
+        fields.add("click_start_cost");
+        fields.add("click_start_rate");
+        fields.add("download_finish_cnt");
+        fields.add("download_finish_cost");
+        fields.add("download_finish_rate");
+        fields.add("install_finish_cnt");
+        fields.add("install_finish_cost");
+        fields.add("install_finish_rate");
+        fields.add("active");
+        fields.add("active_cost");
+        fields.add("active_rate");
+        fields.add("active_register");
+        fields.add("active_register_cost");
+        fields.add("active_register_rate");
+        fields.add("game_addiction");
+        fields.add("game_addiction_cost");
+        fields.add("game_addiction_rate");
+        fields.add("attribution_next_day_open_cnt");
+        fields.add("attribution_next_day_open_cost");
+        fields.add("attribution_next_day_open_rate");
+        fields.add("next_day_open");
+        fields.add("active_pay");
+        fields.add("active_pay_cost");
+        fields.add("active_pay_rate");
+        fields.add("game_pay_count");
+        fields.add("game_pay_cost");
+        fields.add("attribution_game_pay_7d_count");
+        fields.add("attribution_game_pay_7d_cost");
+        fields.add("in_app_uv");
+        fields.add("in_app_detail_uv");
+        fields.add("in_app_cart");
+        fields.add("in_app_pay");
+        fields.add("in_app_order");
+        fields.add("attribution_game_in_app_ltv_1day");
+        fields.add("attribution_game_in_app_ltv_2days");
+        fields.add("attribution_game_in_app_ltv_3days");
+        fields.add("attribution_game_in_app_ltv_4days");
+        fields.add("attribution_game_in_app_ltv_5days");
+        fields.add("attribution_game_in_app_ltv_6days");
+        fields.add("attribution_game_in_app_ltv_7days");
+        fields.add("attribution_game_in_app_ltv_8days");
+        fields.add("attribution_game_in_app_roi_1day");
+        fields.add("attribution_game_in_app_roi_2days");
+        fields.add("attribution_game_in_app_roi_3days");
+        fields.add("attribution_game_in_app_roi_4days");
+        fields.add("attribution_game_in_app_roi_5days");
+        fields.add("attribution_game_in_app_roi_6days");
+        fields.add("attribution_game_in_app_roi_7days");
+        fields.add("attribution_game_in_app_roi_8days");
+        fields.add("active_pay_intra_day_count");
+        fields.add("active_pay_intra_day_cost");
+        fields.add("active_pay_intra_day_rate");
+        return fields;
+    }
+
 }

文件差异内容过多而无法显示
+ 1431 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceV3PromotionProjectReportDaily.java


+ 8 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceAdvertiserReportDailyMapper.java

@@ -1,8 +1,10 @@
 package cn.com.ctop.job.bytedance.data.mapper;
 
 
+import cn.com.ctop.job.bytedance.data.entity.ByteDanceNewMaterialReport;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserReportDaily;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceV3ProjectReportDaily;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceV3PromotionProjectReportDaily;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -13,4 +15,10 @@ public interface BytedanceAdvertiserReportDailyMapper {
     int insert(@Param("list") List<BytedanceAdvertiserReportDaily> list);
 
     void insertV3Project(@Param("list") List<BytedanceV3ProjectReportDaily> dailyList);
+
+    void insertV3PromotionProject(@Param("list") List<BytedanceV3PromotionProjectReportDaily> dailyList);
+
+    void insertV3PromotionProjectVideo(@Param("list") List<ByteDanceNewMaterialReport> videolist);
+
+    void insertV3PromotionProjectImage(@Param("list") List<ByteDanceNewMaterialReport> imageList);
 }

+ 802 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAdvertiserReportDailyMapper.xml

@@ -166,7 +166,8 @@
     </resultMap>
 
     <sql id="Base_Column_List">
-    advertiser_id, stat_datetime, cost, show, avg_show_cost, click, avg_click_cost, ctr, 
+        advertiser_id
+        , stat_datetime, cost, show, avg_show_cost, click, avg_click_cost, ctr,
     convert, convert_cost, convert_rate, deep_convert, deep_convert_cost, deep_convert_rate, 
     attribution_convert, attribution_convert_cost, attribution_deep_convert, attribution_deep_convert_cost, 
     download_start, download_start_cost, download_start_rate, download_finish, download_finish_cost, 
@@ -199,7 +200,7 @@
     message_action, click_landing_page, click_shopwindow, click_website, click_download, 
     click_call_dy, submit_certification_count, approval_count, first_rental_order_count, 
     first_order_count, commute_first_pay_count
-  </sql>
+    </sql>
 
     <insert id="insert" parameterType="cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserReportDaily">
         replace into bytedance_advertiser_report_daily (advertiser_id, stat_datetime, cost,
@@ -843,4 +844,803 @@
         </foreach>
     </insert>
 
+
+    <insert id="insertV3PromotionProject"
+            parameterType="cn.com.ctop.job.bytedance.data.entity.BytedanceV3PromotionProjectReportDaily">
+        replace into media_api.bytedance_promotion_report_daily (
+        advertiser_id,
+        cdp_project_id,
+        cdp_project_name,
+        promotion_id,
+        promotion_name,
+        stat_time_day,
+        active,
+        active_cost,
+        active_pay,
+        active_pay_cost,
+        active_pay_intra_day_cost,
+        active_pay_intra_day_count,
+        active_pay_intra_day_rate,
+        active_pay_rate,
+        active_rate,
+        active_register,
+        active_register_cost,
+        active_register_rate,
+        ad_dislike_cnt,
+        ad_report_cnt,
+        attribution_active_pay,
+        attribution_active_pay_7d_per_count,
+        attribution_active_pay_cost,
+        attribution_active_pay_rate,
+        attribution_billing_game_in_app_ltv_1day,
+        attribution_billing_game_in_app_ltv_2days,
+        attribution_billing_game_in_app_ltv_3days,
+        attribution_billing_game_in_app_ltv_4days,
+        attribution_billing_game_in_app_ltv_5days,
+        attribution_billing_game_in_app_ltv_6days,
+        attribution_billing_game_in_app_ltv_7days,
+        attribution_billing_game_in_app_roi_1day,
+        attribution_billing_game_in_app_roi_2days,
+        attribution_billing_game_in_app_roi_3days,
+        attribution_billing_game_in_app_roi_4days,
+        attribution_billing_game_in_app_roi_5days,
+        attribution_billing_game_in_app_roi_6days,
+        attribution_billing_game_in_app_roi_7days,
+        attribution_billing_game_pay_7d_cost,
+        attribution_billing_game_pay_7d_count,
+        attribution_clue_confirm,
+        attribution_clue_confirm_cost,
+        attribution_clue_high_intention,
+        attribution_clue_high_intention_cost,
+        attribution_clue_interflow,
+        attribution_clue_interflow_cost,
+        attribution_clue_pay_succeed,
+        attribution_clue_pay_succeed_cost,
+        attribution_conversion_class_count,
+        attribution_conversion_rate,
+        attribution_convert_cnt,
+        attribution_convert_cost,
+        attribution_customer_effective,
+        attribution_customer_effective_cost,
+        attribution_day_active_pay_cost,
+        attribution_day_active_pay_count,
+        attribution_day_active_pay_rate,
+        attribution_deep_convert_cnt,
+        attribution_deep_convert_cost,
+        attribution_deep_convert_rate,
+        attribution_game_in_app_ltv_1day,
+        attribution_game_in_app_ltv_2days,
+        attribution_game_in_app_ltv_3days,
+        attribution_game_in_app_ltv_4days,
+        attribution_game_in_app_ltv_5days,
+        attribution_game_in_app_ltv_6days,
+        attribution_game_in_app_ltv_7days,
+        attribution_game_in_app_ltv_8days,
+        attribution_game_in_app_roi_1day,
+        attribution_game_in_app_roi_2days,
+        attribution_game_in_app_roi_3days,
+        attribution_game_in_app_roi_4days,
+        attribution_game_in_app_roi_5days,
+        attribution_game_in_app_roi_6days,
+        attribution_game_in_app_roi_7days,
+        attribution_game_in_app_roi_8days,
+        attribution_game_pay_7d_cost,
+        attribution_game_pay_7d_count,
+        attribution_micro_game_0d_ltv,
+        attribution_micro_game_0d_roi,
+        attribution_micro_game_3d_ltv,
+        attribution_micro_game_3d_roi,
+        attribution_micro_game_7d_ltv,
+        attribution_micro_game_7d_roi,
+        attribution_next_day_open_cnt,
+        attribution_next_day_open_cost,
+        attribution_next_day_open_rate,
+        attribution_retention_2d_cnt,
+        attribution_retention_2d_cost,
+        attribution_retention_2d_rate,
+        attribution_retention_3d_cnt,
+        attribution_retention_3d_cost,
+        attribution_retention_3d_rate,
+        attribution_retention_4d_cnt,
+        attribution_retention_4d_cost,
+        attribution_retention_4d_rate,
+        attribution_retention_5d_cnt,
+        attribution_retention_5d_cost,
+        attribution_retention_5d_rate,
+        attribution_retention_6d_cnt,
+        attribution_retention_6d_cost,
+        attribution_retention_6d_rate,
+        attribution_retention_7d_cnt,
+        attribution_retention_7d_cost,
+        attribution_retention_7d_rate,
+        attribution_retention_7d_sum_cnt,
+        attribution_retention_7d_total_cost,
+        attribution_work_wechat_added_count,
+        attribution_work_wechat_dialog_count,
+        attribution_work_wechat_unfriend_count,
+        average_play_time_per_play,
+        bankcard_information_count,
+        button,
+        card_show,
+        certification_information_count,
+        click_call_dy,
+        click_cnt,
+        click_download,
+        click_landing_page,
+        click_shopwindow,
+        click_start_cnt,
+        click_start_cost,
+        click_start_rate,
+        click_website,
+        consult,
+        consult_clue,
+        consult_effective,
+        conversion_cost,
+        conversion_rate,
+        convert_cnt,
+        coupon,
+        coupon_single_page,
+        cpc_platform,
+        cpm_platform,
+        ctr,
+        customer_effective,
+        deep_convert_cnt,
+        deep_convert_cost,
+        deep_convert_rate,
+        download_finish_cnt,
+        download_finish_cost,
+        download_finish_rate,
+        download_start,
+        dy_comment,
+        dy_follow,
+        dy_home_visited,
+        dy_like,
+        dy_share,
+        first_class_count,
+        form,
+        form_submit,
+        game_addiction,
+        game_addiction_cost,
+        game_addiction_rate,
+        game_pay_cost,
+        game_pay_count,
+        high_loan_credit_count,
+        ies_challenge_click,
+        ies_music_click,
+        in_app_cart,
+        in_app_detail_uv,
+        in_app_order,
+        in_app_order_gmv,
+        in_app_order_roi,
+        in_app_pay,
+        in_app_pay_gmv,
+        in_app_pay_roi,
+        in_app_uv,
+        in_wechat_pay_count,
+        install_finish_cnt,
+        install_finish_cost,
+        install_finish_rate,
+        insurance_lt_roi,
+        live_component_click_cost,
+        live_component_click_count,
+        live_component_click_rate,
+        live_watch_one_minute_count,
+        loan,
+        loan_completion,
+        loan_completion_cost,
+        loan_completion_rate,
+        loan_cost,
+        loan_credit,
+        loan_credit_cost,
+        loan_credit_rate,
+        loan_rate,
+        location_click,
+        lottery,
+        low_loan_credit_count,
+        luban_live_comment_cnt,
+        luban_live_enter_cnt,
+        luban_live_follow_cnt,
+        luban_live_share_cnt,
+        map,
+        message,
+        message_action,
+        next_day_open,
+        open_account_count,
+        pay_amount_roi,
+        personal_information_count,
+        phone,
+        phone_confirm,
+        phone_connect,
+        phone_effective,
+        play_25_feed_break,
+        play_50_feed_break,
+        play_75_feed_break,
+        play_99_feed_break,
+        play_duration_3s,
+        play_over_rate,
+        poi_address_click,
+        poi_collect,
+        pre_loan_credit,
+        pre_loan_credit_cost,
+        premium_payment_cost,
+        premium_payment_count,
+        qq,
+        redirect,
+        redirect_to_shop,
+        second_class_count,
+        shopping,
+        show_cnt,
+        stat_cost,
+        stat_pay_amount,
+        total_play,
+        unfollow_in_wechat_count,
+        valid_play,
+        valid_play_cost,
+        valid_play_cost_of_mille,
+        valid_play_of_mille,
+        valid_play_rate,
+        view,
+        vote,
+        wifi_play_rate,
+        withdraw_m2_count
+        )
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.advertiserId},
+            #{item.cdpProjectId},
+            #{item.cdpProjectName},
+            #{item.promotionId},
+            #{item.promotionName},
+            #{item.statTimeDay},
+            #{item.active},
+            #{item.activeCost},
+            #{item.activePay},
+            #{item.activePayCost},
+            #{item.activePayIntraDayCost},
+            #{item.activePayIntraDayCount},
+            #{item.activePayIntraDayRate},
+            #{item.activePayRate},
+            #{item.activeRate},
+            #{item.activeRegister},
+            #{item.activeRegisterCost},
+            #{item.activeRegisterRate},
+            #{item.adDislikeCnt},
+            #{item.adReportCnt},
+            #{item.attributionActivePay},
+            #{item.attributionActivePay7dPerCount},
+            #{item.attributionActivePayCost},
+            #{item.attributionActivePayRate},
+            #{item.attributionBillingGameInAppLtv1day},
+            #{item.attributionBillingGameInAppLtv2days},
+            #{item.attributionBillingGameInAppLtv3days},
+            #{item.attributionBillingGameInAppLtv4days},
+            #{item.attributionBillingGameInAppLtv5days},
+            #{item.attributionBillingGameInAppLtv6days},
+            #{item.attributionBillingGameInAppLtv7days},
+            #{item.attributionBillingGameInAppRoi1day},
+            #{item.attributionBillingGameInAppRoi2days},
+            #{item.attributionBillingGameInAppRoi3days},
+            #{item.attributionBillingGameInAppRoi4days},
+            #{item.attributionBillingGameInAppRoi5days},
+            #{item.attributionBillingGameInAppRoi6days},
+            #{item.attributionBillingGameInAppRoi7days},
+            #{item.attributionBillingGamePay7dCost},
+            #{item.attributionBillingGamePay7dCount},
+            #{item.attributionClueConfirm},
+            #{item.attributionClueConfirmCost},
+            #{item.attributionClueHighIntention},
+            #{item.attributionClueHighIntentionCost},
+            #{item.attributionClueInterflow},
+            #{item.attributionClueInterflowCost},
+            #{item.attributionCluePaySucceed},
+            #{item.attributionCluePaySucceedCost},
+            #{item.attributionConversionClassCount},
+            #{item.attributionConversionRate},
+            #{item.attributionConvertCnt},
+            #{item.attributionConvertCost},
+            #{item.attributionCustomerEffective},
+            #{item.attributionCustomerEffectiveCost},
+            #{item.attributionDayActivePayCost},
+            #{item.attributionDayActivePayCount},
+            #{item.attributionDayActivePayRate},
+            #{item.attributionDeepConvertCnt},
+            #{item.attributionDeepConvertCost},
+            #{item.attributionDeepConvertRate},
+            #{item.attributionGameInAppLtv1day},
+            #{item.attributionGameInAppLtv2days},
+            #{item.attributionGameInAppLtv3days},
+            #{item.attributionGameInAppLtv4days},
+            #{item.attributionGameInAppLtv5days},
+            #{item.attributionGameInAppLtv6days},
+            #{item.attributionGameInAppLtv7days},
+            #{item.attributionGameInAppLtv8days},
+            #{item.attributionGameInAppRoi1day},
+            #{item.attributionGameInAppRoi2days},
+            #{item.attributionGameInAppRoi3days},
+            #{item.attributionGameInAppRoi4days},
+            #{item.attributionGameInAppRoi5days},
+            #{item.attributionGameInAppRoi6days},
+            #{item.attributionGameInAppRoi7days},
+            #{item.attributionGameInAppRoi8days},
+            #{item.attributionGamePay7dCost},
+            #{item.attributionGamePay7dCount},
+            #{item.attributionMicroGame0dLtv},
+            #{item.attributionMicroGame0dRoi},
+            #{item.attributionMicroGame3dLtv},
+            #{item.attributionMicroGame3dRoi},
+            #{item.attributionMicroGame7dLtv},
+            #{item.attributionMicroGame7dRoi},
+            #{item.attributionNextDayOpenCnt},
+            #{item.attributionNextDayOpenCost},
+            #{item.attributionNextDayOpenRate},
+            #{item.attributionRetention2dCnt},
+            #{item.attributionRetention2dCost},
+            #{item.attributionRetention2dRate},
+            #{item.attributionRetention3dCnt},
+            #{item.attributionRetention3dCost},
+            #{item.attributionRetention3dRate},
+            #{item.attributionRetention4dCnt},
+            #{item.attributionRetention4dCost},
+            #{item.attributionRetention4dRate},
+            #{item.attributionRetention5dCnt},
+            #{item.attributionRetention5dCost},
+            #{item.attributionRetention5dRate},
+            #{item.attributionRetention6dCnt},
+            #{item.attributionRetention6dCost},
+            #{item.attributionRetention6dRate},
+            #{item.attributionRetention7dCnt},
+            #{item.attributionRetention7dCost},
+            #{item.attributionRetention7dRate},
+            #{item.attributionRetention7dSumCnt},
+            #{item.attributionRetention7dTotalCost},
+            #{item.attributionWorkWechatAddedCount},
+            #{item.attributionWorkWechatDialogCount},
+            #{item.attributionWorkWechatUnfriendCount},
+            #{item.averagePlayTimePerPlay},
+            #{item.bankcardInformationCount},
+            #{item.button},
+            #{item.cardShow},
+            #{item.certificationInformationCount},
+            #{item.clickCallDy},
+            #{item.clickCnt},
+            #{item.clickDownload},
+            #{item.clickLandingPage},
+            #{item.clickShopwindow},
+            #{item.clickStartCnt},
+            #{item.clickStartCost},
+            #{item.clickStartRate},
+            #{item.clickWebsite},
+            #{item.consult},
+            #{item.consultClue},
+            #{item.consultEffective},
+            #{item.conversionCost},
+            #{item.conversionRate},
+            #{item.convertCnt},
+            #{item.coupon},
+            #{item.couponSinglePage},
+            #{item.cpcPlatform},
+            #{item.cpmPlatform},
+            #{item.ctr},
+            #{item.customerEffective},
+            #{item.deepConvertCnt},
+            #{item.deepConvertCost},
+            #{item.deepConvertRate},
+            #{item.downloadFinishCnt},
+            #{item.downloadFinishCost},
+            #{item.downloadFinishRate},
+            #{item.downloadStart},
+            #{item.dyComment},
+            #{item.dyFollow},
+            #{item.dyHomeVisited},
+            #{item.dyLike},
+            #{item.dyShare},
+            #{item.firstClassCount},
+            #{item.form},
+            #{item.formSubmit},
+            #{item.gameAddiction},
+            #{item.gameAddictionCost},
+            #{item.gameAddictionRate},
+            #{item.gamePayCost},
+            #{item.gamePayCount},
+            #{item.highLoanCreditCount},
+            #{item.iesChallengeClick},
+            #{item.iesMusicClick},
+            #{item.inAppCart},
+            #{item.inAppDetailUv},
+            #{item.inAppOrder},
+            #{item.inAppOrderGmv},
+            #{item.inAppOrderRoi},
+            #{item.inAppPay},
+            #{item.inAppPayGmv},
+            #{item.inAppPayRoi},
+            #{item.inAppUv},
+            #{item.inWechatPayCount},
+            #{item.installFinishCnt},
+            #{item.installFinishCost},
+            #{item.installFinishRate},
+            #{item.insuranceLtRoi},
+            #{item.liveComponentClickCost},
+            #{item.liveComponentClickCount},
+            #{item.liveComponentClickRate},
+            #{item.liveWatchOneMinuteCount},
+            #{item.loan},
+            #{item.loanCompletion},
+            #{item.loanCompletionCost},
+            #{item.loanCompletionRate},
+            #{item.loanCost},
+            #{item.loanCredit},
+            #{item.loanCreditCost},
+            #{item.loanCreditRate},
+            #{item.loanRate},
+            #{item.locationClick},
+            #{item.lottery},
+            #{item.lowLoanCreditCount},
+            #{item.lubanLiveCommentCnt},
+            #{item.lubanLiveEnterCnt},
+            #{item.lubanLiveFollowCnt},
+            #{item.lubanLiveShareCnt},
+            #{item.map},
+            #{item.message},
+            #{item.messageAction},
+            #{item.nextDayOpen},
+            #{item.openAccountCount},
+            #{item.payAmountRoi},
+            #{item.personalInformationCount},
+            #{item.phone},
+            #{item.phoneConfirm},
+            #{item.phoneConnect},
+            #{item.phoneEffective},
+            #{item.play25FeedBreak},
+            #{item.play50FeedBreak},
+            #{item.play75FeedBreak},
+            #{item.play99FeedBreak},
+            #{item.playDuration3s},
+            #{item.playOverRate},
+            #{item.poiAddressClick},
+            #{item.poiCollect},
+            #{item.preLoanCredit},
+            #{item.preLoanCreditCost},
+            #{item.premiumPaymentCost},
+            #{item.premiumPaymentCount},
+            #{item.qq},
+            #{item.redirect},
+            #{item.redirectToShop},
+            #{item.secondClassCount},
+            #{item.shopping},
+            #{item.showCnt},
+            #{item.statCost},
+            #{item.statPayAmount},
+            #{item.totalPlay},
+            #{item.unfollowInWechatCount},
+            #{item.validPlay},
+            #{item.validPlayCost},
+            #{item.validPlayCostOfMille},
+            #{item.validPlayOfMille},
+            #{item.validPlayRate},
+            #{item.view},
+            #{item.vote},
+            #{item.wifiPlayRate},
+            #{item.withdrawM2Count}
+            )
+        </foreach>
+    </insert>
+
+
+    <insert id="insertV3PromotionProjectVideo"
+            parameterType="cn.com.ctop.job.bytedance.data.entity.ByteDanceNewMaterialReport">
+        REPLACE bytedance_promotion_material_video_daily (
+        advertiser_id,
+        material_id,
+        promotion_id,
+        promotion_name,
+        cdp_project_id,
+        cdp_project_name,
+        stat_cost,
+        stat_datetime,
+        show_cnt,
+        cpm_platform,
+        click_cnt,
+        ctr,
+        cpc_platform,
+        convert_cnt,
+        conversion_cost,
+        conversion_rate,
+        deep_convert_cnt,
+        deep_convert_cost,
+        deep_convert_rate,
+        click_start_cnt,
+        click_start_cost,
+        click_start_rate,
+        download_finish_cnt,
+        download_finish_cost,
+        download_finish_rate,
+        install_finish_cnt,
+        install_finish_cost,
+        install_finish_rate,
+        active,
+        active_cost,
+        active_rate,
+        active_register,
+        active_register_cost,
+        active_register_rate,
+        game_addiction,
+        game_addiction_cost,
+        game_addiction_rate,
+        attribution_next_day_open_cnt,
+        attribution_next_day_open_cost,
+        attribution_next_day_open_rate,
+        next_day_open,
+        active_pay,
+        active_pay_cost,
+        active_pay_rate,
+        game_pay_count,
+        game_pay_cost,
+        attribution_game_pay_7d_count,
+        attribution_game_pay_7d_cost,
+        in_app_uv,
+        in_app_detail_uv,
+        in_app_cart,
+        in_app_pay,
+        in_app_order,
+        attribution_game_in_app_ltv_1day,
+        attribution_game_in_app_ltv_2days,
+        attribution_game_in_app_ltv_3days,
+        attribution_game_in_app_ltv_4days,
+        attribution_game_in_app_ltv_5days,
+        attribution_game_in_app_ltv_6days,
+        attribution_game_in_app_ltv_7days,
+        attribution_game_in_app_ltv_8days,
+        attribution_game_in_app_roi_1day,
+        attribution_game_in_app_roi_2days,
+        attribution_game_in_app_roi_3days,
+        attribution_game_in_app_roi_4days,
+        attribution_game_in_app_roi_5days,
+        attribution_game_in_app_roi_6days,
+        attribution_game_in_app_roi_7days,
+        attribution_game_in_app_roi_8days,
+        active_pay_intra_day_count,
+        active_pay_intra_day_cost,
+        active_pay_intra_day_rate,
+        ad_platform_material_name
+        )
+        VALUES
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.advertiserId},
+            #{item.materialId},
+            #{item.promotionId},
+            #{item.promotionName},
+            #{item.cdpProjectId},
+            #{item.cdpProjectName},
+            #{item.statCost},
+            #{item.statDatetime},
+            #{item.showCnt},
+            #{item.cpmPlatform},
+            #{item.clickCnt},
+            #{item.ctr},
+            #{item.cpcPlatform},
+            #{item.convertCnt},
+            #{item.conversionCost},
+            #{item.conversionRate},
+            #{item.deepConvertCnt},
+            #{item.deepConvertCost},
+            #{item.deepConvertRate},
+            #{item.clickStartCnt},
+            #{item.clickStartCost},
+            #{item.clickStartRate},
+            #{item.downloadFinishCnt},
+            #{item.downloadFinishCost},
+            #{item.downloadFinishRate},
+            #{item.installFinishCnt},
+            #{item.installFinishCost},
+            #{item.installFinishRate},
+            #{item.active},
+            #{item.activeCost},
+            #{item.activeRate},
+            #{item.activeRegister},
+            #{item.activeRegisterCost},
+            #{item.activeRegisterRate},
+            #{item.gameAddiction},
+            #{item.gameAddictionCost},
+            #{item.gameAddictionRate},
+            #{item.attributionNextDayOpenCnt},
+            #{item.attributionNextDayOpenCost},
+            #{item.attributionNextDayOpenRate},
+            #{item.nextDayOpen},
+            #{item.activePay},
+            #{item.activePayCost},
+            #{item.activePayRate},
+            #{item.gamePayCount},
+            #{item.gamePayCost},
+            #{item.attributionGamePay7dCount},
+            #{item.attributionGamePay7dCost},
+            #{item.inAppUv},
+            #{item.inAppDetailUv},
+            #{item.inAppCart},
+            #{item.inAppPay},
+            #{item.inAppOrder},
+            #{item.attributionGameInAppLtv1day},
+            #{item.attributionGameInAppLtv2days},
+            #{item.attributionGameInAppLtv3days},
+            #{item.attributionGameInAppLtv4days},
+            #{item.attributionGameInAppLtv5days},
+            #{item.attributionGameInAppLtv6days},
+            #{item.attributionGameInAppLtv7days},
+            #{item.attributionGameInAppLtv8days},
+            #{item.attributionGameInAppRoi1day},
+            #{item.attributionGameInAppRoi2days},
+            #{item.attributionGameInAppRoi3days},
+            #{item.attributionGameInAppRoi4days},
+            #{item.attributionGameInAppRoi5days},
+            #{item.attributionGameInAppRoi6days},
+            #{item.attributionGameInAppRoi7days},
+            #{item.attributionGameInAppRoi8days},
+            #{item.activePayIntraDayCount},
+            #{item.activePayIntraDayCost},
+            #{item.activePayIntraDayRate},
+            #{item.adPlatformMaterialName}
+            )
+        </foreach>
+    </insert>
+
+
+    <insert id="insertV3PromotionProjectImage"
+            parameterType="cn.com.ctop.job.bytedance.data.entity.ByteDanceNewMaterialReport">
+        REPLACE bytedance_promotion_material_image_daily (
+        advertiser_id,
+        material_id,
+        promotion_id,
+        promotion_name,
+        cdp_project_id,
+        cdp_project_name,
+        stat_cost,
+        stat_datetime,
+        show_cnt,
+        cpm_platform,
+        click_cnt,
+        ctr,
+        cpc_platform,
+        convert_cnt,
+        conversion_cost,
+        conversion_rate,
+        deep_convert_cnt,
+        deep_convert_cost,
+        deep_convert_rate,
+        click_start_cnt,
+        click_start_cost,
+        click_start_rate,
+        download_finish_cnt,
+        download_finish_cost,
+        download_finish_rate,
+        install_finish_cnt,
+        install_finish_cost,
+        install_finish_rate,
+        active,
+        active_cost,
+        active_rate,
+        active_register,
+        active_register_cost,
+        active_register_rate,
+        game_addiction,
+        game_addiction_cost,
+        game_addiction_rate,
+        attribution_next_day_open_cnt,
+        attribution_next_day_open_cost,
+        attribution_next_day_open_rate,
+        next_day_open,
+        active_pay,
+        active_pay_cost,
+        active_pay_rate,
+        game_pay_count,
+        game_pay_cost,
+        attribution_game_pay_7d_count,
+        attribution_game_pay_7d_cost,
+        in_app_uv,
+        in_app_detail_uv,
+        in_app_cart,
+        in_app_pay,
+        in_app_order,
+        attribution_game_in_app_ltv_1day,
+        attribution_game_in_app_ltv_2days,
+        attribution_game_in_app_ltv_3days,
+        attribution_game_in_app_ltv_4days,
+        attribution_game_in_app_ltv_5days,
+        attribution_game_in_app_ltv_6days,
+        attribution_game_in_app_ltv_7days,
+        attribution_game_in_app_ltv_8days,
+        attribution_game_in_app_roi_1day,
+        attribution_game_in_app_roi_2days,
+        attribution_game_in_app_roi_3days,
+        attribution_game_in_app_roi_4days,
+        attribution_game_in_app_roi_5days,
+        attribution_game_in_app_roi_6days,
+        attribution_game_in_app_roi_7days,
+        attribution_game_in_app_roi_8days,
+        active_pay_intra_day_count,
+        active_pay_intra_day_cost,
+        active_pay_intra_day_rate,
+        ad_platform_material_name
+        )
+        VALUES
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.advertiserId},
+            #{item.materialId},
+            #{item.promotionId},
+            #{item.promotionName},
+            #{item.cdpProjectId},
+            #{item.cdpProjectName},
+            #{item.statCost},
+            #{item.statDatetime},
+            #{item.showCnt},
+            #{item.cpmPlatform},
+            #{item.clickCnt},
+            #{item.ctr},
+            #{item.cpcPlatform},
+            #{item.convertCnt},
+            #{item.conversionCost},
+            #{item.conversionRate},
+            #{item.deepConvertCnt},
+            #{item.deepConvertCost},
+            #{item.deepConvertRate},
+            #{item.clickStartCnt},
+            #{item.clickStartCost},
+            #{item.clickStartRate},
+            #{item.downloadFinishCnt},
+            #{item.downloadFinishCost},
+            #{item.downloadFinishRate},
+            #{item.installFinishCnt},
+            #{item.installFinishCost},
+            #{item.installFinishRate},
+            #{item.active},
+            #{item.activeCost},
+            #{item.activeRate},
+            #{item.activeRegister},
+            #{item.activeRegisterCost},
+            #{item.activeRegisterRate},
+            #{item.gameAddiction},
+            #{item.gameAddictionCost},
+            #{item.gameAddictionRate},
+            #{item.attributionNextDayOpenCnt},
+            #{item.attributionNextDayOpenCost},
+            #{item.attributionNextDayOpenRate},
+            #{item.nextDayOpen},
+            #{item.activePay},
+            #{item.activePayCost},
+            #{item.activePayRate},
+            #{item.gamePayCount},
+            #{item.gamePayCost},
+            #{item.attributionGamePay7dCount},
+            #{item.attributionGamePay7dCost},
+            #{item.inAppUv},
+            #{item.inAppDetailUv},
+            #{item.inAppCart},
+            #{item.inAppPay},
+            #{item.inAppOrder},
+            #{item.attributionGameInAppLtv1day},
+            #{item.attributionGameInAppLtv2days},
+            #{item.attributionGameInAppLtv3days},
+            #{item.attributionGameInAppLtv4days},
+            #{item.attributionGameInAppLtv5days},
+            #{item.attributionGameInAppLtv6days},
+            #{item.attributionGameInAppLtv7days},
+            #{item.attributionGameInAppLtv8days},
+            #{item.attributionGameInAppRoi1day},
+            #{item.attributionGameInAppRoi2days},
+            #{item.attributionGameInAppRoi3days},
+            #{item.attributionGameInAppRoi4days},
+            #{item.attributionGameInAppRoi5days},
+            #{item.attributionGameInAppRoi6days},
+            #{item.attributionGameInAppRoi7days},
+            #{item.attributionGameInAppRoi8days},
+            #{item.activePayIntraDayCount},
+            #{item.activePayIntraDayCost},
+            #{item.activePayIntraDayRate},
+            #{item.adPlatformMaterialName}
+            )
+        </foreach>
+    </insert>
+
+
 </mapper>

+ 11 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IByteDanceAdvertiserDataService.java

@@ -20,5 +20,15 @@ public interface IByteDanceAdvertiserDataService {
 
     void getV3AdvertiserConfig(OauthToken oauthToken);
 
-    void getV3AdvertiserReport(OauthToken oauthToken, String yesterda, String yesterda1, String bytedanceReportTypeHourly);
+    void getV3AdvertiserReport(OauthToken oauthToken, String startDate, String endDate, String bytedanceReportTypeHourly);
+
+    /**
+     * V3 广告报表
+     */
+    void getV3PromotionProjectReport(OauthToken oauthToken, String startDate, String endDate, String bytedanceReportTypeHourly);
+
+    /**
+     * V3 素材报表
+     */
+    void getV3PromotionMaterialReport(OauthToken oauthToken,String startDate, String endDate, String bytedanceReportTypeHourly);
 }

+ 285 - 3
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ByteDanceAdvertiserDataServiceImpl.java

@@ -3,6 +3,7 @@ package cn.com.ctop.job.bytedance.data.service.impl;
 import cn.com.ctop.job.bytedance.data.constant.BytedanceConstant;
 import cn.com.ctop.job.bytedance.data.constant.CtopAdConstant;
 import cn.com.ctop.job.bytedance.data.entity.ByteDanceAdvertiserReportDTO;
+import cn.com.ctop.job.bytedance.data.entity.ByteDanceNewMaterialReport;
 import cn.com.ctop.job.bytedance.data.entity.ByteDanceV3AdvertiserReportDTO;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdGet;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdReportDaily;
@@ -13,6 +14,7 @@ import cn.com.ctop.job.bytedance.data.entity.BytedanceAgentReportDaily;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAgentReportHourly;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceV3ProjectReportDaily;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceV3ProjectReportHourly;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceV3PromotionProjectReportDaily;
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdGetMapper;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdReportDailyMapper;
@@ -635,13 +637,26 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     }
 
     @Override
-    public void getV3AdvertiserReport(OauthToken token, String startDate, String endDate, String bytedanceReportTypePl) {
-        var conditions = new ByteDanceV3AdvertiserReportDTO(token.getAccountId(), bytedanceReportTypePl, startDate, endDate, 100);
+    public void getV3AdvertiserReport(OauthToken token, String startDate, String endDate, String bytedanceReportType) {
+        String dataTopic = "BASIC_DATA"; //广告基础数据
+//        String dataTopic = "MATERIAL_DATA";//素材数据
+
+        List<String> dimensions = new ArrayList<>();
+        dimensions.add(bytedanceReportType);
+        /**
+         *stat_time_hour 小时
+         *stat_time_day 每天
+         *cdp_project_id 项目ID
+         *cdp_project_name 项目名称
+         */
+        dimensions.add("cdp_project_id");
+        dimensions.add("cdp_project_name");
+        var conditions = new ByteDanceV3AdvertiserReportDTO(token.getAccountId(), dimensions, dataTopic, startDate, endDate, 100);
         getV3AdvertiserReportByPage(token, conditions, 1);
     }
 
     /**
-     * 获取V3广告主
+     * V3头条项目报表
      */
     private void getV3AdvertiserReportByPage(OauthToken token, ByteDanceV3AdvertiserReportDTO conditions, Integer page) {
         List<Object> advertiserAccountList = redisUtil.getList("V3_ADVERTISER" + conditions.getStartTime(), null);
@@ -742,4 +757,271 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
             getV3AdvertiserReportByPage(token, conditions, page);
         }
     }
+
+
+    /**
+     * V3 广告报表
+     */
+    @Override
+    public void getV3PromotionProjectReport(OauthToken token, String startDate, String endDate, String bytedanceReportType) {
+        String dataTopic = "BASIC_DATA"; //广告基础数据
+//        String dataTopic = "MATERIAL_DATA";//素材数据
+
+        List<String> dimensions = new ArrayList<>();
+        dimensions.add(bytedanceReportType);
+        /**
+         *stat_time_hour 小时
+         *stat_time_day 每天
+         *cdp_project_id 项目ID
+         *cdp_project_name 项目名称
+         *cdp_promotion_id 广告ID
+         *cdp_project_name 广告名称
+         */
+        dimensions.add("cdp_project_id");
+        dimensions.add("cdp_project_name");
+        dimensions.add("cdp_promotion_id");
+        dimensions.add("cdp_promotion_name");
+        var conditions = new ByteDanceV3AdvertiserReportDTO(token.getAccountId(), dimensions, dataTopic, startDate, endDate, 100);
+        getV3PromotionProjectReportByPage(token, conditions, 1);
+    }
+
+    /**
+     * V3头条项目报表
+     */
+    private void getV3PromotionProjectReportByPage(OauthToken token, ByteDanceV3AdvertiserReportDTO conditions, Integer page) {
+        List<Object> advertiserAccountList = redisUtil.getList("V3_PROMOTION_PROJECT" + conditions.getStartTime(), null);
+        conditions.setPage(page);
+        SerializeConfig config = new SerializeConfig();
+        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
+        JSONObject params = JSONObject.parseObject(JSON.toJSONString(conditions, config));
+        // 请求地址
+        String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V3_REPORT_INTEGRATED_GET;
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", token.getAccessToken());
+
+        String info = HttpUtils.httpGet(url, params, headers);
+        JSONObject result = JSONObject.parseObject(info, JSONObject.class);
+//        System.out.println("【请求参数】:" + params + "\n【返回信息】:" + result);
+
+        if (Check.isNull(result)) {
+            XxlJobHelper.log("V3项目报表获取异常");
+            return;
+        }
+        Integer code = result.getInteger("code");
+        String message = result.getString("message");
+        if (code != 0) {
+            if (40100 == code) {
+                //请求过于频繁
+                log.info("V3广告报表请求频繁,准备重试,accountId:{}\n【错误信息】:{}", token.getAccountId(), message);
+                //添加重试
+                if (Check.isNull(advertiserAccountList)) {
+                    redisUtil.add("V3_PROMOTION_PROJECT" + conditions.getStartTime(), Arrays.asList(token.getAccountId()), 1, TimeUnit.HOURS);
+                } else {
+                    advertiserAccountList.add(token.getAccountId());
+                    redisUtil.add("V3_PROMOTION_PROJECT" + conditions.getStartTime(), advertiserAccountList, 1, TimeUnit.HOURS);
+                }
+            } else {
+                log.error("V3广告报表调取失败,账户ID:{}\n【请求地址】: {}\n【请求参数】:{}\n【错误信息】:{}", token.getAccountId(), url, JSONObject.toJSON(params), message);
+                if (advertiserAccountList.contains(token.getAccountId())) {
+                    advertiserAccountList.remove(token.getAccountId());
+                    redisUtil.add("V3_PROMOTION_PROJECT" + conditions.getStartTime(), advertiserAccountList, 1, TimeUnit.HOURS);
+                }
+            }
+            return;
+        }
+
+        JSONArray rows = result.getJSONObject("data").getJSONArray("rows");
+        if (advertiserAccountList.contains(token.getAccountId())) {
+            advertiserAccountList.remove(token.getAccountId());
+            redisUtil.add("V3_PROMOTION_PROJECT" + conditions.getStartTime(), advertiserAccountList, 1, TimeUnit.HOURS);
+        }
+        if (Check.isNull(rows)) {
+            return;
+        }
+//        List<BytedanceV3ProjectReportHourly> hourlyList = new ArrayList<>();
+        List<BytedanceV3PromotionProjectReportDaily> dailyList = new ArrayList<>();
+        try {
+            for (int i = 0; i < rows.size(); i++) {
+                JSONObject data = rows.getJSONObject(i);
+                JSONObject metrics = data.getJSONObject("metrics");
+                JSONObject dimensions = data.getJSONObject("dimensions");
+                Long projectId = dimensions.getLong("cdp_project_id");
+                String projectName = dimensions.getString("cdp_project_name");
+                Long promotionId = dimensions.getLong("cdp_promotion_id");
+                String promotionName = dimensions.getString("cdp_promotion_name");
+
+                if (conditions.getDimensions().contains(CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_HOURLY)) {
+//                    String hour = dimensions.getString("stat_time_hour").substring(11, 13);
+//                    // 时报
+//                    BytedanceV3ProjectReportHourly hourlyReport = JSONObject.parseObject(metrics.toJSONString(), BytedanceV3ProjectReportHourly.class);
+//                    hourlyReport.setAdvertiserId(token.getAccountId());
+//                    hourlyReport.setStatTimeDay(dimensions.getString("stat_time_hour").substring(0, 10).replace("-", ""));
+//                    hourlyReport.setStatHour(Integer.parseInt(hour));
+//                    hourlyReport.setCdpProjectId(projectId);
+//                    hourlyReport.setCdpProjectName(projectName);
+//                    hourlyList.add(hourlyReport);
+                } else {
+                    // 日报
+                    BytedanceV3PromotionProjectReportDaily dailyReport = JSONObject.parseObject(metrics.toJSONString(), BytedanceV3PromotionProjectReportDaily.class);
+                    dailyReport.setAdvertiserId(token.getAccountId());
+                    dailyReport.setStatTimeDay(dimensions.getString("stat_time_day").substring(0, 10).replace("-", ""));
+                    dailyReport.setCdpProjectId(projectId);
+                    dailyReport.setCdpProjectName(projectName);
+                    dailyReport.setPromotionId(promotionId);
+                    dailyReport.setPromotionName(promotionName);
+                    dailyList.add(dailyReport);
+                }
+            }
+//            if (hourlyList.size() > 0) {
+//                bytedanceAdvertiserReportHourlyMapper.insertV3Project(hourlyList);
+//            }
+            if (dailyList.size() > 0) {
+                bytedanceAdvertiserReportDailyMapper.insertV3PromotionProject(dailyList);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("获取广告主数据错误:", e.toString());
+        }
+        page++;
+
+        int totalPage = result.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
+        if (page <= totalPage) {
+            getV3PromotionProjectReportByPage(token, conditions, page);
+        }
+    }
+
+
+    /**
+     * V3 素材报表
+     */
+    @Override
+    public void getV3PromotionMaterialReport(OauthToken token, String startDate, String endDate, String bytedanceReportType) {
+//        String dataTopic = "BASIC_DATA"; //广告基础数据
+        String dataTopic = "MATERIAL_DATA";//素材数据
+        List<String> dimensions = new ArrayList<>();
+        dimensions.add(bytedanceReportType);
+        /**
+         *stat_time_hour 小时
+         *stat_time_day 每天
+         *cdp_project_id 项目ID
+         *cdp_project_name 项目名称
+         *cdp_promotion_id 广告ID
+         *cdp_project_name 广告名称
+         *material_id 素材ID
+         *ad_platform_material_name 素材名
+         */
+        dimensions.add("cdp_project_id");
+        dimensions.add("cdp_project_name");
+        dimensions.add("cdp_promotion_id");
+        dimensions.add("cdp_promotion_name");
+        dimensions.add("image_mode");
+        dimensions.add("material_id");
+        dimensions.add("ad_platform_material_name");
+        var conditions = new ByteDanceV3AdvertiserReportDTO(token.getAccountId(), dimensions, dataTopic, startDate, endDate, 100);
+        getV3PromotionMaterialReportByPage(token, conditions, 1);
+    }
+
+    /**
+     * V3头条项目报表
+     */
+    private void getV3PromotionMaterialReportByPage(OauthToken token, ByteDanceV3AdvertiserReportDTO conditions, Integer page) {
+        List<Object> advertiserAccountList = redisUtil.getList("V3_PROMOTION_MATERIAL" + conditions.getStartTime(), null);
+        conditions.setPage(page);
+        SerializeConfig config = new SerializeConfig();
+        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
+        JSONObject params = JSONObject.parseObject(JSON.toJSONString(conditions, config));
+        // 请求地址
+        String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V3_REPORT_INTEGRATED_GET;
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", token.getAccessToken());
+
+        String info = HttpUtils.httpGet(url, params, headers);
+        JSONObject result = JSONObject.parseObject(info, JSONObject.class);
+//        System.out.println("【请求参数】:" + params + "\n【返回信息】:" + result);
+
+        if (Check.isNull(result)) {
+            XxlJobHelper.log("V3项目报表获取异常");
+            return;
+        }
+        Integer code = result.getInteger("code");
+        String message = result.getString("message");
+        if (code != 0) {
+            if (40100 == code) {
+                //请求过于频繁
+                log.info("V3素材报表请求频繁,准备重试,accountId:{}\n【错误信息】:{}", token.getAccountId(), message);
+                //添加重试
+                if (Check.isNull(advertiserAccountList)) {
+                    redisUtil.add("V3_PROMOTION_MATERIAL" + conditions.getStartTime(), Arrays.asList(token.getAccountId()), 1, TimeUnit.HOURS);
+                } else {
+                    advertiserAccountList.add(token.getAccountId());
+                    redisUtil.add("V3_PROMOTION_MATERIAL" + conditions.getStartTime(), advertiserAccountList, 1, TimeUnit.HOURS);
+                }
+            } else {
+                log.error("V3素材报表调取失败,账户ID:{}\n【请求地址】: {}\n【请求参数】:{}\n【错误信息】:{}", token.getAccountId(), url, JSONObject.toJSON(params), message);
+                if (advertiserAccountList.contains(token.getAccountId())) {
+                    advertiserAccountList.remove(token.getAccountId());
+                    redisUtil.add("V3_PROMOTION_MATERIAL" + conditions.getStartTime(), advertiserAccountList, 1, TimeUnit.HOURS);
+                }
+            }
+            return;
+        }
+
+        JSONArray rows = result.getJSONObject("data").getJSONArray("rows");
+        if (advertiserAccountList.contains(token.getAccountId())) {
+            advertiserAccountList.remove(token.getAccountId());
+            redisUtil.add("V3_PROMOTION_MATERIAL" + conditions.getStartTime(), advertiserAccountList, 1, TimeUnit.HOURS);
+        }
+        if (Check.isNull(rows)) {
+            return;
+        }
+        List<ByteDanceNewMaterialReport> videolist = new ArrayList<>();
+        List<ByteDanceNewMaterialReport> imageList = new ArrayList<>();
+        try {
+            for (int i = 0; i < rows.size(); i++) {
+                JSONObject data = rows.getJSONObject(i);
+                JSONObject metrics = data.getJSONObject("metrics");
+                JSONObject dimensions = data.getJSONObject("dimensions");
+                Long projectId = dimensions.getLong("cdp_project_id");
+                String projectName = dimensions.getString("cdp_project_name");
+                Long promotionId = dimensions.getLong("cdp_promotion_id");
+                String promotionName = dimensions.getString("cdp_promotion_name");
+                String imageMode = dimensions.getString("image_mode");
+                String materialId = dimensions.getString("material_id");
+                String materialName = dimensions.getString("ad_platform_material_name");
+
+                ByteDanceNewMaterialReport report = JSONObject.parseObject(metrics.toJSONString(), ByteDanceNewMaterialReport.class);
+                report.setAdvertiserId(token.getAccountId());
+                report.setMaterialId(materialId);
+                report.setStatDatetime(DateUtils.getDateInteger(dimensions.getString("stat_time_day")));
+                report.setCdpProjectId(projectId);
+                report.setCdpProjectName(projectName);
+                report.setPromotionId(promotionId);
+                report.setPromotionName(promotionName);
+                report.setAdPlatformMaterialName(materialName);
+                if (!Check.isNull(imageMode) && imageMode.contains("视频")) {
+                    videolist.add(report);
+                }
+                if (!Check.isNull(imageMode) && imageMode.contains("图")) {
+                    imageList.add(report);
+                }
+            }
+            if (!Check.isNull(videolist)) {
+                bytedanceAdvertiserReportDailyMapper.insertV3PromotionProjectVideo(videolist);
+            }
+            if (!Check.isNull(imageList)) {
+                bytedanceAdvertiserReportDailyMapper.insertV3PromotionProjectImage(imageList);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("获取V3 素材数据错误:", e.toString());
+        }
+        page++;
+
+        int totalPage = result.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
+        if (page <= totalPage) {
+            getV3PromotionMaterialReportByPage(token, conditions, page);
+        }
+    }
 }

+ 2 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceMaterialReportDailyServiceImpl.java

@@ -174,7 +174,7 @@ public class BytedanceMaterialReportDailyServiceImpl implements IBytedanceMateri
             JSONObject dim = dataObject.getJSONObject("dimensions");
             ByteDanceNewMaterialReport report = JSONObject.parseObject(dataObject.getJSONObject("metrics").toJSONString(), ByteDanceNewMaterialReport.class);
             report.setAdvertiserId(oauthToken.getAccountId());
-            report.setMaterialId(dim.getLong("material_id"));
+            report.setMaterialId(dim.getString("material_id"));
             report.setStatDatetime(DateUtils.getDateInteger(dim.getString("stat_time_day")));
             if (!Check.isNull(dim.getString("image_mode")) && dim.getString("image_mode").contains("视频")) {
                 videolist.add(report);
@@ -248,7 +248,7 @@ public class BytedanceMaterialReportDailyServiceImpl implements IBytedanceMateri
 
         for (int i = 0; i < data.size(); i++) {
             JSONObject dataObject = data.getJSONObject(i);
-            Long materialId = dataObject.getLong("material_id");
+            String materialId = dataObject.getString("material_id");
             String statDatetime = dataObject.getString("stat_datetime");
             Integer dateTime = DateUtils.getDateInteger(statDatetime);
             JSONArray data1 = dataObject.getJSONArray("data");

+ 33 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertiseLoadJob.java

@@ -210,6 +210,39 @@ public class BytedanceAdvertiseLoadJob {
     }
 
     /**
+     * 广告日报
+     *
+     * @throws Exception
+     */
+    @XxlJob("bytedanceV3PromotionProjectReport")
+    public void bytedanceV3PromotionProjectReport() throws Exception {
+        String param = XxlJobHelper.getJobParam(); // 执行参数
+        if (Check.isNull(param)) {
+            log.error("入参为空");
+            return;
+        }
+        String token = tokenService.getByAccountId(Long.valueOf(param));
+        if (Check.isNull(token)) {
+            log.error("此账户未获取到相关token,accountId:{}", param);
+            return;
+        }
+        OauthToken oauthToken = new OauthToken();
+        oauthToken.setAccessToken(token);
+        oauthToken.setAccountId(Long.parseLong(param));
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+        String yesterda2 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -2);
+        dailyExecutorService.submit(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        advertiserDataService.getV3PromotionProjectReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+                        advertiserDataService.getV3PromotionProjectReport(oauthToken, yesterda2, yesterda2, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+                    }
+                });
+    }
+
+    /**
      * 广告主时报
      *
      * @throws Exception

+ 11 - 13
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceMaterialReportLoadJob.java

@@ -1,6 +1,8 @@
 package cn.com.ctop.job.bytedance.handler;
 
+import cn.com.ctop.job.bytedance.data.constant.CtopAdConstant;
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
+import cn.com.ctop.job.bytedance.data.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceMaterialReportDailyService;
 import cn.com.ctop.job.bytedance.data.service.IOauthTokenService;
 import cn.com.ctop.job.bytedance.data.utils.Check;
@@ -32,7 +34,8 @@ public class BytedanceMaterialReportLoadJob {
 
     /**
      * 获取头条图片素材
-     *同步图片和视频素材日报
+     * 同步图片和视频素材日报
+     *
      * @throws Exception
      */
     @XxlJob("bytedanceDailyMaterialReportJob")
@@ -66,13 +69,12 @@ public class BytedanceMaterialReportLoadJob {
     }
 
 
-
-
-
+    @Autowired
+    private IByteDanceAdvertiserDataService advertiserDataService;
 
     /**
-     *
      * 头条-同步体验版素材
+     *
      * @throws Exception
      */
     @XxlJob("bytedanceDailyMaterialReportJobV3")
@@ -101,7 +103,10 @@ public class BytedanceMaterialReportLoadJob {
                         try {
                             materialReportDailyService.bytedanceDailyMaterialReportJobV3Video(oauthToken, yesterda1, yesterda, 1, 100);
 //                            materialReportDailyService.bytedanceDailyMaterialReportJobV3Image(oauthToken, yesterda1, yesterda, 1, 100);
-                        }catch (Exception e){
+
+                            //V3 素材
+                            advertiserDataService.getV3PromotionMaterialReport(oauthToken, yesterda1, yesterda, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+                        } catch (Exception e) {
                             e.printStackTrace();
                         }
                     }
@@ -110,11 +115,4 @@ public class BytedanceMaterialReportLoadJob {
     }
 
 
-
-
-
-
-
-
-
 }