Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

yumeng 1 vuosi sitten
vanhempi
commit
cb24b64747
34 muutettua tiedostoa jossa 8953 lisäystä ja 277 poistoa
  1. 151 9
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java
  2. 5 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/constant/BytedanceConstant.java
  3. 3 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/constant/CtopAdConstant.java
  4. 1 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceAdvertiserReportDTO.java
  5. 28 16
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceNewMaterialReport.java
  6. 373 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceV3AdvertiserReportDTO.java
  7. 5 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceAdvertiserReportDaily.java
  8. 2 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceAdvertiserReportHourly.java
  9. 202 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceCdpProject.java
  10. 1427 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceV3ProjectReportDaily.java
  11. 1433 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceV3ProjectReportHourly.java
  12. 1437 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceV3PromotionProjectReportDaily.java
  13. 53 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/enums/InventoryEnum.java
  14. 14 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceAdvertiserReportDailyMapper.java
  15. 2 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceAdvertiserReportHourlyMapper.java
  16. 15 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceProjectMapper.java
  17. 8 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/OauthTokenMapper.java
  18. 1937 4
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAdvertiserReportDailyMapper.xml
  19. 485 4
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAdvertiserReportHourlyMapper.xml
  20. 77 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceProjectMapper.xml
  21. 28 3
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/OauthTokenMapper.xml
  22. 18 3
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IByteDanceAdvertiserDataService.java
  23. 12 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceProjectService.java
  24. 9 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IOauthTokenService.java
  25. 646 86
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  26. 110 86
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceMaterialReportDailyServiceImpl.java
  27. 96 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceProjectServiceImpl.java
  28. 28 12
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/OauthTokenServiceImpl.java
  29. 26 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/DateUtils.java
  30. 42 7
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/HttpUtils.java
  31. 188 19
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertiseLoadJob.java
  32. 11 10
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAgentLoadJob.java
  33. 12 14
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceMaterialReportLoadJob.java
  34. 69 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceProjectJob.java

+ 151 - 9
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java

@@ -1,21 +1,36 @@
 package cn.com.ctop.job.bytedance.controller;
 
+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.IBytedanceCampaignReportDailyService;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceCampaignReportHourlyService;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceCreativeReportDailyService;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceCreativeReportHourlyService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceFileVideoGetService;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceMaterialReportDailyService;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceProjectService;
 import cn.com.ctop.job.bytedance.data.service.IOauthTokenService;
 import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-
-import java.util.HashMap;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * zian Y
@@ -24,7 +39,7 @@ import java.util.Map;
 
 @RestController
 @RequestMapping("/bytedance/bytedanceController")
