Просмотр исходного кода

Merge remote-tracking branch 'origin/master' into pingkang

# Conflicts:
#	job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java
#	job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceReportRetryJob.java
huangpingkang 1 год назад
Родитель
Сommit
d1630a8c35
45 измененных файлов с 2260 добавлено и 96 удалено
  1. 40 3
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java
  2. 41 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/FeishuController.java
  3. 16 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/AdvertiserAccount.java
  4. 78 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceFlowDetailsReportDaily.java
  5. 59 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceByteAppInfo.java
  6. 200 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceCdpProject.java
  7. 50 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceWxAppInfo.java
  8. 22 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/enums/AccountTypeEnum.java
  9. 5 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/AdminAdvertiserListMapper.java
  10. 21 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ByteDanceFlowDetailsReportMapper.java
  11. 37 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceCdpProjectMapper.java
  12. 2 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceRefreshTokenMapper.java
  13. 8 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ReportsAdPushMapper.java
  14. 10 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ToolsSiteMapper.java
  15. 20 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/AdminAdvertiserListMapper.xml
  16. 53 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ByteDanceFlowDetailsReportMapper.xml
  17. 173 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceCdpProjectListMapper.xml
  18. 6 3
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedancePromoterReportMapper.xml
  19. 17 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceRefreshTokenMapper.xml
  20. 63 18
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ReportsAdPushMapper.xml
  21. 86 6
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ToolsSiteMapper.xml
  22. 6 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IAdminAdvertiserListService.java
  23. 17 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IByteDanceFlowDetailsReportService.java
  24. 30 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceCdpProjectService.java
  25. 5 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IDateReportsPushService.java
  26. 11 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IToolsSiteService.java
  27. 9 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IUnbindWarnPushService.java
  28. 10 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/AdminAdvertiserListServiceImpl.java
  29. 160 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ByteDanceFlowDetailsReportServiceImpl.java
  30. 395 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceCdpProjectServiceImpl.java
  31. 175 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/DateReportsPushServiceImpl.java
  32. 4 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/OptimizerRankPushServiceImpl.java
  33. 5 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsAdPushServiceImpl.java
  34. 81 17
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ToolsSiteServiceImpl.java
  35. 21 5
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/TotalRankPushServiceImpl.java
  36. 9 4
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/UnbindWarnPushServiceImpl.java
  37. 13 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/DateUtils.java
  38. 21 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/RandomStringGenerator.java
  39. 10 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AdminAdvertiserListJob.java
  40. 55 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceFlowDetailsReportJob.java
  41. 171 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceCdpProjectJob.java
  42. 15 18
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceReportRetryJob.java
  43. 6 4
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/FeishuPushJob.java
  44. 19 7
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ToolsSiteJob.java
  45. 5 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/utils/FeishuRobotUtil.java

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

@@ -1,6 +1,9 @@
 package cn.com.ctop.job.bytedance.controller;
 
 import cn.com.ctop.job.bytedance.data.service.*;
+import cn.com.ctop.job.bytedance.data.entity.AdvertiserAccount;
+import cn.com.ctop.job.bytedance.data.enums.AccountTypeEnum;
+import cn.com.ctop.job.bytedance.data.service.*;
 import cn.com.ctop.job.bytedance.data.utils.Check;
 import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.Api;
@@ -35,6 +38,9 @@ public class BytedanceController {
     private IAdminAdvertiserListService adminAdvertiserListService;
 
     @Autowired
+    private IByteDanceFlowDetailsReportService byteDanceFlowDetailsReportService;
+
+    @Autowired
     private IBytedanceAccountReportService accountReportService;
 
     @Autowired
@@ -46,7 +52,12 @@ public class BytedanceController {
 
     @GetMapping("/accountReport")
     public void getChannel(String param) {
-        List<JSONObject> allList = promoterReportService.getAllList();
+
+        List<JSONObject>  infos = adminAdvertiserListService.getAdvertiserInfos();
+        System.err.println(infos);
+        adminAdvertiserListService.batchUpdateAdvertiserName(infos);
+
+      /*  List<JSONObject> allList = promoterReportService.getAllList();
         for (int i = 0; i < allList.size(); i++) {
             JSONObject jsonObject = allList.get(i);
             Long advertiserId = jsonObject.getLong("advertiserId");
@@ -58,11 +69,15 @@ public class BytedanceController {
                     if (!Check.isNull(accessToken)) {
                         accountReportService.getBytedanceAccountDaily(advertiserId, accessToken, "2025-02-15", "2025-03-25", 1, 1);
                         //      accountReportService.getBytedanceAccountHour(advertiserId, accessToken, "2025-02-15", "2025-03-25", 1, 1);
+                        accountReportService.getBytedanceAccountDaily(advertiserId, accessToken, "2025-01-01", "2025-03-25", 1, 1);
+                    //    accountReportService.getBytedanceAccountHour(advertiserId, accessToken, "2025-01-01", "2025-03-25", 1, 1);
+                      //  promoterReportService.getBytedancePromoterHour(advertiserId, accessToken, "2025-01-01", "2025-03-25", 1, 1);
+                        promoterReportService.getBytedancePromoterDaily(advertiserId, accessToken, "2025-01-01", "2025-03-25", 1, 1);
                     }
                 }
             });
 
-        }
+        }*/
 
 
     }
@@ -83,7 +98,6 @@ public class BytedanceController {
                 }
             });
         }
-    }
 
     @GetMapping("/maEcpm")
     public void maEcpm(@RequestParam(required = false) String appId, String startDate, String endDate) {
@@ -99,5 +113,28 @@ public class BytedanceController {
         }
     }
 
+    @GetMapping("/flowDetailsReport")
+    public void flowDetailsReport(@RequestParam(required = false) Long advertiserId, String accessToken, String startDate, String endDate) {
+
+        byteDanceFlowDetailsReportService.getBytedanceFlowDetailsDailyReport(advertiserId, accessToken, AccountTypeEnum.AD.getValue(), startDate, endDate, 1, null);
+
+    }
+
+    @GetMapping("/generateFlowDetailsReport")
+    public void generateFlowDetailsReport(String startDate, String endDate) {
+        List<AdvertiserAccount> adAccount = byteDanceFlowDetailsReportService.getAdAccount();
+        adAccount.forEach(advertiserAccount -> {
+            dailyRetrExecutorService.submit(new Runnable() {
+
+                @Override
+                public void run() {
+                    if(!Check.isNull(advertiserAccount.getAccessToken())){
+                        byteDanceFlowDetailsReportService.getBytedanceFlowDetailsDailyReport(advertiserAccount.getAdvertiserId(), advertiserAccount.getAccessToken(), AccountTypeEnum.AD.getValue(), startDate, endDate, 1, null);
+                    }
+                }
+            });
+
+        });
+    }
 
 }

+ 41 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/FeishuController.java

@@ -0,0 +1,41 @@
+package cn.com.ctop.job.bytedance.controller;
+
+import cn.com.ctop.job.bytedance.data.service.*;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/feishu")
+@Api(tags = "飞书推送")
+public class FeishuController {
+
+    @Autowired
+    ITotalRankPushService totalRankPushService;
+    @Autowired
+    IOptimizerRankPushService optimizerRankPushService;
+    @Autowired
+    IReportsAdPushService reportsAdPushService;
+    @Autowired
+    IDateReportsPushService dateReportsPushService;
+    @Autowired
+    IUnbindWarnPushService unbindWarnPushService;
+    @Autowired
+    IBindAppErrorWarnService bindAppErrorWarnService;
+    @GetMapping("/test")
+    public void test(){
+        bindAppErrorWarnService.send();
+        System.out.println("---feishu test 收到---");
+    }
+
+    @PostMapping("/sendUnbind")
+    public void sendUnbind(@RequestBody JSONObject obj){
+        JSONArray array = obj.getJSONArray("advertiserIds");
+        List<String> list = array.toJavaList(String.class);
+        unbindWarnPushService.send(list, false);
+    }
+}

+ 16 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/AdvertiserAccount.java

@@ -0,0 +1,16 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import lombok.Data;
+
+/**
+ * @author lining
+ * @ClassName AdvertiserAccount
+ * @description: TODO
+ * @date 2025年04月27日
+ * @version: 1.0
+ */
+@Data
+public class AdvertiserAccount {
+    private Long advertiserId;
+    private String accessToken;
+}

+ 78 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/ByteDanceFlowDetailsReportDaily.java

@@ -0,0 +1,78 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author lining
+ * @ClassName ByteDanceFlowDetailsReport
+ * @description: TODO
+ * @date 2025年04月16日
+ * @version: 1.0
+ */
+@Data
+@Builder
+public class ByteDanceFlowDetailsReportDaily {
+    /**
+     * 广告主ID
+     */
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    private Integer statTimeDay;
+
+    /**
+     * 日终结余(单位元)
+     */
+    private BigDecimal balance;
+    /**
+     * 日终赠款结余(单位元)。包括冻结和实结订单pending部分
+     */
+    private BigDecimal grantBalance;
+    /**
+     * 日终非赠款结余(单位元)。包括冻结和实结订单pending部分
+     */
+    private BigDecimal nonGrantBalance;
+    /**
+     * 现金支出(单位元)
+     */
+    private BigDecimal cashCost;
+    /**
+     * 总支出(单位元)
+     */
+    private BigDecimal cost;
+
+    /**
+     * 冻结(单位元)
+     */
+    private BigDecimal frozen;
+    /**
+     * 总存入(单位元)
+     */
+    private BigDecimal income;
+    /**
+     * 赠款支出(单位元)
+     */
+    private BigDecimal rewardCost;
+
+    /**
+     * 共享返货支出(单位元)
+     */
+    private BigDecimal sharedWalletCost;
+    /**
+     * 账户消耗的子钱包的共享余额(单位元)
+     */
+    private BigDecimal companyWalletCost;
+    /**
+     * 总转入(单位元)
+     */
+    private BigDecimal transferIn;
+
+    /**
+     * 总转出(单位元)
+     */
+    private BigDecimal transferOut;
+}

+ 59 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceByteAppInfo.java

@@ -0,0 +1,59 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 字节微小对象 bytedance_byte_app_info
+ *
+ * @author ruoyi
+ * @date 2025-04-23
+ */
+@Data
+public class BytedanceByteAppInfo {
+
+    /**
+     * 账户ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 字节小程序名称
+     */
+    private String byteAppName;
+
+    /**
+     * 字节小程序app id
+     */
+    private String byteAppId;
+
+    /**
+     * 小程序资产ID
+     */
+    private Long instanceId;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public BytedanceByteAppInfo() {
+    }
+
+    public BytedanceByteAppInfo(JSONObject entity, Long advertiserId) {
+        this.advertiserId = advertiserId;
+        this.byteAppName = entity.getString("name");
+        this.byteAppId = entity.getString("app_id");
+        this.instanceId = entity.getLong("instance_id");
+    }
+}

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

@@ -0,0 +1,200 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 头条项目列对象 bytedance_cdp_project_list
+ *
+ * @author ruoyi
+ * @date 2025-04-23
+ */
+@Data
+public class BytedanceCdpProject {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 账户ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 项目ID
+     */
+    private Long projectId;
+
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 投放类型
+     */
+    private String deliveryType;
+
+    /**
+     * 推广目的
+     */
+    private String landingType;
+
+    /**
+     * 子目标
+     */
+    private String appPromotionType;
+
+    /**
+     * 营销场景
+     */
+    private String marketingGoal;
+
+    /**
+     * 广告类型
+     */
+    private String adType;
+
+    /**
+     * 项目创建时间
+     */
+    private String projectCreateTime;
+
+    /**
+     * 项目修改时间
+     */
+    private String projectModifyTime;
+
+    /**
+     * 出价方式
+     */
+    private String pricing;
+
+    /**
+     * 应用包名
+     */
+    private String packageName;
+
+    /**
+     * 应用名
+     */
+    private String appName;
+
+    /**
+     * 首选位置
+     */
+    private String inventoryType;
+
+    /**
+     * 商品库设置
+     */
+    private String productSetting;
+
+    /**
+     * 商品库ID
+     */
+    private Long productPlatformId;
+
+    /**
+     * 产品ID
+     */
+    private String productId;
+
+    /**
+     * 线索版产品ID
+     */
+    private Long uniqueProductId;
+
+    /**
+     * 投放条件ID
+     */
+    private Long assetId;
+
+    /**
+     * 推广产品
+     */
+    private String deliveryProduct;
+
+    /**
+     * 单投放载体
+     */
+    private String deliveryMedium;
+
+    /**
+     * 多投放载体
+     */
+    private String multiDeliveryMedium;
+
+    /**
+     * 下载链接
+     */
+    private String downloadUrl;
+
+    /**
+     * 小程序类型
+     */
+    private String microPromotionType;
+
+    /**
+     * 快应用资产ID
+     */
+    private Long quickAppId;
+
+    /**
+     * 小程序资产ID
+     */
+    private Long microAppInstanceId;
+
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public BytedanceCdpProject() {
+    }
+
+    public BytedanceCdpProject(JSONObject o) {
+        this.advertiserId = o.getLong("advertiser_id");
+        this.projectId = o.getLong("project_id");
+        this.projectName = o.getString("name");
+        this.deliveryType = o.getString("delivery_type");
+        this.landingType = o.getString("landing_type");
+        this.appPromotionType = o.getString("app_promotion_type");
+        this.marketingGoal = o.getString("marketing_goal");
+        this.adType = o.getString("ad_type");
+        this.projectCreateTime = o.getString("project_create_time");
+        this.projectModifyTime = o.getString("project_modify_time");
+        this.pricing = o.getString("pricing");
+        this.packageName = o.getString("package_name");
+        this.appName = o.getString("app_name");
+        JSONObject deliveryRange = o.getJSONObject("delivery_range");
+        if (!Check.isNull(deliveryRange)) {
+            this.inventoryType = deliveryRange.getString("inventory_type");
+        }
+        JSONObject relatedProduct = o.getJSONObject("related_product");
+        if (!Check.isNull(relatedProduct)) {
+            this.productSetting = relatedProduct.getString("product_setting");
+            this.productPlatformId = relatedProduct.getLong("product_platform_id");
+            this.productId = relatedProduct.getString("product_id");
+            this.uniqueProductId = relatedProduct.getLong("unique_product_id");
+        }
+        this.deliveryProduct = o.getString("delivery_product");
+        this.deliveryMedium = o.getString("delivery_medium");
+        this.multiDeliveryMedium = o.getString("multi_delivery_medium");
+        this.downloadUrl = o.getString("download_url");
+        this.microPromotionType = o.getString("micro_promotion_type");
+        this.quickAppId = o.getLong("quick_app_id");
+        this.microAppInstanceId = o.getLong("micro_app_instance_id");
+
+    }
+}

