ZHAOXIAN 1 год назад
Родитель
Сommit
5554d40a74

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

@@ -0,0 +1,49 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+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;
+
+}

+ 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;
+
+}

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

@@ -0,0 +1,21 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+import cn.com.ctop.job.bytedance.data.entity.BytedanceCdpProject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 头条项目列Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-04-23
+ */
+public interface BytedanceCdpProjectMapper {
+
+    void replaceBytedanceCdpProjectList(@Param("projectList") List<BytedanceCdpProject> projectList);
+
+    void insertErrorAdvertiserId(@Param("advertiserId") Long advertiserId);
+
+    List<Long> getAllAdverIdList();
+}

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

@@ -0,0 +1,83 @@
+<?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="insertErrorAdvertiserId">
+        replace
+        into media_api.error_advertiser (advertiser_id)
+        values(
+        #{advertiserId}
+        )
+    </insert>
+
+
+    <select id="getAllAdverIdList" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT advertiser_id
+        FROM deepthink.bytedance_advertiser_list
+    </select>
+
+</mapper>

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

@@ -0,0 +1,16 @@
+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 type, Integer page);
+
+    List<Long> getAllAdverIdList();
+}

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

@@ -0,0 +1,94 @@
+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.HttpUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 头条项目列Service业务层处理
+ * <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() {
+        return bytedanceCdpProjectMapper.getAllAdverIdList();
+    }
+
+    @Override
+    public void getProjectList(Long advertiserId, String type, Integer page) {
+        try {
+            boolean nextPage = false;
+            String accessToken = tokenMapper.onlyGetToken(advertiserId);
+            Map<String, Object> params = new HashMap<>();
+            params.put("advertiser_id", advertiserId);
+            if (!Check.isNull(type)) {
+                JSONObject filtering = new JSONObject();
+                //不传默认返回不限(不含已删除)
+                filtering.put("status_first", "PROJECT_STATUS_DELETE");
+                params.put("filtering", filtering);
+            }
+            params.put("page", page);
+            params.put("page_size", 1100);//最大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);
+            System.out.println("入参:" + params);
+            System.out.println("结果:" + 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))
+                    bytedanceCdpProjectMapper.replaceBytedanceCdpProjectList(projectList);
+            } else {
+                log.error("获取项目列表失败(url:{}),入参:{}\n结果:{}", url, JSONObject.toJSONString(params), obj);
+                bytedanceCdpProjectMapper.insertErrorAdvertiserId(advertiserId);
+            }
+            if (nextPage) {
+                getProjectList(advertiserId, type, page + 1);
+            }
+        } catch (Exception e) {
+            bytedanceCdpProjectMapper.insertErrorAdvertiserId(advertiserId);
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+    }
+
+}

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

@@ -0,0 +1,45 @@
+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 com.google.common.collect.Lists;
+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 cdpProjectExecutorService = Executors.newFixedThreadPool(6);
+    private static ExecutorService nameExecutorService = Executors.newFixedThreadPool(3);
+
+    @XxlJob("getProjectListJob")
+    public void getToolsSiteList() throws Exception {
+        //头像待更新的广告主id集
+        List<Long> avatarIds = cdpProjectService.getAllAdverIdList();
+        List<List<Long>> smallLists = Lists.partition(avatarIds, 10000); // 使用Guava的partition方法拆分列表
+        if (!Check.isNull(smallLists)) {
+            smallLists.forEach(list -> cdpProjectExecutorService.submit(() -> {
+                for (Long id : list) {
+                    cdpProjectService.getProjectList(id, null, 1);
+                    cdpProjectService.getProjectList(id, "del", 1);
+                }
+            }));
+        }
+    }
+
+}