-@Api(tags="头条")
+@Api(tags = "头条")
 @Slf4j
 public class BytedanceController {
     @Autowired
@@ -34,23 +49,150 @@ public class BytedanceController {
     private IBytedanceFileVideoGetService fileVideoService;
 
 
-
-    @ApiOperation(value="根据账户获取视频素材-账户/素材id 下全部视频素材", notes="根据账户获取视频素材-账户/素材id 下全部视频素材")
+    @ApiOperation(value = "根据账户获取视频素材-账户/素材id 下全部视频素材", notes = "根据账户获取视频素材-账户/素材id 下全部视频素材")
     @PostMapping(value = "/getBytedanceVideoByAccountId")
-    public Map<String,String> getBytedanceVideoByAccountId(@RequestBody JSONObject jsonObject) {
+    public Map<String, String> getBytedanceVideoByAccountId(@RequestBody JSONObject jsonObject) {
         Long accountId = jsonObject.getLong("accountId");
         JSONArray dataList = jsonObject.getJSONArray("materialIds");
-        List<Long> materialIds = Check.isNull(dataList) ? null : JSONArray.parseObject(dataList.toJSONString(),List.class);
+        List<Long> materialIds = Check.isNull(dataList) ? null : JSONArray.parseObject(dataList.toJSONString(), List.class);
 
         String token = tokenService.getByAccountId(accountId);
         OauthToken oauthToken = new OauthToken();
         oauthToken.setAccessToken(token);
         oauthToken.setAccountId(accountId);
-        return fileVideoService.getBytedanceVideoByAccountId(oauthToken, materialIds,1, 100);
+        return fileVideoService.getBytedanceVideoByAccountId(oauthToken, materialIds, 1, 100);
     }
 
 
+    private static ExecutorService dailyExecutorService = Executors.newFixedThreadPool(10);
+    @Autowired
+    private IByteDanceAdvertiserDataService advertiserDataService;
 
+    @Autowired
+    IBytedanceCreativeReportDailyService creativeReportDailyService;
+    @Autowired
+    IBytedanceCreativeReportHourlyService creativeReportHourlyService;
+    @Autowired
+    IBytedanceCampaignReportHourlyService campaignReportHourlyService;
+    @Autowired
+    IBytedanceCampaignReportDailyService campaignReportDailyService;
+    @Autowired
+    private IBytedanceMaterialReportDailyService materialReportDailyService;
+    @Autowired
+    private IByteDanceAdvertiserDataService advertiserDataServices;
+    @Autowired
+    private IBytedanceProjectService listService;
 
+    @GetMapping(value = "/testReport")
+    public String testReport() {
+        List<Long> accountIds = tokenService.getAllToutiaoAccountIds();
+        for (Long id : accountIds) {
+            String token = tokenService.getByAccountId(id);
+            OauthToken oauthToken = new OauthToken();
+            oauthToken.setAccessToken(token);
+            oauthToken.setAccountId(id);
+            String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+            String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+            String start = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -8);
+            Date getDate = new Date();
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+            String hour = simpleDateFormat.format(getDate);
+            dailyExecutorService.submit(
+                    new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                Thread.sleep(500);
+                                //                            materialReportDailyService.bytedanceDailyMaterialReportJobV3Video(oauthToken, yesterda2, yesterda, 1, 100);
+//                                listService.getProjectList(oauthToken, start, yesterda, 1);
+//                                advertiserDataService.getV3AdvertiserReport(oauthToken, start, yesterda, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+//                                materialReportDailyService.bytedanceDailyMaterialReportJobV3Video(oauthToken, yesterda, yesterda, 1, 100);
+//                              materialReportDailyService.bytedanceDailyMaterialReportJobV3Image(oauthToken, yesterda2, yesterda, 1, 100);
+                                advertiserDataService.getV3PromotionProjectReport(oauthToken, "2023-07-01", "2023-07-06", CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+                                advertiserDataService.getV3PromotionMaterialReport(oauthToken, "2023-07-01", "2023-07-06", CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    });
+
+        }
+        return "ok";
+    }
+
+    @GetMapping(value = "/testOneReport")
+    public String testOneReport(Long accountId) {
+//        String token = tokenService.getByAccountId(accountId);
+        String token = tokenService.getAgentToken(accountId);
+        if (Check.isNull(token)) {
+            log.error("此账户未获取到相关token,accountId:{}", accountId);
+            return "no";
+        }
+        OauthToken oauthToken = new OauthToken();
+        oauthToken.setAccessToken(token);
+        oauthToken.setAccountId(accountId);
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+        String start = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -2);
+
+
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+        dailyExecutorService.submit(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            Thread.sleep(500);
+//                            materialReportDailyService.bytedanceDailyMaterialReportJobV3Video(oauthToken, start, yesterda, 1, 100);
+//                            advertiserDataService.getV3AdvertiserConfig(oauthToken);
+//                            advertiserDataService.getV3PromotionMaterialReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+//                            advertiserDataService.getV3AdvertiserReport(oauthToken, nowDate, nowDate, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_HOURLY);
+//                            listService.getProjectList(oauthToken, start, yesterda, 1);
+//                            materialReportDailyService.bytedanceDailyMaterialReportJobV3Image(oauthToken, yesterda2, yesterda, 1, 100);
+//                            advertiserDataServices.getPositionAdvertiserReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+//                            advertiserDataService.getAdvertiserReport(oauthToken, nowDate, nowDate, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_HOURLY);
+//                            advertiserDataService.getAgentReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                });
+        return "ok";
+    }
+
+    @GetMapping(value = "/test1")
+    public void test1(Long accountId) {
+        String token = tokenService.getByAccountId(accountId);
+        OauthToken oauthToken = new OauthToken();
+        oauthToken.setAccessToken(token);
+        oauthToken.setAccountId(accountId);
+        log.info("获取头条视频全量素材---账户--{}======》》》", oauthToken.getAccountId());
+        fileVideoService.getFileVideoData(oauthToken, null, null, 1, 100);
+    }
+
+
+    @GetMapping(value = "/getReports")
+    public void getReports() {
+        List<JSONObject> tokens = tokenService.getAgentTokens();
+        //获取两个时间的每一天
+        List<String> perDay = DateUtils.getPerDay("2023-12-01", "2023-12-26");
+        for (String date : perDay) {
+            for (JSONObject obj : tokens) {
+                OauthToken oauthToken = new OauthToken();
+                oauthToken.setAccessToken(obj.getString("access_token"));
+                oauthToken.setAccountId(obj.getLong("agent_id"));
+                dailyExecutorService.submit(
+                        new Runnable() {
+                            @Override
+                            public void run() {
+                                advertiserDataService.getAgentReport(oauthToken, date, date);
+                            }
+                        });
+            }
+        }
+    }
 
 }

+ 5 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/constant/BytedanceConstant.java

@@ -28,7 +28,11 @@ public class BytedanceConstant {
 
     public static final String BYTEDANCE_V2_REPORT_INTEGRATED_GET = "/2/report/integrated/get/";
 
-    public static final String BYTEDANCE_V3_REPORT_INTEGRATED_GET = "/v3.0/report/material/get/";
+    public static final String BYTEDANCE_V3_REPORT_INTEGRATED_GET = "/v3.0/report/custom/get/";
+
+    public static final String BYTEDANCE_V3_CONFIG_ADVERTISER_GET = "/v3.0/report/custom/config/get/";
 
     public static final String BYTEDANCE_V3_PROMOTION_LIST_GET = "/v3.0/promotion/list/";
+
+    public static final String BYTEDANCE_V3_PROJECT_LIST_GET = "/v3.0/project/list/";
 }

+ 3 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/constant/CtopAdConstant.java

@@ -28,6 +28,9 @@ public class CtopAdConstant {
     public static final String BYTEDANCE_REPORT_TYPE_DAILY = "STAT_TIME_GRANULARITY_DAILY";
     public static final String BYTEDANCE_REPORT_TYPE_HOURLY = "STAT_TIME_GRANULARITY_HOURLY";
 
+    public static final String BYTEDANCE_REPORT_V3_TYPE_DAILY = "stat_time_day";
+    public static final String BYTEDANCE_REPORT_V3_TYPE_HOURLY = "stat_time_hour";
+
     public static final String UREPORT_PREVIEW_URL_PREFIX = "/jeecg-boot/ureport/designer?_u=mysql:";
 
 

+ 1 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceAdvertiserReportDTO.java

@@ -187,6 +187,7 @@ public class ByteDanceAdvertiserReportDTO implements Serializable {
         fields.add("live_component_click_count");
         fields.add("live_component_click_cost");
         fields.add("live_component_click_rate");
+        fields.add("stat_pay_amount");
         return fields;
 
     }

+ 28 - 16
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceNewMaterialReport.java

@@ -4,19 +4,37 @@ 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;
     private Integer showCnt;
-    private Integer cpmPlatform;
+    private BigDecimal cpmPlatform;
     private Integer clickCnt;
     private BigDecimal ctr;
     private BigDecimal cpcPlatform;
@@ -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(",");
@@ -170,22 +186,18 @@ public class ByteDanceNewMaterialReport implements Serializable {
         stringBuilder.append("\"attribution_game_in_app_roi_7days\"").append(",");
         stringBuilder.append("\"attribution_game_in_app_roi_8days\"").append(",");
 
-        //stringBuilder.append("\"attribution_day_active_pay_count\"");
-        //stringBuilder.append("\"attribution_day_active_pay_cost\"");
-//        stringBuilder.append("\"attribution_day_active_pay_rate\"");
+//        stringBuilder.append("\"attribution_day_active_pay_count\"").append(",");
+//        stringBuilder.append("\"attribution_day_active_pay_cost\"").append(",");
+//        stringBuilder.append("\"attribution_day_active_pay_rate\"").append(",");
 
         stringBuilder.append("\"active_pay_intra_day_count\"").append(",");
         stringBuilder.append("\"active_pay_intra_day_cost\"").append(",");
-        stringBuilder.append("\"active_pay_intra_day_rate\"").append(",");
-        stringBuilder.append("\"delivery_mode\"");
+        stringBuilder.append("\"active_pay_intra_day_rate\"");
+//        stringBuilder.append("\"delivery_mode\"");
 
         stringBuilder.append("]");
         return stringBuilder.toString();
     }
 
 
-
-
-
-
 }

+ 373 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceV3AdvertiserReportDTO.java

@@ -0,0 +1,373 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Data
+public class ByteDanceV3AdvertiserReportDTO {
+
+    private static final long serialVersionUID = 3674054148513217865L;
+
+    private Long advertiserId;
+    private String dimensions;
+    private String metrics;
+    private String startTime;
+    private String endTime;
+    private Integer pageSize;
+    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, List<String> dimensions, String dataTopic, String startTime, String endTime, Integer pageSize) {
+        try {
+            this.advertiserId = advertiserId;
+            this.dimensions = mapper.writeValueAsString(dimensions);
+
+            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;
+            List<JSONObject> orderBy = new ArrayList<>();
+            JSONObject ord = new JSONObject();
+            ord.put("field", "stat_cost");
+            ord.put("type", "ASC");
+            orderBy.add(ord);
+            this.orderBy = mapper.writeValueAsString(orderBy);
+
+            List<JSONObject> filters = new ArrayList<>();
+            JSONObject filter = new JSONObject();
+            filter.put("field", "stat_cost");
+            filter.put("type", 3);
+            filter.put("operator", 4);
+            filter.put("values", Arrays.asList("0"));
+            filters.add(filter);
+            this.filters = mapper.writeValueAsString(filters);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static List<String> getParamsFields() {
+        List<String> fields = new ArrayList<>();
+        fields.add("stat_cost");
+        fields.add("show_cnt");
+        fields.add("cpm_platform");
+        fields.add("click_cnt");
+        fields.add("ctr");
+        fields.add("cpc_platform");
+        fields.add("attribution_convert_cnt");
+        fields.add("attribution_convert_cost");
+        fields.add("attribution_conversion_rate");
+        fields.add("attribution_deep_convert_cnt");
+        fields.add("attribution_deep_convert_cost");
+        fields.add("attribution_deep_convert_rate");
+        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("attribution_active_pay_7d_per_count");
+        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_retention_2d_cnt");
+        fields.add("attribution_retention_2d_cost");
+        fields.add("attribution_retention_2d_rate");
+        fields.add("attribution_retention_3d_cnt");
+        fields.add("attribution_retention_3d_cost");
+        fields.add("attribution_retention_3d_rate");
+        fields.add("attribution_retention_4d_cnt");
+        fields.add("attribution_retention_4d_cost");
+        fields.add("attribution_retention_4d_rate");
+        fields.add("attribution_retention_5d_cnt");
+        fields.add("attribution_retention_5d_cost");
+        fields.add("attribution_retention_5d_rate");
+        fields.add("attribution_retention_6d_cnt");
+        fields.add("attribution_retention_6d_cost");
+        fields.add("attribution_retention_6d_rate");
+        fields.add("attribution_retention_7d_cnt");
+        fields.add("attribution_retention_7d_cost");
+        fields.add("attribution_retention_7d_rate");
+        fields.add("attribution_retention_7d_sum_cnt");
+        fields.add("attribution_retention_7d_total_cost");
+        fields.add("attribution_billing_game_pay_7d_count");
+        fields.add("attribution_billing_game_pay_7d_cost");
+        fields.add("attribution_billing_game_in_app_ltv_1day");
+        fields.add("attribution_billing_game_in_app_ltv_2days");
+        fields.add("attribution_billing_game_in_app_ltv_3days");
+        fields.add("attribution_billing_game_in_app_ltv_4days");
+        fields.add("attribution_billing_game_in_app_ltv_5days");
+        fields.add("attribution_billing_game_in_app_ltv_6days");
+        fields.add("attribution_billing_game_in_app_ltv_7days");
+        fields.add("attribution_billing_game_in_app_roi_1day");
+        fields.add("attribution_billing_game_in_app_roi_2days");
+        fields.add("attribution_billing_game_in_app_roi_3days");
+        fields.add("attribution_billing_game_in_app_roi_4days");
+        fields.add("attribution_billing_game_in_app_roi_5days");
+        fields.add("attribution_billing_game_in_app_roi_6days");
+        fields.add("attribution_billing_game_in_app_roi_7days");
+        fields.add("attribution_active_pay");
+        fields.add("attribution_active_pay_cost");
+        fields.add("attribution_active_pay_rate");
+        fields.add("stat_pay_amount");
+        fields.add("pay_amount_roi");
+        fields.add("phone");
+        fields.add("form");
+        fields.add("form_submit");
+        fields.add("map");
+        fields.add("button");
+        fields.add("view");
+        fields.add("download_start");
+        fields.add("qq");
+        fields.add("lottery");
+        fields.add("vote");
+        fields.add("message");
+        fields.add("redirect");
+        fields.add("shopping");
+        fields.add("consult");
+        fields.add("consult_effective");
+        fields.add("phone_confirm");
+        fields.add("phone_connect");
+        fields.add("phone_effective");
+        fields.add("coupon");
+        fields.add("coupon_single_page");
+        fields.add("redirect_to_shop");
+        fields.add("poi_address_click");
+        fields.add("poi_collect");
+        fields.add("customer_effective");
+        fields.add("attribution_customer_effective");
+        fields.add("attribution_customer_effective_cost");
+        fields.add("attribution_clue_pay_succeed");
+        fields.add("attribution_clue_pay_succeed_cost");
+        fields.add("attribution_clue_interflow");
+        fields.add("attribution_clue_interflow_cost");
+        fields.add("attribution_clue_high_intention");
+        fields.add("attribution_clue_high_intention_cost");
+        fields.add("attribution_clue_confirm");
+        fields.add("attribution_clue_confirm_cost");
+        fields.add("consult_clue");
+        fields.add("attribution_work_wechat_added_count");
+        fields.add("attribution_work_wechat_unfriend_count");
+        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("attribution_day_active_pay_count");
+        fields.add("attribution_day_active_pay_cost");
+        fields.add("attribution_day_active_pay_rate");
+        fields.add("active_pay_intra_day_count");
+        fields.add("active_pay_intra_day_cost");
+        fields.add("active_pay_intra_day_rate");
+        fields.add("attribution_micro_game_0d_ltv");
+        fields.add("attribution_micro_game_3d_ltv");
+        fields.add("attribution_micro_game_7d_ltv");
+        fields.add("attribution_micro_game_0d_roi");
+        fields.add("attribution_micro_game_3d_roi");
+        fields.add("attribution_micro_game_7d_roi");
+        fields.add("loan_completion");
+        fields.add("loan_completion_cost");
+        fields.add("loan_completion_rate");
+        fields.add("pre_loan_credit");
+        fields.add("pre_loan_credit_cost");
+        fields.add("loan_credit");
+        fields.add("loan_credit_cost");
+        fields.add("loan_credit_rate");
+        fields.add("loan");
+        fields.add("loan_cost");
+        fields.add("loan_rate");
+        fields.add("premium_payment_count");
+        fields.add("premium_payment_cost");
+        fields.add("insurance_lt_roi");
+        fields.add("bankcard_information_count");
+        fields.add("personal_information_count");
+        fields.add("certification_information_count");
+        fields.add("open_account_count");
+        fields.add("first_class_count");
+        fields.add("second_class_count");
+        fields.add("unfollow_in_wechat_count");
+        fields.add("in_wechat_pay_count");
+        fields.add("attribution_work_wechat_dialog_count");
+        fields.add("low_loan_credit_count");
+        fields.add("high_loan_credit_count");
+        fields.add("withdraw_m2_count");
+        fields.add("attribution_conversion_class_count");
+        fields.add("in_app_order_gmv");
+        fields.add("in_app_order_roi");
+        fields.add("in_app_pay_gmv");
+        fields.add("in_app_pay_roi");
+        fields.add("total_play");
+        fields.add("play_duration_3s");
+        fields.add("valid_play");
+        fields.add("valid_play_cost");
+        fields.add("valid_play_rate");
+        fields.add("valid_play_of_mille");
+        fields.add("valid_play_cost_of_mille");
+        fields.add("play_25_feed_break");
+        fields.add("play_50_feed_break");
+        fields.add("play_75_feed_break");
+        fields.add("play_99_feed_break");
+        fields.add("average_play_time_per_play");
+        fields.add("play_over_rate");
+        fields.add("wifi_play_rate");
+        fields.add("card_show");
+        fields.add("dy_like");
+        fields.add("dy_comment");
+        fields.add("dy_share");
+        fields.add("ad_dislike_cnt");
+        fields.add("ad_report_cnt");
+        fields.add("ies_challenge_click");
+        fields.add("ies_music_click");
+        fields.add("location_click");
+        fields.add("dy_home_visited");
+        fields.add("dy_follow");
+        fields.add("message_action");
+        fields.add("click_landing_page");
+        fields.add("click_shopwindow");
+        fields.add("click_website");
+        fields.add("click_call_dy");
+        fields.add("click_download");
+        fields.add("luban_live_enter_cnt");
+        fields.add("live_watch_one_minute_count");
+        fields.add("luban_live_follow_cnt");
+        fields.add("luban_live_share_cnt");
+        fields.add("luban_live_comment_cnt");
+        fields.add("live_component_click_count");
+        fields.add("live_component_click_cost");
+        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;
+    }
+
+}

+ 5 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceAdvertiserReportDaily.java

@@ -329,5 +329,10 @@ public class BytedanceAdvertiserReportDaily {
     private BigDecimal attributionActivePayIntraOneDayAmount;
     /*** 游戏行业-激活后24小时付费roi激活后24h付费金额/所选日期的消耗*/
     private BigDecimal attributionActivePayIntraOneDayRoi;
+    /*** 付费金额(回传时间)*/
+    private BigDecimal statPayAmount;
+
+    private String inventory;
+    private String inventoryName;
 
 }

+ 2 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceAdvertiserReportHourly.java

@@ -330,6 +330,8 @@ public class BytedanceAdvertiserReportHourly {
     private BigDecimal attributionActivePayIntraOneDayAmount;
     /*** 游戏行业-激活后24小时付费roi激活后24h付费金额/所选日期的消耗*/
     private BigDecimal attributionActivePayIntraOneDayRoi;
+    /*** 付费金额(回传时间)*/
+    private BigDecimal statPayAmount;
 
 
 }

+ 202 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceCdpProject.java

@@ -0,0 +1,202 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 项目信息
+ * @date 2023-04-19
+ */
+@Data
+@TableName("bytedance_cdp_project")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "bytedance_cdp_project对象", description = "项目信息")
+public class BytedanceCdpProject {
+
+    /**
+     * 项目id
+     */
+    @Excel(name = "项目id", width = 15)
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称", width = 15)
+    @ApiModelProperty(value = "项目名称")
+    private String name;
+    /**
+     * 账户id
+     */
+    @Excel(name = "账户id", width = 15)
+    @ApiModelProperty(value = "账户id")
+    private Long advertiserId;
+    /**
+     * 项目状态
+     */
+    @Excel(name = "项目状态", width = 15)
+    @ApiModelProperty(value = "项目状态")
+    private String status;
+    /**
+     * 应用包名
+     */
+    @Excel(name = "应用包名", width = 15)
+    @ApiModelProperty(value = "应用包名")
+    private String packageName;
+    /**
+     * 项目创建时间,格式yyyy-MM-dd HH:mm:ss
+     */
+    @Excel(name = "项目创建时间,格式yyyy-MM-dd HH:mm:ss", width = 15)
+    @ApiModelProperty(value = "项目创建时间,格式yyyy-MM-dd HH:mm:ss")
+    private String projectCreateTime;
+    /**
+     * 项目更新时间,格式yyyy-MM-dd HH:mm:ss
+     */
+    @Excel(name = "项目更新时间,格式yyyy-MM-dd HH:mm:ss", width = 15)
+    @ApiModelProperty(value = "项目更新时间,格式yyyy-MM-dd HH:mm:ss")
+    private String projectModifyTime;
+    /**
+     * 出价方式
+     */
+    @Excel(name = "出价方式", width = 15)
+    @ApiModelProperty(value = "出价方式")
+    private String pricing;
+    /**
+     * 推广目的,枚举值:APP 应用推广、LINK 销售线索推广、MICRO_GAME小程序、QUICK_APP快应用
+     */
+    @Excel(name = "推广目的,枚举值:APP 应用推广、LINK 销售线索推广、MICRO_GAME小程序、QUICK_APP快应用", width = 15)
+    @ApiModelProperty(value = "推广目的,枚举值:APP 应用推广、LINK 销售线索推广、MICRO_GAME小程序、QUICK_APP快应用")
+    private String landingType;
+    /**
+     * 广告类型,枚举值:ALL所有广告,SEARCH 搜索广告
+     */
+    @Excel(name = "广告类型,枚举值:ALL所有广告,SEARCH 搜索广告", width = 15)
+    @ApiModelProperty(value = "广告类型,枚举值:ALL所有广告,SEARCH 搜索广告")
+    private String adType;
+    /**
+     * 定向拓展
+     */
+    @Excel(name = "定向拓展", width = 15)
+    @ApiModelProperty(value = "定向拓展")
+    private String audienceExtend;
+    /**
+     * 目标操作,枚举值:ENABLE 启用项目、DISABLE暂停项目
+     */
+    @Excel(name = "目标操作,枚举值:ENABLE 启用项目、DISABLE暂停项目", width = 15)
+    @ApiModelProperty(value = "目标操作,枚举值:ENABLE 启用项目、DISABLE暂停项目")
+    private String optStatus;
+    /**
+     * 子目标,枚举值:DOWNLOAD 应用下载、LAUNCH 应用调用、RESERVE 预约下载
+     */
+    @Excel(name = "子目标,枚举值:DOWNLOAD 应用下载、LAUNCH 应用调用、RESERVE 预约下载", width = 15)
+    @ApiModelProperty(value = "子目标,枚举值:DOWNLOAD 应用下载、LAUNCH 应用调用、RESERVE 预约下载")
+    private String appPromotionType;
+    /**
+     * 投放模式,允许值:MANUAL手动投放、PROCEDURAL自动投放
+     */
+    @Excel(name = "投放模式,允许值:MANUAL手动投放、PROCEDURAL自动投放", width = 15)
+    @ApiModelProperty(value = "投放模式,允许值:MANUAL手动投放、PROCEDURAL自动投放")
+    private String deliveryMode;
+    /**
+     * 出价系数
+     */
+    @Excel(name = " 出价系数", width = 15)
+    @ApiModelProperty(value = " 出价系数")
+    private java.math.BigDecimal searchBidRatio;
+    /**
+     * 下载链接
+     */
+    @Excel(name = " 下载链接", width = 15)
+    @ApiModelProperty(value = " 下载链接")
+    private String downloadUrl;
+    /**
+     * 优先从系统应用商店下载(下载模式),枚举值:APP_STORE_DELIVERY 优先商店下载、DEFAULT 默认下载
+     */
+    @Excel(name = "优先从系统应用商店下载(下载模式),枚举值:APP_STORE_DELIVERY 优先商店下载、DEFAULT 默认下载", width = 15)
+    @ApiModelProperty(value = "优先从系统应用商店下载(下载模式),枚举值:APP_STORE_DELIVERY 优先商店下载、DEFAULT 默认下载")
+    private String downloadMode;
+    /**
+     * 下载方式,枚举值:DOWNLOAD_URL 直接下载、EXTERNAL_URL 落地页下载
+     */
+    @Excel(name = "下载方式,枚举值:DOWNLOAD_URL 直接下载、EXTERNAL_URL 落地页下载", width = 15)
+    @ApiModelProperty(value = "下载方式,枚举值:DOWNLOAD_URL 直接下载、EXTERNAL_URL 落地页下载")
+    private String downloadType;
+    /**
+     * 应用名
+     */
+    @Excel(name = "应用名", width = 15)
+    @ApiModelProperty(value = "应用名")
+    private String appName;
+    /**
+     * 搜索快投关键词功能,HAS_OPEN:启用,DISABLED:未启用
+     */
+    @Excel(name = "搜索快投关键词功能,HAS_OPEN:启用,DISABLED:未启用", width = 15)
+    @ApiModelProperty(value = "搜索快投关键词功能,HAS_OPEN:启用,DISABLED:未启用")
+    private String feedDeliverySearch;
+    /**
+     * 营销场景,枚举值:VIDEO_AND_IMAGE 短视频/图片、LIVE直播
+     */
+    @Excel(name = "营销场景,枚举值:VIDEO_AND_IMAGE 短视频/图片、LIVE直播", width = 15)
+    @ApiModelProperty(value = "营销场景,枚举值:VIDEO_AND_IMAGE 短视频/图片、LIVE直播")
+    private String marketingGoal;
+    /**
+     * 搜索关键词列表
+     */
+    @Excel(name = "搜索关键词列表", width = 15)
+    @ApiModelProperty(value = "搜索关键词列表")
+    private String keywords;
+    /**
+     * 投放设置
+     */
+    @Excel(name = " 投放设置", width = 15)
+    @ApiModelProperty(value = " 投放设置")
+    private String deliverySetting;
+    /**
+     * 自定义筛选条件(商品投放条件)
+     */
+    @Excel(name = "自定义筛选条件(商品投放条件)", width = 15)
+    @ApiModelProperty(value = "自定义筛选条件(商品投放条件)")
+    private String dpaProductTarget;
+    /**
+     * 优化目标
+     */
+    @Excel(name = "优化目标", width = 15)
+    @ApiModelProperty(value = "优化目标")
+    private String optimizeGoal;
+    /**
+     * 定向设置
+     */
+    @Excel(name = "定向设置", width = 15)
+    @ApiModelProperty(value = "定向设置")
+    private String audience;
+    /**
+     * 关联产品投放相关
+     */
+    @Excel(name = "关联产品投放相关", width = 15)
+    @ApiModelProperty(value = "关联产品投放相关")
+    private String relatedProduct;
+    /**
+     * 广告版位
+     */
+    @Excel(name = "广告版位", width = 15)
+    @ApiModelProperty(value = "广告版位")
+    private String deliveryRange;
+    /**
+     * 监测链接设置
+     */
+    @Excel(name = "监测链接设置", width = 15)
+    @ApiModelProperty(value = "监测链接设置")
+    private String trackUrlSetting;
+    /**
+     * internalAdvertiserInfo
+     */
+    @Excel(name = "internalAdvertiserInfo", width = 15)
+    @ApiModelProperty(value = "internalAdvertiserInfo")
+    private String internalAdvertiserInfo;
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1427 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceV3ProjectReportDaily.java


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1433 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceV3ProjectReportHourly.java


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1437 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceV3PromotionProjectReportDaily.java


+ 53 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/enums/InventoryEnum.java

@@ -0,0 +1,53 @@
+package cn.com.ctop.job.bytedance.data.enums;
+
+/**
+ * 素材类型
+ */
+public enum InventoryEnum {
+
+
+    String1("INVENTORY_FEED", "头条信息流"),
+    String2("INVENTORY_TEXT_LINK", "头条文章详情页"),
+    String3("INVENTORY_VIDEO_FEED", "西瓜信息流"),
+    String4("INVENTORY_HOTSOON_FEED", "火山信息流"),
+    String5("INVENTORY_AWEME_FEED", "抖音信息流"),
+    String6("INVENTORY_UNION_SLOT", "穿山甲"),
+    String7("UNION_BOUTIQUE_GAME", "ohayoo精品游戏"),
+    String8("INVENTORY_UNION_SPLASH_SLOT", "穿山甲开屏广告"),
+    String9("INVENTORY_SEARCH", "搜索广告"),
+    String10("INVENTORY_UNIVERSAL", "通投智选"),
+    String11("INVENTORY_BEAUTY", "轻颜相机"),
+    String12("INVENTORY_PIPIXIA", "皮皮虾"),
+    String13("INVENTORY_AUTOMOBILE", "懂车帝"),
+    String14("INVENTORY_STUDY", "好好学习"),
+    String15("INVENTORY_FACE_U", "faceu"),
+    String16("INVENTORY_TOMATO_NOVEL", "番茄小说"),
+    String17("INVENTORY_HOMED_AGGREGATE", "住小帮");
+
+    private String code;
+    private String name;
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    private InventoryEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public static String getNameByCode(String code) {
+        for (InventoryEnum material : InventoryEnum.values()) {
+            if (material.getCode().equals(code)) {
+                return material.getName();
+            }
+        }
+        return "-";
+    }
+
+}

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

@@ -1,7 +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;
@@ -11,4 +14,15 @@ 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);
+
+    void insertPosition(@Param("list") List<BytedanceAdvertiserReportDaily> list);
+
+    void insertV3PromotionProjectHour(@Param("list") List<BytedanceV3PromotionProjectReportDaily> hourlyList);
 }

+ 2 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceAdvertiserReportHourlyMapper.java

@@ -2,6 +2,7 @@ package cn.com.ctop.job.bytedance.data.mapper;
 
 
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserReportHourly;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceV3ProjectReportHourly;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -10,4 +11,5 @@ public interface BytedanceAdvertiserReportHourlyMapper {
 
     int insert(@Param("list") List<BytedanceAdvertiserReportHourly> list);
 
+    int insertV3Project(@Param("list") List<BytedanceV3ProjectReportHourly> hourlyList);
 }

+ 15 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceProjectMapper.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+
+import cn.com.ctop.job.bytedance.data.entity.BytedanceCdpProject;
+import cn.com.ctop.job.bytedance.data.entity.BytedancePromotionList;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface BytedanceProjectMapper {
+
+    int replaceProjectList(@Param("list")List<BytedanceCdpProject> list);
+
+
+}

+ 8 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/OauthTokenMapper.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.job.bytedance.data.mapper;
 
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -13,7 +14,13 @@ import java.util.List;
  * @version V1.0
  */
 public interface OauthTokenMapper extends BaseMapper<OauthToken> {
-  String getByAccountId(@Param("accountId") Long accountId);
+    String getByAccountId(@Param("accountId") Long accountId);
 
     List<Long> getAgentByTouTiao();
+
+    List<Long> getAllToutiaoAccountIds();
+
+    String getAgentToken(@Param("agentId") Long agentId);
+
+    List<JSONObject> getAgentTokens();
 }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1937 - 4
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAdvertiserReportDailyMapper.xml


+ 485 - 4
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceAdvertiserReportHourlyMapper.xml

@@ -167,7 +167,8 @@
     </resultMap>
 
     <sql id="Base_Column_List">
-    advertiser_id, stat_datetime, hour, cost, show, avg_show_cost, click, avg_click_cost, 
+        advertiser_id
+        , stat_datetime, hour, 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, 
@@ -200,7 +201,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.BytedanceAdvertiserReportHourly">
         replace into bytedance_advertiser_report_hourly (advertiser_id, stat_datetime, `hour`,
@@ -266,7 +267,8 @@
         attribution_active_pay_intra_one_day_cost,
         attribution_active_pay_intra_one_day_rate,
         attribution_active_pay_intra_one_day_amount,
-        attribution_active_pay_intra_one_day_roi
+        attribution_active_pay_intra_one_day_roi,
+        stat_pay_amount
         )
         values
         <foreach collection="list" item="item" separator=",">
@@ -360,7 +362,486 @@
             #{item.attributionActivePayIntraOneDayCost},
             #{item.attributionActivePayIntraOneDayRate},
             #{item.attributionActivePayIntraOneDayAmount},
-            #{item.attributionActivePayIntraOneDayRoi}
+            #{item.attributionActivePayIntraOneDayRoi},
+            #{item.statPayAmount}
+            )
+        </foreach>
+    </insert>
+
+    <insert id="insertV3Project" parameterType="cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserReportHourly">
+        replace into media_api.bytedance_cdp_project_report_hourly (
+        advertiser_id,
+        cdp_project_id,
+        cdp_project_name,
+        stat_time_day,
+        stat_hour,
+        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.statTimeDay},
+            #{item.statHour},
+            #{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>

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