+ 50 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceWxAppInfo.java

@@ -0,0 +1,50 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 字节微小对象 bytedance_wx_app_info
+ *
+ * @author ruoyi
+ * @date 2025-04-23
+ */
+@Data
+public class BytedanceWxAppInfo {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 账户ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 小程序名称
+     */
+    private String appName;
+
+    /**
+     * 小程序原始ID
+     */
+    private String userNme;
+
+    /**
+     * 小程序资产ID
+     */
+    private Long instanceId;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+}

+ 22 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/enums/AccountTypeEnum.java

@@ -0,0 +1,22 @@
+package cn.com.ctop.job.bytedance.data.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author lining
+ * @ClassName FlowTransactionTypeEnum
+ * @description: TODO
+ * @date 2025年04月21日
+ * @version: 1.0
+ */
+@AllArgsConstructor
+@Getter
+public enum AccountTypeEnum {
+    AD("AD"),
+    LOCAL("LOCAL"),
+    STAR("STAR")
+    ;
+
+    private String value;
+}

+ 5 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/AdminAdvertiserListMapper.java

@@ -1,10 +1,15 @@
 package cn.com.ctop.job.bytedance.data.mapper;
 
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserList;
+import com.alibaba.fastjson.JSONObject;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 public interface AdminAdvertiserListMapper {
     void replaceBytedanceAdvertiserLists(@Param("adds") List<BytedanceAdvertiserList> advertiserLists);
+
+    List<JSONObject> getAdvertiserInfos();
+
+    void batchUpdateAdvertiserName(@Param("infos") List<JSONObject> infos);
 }

+ 21 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ByteDanceFlowDetailsReportMapper.java

@@ -0,0 +1,21 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+import cn.com.ctop.job.bytedance.data.entity.AdvertiserAccount;
+import cn.com.ctop.job.bytedance.data.entity.ByteDanceFlowDetailsReportDaily;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author lining
+ * @ClassName ByteDanceFlowDetailsReportMapper
+ * @description: TODO
+ * @date 2025年04月17日
+ * @version: 1.0
+ */
+public interface ByteDanceFlowDetailsReportMapper {
+
+    List<AdvertiserAccount> getAdAccount();
+
+    void replaceDanceFlowDetailsReportDailies(@Param("list") List<ByteDanceFlowDetailsReportDaily> dailyList);
+}

+ 37 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceCdpProjectMapper.java

@@ -0,0 +1,37 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+import cn.com.ctop.job.bytedance.data.entity.BytedanceCdpProject;
+import com.alibaba.fastjson.JSONArray;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 头条项目列Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-04-23
+ */
+public interface BytedanceCdpProjectMapper {
+
+    int replaceBytedanceCdpProjectList(@Param("projectList") List<BytedanceCdpProject> projectList);
+
+    void insertErrorAdvertiserId(@Param("advertiserId") Long advertiserId, @Param("type") String type);
+
+    List<Long> getAllAdverIdList(@Param("type") String type);
+
+    boolean delErrApps(@Param("type") String type);
+
+    List<Long> queryAdvertiserIds(@Param("db") String db, @Param("date") String date);
+
+    int replaceBytedanceByteAppInfo(@Param("list") JSONArray list, @Param("advertiserId") Long advertiserId);
+
+    int replaceBytedanceWxAppInfo(@Param("list") JSONArray list, @Param("advertiserId") Long advertiserId);
+
+    List<Long> queryMediaAdverIds(@Param("date") String date, @Param("mediaType") String mediaType);
+
+    int replaceAdqDynamicCreateives(@Param("list") JSONArray list, @Param("advertiserId") Long advertiserId);
+
+    List<Long> queryADQAdverIds(String date);
+
+}

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

@@ -15,4 +15,6 @@ public interface BytedanceRefreshTokenMapper {
     void updateBaiduYunToken(@Param("obj") JSONObject obj);
 
     String onlyGetToken(@Param("advertiserId") Long advertiserId);
+
+    String onlyGetADQToken(@Param("advertiserId") Long advertiserId);
 }

+ 8 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ReportsAdPushMapper.java

@@ -16,13 +16,19 @@ public interface ReportsAdPushMapper {
 
     //所有优化师消耗排名
     List<Map<String, String>> optimizerCostRank(@Param("date") Long date, @Param("hour") String hour);
+    //优化师当日数据
     List<Map<String, String>> optimizerDateData(@Param("date") Long date);
+    //优化师小时数据
     List<Map<String, String>> optimizerHourData(@Param("date") Long date, @Param("hour") String hour);
-
+    //全部部门排行
     List<Map<String, String>> deptCostRank(@Param("date") Long date, @Param("hour") String hour);
 
     //漏绑账户预警
-    List<Map<String, String>> unbindData(@Param("date") Long date, @Param("last90Day") Long last90Day);
+    List<Map<String, String>> unbindData(@Param("date") Long date, @Param("last90Day") Long last90Day,
+                                         @Param("list") List<String> list);
 
+    //错绑账户预警
     List<Map<String, String>> bindAppErrorData(@Param("last30Day") Long last30Day);
+    //部门前后项数据排名
+    List<Map<String, String>> deptRank2(@Param("date") Long date);
 }

+ 10 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ToolsSiteMapper.java

@@ -4,6 +4,7 @@ import cn.com.ctop.job.bytedance.data.entity.AdvertiserApplet;
 import cn.com.ctop.job.bytedance.data.entity.AdvertiserAvatar;
 import cn.com.ctop.job.bytedance.data.entity.AdvertiserNameInfo;
 import cn.com.ctop.job.bytedance.data.entity.AdvertiserToolsSite;
+import com.alibaba.fastjson.JSONObject;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -30,11 +31,19 @@ public interface ToolsSiteMapper {
 
     boolean insertAdvertiserAppList(AdvertiserApplet advertiserApplet);
 
+    boolean updateAdvertiserAppList2(AdvertiserApplet advertiserApplet);
+
     List<Long> getsiteAdvertiserIds();
 
+    List<JSONObject> getsiteAdvertiserIds2();
+
     boolean updateAdvertiserToolsSite(AdvertiserToolsSite advertiserToolsSite);
 
-    void insertAdvertiserToolsSite(AdvertiserToolsSite advertiserToolsSite);
+    boolean insertAdvertiserToolsSite(AdvertiserToolsSite advertiserToolsSite);
+
+    List<JSONObject> queryIsCreateSite(@Param("advertiserId") Long advertiserId, @Param("instanceId") Long instanceId);
 
+    List<AdvertiserApplet> queryAdvertiserAppList(@Param("advertiserId") Long advertiserId, @Param("platType") String platType);
 
+    List<JSONObject> getTimeOutAppList();
 }

+ 20 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/AdminAdvertiserListMapper.xml

@@ -4,7 +4,7 @@
 
 
     <insert id="replaceBytedanceAdvertiserLists">
-        INSERT ignore into deepthink.bytedance_advertiser_list(
+        INSERT  into deepthink.bytedance_advertiser_list(
         admin_advertiser_id,
         advertiser_id,
         advertiser_name,
@@ -19,5 +19,24 @@
             #{add.advertiserType}
             )
         </foreach>
+        on duplicate key update
+        advertiser_name= VALUES(advertiser_name)
     </insert>
+    <update id="batchUpdateAdvertiserName">
+        <foreach collection="infos" item="info" separator=";">
+            UPDATE deepthink.advertiser_bind_info
+            SET advertiser_name = #{info.advertiserName}
+            WHERE advertiser_id = #{info.advertiserId}
+            and media_type = 1
+        </foreach>
+
+    </update>
+    <select id="getAdvertiserInfos" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT t1.advertiser_id AS 'advertiserId', t2.advertiser_name AS 'advertiserName'
+        FROM deepthink.advertiser_bind_info t1
+                 LEFT JOIN deepthink.bytedance_advertiser_list t2
+                           ON t1.advertiser_id = t2.advertiser_id
+        WHERE t1.media_type = 1
+          AND t1.advertiser_name != t2.advertiser_name
+    </select>
 </mapper>

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

@@ -0,0 +1,53 @@
+<?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.ByteDanceFlowDetailsReportMapper">
+
+    <select id="getAdAccount" resultType="cn.com.ctop.job.bytedance.data.entity.AdvertiserAccount">
+        select
+            tb1.advertiser_id as advertiserId,
+            tb2.access_token as accessToken
+        from
+            deepthink.bytedance_advertiser_list tb1
+                left join deepthink.bytedance_auth_list tb2 on
+                tb1.admin_advertiser_id = tb2.admin_advertiser_id
+    </select>
+
+    <insert id="replaceDanceFlowDetailsReportDailies">
+        replace into bytedance_flow_details_report_daily (
+            advertiser_id,
+            stat_time_day,
+        balance,
+        grant_balance,
+        non_grant_balance,
+        cash_cost,
+        cost,
+        frozen,
+        income,
+        reward_cost,
+        shared_wallet_cost,
+        company_wallet_cost,
+        transfer_in,
+        transfer_out
+        )
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.advertiserId},
+            #{item.statTimeDay},
+            #{item.balance},
+            #{item.grantBalance},
+            #{item.nonGrantBalance},
+            #{item.cashCost},
+            #{item.cost},
+            #{item.frozen},
+            #{item.income},
+            #{item.rewardCost},
+            #{item.sharedWalletCost},
+            #{item.companyWalletCost},
+            #{item.transferIn},
+            #{item.transferOut}
+            )
+        </foreach>
+    </insert>
+</mapper>
+

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

@@ -0,0 +1,173 @@
+<?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.BytedanceCdpProjectMapper">
+
+    <insert id="replaceBytedanceCdpProjectList">
+        replace into media_api.bytedance_cdp_project_list (
+        advertiser_id,
+        project_id,
+        project_name,
+        delivery_type,
+        landing_type,
+        app_promotion_type,
+        marketing_goal,
+        ad_type,
+        project_create_time,
+        project_modify_time,
+        pricing,
+        package_name,
+        app_name,
+        inventory_type,
+        product_setting,
+        product_platform_id,
+        product_id,
+        unique_product_id,
+        asset_id,
+        delivery_product,
+        delivery_medium,
+        multi_delivery_medium,
+        download_url,
+        micro_promotion_type,
+        quick_app_id,
+        micro_app_instance_id
+        )
+        values
+        <foreach collection="projectList" item="item" separator=",">
+            (
+            #{item.advertiserId},
+            #{item.projectId},
+            #{item.projectName},
+            #{item.deliveryType},
+            #{item.landingType},
+            #{item.appPromotionType},
+            #{item.marketingGoal},
+            #{item.adType},
+            #{item.projectCreateTime},
+            #{item.projectModifyTime},
+            #{item.pricing},
+            #{item.packageName},
+            #{item.appName},
+            #{item.inventoryType},
+            #{item.productSetting},
+            #{item.productPlatformId},
+            #{item.productId},
+            #{item.uniqueProductId},
+            #{item.assetId},
+            #{item.deliveryProduct},
+            #{item.deliveryMedium},
+            #{item.multiDeliveryMedium},
+            #{item.downloadUrl},
+            #{item.microPromotionType},
+            #{item.quickAppId},
+            #{item.microAppInstanceId}
+            )
+        </foreach>
+    </insert>
+
+
+    <insert id="replaceBytedanceByteAppInfo">
+        replace into media_api.bytedance_byte_app_info (
+        advertiser_id,
+        byte_app_name,
+        byte_app_id,
+        instance_id
+        )
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{advertiserId},
+            #{item.name},
+            #{item.app_id},
+            #{item.instance_id}
+            )
+        </foreach>
+    </insert>
+
+
+    <insert id="replaceBytedanceWxAppInfo">
+        replace into media_api.bytedance_wx_app_info (
+        advertiser_id,
+        app_name,
+        user_nme,
+        instance_id
+        )
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{advertiserId},
+            #{item.name},
+            #{item.user_name},
+            #{item.instance_id}
+            )
+        </foreach>
+    </insert>
+
+    <insert id="insertErrorAdvertiserId">
+        replace
+        into media_api.error_advertiser (advertiser_id,`type`)
+        values(
+        #{advertiserId},
+        #{type}
+        )
+    </insert>
+
+    <select id="getAllAdverIdList" resultType="Long">
+        SELECT advertiser_id
+        FROM media_api.error_advertiser
+        where type = #{type}
+        order by create_time
+    </select>
+
+    <delete id="delErrApps">
+        DELETE
+        FROM media_api.error_advertiser
+        WHERE type =#{type}
+    </delete>
+
+
+    <select id="queryAdvertiserIds" resultType="Long">
+        SELECT DISTINCT advertiser_id
+        FROM media_api.${db}
+        where stat_time_day = #{date}
+        order by create_time
+    </select>
+
+    <select id="queryMediaAdverIds" resultType="Long">
+        SELECT DISTINCT advertiser_id
+        FROM media_api.bytedance_cdp_project_list
+        where micro_promotion_type = #{mediaType}
+        <if test="date != null">
+            AND project_modify_time &gt;= CONCAT(#{date}, ' 00:00:00')
+            AND project_modify_time &lt;= CONCAT(#{date}, ' 23:59:59')
+        </if>
+    </select>
+
+    <insert id="replaceAdqDynamicCreateives">
+        replace into media_api.adq_dynamic_createive_list(
+        advertiser_id,
+        adgroup_id,
+        dynamic_creative_id,
+        mini_program_id,
+        page_type
+        )
+        values
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{advertiserId},
+            #{item.adgroup_id},
+            #{item.dynamic_creative_id},
+            #{item.mini_program_id},
+            #{item.page_type}
+            )
+        </foreach>
+    </insert>
+
+    <select id="queryADQAdverIds" resultType="Long">
+        SELECT DISTINCT advertiser_id
+        FROM deepthink.adq_advertiser_list
+    </select>
+
+
+</mapper>

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

@@ -25,9 +25,12 @@
     </select>
     <select id="getAllList" resultType="com.alibaba.fastjson.JSONObject">
 
-        select t1.advertiser_id as 'advertiserId', t2.access_token as 'accessToken'
-        from deepthink.bytedance_advertiser_list t1
-                 left join deepthink.bytedance_auth_list t2 on t1.admin_advertiser_id = t2.admin_advertiser_id
+        SELECT t1.advertiser_id AS 'advertiserId', t2.access_token AS 'accessToken'
+        FROM deepthink.bytedance_advertiser_list t1
+                 LEFT JOIN deepthink.bytedance_auth_list t2 ON t1.admin_advertiser_id = t2.admin_advertiser_id
+        WHERE t2.admin_advertiser_id IN (1821394663286810,
+                                         1689471010162701
+            )
     </select>
 
     <insert id="replacePromoterReportHour">

+ 17 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceRefreshTokenMapper.xml

@@ -33,7 +33,23 @@
 
 
     <select id="onlyGetToken" resultType="java.lang.String">
-        select 'eb0cea58911b7a7fd30f3458f1d421a57d2b0078'
+        SELECT access_token
+        FROM deepthink.bytedance_auth_list
+        WHERE admin_advertiser_id =
+              (SELECT admin_advertiser_id
+               FROM deepthink.bytedance_advertiser_list
+               WHERE advertiser_id = #{advertiserId}
+            LIMIT 1)
+    </select>
+
+    <select id="onlyGetADQToken" resultType="java.lang.String">
+        SELECT access_token
+        FROM deepthink.adq_auth_list
+        WHERE admin_advertiser_id =
+              (SELECT admin_advertiser_id
+               FROM deepthink.adq_advertiser_list
+               WHERE advertiser_id = #{advertiserId}
+            LIMIT 1)
     </select>
 
 

+ 63 - 18
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ReportsAdPushMapper.xml

@@ -41,28 +41,37 @@
         ) tb2
     </select>
     <select id="tmpTopMovie" resultType="java.util.Map">
