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

头条更新管家下所有账户

yumeng 1 год назад
Родитель
Сommit
fa17071355

+ 17 - 61
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java

@@ -1,5 +1,6 @@
 package cn.com.ctop.job.bytedance.controller;
 package cn.com.ctop.job.bytedance.controller;
 
 
+import cn.com.ctop.job.bytedance.data.service.IAdminAdvertiserListService;
 import cn.com.ctop.job.bytedance.data.service.IBytedancePromoterReportService;
 import cn.com.ctop.job.bytedance.data.service.IBytedancePromoterReportService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceRefreshTokenService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceRefreshTokenService;
 import cn.com.ctop.job.bytedance.data.service.IChannelService;
 import cn.com.ctop.job.bytedance.data.service.IChannelService;
@@ -33,79 +34,34 @@ import java.util.concurrent.Executors;
 @Api(tags = "头条")
 @Api(tags = "头条")
 @Slf4j
 @Slf4j
 public class BytedanceController {
 public class BytedanceController {
-    @Autowired
-    private IBytedanceRefreshTokenService refreshTokenService;
 
 
-    @Autowired
-    private IBytedancePromoterReportService promoterReportService;
-    @Autowired
-    private IChannelService channelService;
     private static ExecutorService dailyRetrExecutorService = Executors.newFixedThreadPool(5);
     private static ExecutorService dailyRetrExecutorService = Executors.newFixedThreadPool(5);
 
 
+    @Autowired
+    private IAdminAdvertiserListService adminAdvertiserListService;
 
 
-    @GetMapping("/testRefreshToken")
-    public void testRefreshToken() {
-        List<JSONObject> dataList = promoterReportService.getAllList();
-        List<String> days = DateUtils.getDays("2025-02-15", "2025-03-13");
-        System.err.println(days);
-
-        for (int i = 0; i < days.size(); i++) {
-            String s = days.get(i);
-            System.err.println(s);
-            for (int j = 0; j < dataList.size(); j++) {
-                JSONObject jsonObject = dataList.get(j);
-                Long advertiserId = jsonObject.getLong("advertiserId");
-                String accessToken = jsonObject.getString("accessToken");
-                dailyRetrExecutorService.submit(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (!Check.isNull(accessToken)) {
-                            promoterReportService.getBytedancePromoterHour(advertiserId, accessToken, s, s, 1, 1);
-
-                        }
-                    }
-                });
-            }
-
-        }
-
-
-        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
-        String yesDate = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
-
-        for (int i = 0; i < dataList.size(); i++) {
-            JSONObject jsonObject = dataList.get(i);
-            Long advertiserId = jsonObject.getLong("advertiserId");
-            String accessToken = jsonObject.getString("accessToken");
-            //   promoterReportService.getBytedancePromoterDaily(advertiserId, accessToken, yesDate, yesDate, 1, 1);
-            promoterReportService.getBytedancePromoterHour(advertiserId, accessToken, yesDate, yesDate, 1, 1);
-
-
-        }
-
-
-    }
 
 
 
 
     @GetMapping("/getChannel")
     @GetMapping("/getChannel")
-    public void getChannel() {
-        List<JSONObject> channelList = promoterReportService.getChannelInfoList();
-/*        startDate = startDate == null ? DateUtils.getNowAddDate("yyyy-MM-dd", -1) : startDate;
-        endDate = endDate == null ? DateUtils.getNowDate("yyyy-MM-dd") : endDate;*/
-
-        List<String> days = DateUtils.getDays("2025-01-01", "2025-03-17");
-        for (int i = 0; i < days.size(); i++) {
-            String s = days.get(i);
-            for (int j = 0; j < channelList.size(); j++) {
-                JSONObject jsonObject = channelList.get(j);
-                String channelAccountId = jsonObject.getString("channelAccountId");
-                String secretKey = jsonObject.getString("secretKey");
-                channelService.getPromotionIdList(s, s, channelAccountId, secretKey, 0);
+    public void getChannel(String param) {
+
+        String[] s = param.split("_");
+        Long advertiserId = Long.valueOf(s[0]);
+        String accessToken = s[1];
+        Integer pageSize = 100;
+        log.info("刷新管家账户下账户列表开始,AdminAdvertiserId:{}", advertiserId);
+        JSONObject totalJson = adminAdvertiserListService.getBytedanceAccountListTotal(advertiserId, advertiserId, accessToken, 1, pageSize);
+        if (!Check.isNull(totalJson)) {
+            Integer totalPage = totalJson.getInteger("totalPage");
+            if (totalPage != 0) {
+                JSONObject result = adminAdvertiserListService.bytedanceAdvertiserThreadPool(totalPage, pageSize, advertiserId, advertiserId, accessToken);
+                log.info("字节多线程获取账户返回结果:{}", result);
             }
             }
         }
         }
 
 
 
 
 
 
+
     }
     }
 
 
 
 

+ 105 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/BytedanceAdvertiserList.java

@@ -0,0 +1,105 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 【请填写功能名称】对象 bytedance_advertiser_list
+ *
+ * @author ruoyi
+ * @date 2025-02-27
+ */
+public class BytedanceAdvertiserList {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 管家账户ID
+     */
+    private Long adminAdvertiserId;
+
+    /**
+     * 广告主ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 广告主名称
+     */
+    private String advertiserName;
+
+    /**
+     * 广告主类型
+     */
+    private String advertiserType;
+
+    /**
+     * 企业号ID
+     */
+    private String eDouyinId;
+
+    /**
+     * 企业号名称
+     */
+    private String eDouyinName;
+
+    public Long getAdminAdvertiserId() {
+        return adminAdvertiserId;
+    }
+
+    public void setAdminAdvertiserId(Long adminAdvertiserId) {
+        this.adminAdvertiserId = adminAdvertiserId;
+    }
+
+    public Long getAdvertiserId() {
+        return advertiserId;
+    }
+
+    public void setAdvertiserId(Long advertiserId) {
+        this.advertiserId = advertiserId;
+    }
+
+    public String getAdvertiserName() {
+        return advertiserName;
+    }
+
+    public void setAdvertiserName(String advertiserName) {
+        this.advertiserName = advertiserName;
+    }
+
+    public String getAdvertiserType() {
+        return advertiserType;
+    }
+
+    public void setAdvertiserType(String advertiserType) {
+        this.advertiserType = advertiserType;
+    }
+
+    public String geteDouyinId() {
+        return eDouyinId;
+    }
+
+    public void seteDouyinId(String eDouyinId) {
+        this.eDouyinId = eDouyinId;
+    }
+
+    public String geteDouyinName() {
+        return eDouyinName;
+    }
+
+    public void seteDouyinName(String eDouyinName) {
+        this.eDouyinName = eDouyinName;
+    }
+
+    @Override
+    public String toString() {
+        return "BytedanceAdvertiserList{" +
+                "adminAdvertiserId=" + adminAdvertiserId +
+                ", advertiserId=" + advertiserId +
+                ", advertiserName='" + advertiserName + '\'' +
+                ", advertiserType='" + advertiserType + '\'' +
+                ", eDouyinId='" + eDouyinId + '\'' +
+                ", eDouyinName='" + eDouyinName + '\'' +
+                '}';
+    }
+}

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

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

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

@@ -0,0 +1,23 @@
+<?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.AdminAdvertiserListMapper">
+
+
+    <insert id="replaceBytedanceAdvertiserLists">
+        replace into deepthink.bytedance_advertiser_list(
+        admin_advertiser_id,
+        advertiser_id,
+        advertiser_name,
+        advertiser_type
+        )
+        values
+        <foreach collection="adds" item="add" separator=",">
+            (
+            #{add.adminAdvertiserId},
+            #{add.advertiserId},
+            #{add.advertiserName},
+            #{add.advertiserType}
+            )
+        </foreach>
+    </insert>
+</mapper>

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

@@ -0,0 +1,9 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+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);
+}

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

