|
|
@@ -0,0 +1,148 @@
|
|
|
+package cn.com.ctop.job.adq.data.service.impl;
|
|
|
+
|
|
|
+import cn.com.ctop.job.adq.data.entity.AdqFlowDetailsReportDaily;
|
|
|
+import cn.com.ctop.job.adq.data.mapper.AdqFlowDetailsReportDailyMapper;
|
|
|
+import cn.com.ctop.job.adq.data.service.IAdqFlowDetailsReportService;
|
|
|
+import cn.com.ctop.job.adq.data.utils.Check;
|
|
|
+import cn.com.ctop.job.adq.data.utils.DateUtils;
|
|
|
+import cn.com.ctop.job.adq.data.utils.HttpUtils;
|
|
|
+import cn.com.ctop.job.adq.utils.RandomStringGenerator;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.time.Instant;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author lining
|
|
|
+ * @ClassName AdqFlowDetailsReportServiceImpl
|
|
|
+ * @description: TODO
|
|
|
+ * @date 2025年04月21日
|
|
|
+ * @version: 1.0
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class AdqFlowDetailsReportServiceImpl implements IAdqFlowDetailsReportService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private AdqFlowDetailsReportDailyMapper adqFlowDetailsReportDailyMapper;
|
|
|
+ @Override
|
|
|
+ public void getAdqFlowDetailsDailyReport(Long advertiserId, String accessToken, String startDate, String endDate, Integer page) {
|
|
|
+ Map<String, Object> paramsMap = new HashMap<>();
|
|
|
+ paramsMap.put("access_token", accessToken);
|
|
|
+ long timestamp = Instant.now().getEpochSecond();
|
|
|
+ paramsMap.put("timestamp", String.valueOf(timestamp));
|
|
|
+ paramsMap.put("nonce", RandomStringGenerator.generateRandomString(32));
|
|
|
+ paramsMap.put("page", page);
|
|
|
+ paramsMap.put("page_size", 1000);
|
|
|
+ paramsMap.put("account_id", advertiserId);
|
|
|
+
|
|
|
+ JSONObject date_range = new JSONObject();
|
|
|
+ date_range.put("start_date", startDate);
|
|
|
+ date_range.put("end_date", endDate);
|
|
|
+ paramsMap.put("date_range", date_range);
|
|
|
+
|
|
|
+ String s = HttpUtils.httpGet("https://api.e.qq.com/v3.0/daily_balance_report/get", paramsMap, null);
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(s);
|
|
|
+
|
|
|
+ if (Check.isNull(jsonObject)) {
|
|
|
+ log.info("账户id:{},广告流水详情请求结果返回为空", advertiserId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<AdqFlowDetailsReportDaily> dailyList = new ArrayList<>();
|
|
|
+ int totalPage = 1;
|
|
|
+ if (!Check.isNull(jsonObject)) {
|
|
|
+ Integer code = jsonObject.getInteger("code");
|
|
|
+ if (code == 0) {
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+ if (!Check.isNull(data)) {
|
|
|
+ totalPage = data.getJSONObject("page_info").getInteger("total_page");
|
|
|
+ JSONArray list = data.getJSONArray("list");
|
|
|
+ if (!Check.isNull(list)) {
|
|
|
+ for (int i = 0; i < list.size(); i++) {
|
|
|
+ JSONObject dataJson = list.getJSONObject(i);
|
|
|
+ Long account_id = dataJson.getLong("account_id");
|
|
|
+ String fund_type = dataJson.getString("fund_type");
|
|
|
+ Long time = dataJson.getLong("time");
|
|
|
+ time = Long.parseLong(DateUtils.getDateFormat(new Date(time * 1000L)));
|
|
|
+ Long deposit = dataJson.getLong("deposit");
|
|
|
+ Long paid = dataJson.getLong("paid");
|
|
|
+ Long trans_in = dataJson.getLong("trans_in");
|
|
|
+ Long trans_out = dataJson.getLong("trans_out");
|
|
|
+ Long credit_modify = dataJson.getLong("credit_modify");
|
|
|
+ Long balance = dataJson.getLong("balance");
|
|
|
+ Long preauth_balance = dataJson.getLong("preauth_balance");
|
|
|
+
|
|
|
+ AdqFlowDetailsReportDaily adqFlowDetailsReportDaily = AdqFlowDetailsReportDaily.builder()
|
|
|
+ .advertiserId(account_id)
|
|
|
+ .fundType(fund_type)
|
|
|
+ .statTimeDay(time)
|
|
|
+ .deposit(deposit)
|
|
|
+ .paid(paid)
|
|
|
+ .transIn(trans_in)
|
|
|
+ .transOut(trans_out)
|
|
|
+ .creditModify(credit_modify)
|
|
|
+ .balance(balance)
|
|
|
+ .preauthBalance(preauth_balance)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ dailyList.add(adqFlowDetailsReportDaily);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!Check.isNull(dailyList)){
|
|
|
+ log.info("账户id:{},广告流水详情请求结果返回成功,开始入库", advertiserId);
|
|
|
+
|
|
|
+ dailyList = buildFlowDetailsReportDaily(dailyList);
|
|
|
+
|
|
|
+ adqFlowDetailsReportDailyMapper.replaceFlowDetailsReportDailies(dailyList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (page < totalPage) {
|
|
|
+ try {
|
|
|
+ Thread.sleep(500L);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ getAdqFlowDetailsDailyReport(advertiserId, accessToken, startDate, endDate, page + 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<AdqFlowDetailsReportDaily> buildFlowDetailsReportDaily(List<AdqFlowDetailsReportDaily> dailyList) {
|
|
|
+ List<AdqFlowDetailsReportDaily> resultList = new ArrayList<>();
|
|
|
+ Map<Long, List<AdqFlowDetailsReportDaily>> dailyListMap = dailyList.stream().collect(Collectors.groupingBy(AdqFlowDetailsReportDaily::getStatTimeDay));
|
|
|
+ dailyListMap.forEach((k, v) -> {
|
|
|
+ if (v.size() > 1) {
|
|
|
+ resultList.add(merge(v.get(0), v.get(1)));
|
|
|
+ }else{
|
|
|
+ resultList.addAll(v);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return resultList;
|
|
|
+ }
|
|
|
+
|
|
|
+ private AdqFlowDetailsReportDaily merge(AdqFlowDetailsReportDaily o1, AdqFlowDetailsReportDaily o2){
|
|
|
+ AdqFlowDetailsReportDaily o3 = AdqFlowDetailsReportDaily.builder()
|
|
|
+ .advertiserId(o1.getAdvertiserId())
|
|
|
+ .statTimeDay(o1.getStatTimeDay())
|
|
|
+ .fundType(o1.getFundType())
|
|
|
+ .deposit(o1.getDeposit() + o2.getDeposit())
|
|
|
+ .paid(o1.getPaid() + o2.getPaid())
|
|
|
+ .transIn(o1.getTransIn() + o2.getTransIn())
|
|
|
+ .transOut(o1.getTransOut()+ o2.getTransOut())
|
|
|
+ .creditModify(o1.getCreditModify() + o2.getCreditModify())
|
|
|
+ .balance(o1.getBalance() + o2.getBalance())
|
|
|
+ .preauthBalance(o1.getPreauthBalance() + o2.getPreauthBalance())
|
|
|
+ .build();
|
|
|
+ return o3;
|
|
|
+ }
|
|
|
+}
|