-        select tb1.*, ifnull(COALESCE (tb2.movie_name, tb3.movie_name), tb1.movie_id) as movie_name
+        select ot1.*, ot2.cost_amount, ot2.real_cost_amount,
+        concat(round(if(ifnull(cost_amount,0)=0, 0, end_amount/cost_amount*100), 2), '%') AS water_roi,
+        concat(round(if(ifnull(real_cost_amount,0)=0, 0, end_amount/real_cost_amount*100), 2), '%') AS real_roi
+        FROM
+        (select ifnull(COALESCE (tb2.movie_name, tb3.movie_name), tb1.movie_id) as movie_name,
+        rank() over (order by sum(end_amount) desc) as rk, sum(end_amount) as end_amount
         from
-        (select rank() over (order by ifnull(sum(share_iaa_amount), 0) + ifnull(sum(share_pay_amount), 0) desc) as rk,
+        (select
         ifnull(sum(share_iaa_amount), 0) + ifnull(sum(share_pay_amount), 0) as end_amount, movie_id
         from
         application.user_data_report_daily udrd
-        where stat_date = #{date}
+        where stat_date = ${date}
         group by movie_id
         having ifnull(sum(share_iaa_amount), 0) + ifnull(sum(share_pay_amount), 0)>0
         order by end_amount desc
-        limit 10
         ) tb1
         left join
         (select distinct movie_id, movie_name from deepthink.channel_changdunovel_info cci) tb2 on tb1.movie_id = tb2.movie_id
         left JOIN
         (select id, movie_name from hr_playlet.m_movie mm) tb3 on tb1.movie_id = tb3.id
+        group by movie_name order by rk limit 10) ot1
+        left join
+        (select product_name, round(ifnull(sum(cost_amount),0),2) as cost_amount, sum(real_cost_amount) as real_cost_amount
+        from application.media_product_report_daily where stat_date=${date} group by product_name
+        ) ot2 on ot1.movie_name=ot2.product_name
         order by rk
     </select>
 
 
     <select id="optimizerCostRank" resultType="java.util.Map">
-        select tb1.user_id, tb4.phonenumber, tb4.dept_id, tb5.dept_name,
+        select tb1.user_id, tb4.phonenumber, tb4.nick_name, tb4.dept_id, tb5.dept_name,
         rank() over (order by sum(cost_amount) desc) as rk,
         sum(cost_amount) as cost_amount,
         concat(round(if(ifnull(sum(real_cost_amount),0)=0, 0, (ifnull(sum(share_iaa_amount),0)+ifnull(sum(share_pay_amount),0))/sum(real_cost_amount)*100), 2), '%') AS real_roi
@@ -161,7 +170,15 @@
 
     <select id="unbindData" resultType="java.util.Map">
         select tb1.advertiser_id, tb1.advertiser_name, ifnull(tb2.ca,0) as today_cost, tb3.ca as last_30_cost from
-        (select cast(advertiser_id as char) advertiser_id, advertiser_name from deepthink.advertiser_unbind_info) tb1
+        (select cast(advertiser_id as char) advertiser_id, advertiser_name from deepthink.advertiser_unbind_info
+        where 1=1
+        <if test="list != null and list.size > 0">
+            and advertiser_id in
+            <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        ) tb1
         left join
         (select advertiser_id, ifnull(sum(cost_amount),0) as ca from application.media_ad_report_daily where stat_date=#{date} group by advertiser_id) tb2
         on tb1.advertiser_id = tb2.advertiser_id
@@ -183,19 +200,26 @@
         select tb1.advertiser_id, tb2.advertiser_name, tb1.ma_appid as right_app, tb2.ma_appid as error_app,
         tb3.app_name as right_app_name, tb4.app_name as error_app_name,
         tb2.user_id, tb5.nick_name, tb5.phonenumber
-        from (select advertiser_id, ma_appid
-        from (select advertiser_id, ma_appid,row_number() over (partition by advertiser_id order by pay_amount desc) as rn
-        from (select advertiser_id, ma_appid, sum(ifnull(pay_amount,0) + ifnull(iaa_amount,0)+ ifnull(new_users,0)) as pay_amount
-        from application.user_data_report_daily
-        where stat_date &gt;= #{last30Day}
-        and advertiser_id != '-9999'
-        and ma_appid != '-9999'
-        group by advertiser_id, ma_appid
-        )t1
-        )t2 where t2.rn = 1
-        )tb1
+        from
+        (select advertiser_id, ma_appid
+        from (
+            select advertiser_id, ma_appid,row_number() over (partition by advertiser_id order by pay_amount desc) as rn
+            from (
+                select advertiser_id, ma_appid, sum(ifnull(pay_amount,0) + ifnull(iaa_amount,0)+ ifnull(new_users,0)) as pay_amount
+                    from application.user_data_report_daily
+                    where stat_date &gt;= #{last30Day}
+                    and advertiser_id != '-9999'
+                    and ma_appid != '-9999'
+                    group by advertiser_id, ma_appid
+                )t1
+            ) t2 where t2.rn = 1
+        ) tb1
         inner join
-        (select advertiser_id, advertiser_name, ma_appid, user_id from deepthink.advertiser_bind_info) tb2
+        (select advertiser_id, advertiser_name, ma_appid, user_id from deepthink.advertiser_bind_info
+        where advertiser_id not in (select advertiser_id from application.user_data_report_daily
+        where stat_date &gt;= #{last30Day} and advertiser_id!='-9999'
+        group by advertiser_id having count(distinct ma_appid)>1)
+        ) tb2
         on tb1.advertiser_id = tb2.advertiser_id
         left join (select distinct app_id, app_name from hr_playlet.m_mini_app_info) tb3
         on tb1.ma_appid = tb3.app_id
@@ -206,4 +230,25 @@
         where tb1.ma_appid != tb2.ma_appid
         order by tb2.user_id
     </select>
+    <select id="deptRank2" resultType="java.util.Map">
+        select tb4.dept_id, tb5.dept_name,
+        rank() over (order by sum(cost_amount) desc) as rk,
+        ifnull(sum(cost_amount), 0) as cost_amount,
+        concat(round(if(ifnull(sum(real_cost_amount),0)=0, 0, (ifnull(sum(share_iaa_amount),0)+ifnull(sum(share_pay_amount),0))/sum(real_cost_amount)*100), 2), '%') AS real_roi
+        from
+        (select cast(advertiser_id as char) advertiser_id, user_id from deepthink.advertiser_bind_info) tb1
+        left join (select advertiser_id, sum(cost_amount) as cost_amount, sum(real_cost_amount) as real_cost_amount
+        from application.media_ad_report_daily where stat_date=${date} group by advertiser_id) tb2
+        on tb1.advertiser_id = tb2.advertiser_id
+        left join (select advertiser_id, sum(share_iaa_amount) as share_iaa_amount, sum(share_pay_amount) as share_pay_amount
+        from application.user_data_report_daily where stat_date=${date} group by advertiser_id) tb3
+        on tb1.advertiser_id = tb3.advertiser_id
+        left join (select user_id, nick_name, phonenumber, dept_id from deepthink.sys_user) tb4
+        on tb1.user_id=tb4.user_id
+        left join (select dept_id, dept_name from deepthink.sys_dept) tb5
+        on tb4.dept_id = tb5.dept_id
+        group by tb4.dept_id
+        having sum(cost_amount)>1
+        order by rk
+    </select>
 </mapper>

+ 86 - 6
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ToolsSiteMapper.xml

@@ -27,7 +27,7 @@
         </foreach>
     </insert>
 
-    <select id="getAvatarAdvertiserIds">
+    <select id="getAvatarAdvertiserIds" resultType="Long">
         select advertiser_id
         from deepthink.advertiser_avatar
         where avatar_status = 'IN_AUDIT'
@@ -49,6 +49,7 @@
             <if test="auditWebUrl != null">audit_web_url = #{auditWebUrl},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="reason != null">reason = #{reason},</if>
         </trim>
         where advertiser_id = #{advertiserId}
     </update>
@@ -91,10 +92,14 @@
         </trim>
     </insert>
 
-    <select id="getNameAdvertiserIds">
+    <select id="getNameAdvertiserIds" resultType="Long">
         select advertiser_id
         from deepthink.advertiser_name_info
         where advertiser_status = 'STATUS_PENDING_CONFIRM'
+           OR (
+            reason like '%账户名已存在%'
+                and advertiser_status = 'FAIL'
+            )
     </select>
 
     <insert id="insertAdvertiserNameInfo" parameterType="cn.com.ctop.job.bytedance.data.entity.AdvertiserNameInfo">
@@ -133,10 +138,10 @@
     </update>
 
 
-    <select id="getAppAdvertiserIds">
+    <select id="getAppAdvertiserIds" resultType="Long">
         select advertiser_id
         from deepthink.advertiser_app_list
-        where advertiser_status = 'AUDITING'
+        where audit_status = 'AUDITING'
           AND plat_type = #{platType}
     </select>
 
@@ -209,6 +214,43 @@
         </trim>
     </insert>
 
+    <update id="updateAdvertiserAppList2" parameterType="cn.com.ctop.job.bytedance.data.entity.AdvertiserApplet">
+        update deepthink.advertiser_app_list
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="advertiserId != null">advertiser_id = #{advertiserId},</if>
+            <if test="appName != null">app_name = #{appName},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="instanceId != null">instance_id = #{instanceId},</if>
+            <if test="appId != null">app_id = #{appId},</if>
+            <if test="originalAppId != null">original_app_id = #{originalAppId},</if>
+            <if test="platType != null">plat_type = #{platType},</if>
+            <if test="auditStatus != null">audit_status = #{auditStatus},</if>
+            <if test="reason != null">reason = #{reason},</if>
+            <if test="link != null">link = #{link},</if>
+            <if test="linkRemark != null">link_remark = #{linkRemark},</if>
+            <if test="path != null">path = #{path},</if>
+            <if test="remarkMessage != null">remark_message = #{remarkMessage},</if>
+            <if test="iconImageUrl != null">icon_image_url = #{iconImageUrl},</if>
+            <if test="headerImageUrl != null">header_image_url = #{headerImageUrl},</if>
+            <if test="labels != null">labels = #{labels},</if>
+            <if test="guideText != null">guide_text = #{guideText},</if>
+            <if test="imagesVerticalUrl != null">images_vertical_url = #{imagesVerticalUrl},</if>
+            <if test="imagesHorizontalUrl != null">images_horizontal_url = #{imagesHorizontalUrl},</if>
+            <if test="introduction != null">introduction = #{introduction},</if>
+            <if test="tagInfo != null">tag_info = #{tagInfo},</if>
+            <if test="startPage != null">start_page = #{startPage},</if>
+            <if test="startParam != null">start_param = #{startParam},</if>
+            <if test="appCreateTime != null">app_create_time = #{appCreateTime},</if>
+            <if test="appUpdateTime != null">app_update_time = #{appUpdateTime},</if>
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="appShare != null">app_share = #{appShare},</if>
+            <if test="shareAdvertiserId != null">share_advertiser_id = #{shareAdvertiserId},</if>
+        </trim>
+        WHERE advertiser_id = #{advertiserId}
+        AND instance_id = #{instanceId}
+        AND task_id = #{taskId}
+    </update>
+
     <update id="updateAdvertiserAppList" parameterType="cn.com.ctop.job.bytedance.data.entity.AdvertiserApplet">
         update deepthink.advertiser_app_list
         <trim prefix="SET" suffixOverrides=",">
@@ -246,12 +288,41 @@
         AND plat_type = #{platType}
     </update>
 
-    <select id="getsiteAdvertiserIds">
+    <select id="getsiteAdvertiserIds2" resultType="com.alibaba.fastjson.JSONObject">
+        select advertiser_id, task_id
+        from deepthink.advertiser_tools_site
+        where status = 'EDIT'
+    </select>
+
+    <select id="getsiteAdvertiserIds" resultType="Long">
         select advertiser_id
         from deepthink.advertiser_tools_site
-        where advertiser_status = 'EDIT'
+        where status = 'ENABLE'
+    </select>
+
+    <select id="queryIsCreateSite" resultType="com.alibaba.fastjson.JSONObject">
+        select task_id, task_name, advertiser_id
+        from deepthink.bytedance_advertiser_task
+        where site_id is null
+          AND advertiser_id = #{advertiserId}
+          AND instance_id = #{instanceId}
+    </select>
+
+
+    <select id="queryAdvertiserAppList" resultType="cn.com.ctop.job.bytedance.data.entity.AdvertiserApplet">
+        select advertiser_id,
+        instance_id,
+        app_name,
+        task_id,
+        audit_status
+        from deepthink.advertiser_app_list
+        <where>
+            <if test="platType != null ">and plat_type = #{platType}</if>
+            <if test="advertiserId != null ">and advertiser_id = #{advertiserId}</if>
+        </where>
     </select>
 
+
     <update id="updateAdvertiserToolsSite" parameterType="cn.com.ctop.job.bytedance.data.entity.AdvertiserToolsSite">
         update deepthink.advertiser_tools_site
         <trim prefix="SET" suffixOverrides=",">
@@ -302,4 +373,13 @@
             <if test="taskId != null">#{taskId},</if>
         </trim>
     </insert>
+
+
+    <select id="getTimeOutAppList" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT task_id, advertiser_id, plat_type
+        FROM deepthink.advertiser_app_list
+        WHERE audit_status = 'FAIL'
+          AND reason like '%timed out%'
+    </select>
+
 </mapper>

+ 6 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IAdminAdvertiserListService.java

@@ -2,8 +2,14 @@ package cn.com.ctop.job.bytedance.data.service;
 
 import com.alibaba.fastjson.JSONObject;
 
+import java.util.List;
+
 public interface IAdminAdvertiserListService {
     JSONObject bytedanceAdvertiserThreadPool(Integer totalPage, Integer pageSize, Long adminAdvertiserId, Long ccAccountId, String accessToken);
 
     JSONObject getBytedanceAccountListTotal(Long advertiserId, Long advertiserId1, String accessToken, Integer pageNum, Integer pageSize);
+
+    List<JSONObject> getAdvertiserInfos();
+
+    void batchUpdateAdvertiserName(List<JSONObject> infos);
 }

+ 17 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IByteDanceFlowDetailsReportService.java

@@ -0,0 +1,17 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+import cn.com.ctop.job.bytedance.data.entity.AdvertiserAccount;
+
+import java.util.List;
+
+/**
+ * @author lining
+ * @ClassName IByteDanceFlowDetailsReportService
+ * @description: TODO
+ * @date 2025年04月16日
+ * @version: 1.0
+ */
+public interface IByteDanceFlowDetailsReportService {
+    List<AdvertiserAccount> getAdAccount();
+    void getBytedanceFlowDetailsDailyReport(Long advertiserId, String accessToken, String transactionType, String startDate, String endDate, Integer page, Long errorId);
+}

+ 30 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceCdpProjectService.java

@@ -0,0 +1,30 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+import java.util.List;
+
+/**
+ * 头条项目列Service接口
+ *
+ * @author ruoyi
+ * @date 2025-04-23
+ */
+public interface IBytedanceCdpProjectService {
+    void getProjectList(Long advertiserId, String date);
+
+    List<Long> getAllAdverIdList(String type);
+
+    boolean delErrApps(String type);
+
+    List<Long> queryAdvertiserIds(String db, String date);
+
+    void getByteAppInfo(Long advertiserId);
+
+    void getWxAppInfo(Long advertiserId);
+
+    List<Long> queryMediaAdverIds(String date, String mediaType);
+
+    List<Long> queryADQAdverIds(String date);
+
+    void getAdqCreatives(Long advertiserId, String date);
+
+}

+ 5 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IDateReportsPushService.java

@@ -0,0 +1,5 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+public interface IDateReportsPushService {
+    void send();
+}

+ 11 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IToolsSiteService.java

@@ -1,5 +1,7 @@
 package cn.com.ctop.job.bytedance.data.service;
 
+import com.alibaba.fastjson.JSONObject;
+
 import java.util.List;
 
 public interface IToolsSiteService {
@@ -12,6 +14,10 @@ public interface IToolsSiteService {
 
     void updateNameStatus(Long id);
 
+    List<JSONObject> getTimeOutAppList();
+
+    void pushAgain(JSONObject app);
+
     List<Long> getAppAdvertiserIds(String platType);
 
     void updateWxAppStatus(Long advertiserId, String searchType, Integer page);
@@ -20,5 +26,10 @@ public interface IToolsSiteService {
 
     List<Long> getSiteAdvertiserIds();
 
+    List<JSONObject> getSiteAdvertiserIds2();
+
     void updateSiteStatus(Long id, Integer page);
+
+    void publishSiteStatus(Long id, String taskId);
+
 }

+ 9 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IUnbindWarnPushService.java

@@ -1,6 +1,15 @@
 package cn.com.ctop.job.bytedance.data.service;
 
+import java.util.List;
+
 public interface IUnbindWarnPushService {
 
     void send();
+
+    /**
+     *
+     * @param advertiserIds
+     * @param copySend 是否抄送
+     */
+    void send(List<String> advertiserIds, boolean copySend);
 }

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

@@ -101,6 +101,16 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
         return returnJson;
     }
 
+    @Override
+    public List<JSONObject> getAdvertiserInfos() {
+        return adminAdvertiserListMapper.getAdvertiserInfos();
+    }
+
+    @Override
+    public void batchUpdateAdvertiserName(List<JSONObject> infos) {
+        adminAdvertiserListMapper.batchUpdateAdvertiserName(infos);
+    }
+
     // 分页结果包装类
     static class PageResult {
         private final int pageNumber;

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

@@ -0,0 +1,160 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.entity.AdvertiserAccount;
+import cn.com.ctop.job.bytedance.data.entity.ByteDanceFlowDetailsReportDaily;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceErrorLog;
+import cn.com.ctop.job.bytedance.data.mapper.ByteDanceFlowDetailsReportMapper;
+import cn.com.ctop.job.bytedance.data.mapper.BytedancePromoterReportMapper;
+import cn.com.ctop.job.bytedance.data.service.IByteDanceFlowDetailsReportService;
+import cn.com.ctop.job.bytedance.data.utils.AlertUtils;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.HttpUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author lining
+ * @ClassName ByteDanceFlowDetailsReportServiceImpl
+ * @description: TODO
+ * @date 2025年04月16日
+ * @version: 1.0
+ */
+@Service
+@Slf4j
+public class ByteDanceFlowDetailsReportServiceImpl implements IByteDanceFlowDetailsReportService {
+
+    @Resource
+    private ByteDanceFlowDetailsReportMapper byteDanceFlowDetailsReportMapper;
+
+    @Autowired
+    private BytedancePromoterReportMapper promoterReportMapper;
+
+    @Override
+    public List<AdvertiserAccount> getAdAccount() {
+        return byteDanceFlowDetailsReportMapper.getAdAccount();
+    }
+
+    @Override
+    public void getBytedanceFlowDetailsDailyReport(Long advertiserId, String accessToken, String accountType, String startDate, String endDate, Integer page, Long errorId) {
+        String url = "https://ad.oceanengine.com/open_api/2/advertiser/fund/daily_stat/";
+        Map<String, Object> paramsMap = new HashMap<>();
+        paramsMap.put("advertiser_id", advertiserId);
+        paramsMap.put("start_date", startDate);
+        paramsMap.put("end_date", endDate);
+        /**
+         * 账户业务类型,可选值:
+         * AD AD广告主(默认)
+         * LOCAL 本地推
+         * STAR 星图
+         */
+        paramsMap.put("account_type", accountType);
+        paramsMap.put("page", page);
+        paramsMap.put("page_size", 100);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", accessToken);
+        headers.put("Content-Type", "application/json");
+        String s = HttpUtils.httpGet(url, paramsMap, headers);
+        JSONObject result = JSONObject.parseObject(s);
+        if (Check.isNull(result)) {
+            log.info("账户id:{},广告流水详情请求结果返回为空", advertiserId);
+            return;
+        }
+
+        List<ByteDanceFlowDetailsReportDaily> dailies = new ArrayList<>();
+        Integer code = result.getInteger("code");
+        Integer totalPage = 1;
+        if (code == 0) {
+            JSONObject data = result.getJSONObject("data");
+            if (!Check.isNull(data)) {
+                JSONArray list = data.getJSONArray("list");
+                totalPage = data.getJSONObject("page_info").getIntValue("total_page");
+                if (!Check.isNull(list)) {
+                    for (int i = 0; i < list.size(); i++) {
+                        JSONObject object = list.getJSONObject(i);
+                        String advertiser_id = object.getString("advertiser_id");
+                        String date = object.getString("date").replace("-", "");
+                        BigDecimal balance = object.getBigDecimal("balance");
+                        BigDecimal grant_balance = object.getBigDecimal("grant_balance");
+                        BigDecimal non_grant_balance = object.getBigDecimal("non_grant_balance");
+                        BigDecimal cash_cost = object.getBigDecimal("cash_cost");
+                        BigDecimal cost = object.getBigDecimal("cost");
+                        BigDecimal frozen = object.getBigDecimal("frozen");
+                        BigDecimal income = object.getBigDecimal("income");
+                        BigDecimal reward_cost = object.getBigDecimal("reward_cost");
+                        BigDecimal shared_wallet_cost = object.getBigDecimal("shared_wallet_cost");
+                        BigDecimal company_wallet_cost = object.getBigDecimal("company_wallet_cost");
+                        BigDecimal transfer_in = object.getBigDecimal("transfer_in");
+                        BigDecimal transfer_out = object.getBigDecimal("transfer_out");
+
+
+                        ByteDanceFlowDetailsReportDaily daily = ByteDanceFlowDetailsReportDaily.builder()
+                                .advertiserId(Long.parseLong(advertiser_id))
+                                .statTimeDay(Integer.parseInt(date))
+                                .balance(balance)
+                                .grantBalance(grant_balance)
+                                .nonGrantBalance(non_grant_balance)
+                                .cashCost(cash_cost)
+                                .cost(cost)
+                                .frozen(frozen)
+                                .income(income)
+                                .rewardCost(reward_cost)
+                                .sharedWalletCost(shared_wallet_cost)
+                                .companyWalletCost(company_wallet_cost)
+                                .transferIn(transfer_in)
+                                .transferOut(transfer_out)
+                                .build();
+                        dailies.add(daily);
+                    }
+
+                    if (!Check.isNull(dailies)) {
+                        log.info("账户id:{},流水日报请求结果返回成功", advertiserId);
+                        byteDanceFlowDetailsReportMapper.replaceDanceFlowDetailsReportDailies(dailies);
+                    }
+                }
+
+            }
+        }else{
+            //增加错误日志保存
+            log.info("账户id:{},日期:{}流水日报请求结果失败,返回数据:{}", advertiserId, startDate, result);
+            insertErrorLog(advertiserId, startDate, endDate);
+            return;
+        }
+
+        if (page < totalPage) {
+            try {
+                Thread.sleep(500L);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+            getBytedanceFlowDetailsDailyReport(advertiserId, accessToken, accountType, startDate, endDate, page + 1, errorId);
+        }else{
+            log.info("账户ID:{},日期:{},流水日报详情数据日报请求成功", advertiserId, startDate);
+
+            if(errorId != null){
+                promoterReportMapper.deleteInfoByErrorId(errorId);
+            }
+            //send message to feishu
+//            AlertUtils.sendMessage(advertiserId, startDate, endDate, 1, "flow_details_daily", 1,null);
+        }
+    }
+
+    private void insertErrorLog(Long advertiserId, String startDate, String endDate) {
+        BytedanceErrorLog errorInfo = new BytedanceErrorLog();
+        errorInfo.setAdvertiserId(advertiserId);
+        errorInfo.setStartDate(startDate);
+        errorInfo.setEndDate(endDate);
+        errorInfo.setDataDimension("flow_details");
+        errorInfo.setDataType("daily");
+        promoterReportMapper.replaceErrorInfo(errorInfo);
+    }
+}

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

@@ -0,0 +1,395 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.entity.BytedanceCdpProject;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceCdpProjectMapper;
+import cn.com.ctop.job.bytedance.data.mapper.BytedanceRefreshTokenMapper;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceCdpProjectService;
+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 cn.com.ctop.job.bytedance.data.utils.Okhttp3Utils;
+import cn.com.ctop.job.bytedance.data.utils.RandomStringGenerator;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 头条项目列Service业务层处理
+ * <p>
+ * media_api.bytedance_cdp_project_list
+ * media_api.bytedance_byte_app_info
+ * media_api.bytedance_wx_app_info
+ * media_api.adq_dynamic_createive_list
+ *
+ * @author ruoyi
+ * @date 2025-04-23
+ */
+@Slf4j
+@Service
+public class BytedanceCdpProjectServiceImpl implements IBytedanceCdpProjectService {
+    @Autowired
+    private BytedanceCdpProjectMapper bytedanceCdpProjectMapper;
+
+    @Autowired
+    private BytedanceRefreshTokenMapper tokenMapper;
+
+    @Override
+    public List<Long> getAllAdverIdList(String type) {
+        return bytedanceCdpProjectMapper.getAllAdverIdList(type);
+    }
+
+    @Override
+    public boolean delErrApps(String type) {
+        return bytedanceCdpProjectMapper.delErrApps(type);
+    }
+
+    @Override
+    public List<Long> queryAdvertiserIds(String db, String date) {
+        return bytedanceCdpProjectMapper.queryAdvertiserIds(db, date);
+    }
+
+    @Override
+    public void getProjectList(Long advertiserId, String date) {
+        this.getProjectListVo(advertiserId, null, date, 1, 1);
+//        this.getProjectListVo(advertiserId, "del", date, 1, 1);
+    }
+
+    private void getProjectListVo(Long advertiserId, String type, String date, Integer page, int count) {
+        try {
+            boolean nextPage = false;
+            String accessToken = tokenMapper.onlyGetToken(advertiserId);
+            if (Check.isNull(accessToken)) {
+                log.error("账户({})查询token失败", advertiserId);
+                return;
+            }
+            Map<String, Object> params = new HashMap<>();
+            params.put("advertiser_id", advertiserId);
+            JSONObject filtering = new JSONObject();
+            if (!Check.isNull(type)) {
+                //不传默认返回不限(不含已删除)
+                filtering.put("status_first", "PROJECT_STATUS_DELETE");
+            }
+            filtering.put("project_modify_time", date);
+            params.put("filtering", filtering);
+            params.put("page", page);
+            params.put("page_size", 100);//最大100
+            String url = "https://api.oceanengine.com/open_api/v3.0/project/list/";
+            String results = HttpUtils.httpGet(url, params, HttpUtils.postMHeaders(accessToken));
+            JSONObject obj = JSONObject.parseObject(results);
+            if (!Check.isNull(obj)) {
+                Integer code = obj.getInteger("code");
+                if (code == 0) {
+                    JSONObject data = obj.getJSONObject("data");
+                    Integer totalPage = data.getJSONObject("page_info").getInteger("total_page");
+                    if (totalPage != 0 && totalPage > data.getJSONObject("page_info").getInteger("page")) {
+                        nextPage = true;
+                    }
+                    List<BytedanceCdpProject> projectList = new ArrayList<>();
+                    JSONArray array = data.getJSONArray("list");
+                    for (int i = 0; i < array.size(); i++) {
+                        BytedanceCdpProject advertiserToolsSite = new BytedanceCdpProject(array.getJSONObject(i));
+                        projectList.add(advertiserToolsSite);
+                    }
+                    if (!Check.isNull(projectList))
+                        if (bytedanceCdpProjectMapper.replaceBytedanceCdpProjectList(projectList) > 0)
+                            log.info("---账户({})项目信息更新成功", advertiserId);
+                } else {
+                    //40100请求超频
+                    if (40100 == code && count <= 5) {
+                        Thread.sleep(800);
+                        getProjectListVo(advertiserId, type, date, page, count + 1);
+                    } else {
+                        log.error("获取项目列表失败(url:{}),入参:{}\n结果:{}", url, JSONObject.toJSONString(params), obj);
+                    }
+                }
+            }
+            if (nextPage) {
+                getProjectListVo(advertiserId, type, date, page + 1, 1);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+    }
+
+    @Override
+    public void getByteAppInfo(Long advertiserId) {
+        this.getByteAppInfoVo(advertiserId, "CREATE_ONLY", 1, 1);
+        this.getByteAppInfoVo(advertiserId, "SHARE_ONLY", 1, 1);
+    }
+
+    private void getByteAppInfoVo(Long advertiserId, String searchType, Integer page, int count) {
+        try {
+            boolean nextPage = false;
+            String accessToken = tokenMapper.onlyGetToken(advertiserId);
+            if (Check.isNull(accessToken)) {
+                log.error("账户({})查询token失败", advertiserId);
+                return;
+            }
+            JSONObject params = new JSONObject();
+            params.put("advertiser_id", advertiserId);
+            params.put("page", page);
+            //页面大小,默认值为10,最大值100
+            params.put("page_size", 100);
+            JSONObject filtering = new JSONObject();
+            //CREATE_ONLY本户创建,SHARE_ONLY 只查共享应用
+            filtering.put("search_type", searchType);
+//        filtering.put("audit_status", "AUDIT_ACCEPTED");
+            params.put("filtering", filtering);
+            //获取微信小程序列表
+            String url = "https://api.oceanengine.com/open_api/v3.0/tools/micro_app/list/";
+            JSONObject obj = Okhttp3Utils.bytedanceGetRequest(accessToken, url, params);
+            if (!Check.isNull(obj)) {
+                Integer code = obj.getInteger("code");
+                if (code == 0) {
+                    JSONObject data = obj.getJSONObject("data");
+                    Integer totalPage = data.getJSONObject("page_info").getInteger("total_page");
+                    if (totalPage != 0 && totalPage > data.getJSONObject("page_info").getInteger("page")) {
+                        nextPage = true;
+                    }
+                    JSONArray list = data.getJSONArray("list");
+                    if (!Check.isNull(list))
+                        if (bytedanceCdpProjectMapper.replaceBytedanceByteAppInfo(list, advertiserId) > 0)
+                            log.info("---账户({})抖小信息更新成功", advertiserId);
+                } else {
+                    //40110请求超频 51010 内部服务超时
+                    if ((40110 == code || 51010 == code) && count <= 3) {
+                        Thread.sleep(700);
+                        getByteAppInfoVo(advertiserId, searchType, page, count + 1);
+                    } else {
+                        log.error("账户({})获取抖小列表失败,入参:{}\n结果:{}", advertiserId, JSONObject.toJSONString(params), obj);
+                        bytedanceCdpProjectMapper.insertErrorAdvertiserId(advertiserId, "tt");
+                    }
+                }
+            }
+            if (nextPage) {
+                getByteAppInfoVo(advertiserId, searchType, page + 1, 1);
+            }
+        } catch (Exception e) {
+            bytedanceCdpProjectMapper.insertErrorAdvertiserId(advertiserId, "tt");
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+    }
+
+    @Override
+    public void getWxAppInfo(Long advertiserId) {
+        this.getWxAppInfoVo(advertiserId, "CREATE_ONLY", 1, 1);
+        this.getWxAppInfoVo(advertiserId, "SHARE_ONLY", 1, 1);
+    }
+
+    private void getWxAppInfoVo(Long advertiserId, String searchType, Integer page, int count) {
+        try {
+            boolean nextPage = false;
+            String accessToken = tokenMapper.onlyGetToken(advertiserId);
+            if (Check.isNull(accessToken)) {
+                log.error("账户({})查询token失败", advertiserId);
+                return;
+            }
+            JSONObject params = new JSONObject();
+            params.put("advertiser_id", advertiserId);
+            params.put("page", page);
+            //页面大小,默认值为10,最大值100
+            params.put("page_size", 100);
+            JSONObject filtering = new JSONObject();
+            //CREATE_ONLY本户创建,SHARE_ONLY 只查共享应用
+            filtering.put("search_type", searchType);
+            //状态 审核通过:AUDIT_ACCEPTED
+//        filtering.put("audit_status", "AUDIT_ACCEPTED");
+            params.put("filtering", filtering);
+            //获取微信小程序列表
+            String url = "https://api.oceanengine.com/open_api/v3.0/tools/wechat_applet/list/";
+            JSONObject obj = Okhttp3Utils.bytedanceGetRequest(accessToken, url, params);
+            if (!Check.isNull(obj)) {
+                Integer code = obj.getInteger("code");
+                if (code == 0) {
+                    JSONObject data = obj.getJSONObject("data");
+                    Integer totalPage = data.getJSONObject("page_info").getInteger("total_page");
+                    if (totalPage != 0 && totalPage > data.getJSONObject("page_info").getInteger("page")) {
+                        nextPage = true;
+                    }
+                    JSONArray list = data.getJSONArray("list");
+                    if (!Check.isNull(list))
+                        if (bytedanceCdpProjectMapper.replaceBytedanceWxAppInfo(list, advertiserId) > 0)
+                            log.info("---账户({})微小信息更新成功", advertiserId);
+                } else {
+                    //40110请求超频
+                    if (40110 == code && count <= 3) {
+                        Thread.sleep(600);
+                        getWxAppInfoVo(advertiserId, searchType, page, count + 1);
+                    } else {
+                        log.error("账户({})获取微小列表失败,入参:{}\n结果:{}", advertiserId, JSONObject.toJSONString(params), obj);
+                        bytedanceCdpProjectMapper.insertErrorAdvertiserId(advertiserId, "wx");
+                    }
+                }
+            }
+            if (nextPage) {
+                getWxAppInfoVo(advertiserId, searchType, page + 1, 1);
+            }
+        } catch (Exception e) {
+            bytedanceCdpProjectMapper.insertErrorAdvertiserId(advertiserId, "wx");
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+    }
+
+    @Override
+    public List<Long> queryMediaAdverIds(String date, String mediaType) {
+        return bytedanceCdpProjectMapper.queryMediaAdverIds(date, mediaType);
+    }
+
+    @Override
+    public List<Long> queryADQAdverIds(String date) {
+        return bytedanceCdpProjectMapper.queryADQAdverIds(date);
+    }
+
+    @Override
+    public void getAdqCreatives(Long advertiserId, String date) {
+        try {
+            String accessToken = tokenMapper.onlyGetADQToken(advertiserId);
+            if (Check.isNull(accessToken)) {
+                log.error("账户({})accessToken is null", advertiserId);
+                return;
+            }
+            this.rebackadqCreativesVo(advertiserId, accessToken, date, 1, true, 1);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("账户({})获取动态创意异常", e.getMessage());
+        }
+    }
+
+
+    private void rebackadqCreativesVo(Long accountId, String accessToken, String date, Integer page, Boolean isDeleted, int count) throws Exception {
+        boolean nextPage = false;
+        JSONObject returnJson = new JSONObject();
+        Map<String, Object> param = new HashMap<>();
+        long timestamp = Instant.now().getEpochSecond();
+        param.put("timestamp", String.valueOf(timestamp));
+        param.put("nonce", RandomStringGenerator.generateRandomString(32));
+        param.put("access_token", accessToken);
+        param.put("account_id", accountId);
+        param.put("page", page);
+        param.put("page_size", 100);
+        if (!Check.isNull(date)) {
+            JSONArray filtering = new JSONArray();
+            JSONObject greObj = new JSONObject();
+            greObj.put("field", "created_time");
+            greObj.put("operator", "GREATER_EQUALS");
+            JSONArray startDateVls = new JSONArray();
+            startDateVls.add(String.valueOf(DateUtils.dt2milli(date + " 00:00:00")));
+            greObj.put("values", startDateVls);
+            filtering.add(greObj);
+            JSONObject lesObj = new JSONObject();
+            lesObj.put("field", "created_time");
+            lesObj.put("operator", "LESS_EQUALS");
+            JSONArray endDateVls = new JSONArray();
+            endDateVls.add(String.valueOf(DateUtils.dt2milli(date + " 23:59:59")));
+            lesObj.put("values", endDateVls);
+            filtering.add(lesObj);
+            param.put("filtering", filtering);
+        }
+//        param.put("is_deleted", isDeleted);
+        JSONArray fields = new JSONArray();
+        fields.add("adgroup_id");
+        fields.add("dynamic_creative_id");
+        fields.add("creative_components");
+        param.put("fields", fields);
+        String result = HttpUtils.httpGet("https://api.e.qq.com/v3.0/dynamic_creatives/get", param, new HashMap<>());
+        JSONObject obj = JSONObject.parseObject(result);
+        if (!Check.isNull(obj)) {
+            if (0 == obj.getInteger("code")) {
+                JSONObject data = obj.getJSONObject("data");
+                if (!Check.isNull(data)) {
+                    JSONObject pageInfo = data.getJSONObject("page_info");
+                    Integer totalPage = pageInfo.getInteger("total_page");
+                    if (totalPage != 0 && totalPage > pageInfo.getInteger("page")) {
+                        nextPage = true;
+                    }
+                    JSONArray array = data.getJSONArray("list");
+                    for (int i = 0; i < array.size(); i++) {
+                        JSONObject object = array.getJSONObject(i);
+                        getAppId(object);
+                    }
+                    if (!Check.isNull(array))
+                        if (bytedanceCdpProjectMapper.replaceAdqDynamicCreateives(array, accountId) > 0)
+                            log.info("---账户({})广点通创意更新成功", accountId);
+                }
+            } else {
+                if (count <= 4) {
+                    Thread.sleep(500);
+                    rebackadqCreativesVo(accountId, accessToken, date, page, isDeleted, count + 1);
+                } else {
+                    log.error("账户({})获取动态创意失败,入参:{}\n,结果:{}", accountId, JSONObject.toJSONString(param), obj);
+                }
+            }
+        }
+        if (nextPage) {
+            rebackadqCreativesVo(accountId, accessToken, date, page + 1, isDeleted, 1);
+        }
+    }
+
+    private void getAppId(JSONObject object) {
+        JSONObject creativeComponents = object.getJSONObject("creative_components");
+        if (!Check.isNull(creativeComponents)) {
+            JSONArray textLink = creativeComponents.getJSONArray("text_link");
+            if (!Check.isNull(textLink)) {
+                JSONObject value = textLink.getJSONObject(0).getJSONObject("value");
+                if (!Check.isNull(value)) {
+                    JSONObject jumpInfo = value.getJSONObject("jump_info");
+                    if (!Check.isNull(jumpInfo)) {
+                        object.put("page_type", jumpInfo.getString("page_type"));
+                        JSONObject pageSpec = jumpInfo.getJSONObject("page_spec");
+                        if (!Check.isNull(pageSpec)) {
+                            JSONObject wechatMiniProgramSpec = pageSpec.getJSONObject("wechat_mini_program_spec");
+                            if (!Check.isNull(wechatMiniProgramSpec)) {
+                                object.put("mini_program_id", wechatMiniProgramSpec.getString("mini_program_id"));
+                            }
+                        }
+                    }
+                }
+            }
+            if (!Check.isNull(object.getString("mini_program_id"))) {
+                return;
+            }
+            JSONArray jumpInfo = creativeComponents.getJSONArray("jump_info");
+            if (!Check.isNull(jumpInfo)) {
+                JSONObject value = jumpInfo.getJSONObject(0).getJSONObject("value");
+                if (!Check.isNull(value)) {
+                    object.put("page_type", value.getString("page_type"));
+                    JSONObject pageSpec = value.getJSONObject("page_spec");
+                    if (!Check.isNull(pageSpec)) {
+                        JSONObject wechatMiniProgramSpec = pageSpec.getJSONObject("wechat_mini_program_spec");
+                        if (!Check.isNull(wechatMiniProgramSpec)) {
+                            object.put("mini_program_id", wechatMiniProgramSpec.getString("mini_program_id"));
+                        }
+                    }
+                }
+            }
+            if (!Check.isNull(object.getString("mini_program_id"))) {
+                return;
+            }
+            JSONArray mainJumpInfo = creativeComponents.getJSONArray("main_jump_info");
+            if (!Check.isNull(mainJumpInfo)) {
+                JSONObject value = mainJumpInfo.getJSONObject(0).getJSONObject("value");
+                if (!Check.isNull(value)) {
+                    object.put("page_type", value.getString("page_type"));
+                    JSONObject pageSpec = value.getJSONObject("page_spec");
+                    if (!Check.isNull(pageSpec)) {
+                        JSONObject wechatMiniProgramSpec = pageSpec.getJSONObject("wechat_mini_program_spec");
+                        if (!Check.isNull(wechatMiniProgramSpec)) {
+                            object.put("mini_program_id", wechatMiniProgramSpec.getString("mini_program_id"));
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

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

@@ -0,0 +1,175 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.mapper.ReportsAdPushMapper;
+import cn.com.ctop.job.bytedance.data.service.IDateReportsPushService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import cn.com.ctop.job.bytedance.utils.FeishuRobotUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import javafx.util.Pair;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class DateReportsPushServiceImpl implements IDateReportsPushService {
+    public static final String APP_ID = "cli_a772633aaeff5013";
+    public static final String APP_KEY = "lEHaMdEoBVrrLNc5RtC11f8XsANnKgB4";
+    @Autowired
+    ReportsAdPushMapper reportsPushMapper;
+
+    private static final String TEMPLATE_VERSION = "1.0.2";
+    private static final String TEMPLATE_ID = "AAqRhJzMBoO0E";
+    @Override
+    public void send() {
+        String token;
+        try {
+            token = FeishuRobotUtil.getTenantToken(APP_ID, APP_KEY);
+        }catch (IOException e){
+            log.error("获取飞书token失败", e);
+            return;
+        }
+        //日期时间 - 统统以昨日为准
+        String today = DateUtils.getNowAddDate("yyyy-MM-dd", -1);
+        String lastDay = DateUtils.getNowAddDate("yyyy-MM-dd", -2);
+        Long todayLong = Long.parseLong(today.replaceAll("-", ""));
+        Long lastDayLong = Long.parseLong(lastDay.replaceAll("-", ""));
+
+        Map<String, String> todayData = reportsPushMapper.tmpPushData(todayLong);
+        Map<String, String> lastDayData = reportsPushMapper.tmpPushData(lastDayLong);
+
+        String updateTime = String.valueOf(todayData.get("update_time"));
+        List<Pair<String, String>> columns = Arrays.asList(
+                new Pair<>("cost_amount", "消耗金额"),
+                new Pair<>("end_amount", "结算金额"),
+                new Pair<>("pay_amount", "充值金额"),
+                new Pair<>("water_roi", "流水ROI"),
+                new Pair<>("real_roi", "真实ROI"),
+                new Pair<>("water_profit", "流水利润"),
+                new Pair<>("real_profit", "真实利润")
+        );
+        JSONArray dateIndicatorTable = new JSONArray();
+        for (Pair<String, String> column : columns) {
+            String key = column.getKey();
+            String name = column.getValue();
+            JSONObject obj = new JSONObject();
+            if (!name.contains("ROI")){
+                String todayDataValue = String.valueOf(todayData.getOrDefault(key, "0"));
+                String lastDayDataValue = String.valueOf(lastDayData.getOrDefault(key, "0"));
+                obj.put("indicatorName", name);
+                obj.put("todayData", todayDataValue);
+                obj.put("lastDayData", lastDayDataValue);
+                double todayDataDouble = Double.parseDouble(todayDataValue);
+                double lastDayDataDouble = Double.parseDouble(lastDayDataValue);
+                if (lastDayDataDouble != 0) {
+                    double rate = (todayDataDouble - lastDayDataDouble) / lastDayDataDouble * 100;
+                    String rateStr = String.format("%.2f%%", rate);
+                    obj.put("roundRate", rateStr);
+                    if (rate > 0.0){
+                        obj.put("rateColor", "red");
+                    }else if (rate < 0.0){
+                        obj.put("rateColor", "green");
+                    }
+                } else {
+                    obj.put("roundRate", "0.00%");
+                    obj.put("rateColor", "black");
+                }
+            }else {
+                String todayDataValue = String.valueOf(todayData.get(key));
+                String lastDayDataValue = String.valueOf(lastDayData.get(key));
+                obj.put("indicatorName", name);
+                obj.put("todayData", todayDataValue);
+                obj.put("lastDayData", lastDayDataValue);
+                obj.put("roundRate", "-");
+                obj.put("rateColor", "black");
+            }
+            dateIndicatorTable.add(obj);
+        }
+
+        List<Map<String, String>> movieData = reportsPushMapper.tmpTopMovie(todayLong);
+        JSONArray movieRankTable = new JSONArray();
+        for (Map<String, String> movie : movieData){
+            JSONObject obj = new JSONObject();
+            obj.put("rank", String.valueOf(movie.get("rk")));
+            obj.put("movieName", String.valueOf(movie.get("movie_name")));
+            obj.put("endAmount", String.valueOf(movie.get("end_amount")));
+            obj.put("realROI", String.valueOf(movie.get("real_roi")));
+            movieRankTable.add(obj);
+        }
+
+        List<Map<String, String>> deptData = reportsPushMapper.deptRank2(todayLong);
+        JSONArray deptRank = new JSONArray();
+        for (Map<String, String> dept : deptData){
+            JSONObject obj = new JSONObject();
+            obj.put("rank", String.valueOf(dept.get("rk")));
+            obj.put("deptName", String.valueOf(dept.get("dept_name")));
+            obj.put("todayCost", String.valueOf(dept.get("cost_amount")));
+            obj.put("ROI", String.valueOf(dept.get("real_roi")));
+            deptRank.add(obj);
+        }
+
+        JSONObject template_variable = new JSONObject();
+        template_variable.put("updateTime", updateTime);
+        template_variable.put("todayDate", today);
+        template_variable.put("lastDayDate", lastDay);
+        template_variable.put("dateIndicatorTable", dateIndicatorTable);
+        template_variable.put("movieRankTable", movieRankTable);
+        template_variable.put("deptRank", deptRank);
+
+        List<String> userIds = Arrays.asList(
+                "44fbaed6" //zhaotx
+                ,"ebeeced9" //yumeng
+                ,"265g9ef1" //wangshu
+                ,"ee518161" //zhaozhicheng
+                ,"c5f6b59d" //yuyang
+                ,"d834552b" //hemenghao
+                ,"a3235a61" //louzijun
+                ,"58e7a98a"  //xsq
+        );
+        for (String userId : userIds) {
+            sendToFeishu(token, template_variable, userId);
+        }
+    }
+
+    private void sendToFeishu(String token, JSONObject template_variable, String receive_id) {
+        JSONObject content = new JSONObject();
+        JSONObject contentData = new JSONObject();
+        contentData.put("template_id",TEMPLATE_ID);
+        contentData.put("template_version_name", TEMPLATE_VERSION);
+        contentData.put("template_variable", template_variable);
+        content.put("type", "template");
+        content.put("data", contentData);
+
+        JSONObject request = new JSONObject();
+        request.put("receive_id", receive_id);
+        request.put("msg_type", "interactive");
+        request.put("content", content.toJSONString());
+        //发送
+        try (CloseableHttpClient client = HttpClients.createDefault()){
+            HttpPost httpPost = new HttpPost("https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=user_id");
+            httpPost.setHeader("Authorization", "Bearer "+token);
+            HttpEntity entity = new StringEntity(request.toJSONString(), "UTF-8");
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json; charset=utf-8");
+            CloseableHttpResponse respon = client.execute(httpPost);
+            System.out.println("发送结果: "+ EntityUtils.toString(respon.getEntity(), "UTF-8"));
+        }catch (IOException e){
+            log.error("发送飞书消息失败", e);
+        }
+    }
+}

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

@@ -27,10 +27,12 @@ import java.util.stream.Collectors;
 @Service
 @Slf4j
 public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
+    public static final String APP_ID = "cli_a772630daa6cd00d";
+    public static final String APP_KEY = "qNjMgTXcUmRNc9gwzMMDYc8IS35wDdtX";
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
-    private static final String TEMPLATE_VERSION = "1.0.2";
+    private static final String TEMPLATE_VERSION = "1.0.5";
     private static final String TEMPLATE_ID = "AAqRUxrkkWuZf";
 
     public void send() {
@@ -41,7 +43,7 @@ public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
         String token;
         Map<String, String> mobileMap;
         try {
-            token = FeishuRobotUtil.getFsZtTenantToken();
+            token = FeishuRobotUtil.getTenantToken(APP_ID, APP_KEY);
             mobileMap = FeishuRobotUtil.getFsUserIds(token, mobiles); //mobile -> userId
         }catch (IOException e){
             log.error("获取飞书token失败", e);

Разница между файлами не показана из-за своего большого размера
+ 5 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsAdPushServiceImpl.java


+ 81 - 17
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ToolsSiteServiceImpl.java

@@ -42,11 +42,11 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
         params.put("advertiser_id", advertiserId);
         String url = "https://ad.oceanengine.com/open_api/2/advertiser/avatar/get/";
         JSONObject obj = Okhttp3Utils.bytedanceGetRequest(accessToken, url, params);
-        System.out.println(obj);
         if (!Check.isNull(obj)) {
             Integer code = obj.getInteger("code");
             if (code == 0) {
                 AdvertiserAvatar advertiserAvatar = new AdvertiserAvatar(obj.getJSONObject("data"));
+                advertiserAvatar.setReason("");
                 if (!toolsSiteMapper.updateAdvertiserAvatar(advertiserAvatar)) {
                     toolsSiteMapper.insertAdvertiserAvatar(advertiserAvatar);
                 }
@@ -69,13 +69,13 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
         String url = "https://api.oceanengine.com/open_api/2/agent/advertiser_info/query/";
         String results = HttpUtils.httpGet(url, params, HttpUtils.postMHeaders(accessToken));
         JSONObject obj = JSONObject.parseObject(results);
-        System.out.println(obj);
         Integer code = obj.getInteger("code");
         if (code == 0) {
             JSONArray array = obj.getJSONObject("data").getJSONArray("account_detail_list");
             JSONObject object = array.getJSONObject(0);
             if (!Check.isNull(object)) {
                 AdvertiserNameInfo nameInfo = new AdvertiserNameInfo(advertiserId, object.getString("advertiser_name"), object.getString("advertiser_status"));
+                nameInfo.setReason("");
                 if (!toolsSiteMapper.updateAdvertiserNameInfo(nameInfo)) {
                     toolsSiteMapper.insertAdvertiserNameInfo(nameInfo);
                 }
@@ -86,6 +86,18 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
     }
 
     @Override
+    public List<JSONObject> getTimeOutAppList() {
+        return toolsSiteMapper.getTimeOutAppList();
+    }
+
+    @Override
+    public void pushAgain(JSONObject app) {
+        String taskId = app.getString("task_id");
+        Long advertiserId = app.getLong("advertiser_id");
+        publishSiteStatus(advertiserId, taskId);
+    }
+
+    @Override
     public List<Long> getAppAdvertiserIds(String platType) {
         return toolsSiteMapper.getAppAdvertiserIds(platType);
     }
@@ -115,7 +127,6 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
         String url = "https://api.oceanengine.com/open_api/v3.0/tools/wechat_applet/list/";
         JSONObject obj = Okhttp3Utils.bytedanceGetRequest(accessToken, url, params);
         Integer code = obj.getInteger("code");
-        System.out.println(obj);
         if (code == 0) {
             JSONObject data = obj.getJSONObject("data");
             Integer totalPage = data.getJSONObject("page_info").getInteger("total_page");
@@ -129,10 +140,13 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
                 if ("SHARE_ONLY".equals(searchType)) {
                     advertiserApplet.setAppShare("1");
                     advertiserApplet.setShareAdvertiserId(resultObj.getLong("advertiser_id"));
+                } else {
+                    //小程序审核成功,判断是否主动创建落地页
+                    if ("AUDIT_ACCEPTED".equals(advertiserApplet.getAuditStatus()))
+                        pushCreateSite(advertiserId, advertiserApplet.getInstanceId());
                 }
-                if (!toolsSiteMapper.updateAdvertiserAppList(advertiserApplet)) {
+                if (!toolsSiteMapper.updateAdvertiserAppList(advertiserApplet))
                     toolsSiteMapper.insertAdvertiserAppList(advertiserApplet);
-                }
             }
         } else {
             log.error("获取微信小程序列表失败,{}", obj);
@@ -145,6 +159,20 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
 
     @Override
     public void updateTTAppStatus(Long advertiserId, String searchType, Integer page) {
+        List<AdvertiserApplet> advertiserApplets = toolsSiteMapper.queryAdvertiserAppList(advertiserId, "2");
+        //判断小程序状态是否在“审核中”状态,若存在则去拉取状态,并针对该对象修改,若不存在,则不执行。
+        if (!Check.isNull(advertiserApplets)) {
+            for (AdvertiserApplet advertiserApplet : advertiserApplets) {
+                if ("AUDITING".equals(advertiserApplet.getAuditStatus())) {
+                    getTTList(advertiserApplet, advertiserId, searchType, page);
+                }
+            }
+        } else {
+            getTTList(null, advertiserId, searchType, page);
+        }
+    }
+
+    private void getTTList(AdvertiserApplet targetApplet, Long advertiserId, String searchType, Integer page) {
         boolean nextPage = false;
         String accessToken = tokenMapper.onlyGetToken(advertiserId);
         JSONObject params = new JSONObject();
@@ -155,20 +183,11 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
         JSONObject filtering = new JSONObject();
         //CREATE_ONLY本户创建,SHARE_ONLY 只查共享应用
         filtering.put("search_type", searchType);
-       /*
-       //AUDIT_ACCEPTED 审核通过、AUDITING 审核中、AUDIT_REJECTED 审核不通过。不传表示全部状态
-        filtering.put("audit_status", "AUDIT_ACCEPTED");
-        */
-           /* JSONObject createTime = new JSONObject();
-            createTime.put("start_time", startDate);
-            createTime.put("end_time", DateUtils.getLastDay(endDate, -1));
-            filtering.put("create_time", createTime);*/
         params.put("filtering", filtering);
         //获取微信小程序列表
         String url = "https://api.oceanengine.com/open_api/v3.0/tools/micro_app/list/";
         JSONObject obj = Okhttp3Utils.bytedanceGetRequest(accessToken, url, params);
         Integer code = obj.getInteger("code");
-        System.out.println(obj);
         if (code == 0) {
             JSONObject data = obj.getJSONObject("data");
             Integer totalPage = data.getJSONObject("page_info").getInteger("total_page");
@@ -183,8 +202,13 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
                     advertiserApplet.setAppShare("1");
                     advertiserApplet.setShareAdvertiserId(resultObj.getLong("advertiser_id"));
                 }
-                if (!toolsSiteMapper.updateAdvertiserAppList(advertiserApplet)) {
-                    toolsSiteMapper.insertAdvertiserAppList(advertiserApplet);
+                if (targetApplet == null) {
+                    if (!toolsSiteMapper.updateAdvertiserAppList(advertiserApplet)) {
+                        toolsSiteMapper.insertAdvertiserAppList(advertiserApplet);
+                    }
+                } else {
+                    advertiserApplet.setTaskId(targetApplet.getTaskId());
+                    toolsSiteMapper.updateAdvertiserAppList2(advertiserApplet);
                 }
             }
         } else {
@@ -201,6 +225,11 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
     }
 
     @Override
+    public List<JSONObject> getSiteAdvertiserIds2() {
+        return toolsSiteMapper.getsiteAdvertiserIds2();
+    }
+
+    @Override
     public void updateSiteStatus(Long advertiserId, Integer page) {
         String accessToken = tokenMapper.onlyGetToken(advertiserId);
         boolean nextPage = false;
@@ -213,7 +242,6 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
         String url = "https://ad.oceanengine.com/open_api/2/tools/site/get/";
         JSONObject obj = Okhttp3Utils.bytedanceGetRequest(accessToken, url, params);
         Integer code = obj.getInteger("code");
-        System.out.println(obj);
         if (code == 0) {
             JSONObject data = obj.getJSONObject("data");
             Integer totalPage = data.getJSONObject("page_info").getInteger("total_page");
@@ -234,4 +262,40 @@ public class ToolsSiteServiceImpl implements IToolsSiteService {
             updateSiteStatus(advertiserId, page + 1);
         }
     }
+
+    @Override
+    public void publishSiteStatus(Long advertiserId, String taskId) {
+        if (Check.isNull(taskId) || Check.isNull(advertiserId)) {
+            return;
+        }
+        String url = "https://api.deepthink.artlinkworld.cn/task/createTask";
+        Map<String, Object> param = new HashMap<>();
+        param.put("taskId", taskId);
+        param.put("advertiserId", advertiserId);
+        String s = HttpUtils.httpPostRequest(url, param, null);
+        JSONObject jsonObject = JSONObject.parseObject(s);
+        if (!Check.isNull(jsonObject) && jsonObject.getInteger("code") == 0) {
+            log.info("任务id:{},advertiserId: {} 执行创建落地页", taskId, advertiserId);
+        }
+    }
+
+    //主动去创建落地页
+    private void pushCreateSite(Long advertiserId, Long instanceId) {
+        List<JSONObject> objectList = toolsSiteMapper.queryIsCreateSite(advertiserId, instanceId);
+        //有数据 说明还没有创建落地页,执行创建
+        if (!Check.isNull(objectList)) {
+            for (JSONObject object : objectList) {
+                Long taskId = object.getLong("task_id");
+                String url = "https://api.deepthink.artlinkworld.cn/task/createTask";
+                Map<String, Object> param = new HashMap<>();
+                param.put("taskId", taskId);
+                param.put("advertiserId", advertiserId);
+                String s = HttpUtils.httpPostRequest(url, param, null);
+                JSONObject jsonObject = JSONObject.parseObject(s);
+                if (!Check.isNull(jsonObject) && jsonObject.getInteger("code") == 0) {
+                    log.info("任务:{}({}),advertiserId: {} 执行创建落地页", object.getString("task_name"), taskId, advertiserId);
+                }
+            }
+        }
+    }
 }

Разница между файлами не показана из-за своего большого размера
+ 21 - 5
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/TotalRankPushServiceImpl.java


+ 9 - 4
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/UnbindWarnPushServiceImpl.java

@@ -34,8 +34,13 @@ public class UnbindWarnPushServiceImpl implements IUnbindWarnPushService {
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
+    @Override
+    public void send(){
+        send(null, true);
+    }
 
-    public void send() {
+    @Override
+    public void send(List<String> advertiserIds, boolean copySend) {
         List<JSONObject> users = reportsPushMapper.selectUserList();
         users.forEach(u -> {
             if (u.containsKey("remark") && u.getString("remark") != null && u.getString("remark").length() < 2){
@@ -54,7 +59,7 @@ public class UnbindWarnPushServiceImpl implements IUnbindWarnPushService {
         Long last90DayLong = Long.parseLong(last90Day.substring(0, 10).replaceAll("-", ""));
 
         int unFindCount = 0;
-        List<Map<String, String>> unbindData = reportsPushMapper.unbindData(todayLong, last90DayLong);
+        List<Map<String, String>> unbindData = reportsPushMapper.unbindData(todayLong, last90DayLong, advertiserIds);
 
         List<Unbind> unbinds = new ArrayList<>();
         List<Map<String, String>> unFindList = new ArrayList<>();
@@ -146,8 +151,8 @@ public class UnbindWarnPushServiceImpl implements IUnbindWarnPushService {
             }
         }
 
-        //给指定人员发送汇总
-        if (1==1){
+        //给指定人员抄送
+        if (copySend){
             JSONObject template_variable = new JSONObject();
             template_variable.put("unbindNum", unbindData.size());
             template_variable.put("alarm_time", alarm_time);

+ 13 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/DateUtils.java

@@ -5,6 +5,9 @@ import lombok.extern.slf4j.Slf4j;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -12,6 +15,8 @@ import java.util.List;
 
 @Slf4j
 public class DateUtils {
+    public static final DateTimeFormatter FORMATTER_DATETIME_SECOND = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
     public static Date getDateByPattern(String day, String pattern) {
         SimpleDateFormat format = new SimpleDateFormat(pattern);
         try {
@@ -58,14 +63,20 @@ public class DateUtils {
         }
     }
 
+    public static Long dt2milli(String dateTime) {
+        LocalDateTime parse = LocalDateTime.parse(dateTime, FORMATTER_DATETIME_SECOND);
+        long epochMilli = LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+        return epochMilli/1000;
+    }
+
     public static String formatTimestamp(String format, Long ts) {
         SimpleDateFormat sdf = new SimpleDateFormat(format);
         Date date = new Date(ts * 1000);
         return sdf.format(date);
     }
 
-    public static Integer getIntegerDate(String date) {
-        return Integer.valueOf(date.replace("-", ""));
+    public static String getYYMMDDTime(String date) {
+        return date.replace("-", "");
     }
 
 

+ 21 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/RandomStringGenerator.java

@@ -0,0 +1,21 @@
+package cn.com.ctop.job.bytedance.data.utils;
+
+import java.security.SecureRandom;
+
+public class RandomStringGenerator {
+    private static final String CHAR_SET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+    // 定义生成器
+    private static final SecureRandom RANDOM = new SecureRandom();
+
+    public static String generateRandomString(int length) {
+        StringBuilder sb = new StringBuilder(length);
+        for (int i = 0; i < length; i++) {
+            int index = RANDOM.nextInt(CHAR_SET.length());
+            sb.append(CHAR_SET.charAt(index));
+        }
+        return sb.toString();
+    }
+
+
+
+}

+ 10 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AdminAdvertiserListJob.java

@@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -56,4 +57,13 @@ public class AdminAdvertiserListJob {
     }
 
 
+    @XxlJob("batchUpdateAdvertiserName")
+    public void batchUpdateAdvertiserName() throws Exception {
+        List<JSONObject> infos = adminAdvertiserListService.getAdvertiserInfos();
+        if (!Check.isNull(infos)) {
+            adminAdvertiserListService.batchUpdateAdvertiserName(infos);
+        }
+    }
+
+
 }

+ 55 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceFlowDetailsReportJob.java

@@ -0,0 +1,55 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.job.bytedance.data.enums.AccountTypeEnum;
+import cn.com.ctop.job.bytedance.data.service.IByteDanceFlowDetailsReportService;
+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;
+
+/**
+ * @author lining
+ * @ClassName ByteDanceFlowDetailsReportJob
+ * @description: TODO
+ * @date 2025年04月16日
+ * @version: 1.0
+ */
+@Slf4j
+@Component
+public class ByteDanceFlowDetailsReportJob {
+
+    @Autowired
+    private IByteDanceFlowDetailsReportService byteDanceFlowDetailsReportService;
+
+    private static ExecutorService executorService = Executors.newFixedThreadPool(2);
+
+    @XxlJob("flowDetailsDaily")
+    public void flowDetailsDaily() throws Exception {
+        String param = XxlJobHelper.getJobParam(); // 执行参数
+        if (Check.isNull(param)) {
+            log.error("入参为空");
+            return;
+        }
+
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String data = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+        String[] s = param.split("_");
+        Long advertiserId = Long.valueOf(s[0]);
+        String accessToken = s[1];
+
+        executorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                if (!Check.isNull(accessToken)) {
+                    byteDanceFlowDetailsReportService.getBytedanceFlowDetailsDailyReport(advertiserId, accessToken, AccountTypeEnum.AD.getValue(), data, data, 1, null);
+                }
+            }
+        });
+    }
+}

+ 171 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceCdpProjectJob.java

@@ -0,0 +1,171 @@
+package cn.com.ctop.job.bytedance.handler;
+
+
+import cn.com.ctop.job.bytedance.data.service.IBytedanceCdpProjectService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+/**
+ * 拉取账户对应项目List
+ */
+@Slf4j
+@Component
+public class BytedanceCdpProjectJob {
+
+    @Autowired
+    private IBytedanceCdpProjectService cdpProjectService;
+
+    private static ExecutorService allttService = Executors.newFixedThreadPool(2);
+    private static ExecutorService allwxService = Executors.newFixedThreadPool(2);
+
+    private static ExecutorService projectExecutorService = Executors.newFixedThreadPool(3);
+    private static ExecutorService ttAppsExecutorService = Executors.newFixedThreadPool(3);
+    private static ExecutorService wxAppsExecutorService = Executors.newFixedThreadPool(3);
+    private static ExecutorService createiveAppsExecutorService = Executors.newFixedThreadPool(3);
+
+
+    @XxlJob("getAll")
+    public void getAll() {
+        log.info("[getAll] 任务启动...");
+        List<Long> ttList = cdpProjectService.getAllAdverIdList("tt");
+        if (!Check.isNull(ttList)) {
+            if (cdpProjectService.delErrApps("tt"))
+                log.info("[getAll] ---移除抖小失败记录");
+            ttList.forEach(id -> allttService.submit(() -> cdpProjectService.getByteAppInfo(id)));
+        }
+        List<Long> wxlist = cdpProjectService.getAllAdverIdList("wx");
+        if (!Check.isNull(wxlist)) {
+            if (cdpProjectService.delErrApps("wx"))
+                log.info("[getAll] ---移除微小失败记录");
+            wxlist.forEach(id -> allwxService.submit(() -> cdpProjectService.getWxAppInfo(id)));
+        }
+    }
+
+
+    @XxlJob("nowProjects")
+    public void nowProjects() {
+        log.info("[nowProjects] 任务启动...");
+        try {
+            //拉取今天数据
+            String today = DateUtils.getNowDate("yyyy-MM-dd");
+            List<Long> nowAdIds = cdpProjectService.queryAdvertiserIds("bytedance_advertiser_report_hour", DateUtils.getYYMMDDTime(today));
+            if (!Check.isNull(nowAdIds)) {
+                nowAdIds.forEach(id -> projectExecutorService.submit(() -> cdpProjectService.getProjectList(id, today)));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("[nowProjects]" + e.getMessage());
+        }
+    }
+
+    @XxlJob("yesProjects")
+    public void yesProjects() {
+        log.info("[yesProjects] 任务启动...");
+        try {
+            //拉取昨天数据
+            String yesterday = DateUtils.getNowAddDate("yyyy-MM-dd", -1);
+            List<Long> adIds = cdpProjectService.queryAdvertiserIds("bytedance_advertiser_report_daily", DateUtils.getYYMMDDTime(yesterday));
+            if (!Check.isNull(adIds)) {
+                adIds.forEach(id -> projectExecutorService.submit(() -> cdpProjectService.getProjectList(id, yesterday)));
+            }
+            //拉取前天数据
+            String yesterday2 = DateUtils.getNowAddDate("yyyy-MM-dd", -2);
+            List<Long> adIds2 = cdpProjectService.queryAdvertiserIds("bytedance_advertiser_report_daily", DateUtils.getYYMMDDTime(yesterday2));
+            if (!Check.isNull(adIds2)) {
+                adIds2.forEach(id -> projectExecutorService.submit(() -> cdpProjectService.getProjectList(id, yesterday2)));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("[yesProjects]" + e.getMessage());
+        }
+    }
+
+    @XxlJob("nowApps")
+    public void nowApps() {
+        log.info("[nowApps] 任务启动...");
+        try {
+            String today = DateUtils.getNowDate("yyyy-MM-dd");
+            //BYTE_APP 字节小程序, WECHAT_APP:微信小程序
+            List<Long> ttList = cdpProjectService.queryMediaAdverIds(today, "BYTE_APP");
+            if (!Check.isNull(ttList)) {
+                ttList.forEach(id -> ttAppsExecutorService.submit(() -> cdpProjectService.getByteAppInfo(id)));
+            }
+            List<Long> wxlist = cdpProjectService.queryMediaAdverIds(today, "WECHAT_APP");
+            if (!Check.isNull(wxlist)) {
+                wxlist.forEach(id -> wxAppsExecutorService.submit(() -> cdpProjectService.getWxAppInfo(id)));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("[nowApps]" + e.getMessage());
+        }
+    }
+
+    @XxlJob("yesApps")
+    public void yesApps() {
+        log.info("[yesApps] 任务启动...");
+        try {
+            //昨天
+            String yesterday = DateUtils.getNowAddDate("yyyy-MM-dd", -1);
+            //BYTE_APP 字节小程序, WECHAT_APP:微信小程序
+            List<Long> ttList = cdpProjectService.queryMediaAdverIds(yesterday, "BYTE_APP");
+            if (!Check.isNull(ttList)) {
+                ttList.forEach(id -> ttAppsExecutorService.submit(() -> cdpProjectService.getByteAppInfo(id)));
+            }
+            List<Long> wxlist = cdpProjectService.queryMediaAdverIds(yesterday, "WECHAT_APP");
+            if (!Check.isNull(wxlist)) {
+                wxlist.forEach(id -> wxAppsExecutorService.submit(() -> cdpProjectService.getWxAppInfo(id)));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("[yesApps]" + e.getMessage());
+        }
+    }
+
+
+    @XxlJob("nowDynamicCreateives")
+    public void nowDynamicCreateives() {
+        log.info("[nowDynamicCreateives] 任务启动...");
+        try {
+            //拉取今天数据
+            String today = DateUtils.getNowDate("yyyy-MM-dd");
+            List<Long> ids = cdpProjectService.queryAdvertiserIds("adq_advertiser_report_hour", DateUtils.getYYMMDDTime(today));
+            if (!Check.isNull(ids)) {
+                ids.forEach(id -> createiveAppsExecutorService.submit(() -> cdpProjectService.getAdqCreatives(id, today)));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("[nowDynamicCreateives]" + e.getMessage());
+        }
+    }
+
+    @XxlJob("yesDynamicCreateives")
+    public void yesDynamicCreateives() {
+        log.info("[yesDynamicCreateives] 任务启动...");
+        try {
+            //拉取昨天数据
+            String yesterday = DateUtils.getNowAddDate("yyyy-MM-dd", -1);
+            List<Long> ids = cdpProjectService.queryAdvertiserIds("adq_advertiser_report_daily", DateUtils.getYYMMDDTime(yesterday));
+            if (!Check.isNull(ids)) {
+                ids.forEach(id -> createiveAppsExecutorService.submit(() -> cdpProjectService.getAdqCreatives(id, yesterday)));
+            }
+            //拉取前天数据
+            String yesterday2 = DateUtils.getNowAddDate("yyyy-MM-dd", -2);
+            List<Long> ids2 = cdpProjectService.queryAdvertiserIds("adq_advertiser_report_daily", DateUtils.getYYMMDDTime(yesterday2));
+            if (!Check.isNull(ids2)) {
+                ids2.forEach(id -> createiveAppsExecutorService.submit(() -> cdpProjectService.getAdqCreatives(id, yesterday2)));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("[yesDynamicCreateives]" + e.getMessage());
+        }
+    }
+}

+ 15 - 18
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceReportRetryJob.java

@@ -2,6 +2,8 @@ package cn.com.ctop.job.bytedance.handler;
 
 
 import cn.com.ctop.job.bytedance.data.service.*;
+import cn.com.ctop.job.bytedance.data.enums.AccountTypeEnum;
+import cn.com.ctop.job.bytedance.data.service.*;
 import cn.com.ctop.job.bytedance.data.utils.Check;
 import com.alibaba.fastjson.JSONObject;
 import com.xxl.job.core.handler.annotation.XxlJob;
@@ -37,6 +39,9 @@ public class BytedanceReportRetryJob {
     @Autowired
     private IBytedanceMiniAppService miniAppService;
 
+    @Autowired
+    private IByteDanceFlowDetailsReportService byteDanceFlowDetailsReportService;
+
 
     private static ExecutorService hourAccountRetrExecutorService = Executors.newFixedThreadPool(2);
     private static ExecutorService dailyAccountRetrExecutorService = Executors.newFixedThreadPool(2);
@@ -46,6 +51,8 @@ public class BytedanceReportRetryJob {
 
     private static ExecutorService productDailyRetrExecutor = Executors.newFixedThreadPool(2);
 
+    private static ExecutorService flowDailyRetrExecutor = Executors.newFixedThreadPool(2);
+
 
     @XxlJob("retryReport")
     public void retryReport() throws Exception {
@@ -115,6 +122,14 @@ public class BytedanceReportRetryJob {
                         });
                     }
 
+                } else if ("flow_details".equals(dataDimension)) { //日报流水详情
+                    flowDailyRetrExecutor.submit(new Runnable() {
+
+                        @Override
+                        public void run() {
+                            byteDanceFlowDetailsReportService.getBytedanceFlowDetailsDailyReport(advertiserId, accessToken, AccountTypeEnum.AD.getValue(), startDate, endDate, 1, id);
+                        }
+                    });
                 }
 
 
@@ -147,24 +162,6 @@ public class BytedanceReportRetryJob {
             log.info("常读重试列表为空");
         }
 
-        List<JSONObject> maEcpmRetryJob = miniAppService.getMaEcpmRetryJob();
-        if (!Check.isNull(maEcpmRetryJob)) {
-            for (int i = 0; i < maEcpmRetryJob.size(); i++) {
-                JSONObject jsonObject = maEcpmRetryJob.get(i);
-                Long id = jsonObject.getLong("id");
-                String startDate = jsonObject.getString("startDate");
-                String endDate = jsonObject.getString("endDate");
-                String dataDimension = jsonObject.getString("dataDimension");
-                Integer isSend = jsonObject.getInteger("isSend");
-                if (dataDimension != null && dataDimension.startsWith("ma_ecpm:")) {
-                    String appId = dataDimension.split(":")[1];
-                    miniAppService.getMaEcpm(startDate, endDate, appId, 1, id, isSend);
-                }
-            }
-        } else {
-            log.info("抖小IAA重试列表为空");
-        }
-
 
     }
 

+ 6 - 4
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/FeishuPushJob.java

@@ -19,29 +19,31 @@ public class FeishuPushJob {
     IOptimizerRankPushService optimizerRankPushService;
     @Autowired
     ITotalRankPushService totalRankPushService;
+    @Autowired
+    IDateReportsPushService dateReportsPushService;
 
     @XxlJob("unbindWarnPush")
     public void unbindWarnPush(){
         unbindWarnPushService.send();
     }
-
     @XxlJob("bindAppErrorWarnPush")
     public void bindAppErrorWarnPush(){
         bindAppErrorWarnService.send();
     }
-
     @XxlJob("reportsAdPush")
     public void reportsAdPush(){
         reportsAdPushService.send();
     }
-
     @XxlJob("optimizerRankPush")
     public void optimizerRankPush(){
         optimizerRankPushService.send();
     }
-
     @XxlJob("totalRankPush")
     public void totalRankPush(){
         totalRankPushService.send();
     }
+    @XxlJob("dateReportsPush")
+    public void dateReportsPush(){
+        dateReportsPushService.send();
+    }
 }

+ 19 - 7
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ToolsSiteJob.java

@@ -3,6 +3,7 @@ package cn.com.ctop.job.bytedance.handler;
 
 import cn.com.ctop.job.bytedance.data.service.IToolsSiteService;
 import cn.com.ctop.job.bytedance.data.utils.Check;
+import com.alibaba.fastjson.JSONObject;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,12 +25,14 @@ public class ToolsSiteJob {
 
     private static ExecutorService avatarExecutorService = Executors.newFixedThreadPool(3);
     private static ExecutorService nameExecutorService = Executors.newFixedThreadPool(3);
+    private static ExecutorService appExecutorService = Executors.newFixedThreadPool(3);
     private static ExecutorService wxappExecutorService = Executors.newFixedThreadPool(3);
     private static ExecutorService ttappExecutorService = Executors.newFixedThreadPool(3);
     private static ExecutorService siteExecutorService = Executors.newFixedThreadPool(3);
 
     @XxlJob("getToolsSiteList")
     public void getToolsSiteList() throws Exception {
+        log.info("[批量创建,各状态更新] 任务启动...");
 //        String param = XxlJobHelper.getJobParam(); // 执行参数
 //        if (Check.isNull(param)) {
 //            log.error("入参为空");
@@ -38,17 +41,18 @@ public class ToolsSiteJob {
         //头像待更新的广告主id集
         List<Long> avatarIds = toolsSiteService.getAvatarAdvertiserIds();
         if (!Check.isNull(avatarIds)) {
-            avatarIds.forEach(id -> avatarExecutorService.submit(() -> {
-                toolsSiteService.updateAvatarStatus(id);
-            }));
+            avatarIds.forEach(id -> avatarExecutorService.submit(() -> toolsSiteService.updateAvatarStatus(id)));
         }
 
         //广告名称待更新的广告主id集
         List<Long> nameIds = toolsSiteService.getNameAdvertiserIds();
         if (!Check.isNull(nameIds)) {
-            nameIds.forEach(id -> nameExecutorService.submit(() -> {
-                toolsSiteService.updateNameStatus(id);
-            }));
+            nameIds.forEach(id -> nameExecutorService.submit(() -> toolsSiteService.updateNameStatus(id)));
+        }
+
+        List<JSONObject> appList = toolsSiteService.getTimeOutAppList();
+        if (!Check.isNull(appList)) {
+            appList.forEach(app -> appExecutorService.submit(() -> toolsSiteService.pushAgain(app)));
         }
 
         //微信
@@ -73,13 +77,21 @@ public class ToolsSiteJob {
             }));
         }
 
-        //落地页
+        //更新落地页状态
         List<Long> siteIds = toolsSiteService.getSiteAdvertiserIds();
         if (!Check.isNull(siteIds)) {
             siteIds.forEach(id -> siteExecutorService.submit(() -> {
                 toolsSiteService.updateSiteStatus(id, 1);
             }));
         }
+
+        //发布落地页
+        List<JSONObject> sids = toolsSiteService.getSiteAdvertiserIds2();
+        if (!Check.isNull(siteIds)) {
+            sids.forEach(o -> siteExecutorService.submit(() -> {
+                toolsSiteService.publishSiteStatus(o.getLong("advertiser_id"), o.getString("task_id"));
+            }));
+        }
     }
 
 }

+ 5 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/utils/FeishuRobotUtil.java

@@ -49,6 +49,11 @@ public class FeishuRobotUtil {
         return getTenantToken(getFsAdlbAuth());
     }
 
+    public static String getTenantToken(String appid, String appKey) throws IOException {
+        String entity = "{\"app_id\":\""+appid+"\",\"app_secret\":\""+appKey+"\"}";
+        return getTenantToken(entity);
+    }
+
     public static String getTenantToken(String entity) throws IOException {
         //获取token
         String tokenUrl = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal";