Browse Source

添加项目列表

zhaoxian 2 years ago
parent
commit
e22ca52271

+ 2 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/constant/BytedanceConstant.java

@@ -33,4 +33,6 @@ public class BytedanceConstant {
     public static final String BYTEDANCE_V3_CONFIG_ADVERTISER_GET = "/v3.0/report/custom/config/get/";
 
     public static final String BYTEDANCE_V3_PROMOTION_LIST_GET = "/v3.0/promotion/list/";
+
+    public static final String BYTEDANCE_V3_PROJECT_LIST_GET = "/v3.0/project/list/";
 }

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

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

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

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

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

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.com.ctop.job.bytedance.data.mapper.BytedanceProjectMapper">
+
+
+    <insert id="replaceProjectList">
+        REPLACE INTO bytedance_cdp_project (
+        project_id,
+        `name`,
+        advertiser_id,
+        status,
+        package_name,
+        project_create_time,
+        project_modify_time,
+        pricing,
+        landing_type,
+        ad_type,
+        audience_extend,
+        opt_status,
+        app_promotion_type,
+        delivery_mode,
+        search_bid_ratio,
+        download_url,
+        download_mode,
+        download_type,
+        app_name,
+        feed_delivery_search,
+        marketing_goal,
+        keywords,
+        delivery_setting,
+        dpa_product_target,
+        optimize_goal,
+        audience,
+        related_product,
+        delivery_range,
+        track_url_setting,
+        internal_advertiser_info
+        )
+        VALUES
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.projectId},
+            #{item.name},
+            #{item.advertiserId},
+            #{item.status},
+            #{item.packageName},
+            #{item.projectCreateTime},
+            #{item.projectModifyTime},
+            #{item.pricing},
+            #{item.landingType},
+            #{item.adType},
+            #{item.audienceExtend},
+            #{item.optStatus},
+            #{item.appPromotionType},
+            #{item.deliveryMode},
+            #{item.searchBidRatio},
+            #{item.downloadUrl},
+            #{item.downloadMode},
+            #{item.downloadType},
+            #{item.appName},
+            #{item.feedDeliverySearch},
+            #{item.marketingGoal},
+            #{item.keywords},
+            #{item.deliverySetting},
+            #{item.dpaProductTarget},
+            #{item.optimizeGoal},
+            #{item.audience},
+            #{item.relatedProduct},
+            #{item.deliveryRange},
+            #{item.trackUrlSetting},
+            #{item.internalAdvertiserInfo}
+            )
+        </foreach>
+    </insert>
+
+
+</mapper>

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

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

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

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

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

@@ -0,0 +1,68 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.job.bytedance.data.entity.OauthToken;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceProjectService;
+import cn.com.ctop.job.bytedance.data.service.IOauthTokenService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 获取项目列表
+ */
+@Slf4j
+@Component
+public class BytedanceProjectJob {
+    @Autowired
+    private IOauthTokenService tokenService;
+
+    private static ExecutorService dailyExecutorService = Executors.newFixedThreadPool(3);
+
+
+    @Autowired
+    private IBytedanceProjectService projectService;
+
+
+    /**
+     * 获取项目列表
+     *
+     */
+    @XxlJob("getV3Project")
+    public void getV3Project() throws Exception {
+        String param = XxlJobHelper.getJobParam(); // 执行参数
+        if (Check.isNull(param)) {
+            log.error("入参为空");
+            return;
+        }
+        String token = tokenService.getByAccountId(Long.valueOf(param));
+        if (Check.isNull(token)) {
+            log.error("此账户未获取到相关token,accountId:{}", param);
+            return;
+        }
+        OauthToken oauthToken = new OauthToken();
+        oauthToken.setAccessToken(token);
+        oauthToken.setAccountId(Long.parseLong(param));
+
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+        String yesterda2 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -2);
+        dailyExecutorService.submit(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        projectService.getProjectList(oauthToken, yesterda, yesterda, 1);
+                        projectService.getProjectList(oauthToken, yesterda2, yesterda2, 1);
+                    }
+                });
+
+
+    }
+
+}