yumeng hai 3 semanas
pai
achega
f0b5e30572

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

@@ -10,6 +10,8 @@ import java.util.List;
 public interface AdminAdvertiserListMapper {
     void replaceBytedanceAdvertiserLists(@Param("adds") List<BytedanceAdvertiserList> advertiserLists);
 
+    void deleteNotInAdvertiserList(@Param("adminAdvertiserId") Long adminAdvertiserId, @Param("ids") List<Long> ids);
+
     List<JSONObject> getAdvertiserInfos();
 
     void batchUpdateAdvertiserName(@Param("infos") List<JSONObject> infos);

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

@@ -25,6 +25,15 @@
         advertiser_name= VALUES(advertiser_name),
         account_role= VALUES(account_role)
     </insert>
+    <delete id="deleteNotInAdvertiserList">
+        DELETE FROM nuojing_data.media_advertiser_account
+        WHERE media_type = 1
+          AND admin_advertiser_id = #{adminAdvertiserId}
+        <if test="ids != null and ids.size() > 0">
+            AND advertiser_id NOT IN
+            <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
+        </if>
+    </delete>
     <insert id="addAgentList">
         replace into deepthink.bytedance_agent_advertiser_list(
         admin_advertiser_id,

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

@@ -7,6 +7,8 @@ import java.util.List;
 public interface IAdminAdvertiserListService {
     JSONObject bytedanceAdvertiserThreadPool(Integer totalPage, Integer pageSize, Long adminAdvertiserId, Long ccAccountId, String accessToken);
 
+    void clearAdminAdvertiserList(Long adminAdvertiserId);
+
     JSONObject getBytedanceAccountListTotal(Long advertiserId, Long advertiserId1, String accessToken, Integer pageNum, Integer pageSize);
 
     List<JSONObject> getAdvertiserInfos();

+ 34 - 17
nj_job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/AdminAdvertiserListServiceImpl.java

@@ -34,11 +34,12 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
             final int currentPage = page;
             Callable<AdminAdvertiserListServiceImpl.PageResult> task = () -> {
                 try {
-                    List<String> bytedanceAccountList = getBytedanceAccountList(adminAdvertiserId, ccAccountId, accessToken, currentPage, 100, 1);
+                    List<Long> bytedanceAccountList = getBytedanceAccountList(adminAdvertiserId, ccAccountId, accessToken, currentPage, 100, 1);
+                    // 拉取失败(含重试超限)返回 null,该页视为失败
                     return new AdminAdvertiserListServiceImpl.PageResult(currentPage, bytedanceAccountList);
                 } catch (Exception e) {
                     e.printStackTrace();
-                    return new AdminAdvertiserListServiceImpl.PageResult(currentPage, Collections.emptyList());
+                    return new AdminAdvertiserListServiceImpl.PageResult(currentPage, null);
                 }
             };
             futures.add(executor.submit(task));
@@ -65,7 +66,8 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
 
         // 7. 排序并合并结果
         results.sort(Comparator.comparingInt(AdminAdvertiserListServiceImpl.PageResult::getPageNumber));
-        List<String> finalData = results.stream()
+        List<Long> finalData = results.stream()
+                .filter(r -> r.getData() != null)
                 .flatMap(r -> r.getData().stream())
                 .collect(Collectors.toList());
 
@@ -73,10 +75,24 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
         returnJson.put("code", 200);
         returnJson.put("total", finalData.size());
         returnJson.put("message", "多线程请求字节账户列表成功");
+        // 全量同步:所有分页均拉取成功时,删除该管家下已不在账户列表中的存量账户;任一分页失败则跳过,防止误删
+        boolean allSuccess = results.stream().allMatch(r -> r.getData() != null);
+        if (allSuccess && !finalData.isEmpty()) {
+            adminAdvertiserListMapper.deleteNotInAdvertiserList(adminAdvertiserId, finalData);
+            returnJson.put("message", "多线程请求字节账户列表成功,已同步删除过期账户");
+        } else if (!allSuccess) {
+            returnJson.put("code", 500);
+            returnJson.put("message", "存在拉取失败分页,跳过本次存量账户清理");
+        }
         return returnJson;
     }
 
     @Override
+    public void clearAdminAdvertiserList(Long adminAdvertiserId) {
+        adminAdvertiserListMapper.deleteNotInAdvertiserList(adminAdvertiserId, null);
+    }
+
+    @Override
     public JSONObject getBytedanceAccountListTotal(Long adminAdvertiserId, Long ccAccountId, String accessToken, Integer page, Integer pageSize) {
         JSONObject returnJson = new JSONObject();
         Integer totalPage = 0;
@@ -88,9 +104,9 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
         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");
+        Integer code = Check.isNull(jsonObject) ? null : jsonObject.getInteger("code");
         List<BytedanceAdvertiserList> advertiserLists = new ArrayList<>();
-        if (code == 0) {
+        if (code != null && code == 0) {
             JSONObject data = jsonObject.getJSONObject("data");
             if (!Check.isNull(data)) {
                 JSONObject pageInfo = data.getJSONObject("page_info");
@@ -101,6 +117,7 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
 
         }
         returnJson.put("totalPage", totalPage);
+        returnJson.put("code", code);
         return returnJson;
     }
 
@@ -179,9 +196,9 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
     // 分页结果包装类
     static class PageResult {
         private final int pageNumber;
-        private final List<String> data;
+        private final List<Long> data;
 
-        public PageResult(int pageNumber, List<String> data) {
+        public PageResult(int pageNumber, List<Long> data) {
             this.pageNumber = pageNumber;
             this.data = data;
         }
@@ -190,13 +207,13 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
             return pageNumber;
         }
 
-        public List<String> getData() {
+        public List<Long> getData() {
             return data;
         }
     }
 
 
-    private List<String> getBytedanceAccountList(Long adminAdvertiserId, Long ccAccountId, String accessToken, Integer page, Integer pageSize, Integer requestCount) throws InterruptedException {
+    private List<Long> getBytedanceAccountList(Long adminAdvertiserId, Long ccAccountId, String accessToken, Integer page, Integer pageSize, Integer requestCount) throws InterruptedException {
         try {
             Thread.sleep(100);
         } catch (InterruptedException e) {
@@ -204,9 +221,7 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
         }
         if (requestCount > 3) {
             log.error("重试次数大于3次,跳出本页数据请求任务,adminAdvertiserId:{}", adminAdvertiserId);
-            List<String> data = new ArrayList<>();
-            data.add("page:" + page);
-            return data;
+            return null;
         }
         Map<String, Object> paramsMap = new HashMap<>();
         paramsMap.put("cc_account_id", ccAccountId);
@@ -216,9 +231,9 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
         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");
+        Integer code = Check.isNull(jsonObject) ? null : jsonObject.getInteger("code");
         List<BytedanceAdvertiserList> advertiserLists = new ArrayList<>();
-        if (code == 0) {
+        if (code != null && code == 0) {
             JSONObject data = jsonObject.getJSONObject("data");
             if (!Check.isNull(data)) {
                 JSONArray list = data.getJSONArray("list");
@@ -237,14 +252,16 @@ public class AdminAdvertiserListServiceImpl implements IAdminAdvertiserListServi
         } else {
             log.error("请求字节账户列表失败,进入重试任务,当前请求次数:{}", requestCount);
             Thread.sleep(1000);
-            getBytedanceAccountList(adminAdvertiserId, ccAccountId, accessToken, page, pageSize, requestCount + 1);
+            return 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);
+        List<Long> data = new ArrayList<>();
+        for (BytedanceAdvertiserList advertiserList : advertiserLists) {
+            data.add(advertiserList.getAdvertiserId());
+        }
         return data;
     }
 }

+ 13 - 4
nj_job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AdminAdvertiserListJob.java

@@ -45,10 +45,19 @@ public class AdminAdvertiserListJob {
                 JSONObject totalJson = adminAdvertiserListService.getBytedanceAccountListTotal(advertiserId, advertiserId, accessToken, 1, pageSize);
                 if (!Check.isNull(totalJson)) {
                     Integer totalPage = totalJson.getInteger("totalPage");
-                    log.info("管家账户ID:{},账户总数:{}", advertiserId, totalPage);
-                    if (totalPage != 0) {
-                        JSONObject result = adminAdvertiserListService.bytedanceAdvertiserThreadPool(totalPage, pageSize, advertiserId, advertiserId, accessToken);
-                        log.info("字节多线程获取账户返回结果:{}", result);
+                    Integer code = totalJson.getInteger("code");
+                    log.info("管家账户ID:{},总页数:{},接口返回码:{}", advertiserId, totalPage, code);
+                    if (code != null && code == 0) {
+                        if (totalPage != 0) {
+                            JSONObject result = adminAdvertiserListService.bytedanceAdvertiserThreadPool(totalPage, pageSize, advertiserId, advertiserId, accessToken);
+                            log.info("字节多线程获取账户返回结果:{}", result);
+                        } else {
+                            // 接口确认该管家账户下已无账户,按全量同步语义清空其存量账户
+                            adminAdvertiserListService.clearAdminAdvertiserList(advertiserId);
+                            log.info("管家账户ID:{},账户数已为0,已清空该管家存量账户", advertiserId);
+                        }
+                    } else {
+                        log.error("管家账户ID:{},获取账户列表失败,接口返回码:{},跳过本次同步", advertiserId, code);
                     }
                 }
             }