@@ -0,0 +1,77 @@
+<?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.BytedanceProjectMapper">
+
+
+    <insert id="replaceProjectList">
+        REPLACE INTO bytedance_cdp_project (
+        project_id,
+        `name`,
+        advertiser_id,
+        status,
+        package_name,
+        project_create_time,
+        project_modify_time,
+        pricing,
+        landing_type,
+        ad_type,
+        audience_extend,
+        opt_status,
+        app_promotion_type,
+        delivery_mode,
+        search_bid_ratio,
+        download_url,
+        download_mode,
+        download_type,
+        app_name,
+        feed_delivery_search,
+        marketing_goal,
+        keywords,
+        delivery_setting,
+        dpa_product_target,
+        optimize_goal,
+        audience,
+        related_product,
+        delivery_range,
+        track_url_setting,
+        internal_advertiser_info
+        )
+        VALUES
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.projectId},
+            #{item.name},
+            #{item.advertiserId},
+            #{item.status},
+            #{item.packageName},
+            #{item.projectCreateTime},
+            #{item.projectModifyTime},
+            #{item.pricing},
+            #{item.landingType},
+            #{item.adType},
+            #{item.audienceExtend},
+            #{item.optStatus},
+            #{item.appPromotionType},
+            #{item.deliveryMode},
+            #{item.searchBidRatio},
+            #{item.downloadUrl},
+            #{item.downloadMode},
+            #{item.downloadType},
+            #{item.appName},
+            #{item.feedDeliverySearch},
+            #{item.marketingGoal},
+            #{item.keywords},
+            #{item.deliverySetting},
+            #{item.dpaProductTarget},
+            #{item.optimizeGoal},
+            #{item.audience},
+            #{item.relatedProduct},
+            #{item.deliveryRange},
+            #{item.trackUrlSetting},
+            #{item.internalAdvertiserInfo}
+            )
+        </foreach>
+    </insert>
+
+
+</mapper>

+ 28 - 3
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/OauthTokenMapper.xml

@@ -3,10 +3,35 @@
 <mapper namespace="cn.com.ctop.job.bytedance.data.mapper.OauthTokenMapper">
 
     <select id="getByAccountId" resultType="java.lang.String">
-       SELECT access_token  from  `jeecg-boot`.ctop_oauth_token WHERE account_id = #{accountId}
+        SELECT access_token
+        from `jeecg-boot`.ctop_oauth_token
+        WHERE account_id = #{accountId}
     </select>
 
+
     <select id="getAgentByTouTiao" resultType="Long">
-       SELECT agent_id  from  `jeecg-boot`.ctop_cwjs_agent_info WHERE status = 0 and enabled=0
+        SELECT agent_id
+        from `jeecg-boot`.ctop_cwjs_agent_info
+        WHERE status = 0
+          and enabled = 0
+    </select>
+
+    <select id="getAllToutiaoAccountIds" resultType="Long">
+        SELECT account_id
+        FROM `jeecg-boot`.ctop_user_allocation
+        WHERE media_id = 1
+          and account_status = 0
+    </select>
+
+    <select id="getAgentToken" resultType="java.lang.String">
+        SELECT access_token
+        from `jeecg-boot`.ctop_bytedance_agent_token
+        WHERE agent_id = #{agentId}
+    </select>
+
+    <select id="getAgentTokens" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT access_token, agent_id
+        from `jeecg-boot`.ctop_bytedance_agent_token
     </select>
-</mapper>
+
+</mapper>

+ 18 - 3
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IByteDanceAdvertiserDataService.java

@@ -2,13 +2,12 @@ package cn.com.ctop.job.bytedance.data.service;
 
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
 
-import java.util.Date;
 import java.util.Map;
 
 /**
  * @author jeecg-boot
  */
-public interface IByteDanceAdvertiserDataService  {
+public interface IByteDanceAdvertiserDataService {
 
 
     Map<String, Object> getAdvertiserPlan(OauthToken token, String ids, String date, String updateDate);
@@ -17,5 +16,21 @@ public interface IByteDanceAdvertiserDataService  {
 
     void getAdvertiserReport(OauthToken oauthToken, String yesterda, String yesterda1, String bytedanceReportTypeDaily);
 
-    void getAgentReport(OauthToken oauthToken, String yesterda, String yesterda1, String bytedanceReportTypeDaily);
+    void getPositionAdvertiserReport(OauthToken oauthToken, String yesterda, String yesterda1, String bytedanceReportTypeDaily);
+
+    void getAgentReport(OauthToken oauthToken, String startDate, String endDate);
+
+    void getV3AdvertiserConfig(OauthToken oauthToken);
+
+    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);
 }

+ 12 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceProjectService.java

@@ -0,0 +1,12 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+import cn.com.ctop.job.bytedance.data.entity.OauthToken;
+
+/**
+ * 获取项目列表
+ */
+public interface IBytedanceProjectService {
+
+    void getProjectList(OauthToken oauthToken, String startDate,String endDate,int page);
+
+}

+ 9 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IOauthTokenService.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.job.bytedance.data.service;
 
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.List;
@@ -13,7 +14,13 @@ import java.util.List;
  */
 public interface IOauthTokenService extends IService<OauthToken> {
 
-  String getByAccountId(Long accountId);
+    String getByAccountId(Long accountId);
 
-  List<Long> getAgentByTouTiao();
+    List<Long> getAgentByTouTiao();
+
+    List<Long> getAllToutiaoAccountIds();
+
+    String getAgentToken(Long accountId);
+
+    List<JSONObject> getAgentTokens();
 }

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

@@ -2,8 +2,27 @@ 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.*;
-import cn.com.ctop.job.bytedance.data.mapper.*;
+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;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceAdReportHourly;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserReportDaily;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserReportHourly;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceAgentReportDaily;
+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.enums.InventoryEnum;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdGetMapper;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdReportDailyMapper;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdReportHourlyMapper;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdvertiserReportDailyMapper;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdvertiserReportHourlyMapper;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceAgentReportDailyMapper;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceAgentReportHourlyMapper;
 import cn.com.ctop.job.bytedance.data.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceAgentReportDailyService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceAgentReportHourlyService;
@@ -16,6 +35,8 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.PropertyNamingStrategy;
 import com.alibaba.fastjson.serializer.SerializeConfig;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.xxl.job.core.context.XxlJobHelper;
 import lombok.extern.slf4j.Slf4j;
 import lombok.var;
@@ -26,7 +47,11 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -76,9 +101,9 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
      */
 
     public void getAd(OauthToken token, int pageNum, String ids, String date, String updateDate) {
-        log.info("开始获取广告计划信息 accountID:{},日期{},page:{}", token.getAccountId(), updateDate,pageNum);
+        log.info("开始获取广告计划信息 accountID:{},日期{},page:{}", token.getAccountId(), updateDate, pageNum);
 
-        List<Object> adAccountList = redisUtil.getList("AD"+updateDate,null);
+        List<Object> adAccountList = redisUtil.getList("AD" + updateDate, null);
 
         JSONArray getIds = null;
         if (null != ids && !"".equals(ids)) {
@@ -117,30 +142,30 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
             log.error(
                     "获取广告计划信息接口异常==》accountId:{},message:{},code{}",
                     token.getAccountId(),
-                    resultObject.getString("message"),code);
+                    resultObject.getString("message"), code);
             //请求过于频繁
-            if (40100 == code){
-                log.info("广告计划请求频繁,code:{},准备重试,accountId:{},错误消息:{}",code,token.getAccountId(),resultObject.getString("message"));
+            if (40100 == code) {
+                log.info("广告计划请求频繁,code:{},准备重试,accountId:{},错误消息:{}", code, token.getAccountId(), resultObject.getString("message"));
                 //添加重试
-                if (Check.isNull(adAccountList)){
-                    redisUtil.add("AD"+updateDate,Arrays.asList(token.getAccountId()), 1, TimeUnit.HOURS);
-                }else {
+                if (Check.isNull(adAccountList)) {
+                    redisUtil.add("AD" + updateDate, Arrays.asList(token.getAccountId()), 1, TimeUnit.HOURS);
+                } else {
                     adAccountList.add(token.getAccountId());
-                    redisUtil.add("AD"+updateDate,adAccountList, 1, TimeUnit.HOURS);
+                    redisUtil.add("AD" + updateDate, adAccountList, 1, TimeUnit.HOURS);
                 }
-            }else {
-                if (adAccountList.contains(token.getAccountId())){
+            } else {
+                if (adAccountList.contains(token.getAccountId())) {
                     adAccountList.remove(token.getAccountId());
-                    redisUtil.add("AD"+updateDate,adAccountList, 1, TimeUnit.HOURS);
+                    redisUtil.add("AD" + updateDate, adAccountList, 1, TimeUnit.HOURS);
                 }
 
             }
             return;
         }
         JSONArray data = resultObject.getJSONObject("data").getJSONArray("list");
-        if (adAccountList.contains(token.getAccountId())){
+        if (adAccountList.contains(token.getAccountId())) {
             adAccountList.remove(token.getAccountId());
-            redisUtil.add("AD"+updateDate,adAccountList, 1, TimeUnit.HOURS);
+            redisUtil.add("AD" + updateDate, adAccountList, 1, TimeUnit.HOURS);
         }
         if (null == data || data.isEmpty()) {
             //log.info("广告计划,accountId:{}暂无数据",token.getAccountId());
@@ -240,7 +265,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         conditions.setPageSize(1000);
         conditions.setTimeGranularity(bytedanceReportTypePl);
         conditions.setFields(conditions.getFieldsList());
-        log.info("账户--{}正在执行广告主{}数据",conditions.getAdvertiserId(),bytedanceReportTypePl);
+        log.info("账户--{}正在执行广告主{}数据", conditions.getAdvertiserId(), bytedanceReportTypePl);
         return conditions;
     }
 
@@ -280,7 +305,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
                             JSONObject.parseObject(data.toJSONString(), BytedanceAdReportHourly.class);
                     hourlyReport.setAdvertiserId(conditions.getAdvertiserId());
                     String hour = hourlyReport.getStatDatetime().substring(11, 13);
-                    hourlyReport.setStatDatetime(hourlyReport.getStatDatetime().substring(0,10).replace("-", ""));
+                    hourlyReport.setStatDatetime(hourlyReport.getStatDatetime().substring(0, 10).replace("-", ""));
                     hourlyReport.setHour(Integer.parseInt(hour));
                     hourlyReports.add(hourlyReport);
 
@@ -290,7 +315,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
                         BytedanceAdReportDaily dailyReport =
                                 JSONObject.parseObject(data.toJSONString(), BytedanceAdReportDaily.class);
                         dailyReport.setAdvertiserId(conditions.getAdvertiserId());
-                        dailyReport.setStatDatetime(dailyReport.getStatDatetime().substring(0,10).replace("-", ""));
+                        dailyReport.setStatDatetime(dailyReport.getStatDatetime().substring(0, 10).replace("-", ""));
                         dailyReports.add(dailyReport);
                     }
                 }
@@ -352,47 +377,48 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     private void getAdvertiserReportByPage(
             OauthToken token, ByteDanceAdvertiserReportDTO conditions, Integer page) {
 
-        List<Object> advertiserAccountList = redisUtil.getList("ADVERTISER"+conditions.getStartDate(),null);
+        List<Object> advertiserAccountList = redisUtil.getList("ADVERTISER" + conditions.getStartDate(), null);
 
-        log.info("开始获取广告主账户报表,账户id:{}--时间---{},page:{}", token.getAccountId(),conditions.getStartDate(),page);
+        log.info("开始获取广告主账户报表,账户id:{}--时间---{},page:{}", token.getAccountId(), conditions.getStartDate(), page);
         conditions.setPage(page);
         SerializeConfig config = new SerializeConfig();
         config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
         JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(conditions, config));
         JSONObject getObject = getAdvertiserStat(token, jsonObject);
+//        System.out.println("返回结果:" + getObject);
         if (null == getObject) {
             XxlJobHelper.log("头条广告主数据获取异常");
-            log.error("头条广告主数据获取信息为空==》accountId:{}",token.getAccountId());
+            log.error("头条广告主数据获取信息为空==》accountId:{}", token.getAccountId());
             return;
         }
         Integer code = getObject.getInteger("code");
         String message = getObject.getString("message");
         if (null == code || code != 0) {
-            log.error("头条广告主数据获取异常:{}---code--{}", message,code);
+            log.error("头条广告主数据获取异常:{}---code--{}", message, code);
 
             //请求过于频繁
-            if (40100 == code){
-                log.info("广告主日报请求频繁,code:{},准备重试,accountId:{},错误消息:{}",code,token.getAccountId(),message);
+            if (40100 == code) {
+                log.info("广告主日报请求频繁,code:{},准备重试,accountId:{},错误消息:{}", code, token.getAccountId(), message);
                 //添加重试
-                if (Check.isNull(advertiserAccountList)){
-                    redisUtil.add("ADVERTISER"+conditions.getStartDate(),Arrays.asList(token.getAccountId()), 1, TimeUnit.HOURS);
-                }else {
+                if (Check.isNull(advertiserAccountList)) {
+                    redisUtil.add("ADVERTISER" + conditions.getStartDate(), Arrays.asList(token.getAccountId()), 1, TimeUnit.HOURS);
+                } else {
                     advertiserAccountList.add(token.getAccountId());
-                    redisUtil.add("ADVERTISER"+conditions.getStartDate(),advertiserAccountList, 1, TimeUnit.HOURS);
+                    redisUtil.add("ADVERTISER" + conditions.getStartDate(), advertiserAccountList, 1, TimeUnit.HOURS);
                 }
-            }else {
-                if (advertiserAccountList.contains(token.getAccountId())){
+            } else {
+                if (advertiserAccountList.contains(token.getAccountId())) {
                     advertiserAccountList.remove(token.getAccountId());
-                    redisUtil.add("ADVERTISER"+conditions.getStartDate(),advertiserAccountList, 1, TimeUnit.HOURS);
+                    redisUtil.add("ADVERTISER" + conditions.getStartDate(), advertiserAccountList, 1, TimeUnit.HOURS);
                 }
             }
 
             return;
         }
         JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
-        if (advertiserAccountList.contains(token.getAccountId())){
+        if (advertiserAccountList.contains(token.getAccountId())) {
             advertiserAccountList.remove(token.getAccountId());
-            redisUtil.add("ADVERTISER"+conditions.getStartDate(),advertiserAccountList, 1, TimeUnit.HOURS);
+            redisUtil.add("ADVERTISER" + conditions.getStartDate(), advertiserAccountList, 1, TimeUnit.HOURS);
         }
         if (null == dataArray || dataArray.isEmpty()) {
 
@@ -467,6 +493,143 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         groupBy.add("STAT_GROUP_BY_FIELD_ID");
         groupBy.add("STAT_GROUP_BY_FIELD_STAT_TIME");
         conditions.put("group_by", groupBy);
+//        System.out.println("入参:" + conditions);
+        return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, conditions);
+    }
+
+    /**
+     * -------------------------------------------------------------------------获取分版位广告主
+     */
+    @Override
+    public void getPositionAdvertiserReport(OauthToken token, String startDate, String endDate, String bytedanceReportTypePl) {
+        var conditions = getReportDTO(token, startDate, endDate, bytedanceReportTypePl);
+        getPositionAdvertiserReportByPage(token, conditions, 1);
+    }
+
+    /**
+     * 获取广告主 分版位信息
+     */
+    private void getPositionAdvertiserReportByPage(OauthToken token, ByteDanceAdvertiserReportDTO conditions, Integer page) {
+
+        List<Object> advertiserAccountList = redisUtil.getList("POSITION_ADVERTISER" + conditions.getStartDate(), null);
+
+        log.info("开始获取广告主账户报表,账户id:{}--时间---{},page:{}", token.getAccountId(), conditions.getStartDate(), page);
+        conditions.setPage(page);
+        SerializeConfig config = new SerializeConfig();
+        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
+        JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(conditions, config));
+        JSONObject getObject = getPositionAdvertiserStat(token, jsonObject);
+//        System.out.println("返回结果:" + getObject);
+        if (null == getObject) {
+            XxlJobHelper.log("头条广告主数据获取异常");
+            log.error("头条广告主数据获取信息为空==》accountId:{}", token.getAccountId());
+            return;
+        }
+        Integer code = getObject.getInteger("code");
+        String message = getObject.getString("message");
+        if (null == code || code != 0) {
+            log.error("头条广告主数据获取异常:{}---code--{}", message, code);
+
+            //请求过于频繁
+            if (40100 == code) {
+                log.info("广告主日报请求频繁,code:{},准备重试,accountId:{},错误消息:{}", code, token.getAccountId(), message);
+                //添加重试
+                if (Check.isNull(advertiserAccountList)) {
+                    redisUtil.add("POSITION_ADVERTISER" + conditions.getStartDate(), Arrays.asList(token.getAccountId()), 1, TimeUnit.HOURS);
+                } else {
+                    advertiserAccountList.add(token.getAccountId());
+                    redisUtil.add("POSITION_ADVERTISER" + conditions.getStartDate(), advertiserAccountList, 1, TimeUnit.HOURS);
+                }
+            } else {
+                if (advertiserAccountList.contains(token.getAccountId())) {
+                    advertiserAccountList.remove(token.getAccountId());
+                    redisUtil.add("POSITION_ADVERTISER" + conditions.getStartDate(), advertiserAccountList, 1, TimeUnit.HOURS);
+                }
+            }
+
+            return;
+        }
+        JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
+        if (advertiserAccountList.contains(token.getAccountId())) {
+            advertiserAccountList.remove(token.getAccountId());
+            redisUtil.add("POSITION_ADVERTISER" + conditions.getStartDate(), advertiserAccountList, 1, TimeUnit.HOURS);
+        }
+        if (null == dataArray || dataArray.isEmpty()) {
+
+            return;
+        }
+//        List<BytedanceAdvertiserReportHourly> hourlyList = new ArrayList<>();
+        List<BytedanceAdvertiserReportDaily> dailyList = new ArrayList<>();
+
+        try {
+            for (int i = 0; i < dataArray.size(); i++) {
+                JSONObject data = dataArray.getJSONObject(i);
+//                if (null != conditions.getTimeGranularity()
+//                        && conditions.getTimeGranularity().equals(CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY)) {
+//                    // 时报
+//                    BytedanceAdvertiserReportHourly hourlyReport =
+//                            JSONObject.parseObject(data.toJSONString(), BytedanceAdvertiserReportHourly.class);
+//                    hourlyReport.setAdvertiserId(conditions.getAdvertiserId());
+//                    String hour = hourlyReport.getStatDatetime().substring(11, 13);
+//                    hourlyReport.setStatDatetime(hourlyReport.getStatDatetime().substring(0, 10).replace("-", ""));
+//                    hourlyReport.setHour(Integer.parseInt(hour));
+//                    hourlyList.add(hourlyReport);
+//
+//                } else {
+                // 日报
+                BytedanceAdvertiserReportDaily dailyReport =
+                        JSONObject.parseObject(data.toJSONString(), BytedanceAdvertiserReportDaily.class);
+                dailyReport.setAdvertiserId(conditions.getAdvertiserId());
+                dailyReport.setStatDatetime(dailyReport.getStatDatetime().substring(0, 10).replace("-", ""));
+                dailyReport.setInventoryName(InventoryEnum.getNameByCode(dailyReport.getInventory()));
+                dailyList.add(dailyReport);
+//                }
+            }
+//            if (hourlyList.size() > 0) {
+//                bytedanceAdvertiserReportHourlyMapper.insert(hourlyList);
+//            }
+            if (dailyList.size() > 0) {
+                bytedanceAdvertiserReportDailyMapper.insertPosition(dailyList);
+            }
+        } catch (Exception e) {
+            log.info("获取广告主数据错误:{}", e.toString());
+        }
+        page++;
+        int totalPage =
+                getObject.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
+        if (page <= totalPage) {
+            getPositionAdvertiserReportByPage(token, conditions, page);
+        } else {
+            JSONObject param = new JSONObject();
+            param.put("advertiser_id", token.getAccountId());
+            param.put("start_date", conditions.getStartDate().replace("-", ""));
+            param.put("end_date", conditions.getEndDate().replace("-", ""));
+            if (null != conditions.getTimeGranularity()
+                    && conditions.getTimeGranularity().equals(CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY)) {
+                param.put("date_type", "hourly");
+            } else {
+                param.put("date_type", "daily");
+            }
+            HttpUtils.httpPostRequest(urlPath, param, null);
+        }
+    }
+
+    /**
+     * 获取广告主报表信息
+     *
+     * @param token
+     * @param conditions
+     * @return
+     */
+    public JSONObject getPositionAdvertiserStat(OauthToken token, JSONObject conditions) {
+        // 请求地址
+        String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V2_REPORT_advertiser_GET;
+        JSONArray groupBy = new JSONArray();
+        groupBy.add("STAT_GROUP_BY_FIELD_ID");
+        groupBy.add("STAT_GROUP_BY_FIELD_STAT_TIME");
+        groupBy.add("STAT_GROUP_BY_INVENTORY");
+        conditions.put("group_by", groupBy);
+//        System.out.println("入参:" + conditions);
         return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, conditions);
     }
 
@@ -475,21 +638,13 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
      */
     @Override
     public void getAgentReport(
-            OauthToken token, String startDate, String endDate, String bytedanceReportTypePl) {
+            OauthToken token, String startDate, String endDate) {
         JSONObject jsonObject = new JSONObject();
-        if (CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY.equals(bytedanceReportTypePl)) {
-            // 日报
-            jsonObject.put("agent_id", token.getAccountId());
-            jsonObject.put("start_date", startDate);
-            jsonObject.put("end_date", endDate);
-            jsonObject.put("page_size", 1000);
-            jsonObject.put("timeGranularity", bytedanceReportTypePl);
-        } else {
-            // 时报
-            jsonObject.put("agent_id", token.getAccountId());
-            jsonObject.put("page_size", 1000);
-            jsonObject.put("timeGranularity", bytedanceReportTypePl);
-        }
+        // 日报
+        jsonObject.put("agent_id", token.getAccountId());
+        jsonObject.put("start_date", startDate);
+        jsonObject.put("end_date", endDate);
+        jsonObject.put("page_size", 1000);
 
         getAgentReportByPage(token, jsonObject, 1);
     }
@@ -498,80 +653,485 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
      * 获取代理商
      */
     private void getAgentReportByPage(OauthToken token, JSONObject conditions, Integer page) {
-        log.info("获取代理商数据 accountID:{},page:{}", token.getAccountId(), page);
-        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
-        String hour = simpleDateFormat.format(new Date());
-        String nowDate = DateUtils.getNowDate("yyyyMMdd");
         conditions.put("page", page);
         SerializeConfig config = new SerializeConfig();
         config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
         JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(conditions, config));
+//        System.out.println("----------------入参:" + jsonObject);
+//        System.out.println("-");
         JSONObject getObject = getAgentStat(token, jsonObject);
+//        System.out.println("----------------结果:" + getObject);
         if (null == getObject) {
             XxlJobHelper.log("头条代理商数据获取异常");
             return;
         }
         Integer code = getObject.getInteger("code");
-        String message = getObject.getString("message");
-        if (null == code || code != 0) {
-            XxlJobHelper.log("头条代理商数据获取异常:{}", message);
+        if (code == 0) {
+            JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
+            if (null == dataArray || dataArray.isEmpty()) {
+                return;
+            }
+            List<BytedanceAgentReportDaily> dailyList = new ArrayList<>();
+            try {
+                Integer startDate = DateUtils.getDateInteger(conditions.getString("start_date"));
+                for (int i = 0; i < dataArray.size(); i++) {
+                    JSONObject data = dataArray.getJSONObject(i);
+                    // 日报
+                    BytedanceAgentReportDaily dailyReport = JSONObject.parseObject(data.toJSONString(), BytedanceAgentReportDaily.class);
+                    dailyReport.setStatDatetime(String.valueOf(startDate));
+                    dailyList.add(dailyReport);
+                }
+                if (dailyList.size() > 0) {
+                    bytedanceAgentReportDailyMapper.insert(dailyList);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                log.info("获取代理商数据错误:{}", e.toString());
+            }
+        }
+        page++;
+        int totalPage =
+                getObject.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
+        if (page <= totalPage) {
+            getAgentReportByPage(token, conditions, page);
+        }
+
+    }
+
+    /**
+     * 获取获取代理商报表信息
+     *
+     * @param token
+     * @param conditions
+     * @return
+     */
+    public JSONObject getAgentStat(OauthToken token, JSONObject conditions) {
+        // 请求地址
+        String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V2_REPORT_AGENT_GET_V2;
+        return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, conditions);
+    }
+
+
+    private static final ObjectMapper mapper = new ObjectMapper();
+
+    /**
+     * 获取自定义报表可用指标和维度
+     */
+    @Override
+    public void getV3AdvertiserConfig(OauthToken oauthToken) {
+        try {
+            // 请求地址
+            String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V3_CONFIG_ADVERTISER_GET;
+            Map<String, Object> param = new HashMap<>();
+            param.put("advertiser_id", oauthToken.getAccountId());
+
+            List<String> data_topics_list = new ArrayList<>();
+            data_topics_list.add("BASIC_DATA");//广告基础数据
+//            data_topics_list.add("QUERY_DATA");//搜索词数据、
+//            data_topics_list.add("BIDWORD_DATA");//关键词数据
+//            data_topics_list.add("MATERIAL_DATA");//素材数据、
+            data_topics_list.add("PRODUCT_DATA");//产品数据、
+//            data_topics_list.add("ONE_KEY_BOOST_DATA");//一键起量(巨量广告升级版)
+            String data_topics = mapper.writeValueAsString(data_topics_list);
+            param.put("data_topics", data_topics);
+
+            Map<String, String> header = new HashMap<>();
+            header.put("Access-Token", oauthToken.getAccessToken());
+            JSONObject resultObject = JSONObject.parseObject(HttpUtils.httpGet(url, param, header));
+//            System.out.println("指标参数:\n" + resultObject);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    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头条项目报表
+     */
+    private void getV3AdvertiserReportByPage(OauthToken token, ByteDanceV3AdvertiserReportDTO conditions, Integer page) {
+        List<Object> advertiserAccountList = redisUtil.getList("V3_ADVERTISER" + 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;
         }
-        JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
-        if (null == dataArray || dataArray.isEmpty()) {
+        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_ADVERTISER" + conditions.getStartTime(), Arrays.asList(token.getAccountId()), 1, TimeUnit.HOURS);
+                } else {
+                    advertiserAccountList.add(token.getAccountId());
+                    redisUtil.add("V3_ADVERTISER" + 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_ADVERTISER" + conditions.getStartTime(), advertiserAccountList, 1, TimeUnit.HOURS);
+                }
+            }
             return;
         }
-        List<BytedanceAgentReportHourly> hourlyList = new ArrayList<>();
-        List<BytedanceAgentReportDaily> dailyList = new ArrayList<>();
+
+        JSONArray rows = result.getJSONObject("data").getJSONArray("rows");
+        if (advertiserAccountList.contains(token.getAccountId())) {
+            advertiserAccountList.remove(token.getAccountId());
+            redisUtil.add("V3_ADVERTISER" + conditions.getStartTime(), advertiserAccountList, 1, TimeUnit.HOURS);
+        }
+        if (Check.isNull(rows)) {
+            return;
+        }
+        List<BytedanceV3ProjectReportHourly> hourlyList = new ArrayList<>();
+        List<BytedanceV3ProjectReportDaily> dailyList = new ArrayList<>();
         try {
-            for (int i = 0; i < dataArray.size(); i++) {
-                JSONObject data = dataArray.getJSONObject(i);
-                if (null != conditions.get("timeGranularity")
-                        && conditions
-                        .get("timeGranularity")
-                        .equals(CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY)) {
+            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");
+
+                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 {
+                    // 日报
+                    BytedanceV3ProjectReportDaily dailyReport = JSONObject.parseObject(metrics.toJSONString(), BytedanceV3ProjectReportDaily.class);
+                    dailyReport.setAdvertiserId(token.getAccountId());
+                    dailyReport.setStatTimeDay(dimensions.getString("stat_time_day").substring(0, 10).replace("-", ""));
+                    dailyReport.setCdpProjectId(projectId);
+                    dailyReport.setCdpProjectName(projectName);
+                    dailyList.add(dailyReport);
+                }
+            }
+            if (hourlyList.size() > 0) {
+                bytedanceAdvertiserReportHourlyMapper.insertV3Project(hourlyList);
+            }
+            if (dailyList.size() > 0) {
+                bytedanceAdvertiserReportDailyMapper.insertV3Project(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) {
+            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<BytedanceV3PromotionProjectReportDaily> 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);
                     // 时报
-                    BytedanceAgentReportHourly hourlyReport =
-                            JSONObject.parseObject(data.toJSONString(), BytedanceAgentReportHourly.class);
-                    hourlyReport.setStatDatetime(nowDate);
+                    BytedanceV3PromotionProjectReportDaily hourlyReport = JSONObject.parseObject(metrics.toJSONString(), BytedanceV3PromotionProjectReportDaily.class);
+                    hourlyReport.setAdvertiserId(token.getAccountId());
+                    hourlyReport.setStatTimeDay(dimensions.getString("stat_time_hour").substring(0, 10).replace("-", ""));
                     hourlyReport.setHour(Integer.parseInt(hour));
+                    hourlyReport.setCdpProjectId(projectId);
+                    hourlyReport.setCdpProjectName(projectName);
+                    hourlyReport.setPromotionId(promotionId);
+                    hourlyReport.setPromotionName(promotionName);
                     hourlyList.add(hourlyReport);
                 } else {
                     // 日报
-                    BytedanceAgentReportDaily dailyReport =
-                            JSONObject.parseObject(data.toJSONString(), BytedanceAgentReportDaily.class);
-                    dailyReport.setStatDatetime(((String) conditions.get("start_date")).replace("-", ""));
+                    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) {
-                bytedanceAgentReportHourlyMapper.insert(hourlyList);
+                bytedanceAdvertiserReportDailyMapper.insertV3PromotionProjectHour(hourlyList);
             }
             if (dailyList.size() > 0) {
-                bytedanceAgentReportDailyMapper.insert(dailyList);
+                bytedanceAdvertiserReportDailyMapper.insertV3PromotionProject(dailyList);
             }
         } catch (Exception e) {
             e.printStackTrace();
-            log.info("获取代理商数据错误:{}", e.toString());
+            log.info("获取广告主数据错误:", e.toString());
         }
         page++;
-        int totalPage =
-                getObject.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
+
+        int totalPage = result.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
         if (page <= totalPage) {
-            getAgentReportByPage(token, conditions, page);
+            getV3PromotionProjectReportByPage(token, conditions, page);
         }
     }
 
+
     /**
-     * 获取获取代理商报表信息
-     *
-     * @param token
-     * @param conditions
-     * @return
+     * V3 素材报表
      */
-    public JSONObject getAgentStat(OauthToken token, JSONObject conditions) {
+    @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_V2_REPORT_AGENT_GET_V2;
-        return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, conditions);
+        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);
+        }
     }
 }

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

@@ -7,21 +7,25 @@ import cn.com.ctop.job.bytedance.data.entity.OauthToken;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceMaterialReportDailyMapper;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceNewMaterialReportMapper;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceMaterialReportDailyService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
 import cn.com.ctop.job.bytedance.data.utils.DateUtils;
 import cn.com.ctop.job.bytedance.data.utils.HttpUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 图片与视频素材日报
@@ -41,9 +45,11 @@ public class BytedanceMaterialReportDailyServiceImpl implements IBytedanceMateri
     @Resource
     private BytedanceNewMaterialReportMapper bytedanceNewMaterialReportMapper;
 
+    private static final ObjectMapper mapper = new ObjectMapper();
+
     @Override
     public void bytedanceDailyMaterialReportJob(OauthToken oauthToken, String yesterda, String yesterda1, int page, int pageSize) {
-        log.info("开始获取图片和视频素材日报 accountID:{},page:{} date:{}", oauthToken.getAccountId(), page,yesterda);
+        log.info("开始获取图片和视频素材日报 accountID:{},page:{} date:{}", oauthToken.getAccountId(), page, yesterda);
         // 请求地址
         String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V2_REPORT_INTEGRATED_GET;
         JSONObject param = new JSONObject();
@@ -76,15 +82,15 @@ public class BytedanceMaterialReportDailyServiceImpl implements IBytedanceMateri
                 report.setImageMode((String) dimensions.get("image_mode"));
 
                 //过滤 imageMode 为 MATERIAL_IMAGE_MODE_TITLE
-                if (report.getImageMode()==null || StringUtils.equals("MATERIAL_IMAGE_MODE_TITLE",report.getImageMode())){
+                if (report.getImageMode() == null || StringUtils.equals("MATERIAL_IMAGE_MODE_TITLE", report.getImageMode())) {
                     continue;
                 }
 
                 report.setInventory((String) dimensions.get("inventory"));
-                if (report.getInventory()==null){
+                if (report.getInventory() == null) {
                     continue;
                 }
-                report.setStatDatetime(dimensions.getString("stat_datetime")==null?null:dimensions.getString("stat_datetime").substring(0,10).replace("-",""));
+                report.setStatDatetime(dimensions.getString("stat_datetime") == null ? null : dimensions.getString("stat_datetime").substring(0, 10).replace("-", ""));
                 report.setSubmitCertificationCount(dataObject.get("submit_certification_count") == null ? null : Integer.parseInt((String) dataObject.get("submit_certification_count")));
                 report.setApprovalCount(dataObject.get("approval_count") == null ? null : Integer.parseInt((String) dataObject.get("approval_count")));
                 report.setFirstOrderCount(dataObject.get("first_order_count") == null ? null : Integer.parseInt((String) dataObject.get("first_order_count")));
@@ -98,7 +104,7 @@ public class BytedanceMaterialReportDailyServiceImpl implements IBytedanceMateri
         }
         try {
             bytedanceMaterialReportDailyMapper.insert(list);
-        }catch (Exception e){
+        } catch (Exception e) {
             log.info(e.toString());
         }
 
@@ -110,127 +116,123 @@ public class BytedanceMaterialReportDailyServiceImpl implements IBytedanceMateri
     }
 
 
-
     //头条-体验版素材日报--视频
     @Override
     public void bytedanceDailyMaterialReportJobV3Video(OauthToken oauthToken, String yesterda, String yesterda1, int page, int pageSize) throws Exception {
-        log.info("开始获取体验版-视频-素材日报 accountID:{},page:{} date:{}", oauthToken.getAccountId(), page,yesterda);
+        log.info("开始获取体验版-视频-素材日报 accountID:{},page:{} date:{}", oauthToken.getAccountId(), page, yesterda);
         // 请求地址
         String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V3_REPORT_INTEGRATED_GET;
-        Map<String,Object> param = new HashMap<>();
-        param.put("advertiser_id",oauthToken.getAccountId());
-        param.put("start_date",yesterda);
-        param.put("end_date",yesterda1);
-        param.put("page",page);
-        param.put("page_size",pageSize);
-        //List<String> fields = Arrays.asList("stat_cost");
-        //String fields1 = "[\"stat_cost\",\"show_cnt\",\"image_mode\"]";
-        // fields 入参 为拼接字符串数组形式 与入参 video_image_mode数组 && image_image_mode数组 格式不同
-        String fields = ByteDanceNewMaterialReport.getParamsFields();
-        param.put("fields",fields);
-        param.put("time_granularity","STAT_TIME_GRANULARITY_DAILY");
-        //param.put("group_by","STAT_GROUP_BY_DELIVERY_MODE");
-
-        Map<String,String> header = new HashMap<>();
-        header.put("Access-Token",oauthToken.getAccessToken());
-
-        //String video_image_mode = "[\"CREATIVE_IMAGE_MODE_VIDEO\",\"CREATIVE_IMAGE_MODE_VIDEO_VERTICAL\"]";
-        String[] video_image_mode = new String[]{"CREATIVE_IMAGE_MODE_VIDEO","CREATIVE_IMAGE_MODE_VIDEO_VERTICAL"};
-        //String image_image_mode = "[\"CREATIVE_IMAGE_MODE_LARGE\",\"CREATIVE_IMAGE_MODE_LARGE_VERTICAL\",\"CREATIVE_IMAGE_MODE_SMALL\"]";
-        String[] image_image_mode = new String[]{"CREATIVE_IMAGE_MODE_LARGE","CREATIVE_IMAGE_MODE_LARGE_VERTICAL","CREATIVE_IMAGE_MODE_SMALL"};
-
-        JSONObject filtering = new JSONObject();
-        Map<String,Object> video_material = new HashMap<>();
-        video_material.put("image_mode",video_image_mode);
-
-        Map<String,Object> image_material = new HashMap<>();
-        image_material.put("image_mode",image_image_mode);
-
-        filtering.put("video_material",video_material);
-        //filtering.put("image_material",image_material);
-
-        param.put("filtering",filtering);
-        JSONObject resultObject = JSONObject.parseObject(HttpUtils.httpGet(url, param,header));
+        Map<String, String> header = new HashMap<>();
+        header.put("Access-Token", oauthToken.getAccessToken());
 
+        Map<String, Object> param = new HashMap<>();
+        param.put("advertiser_id", oauthToken.getAccountId());
+        param.put("start_time", yesterda);
+        param.put("end_time", yesterda1);
+        param.put("page", page);
+        param.put("page_size", pageSize);
+        //维度:每日数据
+        List<String> dimensions = new ArrayList<>();
+        dimensions.add("material_id");
+        dimensions.add("stat_time_day");
+        dimensions.add("image_mode");
+        param.put("dimensions", mapper.writeValueAsString(dimensions));
+
+        //指标列表
+        param.put("metrics", ByteDanceNewMaterialReport.getParamsFields());
+        List<JSONObject> filters = new ArrayList<>();
+        JSONObject filter = new JSONObject();
+        filter.put("field", "stat_cost");
+        filter.put("type", 3);
+        filter.put("operator", 4);
+        filter.put("values", Arrays.asList("0"));
+        filters.add(filter);
+        param.put("filters", mapper.writeValueAsString(filters));
+
+        List<JSONObject> orderBy = new ArrayList<>();
+        JSONObject ord = new JSONObject();
+        ord.put("field", "material_id");
+        ord.put("type", "ASC");
+        orderBy.add(ord);
+        param.put("order_by", mapper.writeValueAsString(orderBy));
+        String result = HttpUtils.httpGet(url, param, header);
+        JSONObject resultObject = JSONObject.parseObject(result);
         Integer code = resultObject.getInteger("code");
         if (null == code || !code.equals(0)) {
             log.error("获取体验版-视频-素材日报接口异常==》accountId:{},message:{}", oauthToken.getAccountId(), resultObject.getString("message"));
             return;
         }
-        JSONArray data = resultObject.getJSONObject("data").getJSONArray("list");
+        JSONArray data = resultObject.getJSONObject("data").getJSONArray("rows");
         if (null == data || data.isEmpty()) {
             log.error("获取体验版-视频-素材数据为空==》accountId:{}", oauthToken.getAccountId());
             return;
         }
-        List<ByteDanceNewMaterialReport> list = new ArrayList<>();
-
+        List<ByteDanceNewMaterialReport> videolist = new ArrayList<>();
+        List<ByteDanceNewMaterialReport> imageList = new ArrayList<>();
         for (int i = 0; i < data.size(); i++) {
             JSONObject dataObject = data.getJSONObject(i);
-            Long materialId = dataObject.getLong("material_id");
-            String statDatetime = dataObject.getString("stat_datetime");
-            Integer dateTime = DateUtils.getDateInteger(statDatetime);
-            JSONArray data1 = dataObject.getJSONArray("data");
-            for (Object o : data1) {
-                JSONObject j = JSONObject.parseObject(o.toString());
-                ByteDanceNewMaterialReport report = JSONObject.parseObject(j.toJSONString(), ByteDanceNewMaterialReport.class);
-                report.setAdvertiserId(oauthToken.getAccountId());
-                report.setMaterialId(materialId);
-                report.setStatDatetime(dateTime);
-                list.add(report);
+            JSONObject dim = dataObject.getJSONObject("dimensions");
+            ByteDanceNewMaterialReport report = JSONObject.parseObject(dataObject.getJSONObject("metrics").toJSONString(), ByteDanceNewMaterialReport.class);
+            report.setAdvertiserId(oauthToken.getAccountId());
+            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);
+            }
+            if (!Check.isNull(dim.getString("image_mode")) && dim.getString("image_mode").contains("图")) {
+                imageList.add(report);
             }
         }
-
-        bytedanceNewMaterialReportMapper.replaceBytedanceNewMaterialVideoDaily(list);
-
+        if (!Check.isNull(videolist)) {
+            bytedanceNewMaterialReportMapper.replaceBytedanceNewMaterialVideoDaily(videolist);
+        }
+        if (!Check.isNull(imageList)) {
+            bytedanceNewMaterialReportMapper.replaceBytedanceNewMaterialImageDaily(imageList);
+        }
         page++;
         int totalPage = resultObject.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
         if (page <= totalPage) {
             bytedanceDailyMaterialReportJobV3Video(oauthToken, yesterda, yesterda1, page, 100);
         }
-        log.error("获取体验版-视频-素材数据完成==》accountId:{}", oauthToken.getAccountId());
-
+        log.info("获取体验版-视频-素材数据完成==》accountId:{}", oauthToken.getAccountId());
     }
 
     //头条-体验版素材日报--图片
     @Override
     public void bytedanceDailyMaterialReportJobV3Image(OauthToken oauthToken, String yesterda, String yesterda1, int page, int pageSize) throws Exception {
-        log.info("开始获取体验版-图片-素材日报 accountID:{},page:{} date:{}", oauthToken.getAccountId(), page,yesterda);
+        log.info("开始获取体验版-图片-素材日报 accountID:{},page:{} date:{}", oauthToken.getAccountId(), page, yesterda);
         // 请求地址
         String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V3_REPORT_INTEGRATED_GET;
-        Map<String,Object> param = new HashMap<>();
-        param.put("advertiser_id",oauthToken.getAccountId());
-        param.put("start_date",yesterda);
-        param.put("end_date",yesterda1);
-        param.put("page",page);
-        param.put("page_size",pageSize);
-        //List<String> fields = Arrays.asList("stat_cost");
-        //String fields1 = "[\"stat_cost\",\"show_cnt\",\"image_mode\"]";
-        // fields 入参 为拼接字符串数组形式 与入参 video_image_mode数组 && image_image_mode数组 格式不同
+        Map<String, Object> param = new HashMap<>();
+        param.put("advertiser_id", oauthToken.getAccountId());
+        param.put("start_date", yesterda);
+        param.put("end_date", yesterda1);
+        param.put("page", page);
+        param.put("page_size", pageSize);
         String fields = ByteDanceNewMaterialReport.getParamsFields();
-        param.put("fields",fields);
-        param.put("time_granularity","STAT_TIME_GRANULARITY_DAILY");
-        //param.put("group_by","STAT_GROUP_BY_DELIVERY_MODE");
+        param.put("fields", fields);
+        param.put("time_granularity", "STAT_TIME_GRANULARITY_DAILY");
 
-        Map<String,String> header = new HashMap<>();
-        header.put("Access-Token",oauthToken.getAccessToken());
+        Map<String, String> header = new HashMap<>();
+        header.put("Access-Token", oauthToken.getAccessToken());
 
         //String video_image_mode = "[\"CREATIVE_IMAGE_MODE_VIDEO\",\"CREATIVE_IMAGE_MODE_VIDEO_VERTICAL\"]";
-        String[] video_image_mode = new String[]{"CREATIVE_IMAGE_MODE_VIDEO","CREATIVE_IMAGE_MODE_VIDEO_VERTICAL"};
+        String[] video_image_mode = new String[]{"CREATIVE_IMAGE_MODE_VIDEO", "CREATIVE_IMAGE_MODE_VIDEO_VERTICAL"};
         //String image_image_mode = "[\"CREATIVE_IMAGE_MODE_LARGE\",\"CREATIVE_IMAGE_MODE_LARGE_VERTICAL\",\"CREATIVE_IMAGE_MODE_SMALL\"]";
-        String[] image_image_mode = new String[]{"CREATIVE_IMAGE_MODE_LARGE","CREATIVE_IMAGE_MODE_LARGE_VERTICAL","CREATIVE_IMAGE_MODE_SMALL"};
+        String[] image_image_mode = new String[]{"CREATIVE_IMAGE_MODE_LARGE", "CREATIVE_IMAGE_MODE_LARGE_VERTICAL", "CREATIVE_IMAGE_MODE_SMALL"};
 
         JSONObject filtering = new JSONObject();
-        Map<String,Object> video_material = new HashMap<>();
-        video_material.put("image_mode",video_image_mode);
+        Map<String, Object> video_material = new HashMap<>();
+        video_material.put("image_mode", video_image_mode);
 
-        Map<String,Object> image_material = new HashMap<>();
-        image_material.put("image_mode",image_image_mode);
+        Map<String, Object> image_material = new HashMap<>();
+        image_material.put("image_mode", image_image_mode);
 
 //        filtering.put("video_material",video_material);
-        filtering.put("image_material",image_material);
+        filtering.put("image_material", image_material);
 
-        param.put("filtering",filtering);
-        JSONObject resultObject = JSONObject.parseObject(HttpUtils.httpGet(url, param,header));
+        param.put("filtering", filtering);
+        JSONObject resultObject = JSONObject.parseObject(HttpUtils.httpGet(url, param, header));
 
         Integer code = resultObject.getInteger("code");
         if (null == code || !code.equals(0)) {
@@ -246,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");
@@ -271,4 +273,26 @@ public class BytedanceMaterialReportDailyServiceImpl implements IBytedanceMateri
 
     }
 
+    //Unicode转中文方法
+    public static String unicodeToCn(String unicode) {
+        /** 以 \ u 分割,因为java注释也能识别unicode,因此中间加了一个空格*/
+        String[] strs = unicode.split("\\\\u");
+        String returnStr = "";
+        // 由于unicode字符串以 \ u 开头,因此分割出的第一个字符是""。
+        for (int i = 1; i < strs.length; i++) {
+            returnStr += (char) Integer.valueOf(strs[i], 16).intValue();
+        }
+        return returnStr;
+    }
+
+    public String unicodeDecode(String unicode) {
+        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
+        Matcher matcher = pattern.matcher(unicode);
+        char ch = 0;
+        while (matcher.find()) {
+            ch = (char) Integer.parseInt(matcher.group(2), 16);
+            unicode = unicode.replace(matcher.group(1), ch + "");
+        }
+        return unicode;
+    }
 }

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

@@ -0,0 +1,96 @@
+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.entity.BytedanceCdpProject;
+import cn.com.ctop.job.bytedance.data.entity.OauthToken;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceProjectMapper;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceProjectService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.HttpUtils;
+import cn.com.ctop.job.bytedance.utils.RedisUtil;
+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.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 获取项目列表
+ */
+@Service
+@Slf4j
+public class BytedanceProjectServiceImpl implements IBytedanceProjectService {
+    @Value("${api.bytedance.api-prefix}")
+    private String bytedanceApiUrl;
+
+    @Resource
+    BytedanceProjectMapper projectListMapper;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+
+    @Override
+    public void getProjectList(OauthToken oauthToken, String startDate, String endDate, int page) {
+        log.info("开始获取获取项目列表 accountId:{},日期{},page:{}", oauthToken.getAccountId(), startDate, page);
+        try {
+            // 请求地址
+            String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V3_PROJECT_LIST_GET;
+            JSONObject param = new JSONObject();
+            param.put("advertiser_id", oauthToken.getAccountId());
+            param.put("page", page);
+            param.put("page_size", 100);
+            JSONObject filtering = new JSONObject();
+            filtering.put("project_modify_time", startDate);
+            filtering.put("project_create_time", startDate);
+            param.put("filtering", filtering);
+            JSONObject resultObject = HttpUtils.bytedanceGetRequest(oauthToken.getAccessToken(), url, param);
+            if (Check.isNull(resultObject)) {
+                log.error("获取项目列表异常==》accountId:{},调用结果为null", oauthToken.getAccountId());
+                return;
+            }
+            Integer code = resultObject.getInteger("code");
+            if (null == code || !code.equals(0)) {
+                log.error("获取获取项目列表接口异常==》accountId:{},message:{},code{}", oauthToken.getAccountId(), resultObject.getString("message"), code);
+                return;
+            }
+            JSONArray data = resultObject.getJSONObject("data").getJSONArray("list");
+            if (null == data || data.isEmpty()) {
+                log.error("获取获取项目列表数据为空==》accountId:{},message:{},code:{}", oauthToken.getAccountId(), resultObject.getString("message"), code);
+                return;
+            }
+            List<BytedanceCdpProject> list = new ArrayList<>();
+            for (int i = 0; i < data.size(); i++) {
+                JSONObject dataObject = data.getJSONObject(i);
+                BytedanceCdpProject report = JSONObject.parseObject(dataObject.toJSONString(), BytedanceCdpProject.class);
+                list.add(report);
+            }
+            projectListMapper.replaceProjectList(list);
+            page++;
+            int totalPage = resultObject.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
+            if (page <= totalPage) {
+                getProjectList(oauthToken, startDate, endDate, page);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void updProjectStatus(OauthToken token, Long projectId, String disable) {
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", token.getAccountId());
+        JSONObject data = new JSONObject();
+        data.put("project_id", projectId);
+        data.put("opt_status", disable);
+        List<JSONObject> list = new ArrayList<>();
+        list.add(data);
+        params.put("data", list);
+        String url = bytedanceApiUrl + "/v3.0/project/status/update/";
+        JSONObject object = HttpUtils.bytedancePostRequest(token.getAccessToken(), url, params);
+    }
+}

+ 28 - 12
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/OauthTokenServiceImpl.java

@@ -3,6 +3,7 @@ package cn.com.ctop.job.bytedance.data.service.impl;
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
 import cn.com.ctop.job.bytedance.data.mapper.OauthTokenMapper;
 import cn.com.ctop.job.bytedance.data.service.IOauthTokenService;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -17,16 +18,31 @@ import java.util.List;
  */
 @Service
 public class OauthTokenServiceImpl extends ServiceImpl<OauthTokenMapper, OauthToken> implements IOauthTokenService {
-  @Autowired
-  private OauthTokenMapper tokenMapper;
-
-  @Override
-  public String getByAccountId(Long accountId) {
-    return tokenMapper.getByAccountId(accountId);
-  }
-
-  @Override
-  public List<Long> getAgentByTouTiao() {
-    return tokenMapper.getAgentByTouTiao();
-  }
+    @Autowired
+    private OauthTokenMapper tokenMapper;
+
+    @Override
+    public String getByAccountId(Long accountId) {
+        return tokenMapper.getByAccountId(accountId);
+    }
+
+    @Override
+    public List<Long> getAgentByTouTiao() {
+        return tokenMapper.getAgentByTouTiao();
+    }
+
+    @Override
+    public List<Long> getAllToutiaoAccountIds() {
+        return tokenMapper.getAllToutiaoAccountIds();
+    }
+
+    @Override
+    public String getAgentToken(Long accountId) {
+        return tokenMapper.getAgentToken(accountId);
+    }
+
+    @Override
+    public List<JSONObject> getAgentTokens() {
+        return tokenMapper.getAgentTokens();
+    }
 }

+ 26 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/DateUtils.java

@@ -78,5 +78,31 @@ public class DateUtils {
         return lDate;
     }
 
+    /**
+     * 获取 两个日期之间的所有 日期
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public static List<String> getAllDatesOfTwoTimes(String startDate, String endDate) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        List<String> dateList = new ArrayList<String>();
+        try {
+            Date dateOne = sdf.parse(startDate);
+            Date dateTwo = sdf.parse(endDate);
 
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(dateOne);
+
+            dateList.add(startDate);
+            while (calendar.getTime().before(dateTwo)) { //倒序时间,顺序after改before其他相应的改动。
+                calendar.add(Calendar.DAY_OF_MONTH, 1);
+                dateList.add(sdf.format(calendar.getTime()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dateList;
+    }
 }

+ 42 - 7
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/HttpUtils.java

@@ -24,6 +24,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.impl.cookie.BasicClientCookie;
+import org.apache.http.protocol.HTTP;
 import org.apache.http.ssl.SSLContextBuilder;
 import org.apache.http.util.EntityUtils;
 
@@ -152,7 +153,7 @@ public class HttpUtils {
                 return JSONObject.parseObject(result.toString());
             }
         } catch (Exception e) {
-            log.info("地址:{},---参数{},---调用发生了异常=======》{}",url,e,params);
+            log.info("地址:{},---参数{},---调用发生了异常=======》{}", url, e, params);
             e.printStackTrace();
         } finally {
             try {
@@ -170,8 +171,6 @@ public class HttpUtils {
     }
 
 
-
-
     public static HttpClient getHttpclient() {
         RequestConfig defaultRequestConfig = RequestConfig.custom().setSocketTimeout(180000).setConnectTimeout(30000)
                 .setConnectionRequestTimeout(30000).setStaleConnectionCheckEnabled(true).build();
@@ -212,12 +211,10 @@ public class HttpUtils {
                     httpget.setHeader(key, headers.get(key));
                 }
             }
-            HttpEntity respEntity;
             HttpResponse response = httpclient.execute(httpget);
-            respEntity = response.getEntity();
+            HttpEntity entity = response.getEntity();
             Header[] responseHeaders = response.getHeaders("Set-Cookie");
             if (responseHeaders != null) {
-
                 for (Header header : responseHeaders) {
                     String[] ckArray = header.getValue().split(";");
                     BasicClientCookie ck = new BasicClientCookie(ckArray[0].split("=")[0], ckArray[0].split("=")[1]);
@@ -226,7 +223,7 @@ public class HttpUtils {
                     HttpUtils.COOKIESTORE.addCookie(ck);
                 }
             }
-            result = EntityUtils.toString(respEntity);
+            result = EntityUtils.toString(entity, HTTP.UTF_8);
         } catch (Exception e) {
             log.error("http get请求异常");
             e.printStackTrace();
@@ -235,4 +232,42 @@ public class HttpUtils {
     }
 
 
+    public static JSONObject bytedancePostRequest(String accessToken, String url, JSONObject params) {
+        // 构造请求
+        HttpPost httpEntity = new HttpPost(url);
+        httpEntity.setHeader("Access-Token", accessToken);
+        CloseableHttpResponse response = null;
+        CloseableHttpClient client = null;
+        try {
+            client = HttpClientBuilder.create().build();
+            httpEntity.setEntity(new StringEntity(params.toJSONString(), ContentType.APPLICATION_JSON));
+            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(12000).setConnectTimeout(12000).build();
+            httpEntity.setConfig(requestConfig);
+            response = client.execute(httpEntity);
+            if (response != null && response.getStatusLine().getStatusCode() == 200) {
+                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
+                StringBuilder result = new StringBuilder();
+                String line = "";
+                while ((line = bufferedReader.readLine()) != null) {
+                    result.append(line);
+                }
+                bufferedReader.close();
+                return JSONObject.parseObject(result.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                if (client != null) {
+                    client.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
 }

+ 188 - 19
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertiseLoadJob.java

@@ -38,9 +38,6 @@ public class BytedanceAdvertiseLoadJob {
     private IByteDanceAdvertiserDataService advertiserDataService;
 
 
-
-
-
     @Autowired
     private RedisUtil redisUtil;
 
@@ -56,7 +53,7 @@ public class BytedanceAdvertiseLoadJob {
 
         //获取广告主信息异常的key
         Set<String> set = redisUtil.kesy("ADVERTISER*");
-        if (Check.isNull(set)){
+        if (Check.isNull(set)) {
             return;
         }
 
@@ -66,11 +63,11 @@ public class BytedanceAdvertiseLoadJob {
 
             //添加重试
             List<Object> adAccountList;
-            adAccountList = redisUtil.getList(key,null);
+            adAccountList = redisUtil.getList(key, null);
             //遍历key下的所有信息
             for (Object accountId : adAccountList) {
 
-               // log.info("广告主遗漏数据补充,日期:{},accountId:{}",key,adAccountList.toString());
+                // log.info("广告主遗漏数据补充,日期:{},accountId:{}",key,adAccountList.toString());
                 String token = tokenService.getByAccountId(Long.valueOf(String.valueOf(accountId)));
                 if (Check.isNull(token)) {
                     log.error("此账户未获取到相关token,accountId:{}", accountId);
@@ -80,17 +77,20 @@ public class BytedanceAdvertiseLoadJob {
                 OauthToken oauthToken = new OauthToken();
                 oauthToken.setAccessToken(token);
                 oauthToken.setAccountId(Long.valueOf(String.valueOf(accountId)));
+                String time = key.replaceAll("ADVERTISER", "");
+                if(Check.isNull(time)){
+                    continue;
+                }
+                advertiserDataService.getAdvertiserReport(oauthToken, time, time, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
 
-                advertiserDataService.getAdvertiserReport(oauthToken, key.replaceAll("ADVERTISER",""), key.replaceAll("ADVERTISER",""), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-
-                adAccountList = redisUtil.getList(key,null);
+                adAccountList = redisUtil.getList(key, null);
 
-                if (adAccountList.size() == 0){
+                if (adAccountList.size() == 0) {
                     redisUtil.delete(key);
                 }
 
                 try {
-                    Thread.sleep(1000*2);
+                    Thread.sleep(1000 * 2);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
@@ -100,15 +100,9 @@ public class BytedanceAdvertiseLoadJob {
         }
 
 
-
-
     }
 
 
-
-
-
-
     /**
      * 广告主日报
      *
@@ -136,6 +130,7 @@ public class BytedanceAdvertiseLoadJob {
                 new Runnable() {
                     @Override
                     public void run() {
+                        advertiserDataService.getAdvertiserReport(oauthToken, nowDate, nowDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
                         advertiserDataService.getAdvertiserReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
                         advertiserDataService.getAdvertiserReport(oauthToken, yesterda2, yesterda2, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
                     }
@@ -143,6 +138,40 @@ public class BytedanceAdvertiseLoadJob {
     }
 
     /**
+     * 广告主日报 分版位
+     *
+     * @throws Exception
+     */
+    @XxlJob("bytedancePositionAdvertiserDailyReport")
+    public void bytedancePositionAdvertiserDailyReport() 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.getPositionAdvertiserReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+//                        advertiserDataService.getPositionAdvertiserReport(oauthToken, yesterda2, yesterda2, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+                        advertiserDataService.getPositionAdvertiserReport(oauthToken, yesterda2, nowDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+                    }
+                });
+    }
+
+    /**
      * 广告主时报
      *
      * @throws Exception
@@ -186,10 +215,151 @@ public class BytedanceAdvertiseLoadJob {
 
 
     /**
+     * 广告主日报
+     *
+     * @throws Exception
+     */
+    @XxlJob("bytedanceAdvertiserV3DailyReport")
+    public void bytedanceAdvertiserV3DailyReport() 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.getV3AdvertiserReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+                        advertiserDataService.getV3AdvertiserReport(oauthToken, yesterda2, yesterda2, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+                    }
+                });
+    }
+
+    /**
+     * 广告日报
+     *
+     * @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
+     */
+    @XxlJob("bytedanceV3PromotionProjectReportHour")
+    public void bytedanceV3PromotionProjectReportHour() 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_HOURLY);
+                        advertiserDataService.getV3PromotionProjectReport(oauthToken, nowDate, nowDate, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_HOURLY);
+                    }
+                });
+    }
+
+    /**
+     * 广告主时报
+     *
+     * @throws Exception
+     */
+    @XxlJob("bytedanceAdvertiserV3HourlyReport")
+    public void bytedanceAdvertiserV3HourlyReport() 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));
+
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+
+        hourExecutorService.submit(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        if ("00".equals(hour)) {
+                            advertiserDataService.getV3AdvertiserReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_HOURLY);
+                        }
+                        advertiserDataService.getV3AdvertiserReport(oauthToken, nowDate, nowDate, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_HOURLY);
+                        advertiserDataService.getV3AdvertiserReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_HOURLY);
+
+                    }
+                });
+    }
+
+    /**
      * master
      */
     @XxlJob("bytedanceAdvertiserHourlyReport2")