@@ -0,0 +1,169 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserList;
+import cn.com.ctop.job.bytedance.data.mapper.AdminAdvertiserListMapper;
+import cn.com.ctop.job.bytedance.data.service.IAdminAdvertiserListService;
+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.*;
+import java.util.concurrent.*;
+import java.util.stream.Collectors;
+@Service
+@Slf4j
+public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListService {
+
+    @Autowired
+    private AdminAdvertiserListMapper adminAdvertiserListMapper;
+    @Override
+    public JSONObject bytedanceAdvertiserThreadPool(Integer totalPage, Integer pageSize, Long adminAdvertiserId, Long ccAccountId, String accessToken) {
+        ExecutorService executor = Executors.newFixedThreadPool(15);
+        // 3. 创建线程安全的结果收集器
+        List<Future<AdminAdvertiserListServiceImpl.PageResult>> futures = new ArrayList<>();
+
+        // 4. 提交分页任务
+        for (int page = 1; page <= totalPage; page++) {
+            final int currentPage = page;
+            Callable<AdminAdvertiserListServiceImpl.PageResult> task = () -> {
+                try {
+                    List<String> bytedanceAccountList = getBytedanceAccountList(adminAdvertiserId, ccAccountId, accessToken, currentPage, 100, 1);
+                    return new AdminAdvertiserListServiceImpl.PageResult(currentPage, bytedanceAccountList);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    return new AdminAdvertiserListServiceImpl.PageResult(currentPage, Collections.emptyList());
+                }
+            };
+            futures.add(executor.submit(task));
+        }
+
+        // 5. 处理结果
+        List<AdminAdvertiserListServiceImpl.PageResult> results = new ArrayList<>();
+        for (Future<AdminAdvertiserListServiceImpl.PageResult> future : futures) {
+            try {
+                results.add(future.get());
+            } catch (InterruptedException | ExecutionException e) {
+                e.printStackTrace();
+                log.error("多线程请求数据失败:" + e.getMessage());
+            }
+        }
+
+        // 6. 关闭线程池
+        executor.shutdown();
+        try {
+            executor.awaitTermination(1, TimeUnit.MINUTES);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
+        // 7. 排序并合并结果
+        results.sort(Comparator.comparingInt(AdminAdvertiserListServiceImpl.PageResult::getPageNumber));
+        List<String> finalData = results.stream()
+                .flatMap(r -> r.getData().stream())
+                .collect(Collectors.toList());
+
+        JSONObject returnJson = new JSONObject();
+        returnJson.put("code", 200);
+        returnJson.put("total", finalData.size());
+        returnJson.put("message", "多线程请求字节账户列表成功");
+        return returnJson;
+    }
+
+    @Override
+    public JSONObject getBytedanceAccountListTotal(Long adminAdvertiserId, Long ccAccountId, String accessToken, Integer page, Integer pageSize) {
+        JSONObject returnJson = new JSONObject();
+        Integer totalPage = 0;
+        Map<String, Object> paramsMap = new HashMap<>();
+        paramsMap.put("cc_account_id", ccAccountId);
+        paramsMap.put("page", page);
+        paramsMap.put("page_size", pageSize);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", accessToken);
+        String s = HttpUtils.httpGet("https://ad.oceanengine.com/open_api/2/customer_center/advertiser/list/", paramsMap, headers);
+        JSONObject jsonObject = JSONObject.parseObject(s);
+        Integer code = jsonObject.getInteger("code");
+        List<BytedanceAdvertiserList> advertiserLists = new ArrayList<>();
+        if (code == 0) {
+            JSONObject data = jsonObject.getJSONObject("data");
+            if (!Check.isNull(data)) {
+                JSONObject pageInfo = data.getJSONObject("page_info");
+                if (!Check.isNull(pageInfo)) {
+                    totalPage = pageInfo.getInteger("total_page");
+                }
+            }
+
+        }
+        returnJson.put("totalPage", totalPage);
+        return returnJson;
+    }
+
+    // 分页结果包装类
+    static class PageResult {
+        private final int pageNumber;
+        private final List<String> data;
+
+        public PageResult(int pageNumber, List<String> data) {
+            this.pageNumber = pageNumber;
+            this.data = data;
+        }
+
+        public int getPageNumber() {
+            return pageNumber;
+        }
+
+        public List<String> getData() {
+            return data;
+        }
+    }
+
+
+    private List<String> getBytedanceAccountList(Long adminAdvertiserId, Long ccAccountId, String accessToken, Integer page, Integer pageSize, Integer requestCount) {
+        if (requestCount > 3) {
+            log.error("重试次数大于3次,跳出本页数据请求任务,adminAdvertiserId:{}", adminAdvertiserId);
+            List<String> data = new ArrayList<>();
+            data.add("page:" + page);
+            return data;
+        }
+        Map<String, Object> paramsMap = new HashMap<>();
+        paramsMap.put("cc_account_id", ccAccountId);
+        paramsMap.put("page", page);
+        paramsMap.put("page_size", pageSize);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", accessToken);
+        String s = HttpUtils.httpGet("https://ad.oceanengine.com/open_api/2/customer_center/advertiser/list/", paramsMap, headers);
+        JSONObject jsonObject = JSONObject.parseObject(s);
+        Integer code = jsonObject.getInteger("code");
+        List<BytedanceAdvertiserList> advertiserLists = new ArrayList<>();
+        if (code == 0) {
+            JSONObject data = jsonObject.getJSONObject("data");
+            if (!Check.isNull(data)) {
+                JSONArray list = data.getJSONArray("list");
+                if (!Check.isNull(list)) {
+                    for (int i = 0; i < list.size(); i++) {
+                        BytedanceAdvertiserList advertiserList = new BytedanceAdvertiserList();
+                        JSONObject advertiserInfo = list.getJSONObject(i);
+                        advertiserList.setAdminAdvertiserId(adminAdvertiserId);
+                        advertiserList.setAdvertiserId(advertiserInfo.getLong("advertiser_id"));
+                        advertiserList.setAdvertiserName(advertiserInfo.getString("advertiser_name"));
+                        advertiserList.setAdvertiserType(advertiserInfo.getString("advertiser_type"));
+                        advertiserLists.add(advertiserList);
+                    }
+                }
+            }
+        } else {
+            log.error("请求字节账户列表失败,进入重试任务,当前请求次数:{}", requestCount);
+            getBytedanceAccountList(adminAdvertiserId, ccAccountId, accessToken, page, pageSize, requestCount + 1);
+        }
+        if (!Check.isNull(advertiserLists)) {
+            adminAdvertiserListMapper.replaceBytedanceAdvertiserLists(advertiserLists);
+            log.info("字节账户数据插入成功,当前页数:{},数据条数:{}", page, advertiserLists.size());
+        }
+        List<String> data = new ArrayList<>();
+        data.add("page:" + page);
+        return data;
+    }
+}

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

@@ -0,0 +1,60 @@
+package cn.com.ctop.job.bytedance.handler;
+
+
+import cn.com.ctop.job.bytedance.data.service.IAdminAdvertiserListService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import com.alibaba.fastjson.JSONObject;
+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;
+
+
+/**
+ * 广告主定时任务
+ *
+ * @throws Exception
+ */
+@Slf4j
+@Component
+public class AdminAdvertiserListJob {
+    @Autowired
+    private IAdminAdvertiserListService adminAdvertiserListService;
+    private static ExecutorService adminService = Executors.newFixedThreadPool(2);
+
+    @XxlJob("getAdminAdvertiserList")
+    public void getAdminAdvertiserList() throws Exception {
+        String param = XxlJobHelper.getJobParam(); // 执行参数
+        if (Check.isNull(param)) {
+            log.error("入参为空");
+            return;
+        }
+        String[] s = param.split("_");
+        Long advertiserId = Long.valueOf(s[0]);
+        String accessToken = s[1];
+        Integer pageSize = 100;
+        adminService.submit(new Runnable() {
+            @Override
+            public void run() {
+                log.info("刷新管家账户下账户列表开始,AdminAdvertiserId:{}", advertiserId);
+                JSONObject totalJson = adminAdvertiserListService.getBytedanceAccountListTotal(advertiserId, advertiserId, accessToken, 1, pageSize);
+                if (!Check.isNull(totalJson)) {
+                    Integer totalPage = totalJson.getInteger("totalPage");
+                    if (totalPage != 0) {
+                        JSONObject result = adminAdvertiserListService.bytedanceAdvertiserThreadPool(totalPage, pageSize, advertiserId, advertiserId, accessToken);
+                        log.info("字节多线程获取账户返回结果:{}", result);
+                    }
+                }
+            }
+        });
+
+
+    }
+
+
+}

+ 1 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedancePromoterReportJob.java

@@ -116,8 +116,7 @@ public class BytedancePromoterReportJob {
         Long advertiserId = Long.valueOf(s[0]);
         Long advertiserId = Long.valueOf(s[0]);
         String accessToken = s[1];
         String accessToken = s[1];
 
 
-        hourExecutorService
-                .submit(new Runnable() {
+        hourExecutorService.submit(new Runnable() {
                     @Override
                     @Override
                     public void run() {
                     public void run() {
                         promoterReportService.getBytedancePromoterHour(advertiserId, accessToken, yesDate, yesDate, 1, 1);
                         promoterReportService.getBytedancePromoterHour(advertiserId, accessToken, yesDate, yesDate, 1, 1);