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