-    public void bytedanceAdvertiserHourlyReport2(){
+    public void bytedanceAdvertiserHourlyReport2() {
         String token = tokenService.getByAccountId(1714136819636232L);
         OauthToken oauthToken = new OauthToken();
         oauthToken.setAccessToken(token);
@@ -201,5 +371,4 @@ public class BytedanceAdvertiseLoadJob {
     }
 
 
-
 }

+ 11 - 10
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAgentLoadJob.java

@@ -5,6 +5,7 @@ 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.IOauthTokenService;
 import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+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;
@@ -40,22 +41,22 @@ public class BytedanceAgentLoadJob {
      */
     @XxlJob("bytedanceAgentDailyReport")
     public void bytedanceAdvertiserDailyReport() throws Exception {
-
-        List<Long> agentByTouTiao = tokenService.getAgentByTouTiao();
+        List<JSONObject> tokens = tokenService.getAgentTokens();
         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);
-        for (Long aLong : agentByTouTiao) {
-            String token = tokenService.getByAccountId(Long.valueOf(aLong));
+        String yesterda3 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -3);
+        for (JSONObject obj : tokens) {
             OauthToken oauthToken = new OauthToken();
-            oauthToken.setAccessToken(token);
-            oauthToken.setAccountId(aLong);
+            oauthToken.setAccessToken(obj.getString("access_token"));
+            oauthToken.setAccountId(obj.getLong("agent_id"));
             dailyExecutorService.submit(
                     new Runnable() {
                         @Override
                         public void run() {
-                            advertiserDataService.getAgentReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-                            advertiserDataService.getAgentReport(oauthToken, yesterda2, yesterda2, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+                            advertiserDataService.getAgentReport(oauthToken, yesterda, yesterda);
+                            advertiserDataService.getAgentReport(oauthToken, yesterda2, yesterda2);
+                            advertiserDataService.getAgentReport(oauthToken, yesterda3, yesterda3);
                         }
                     });
         }
@@ -84,8 +85,8 @@ public class BytedanceAgentLoadJob {
                     new Runnable() {
                         @Override
                         public void run() {
-                            advertiserDataService.getAgentReport(oauthToken, nowDate, nowDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
-                            advertiserDataService.getAgentReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+//                            advertiserDataService.getAgentReport(oauthToken, nowDate, nowDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+//                            advertiserDataService.getAgentReport(oauthToken, yesterda, yesterda, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
 
                         }
                     });

+ 12 - 14
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")
@@ -100,8 +102,11 @@ public class BytedanceMaterialReportLoadJob {
                     public void run() {
                         try {
                             materialReportDailyService.bytedanceDailyMaterialReportJobV3Video(oauthToken, yesterda1, yesterda, 1, 100);
-                            materialReportDailyService.bytedanceDailyMaterialReportJobV3Image(oauthToken, yesterda1, yesterda, 1, 100);
-                        }catch (Exception e){
+//                            materialReportDailyService.bytedanceDailyMaterialReportJobV3Image(oauthToken, yesterda1, yesterda, 1, 100);
+
+                            //V3 素材
+                            advertiserDataService.getV3PromotionMaterialReport(oauthToken, yesterda1, yesterda, CtopAdConstant.BYTEDANCE_REPORT_V3_TYPE_DAILY);
+                        } catch (Exception e) {
                             e.printStackTrace();
                         }
                     }
@@ -110,11 +115,4 @@ public class BytedanceMaterialReportLoadJob {
     }
 
 
-
-
-
-
-
-
-
 }

+ 69 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceProjectJob.java

@@ -0,0 +1,69 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.job.bytedance.data.entity.OauthToken;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceProjectService;
+import cn.com.ctop.job.bytedance.data.service.IOauthTokenService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import com.xxl.job.core.context.XxlJobHelper;
+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.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 获取项目列表
+ */
+@Slf4j
+@Component
+public class BytedanceProjectJob {
+    @Autowired
+    private IOauthTokenService tokenService;
+
+    private static ExecutorService dailyExecutorService = Executors.newFixedThreadPool(3);
+
+
+    @Autowired
+    private IBytedanceProjectService projectService;
+
+
+    /**
+     * 获取项目列表
+     *
+     */
+    @XxlJob("getV3Project")
+    public void getV3Project() 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() {
+                        projectService.getProjectList(oauthToken, nowDate, nowDate, 1);
+                        projectService.getProjectList(oauthToken, yesterda, yesterda, 1);
+                        projectService.getProjectList(oauthToken, yesterda2, yesterda2, 1);
+                    }
+                });
+
+
+    }
+
+}