yumeng 9 месяцев назад
Родитель
Сommit
2f9b64d4b8

+ 12 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/controller/AdqController.java

@@ -48,8 +48,20 @@ public class AdqController {
 
     @Autowired
     private IAdqMaterialReportService adqMaterialReportService;
+    @Autowired
+    private IDailyBalanceReportService dailyBalanceReportService;
+
+
+    @GetMapping("/getBalanceReport")
+    public JSONObject getBalanceReport() {
+
+        dailyBalanceReportService.getAdqBalanceReport(56298095L, "a501cb39b83bd0dabe37c1a325f99e03", "2025-09-09", "2025-09-11", 1, 1L);
 
 
+        return null;
+
+    }
+
     @GetMapping("/getAgentInfo")
     public JSONObject getAgentInfo() {
 

+ 64 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/controller/HistoryController.java

@@ -0,0 +1,64 @@
+package cn.com.ctop.job.adq.controller;
+
+import cn.com.ctop.job.adq.data.entity.AdvertiserAccount;
+import cn.com.ctop.job.adq.data.service.*;
+import cn.com.ctop.job.adq.data.utils.Check;
+import cn.com.ctop.job.adq.data.utils.DateUtils;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+/**
+ * zian Y
+ * 2022/2/9
+ **/
+
+@RestController
+@RequestMapping("/hostory")
+@Api(tags = "adq")
+@Slf4j
+public class HistoryController {
+    private static ExecutorService dailyExecutorService = Executors.newFixedThreadPool(5);
+    @Autowired
+    private IAdqCreativeReportService adqReportService;
+
+    @Autowired
+    private IAdqAccountReportService accountReportService;
+    @Autowired
+    private IDailyBalanceReportService dailyBalanceReportService;
+
+    @GetMapping("/getData")
+    public JSONObject getData(Long advertiserId, String startDate, String endDate) {
+        JSONObject json = new JSONObject();
+        dailyExecutorService.submit(new Runnable() {
+            @Override
+            public void run() {
+
+                String token = accountReportService.getTokenByAdvertiserId(advertiserId);
+                if (Check.isNull(token)) {
+                    return;
+                }
+                accountReportService.getAdqAccountDaily(advertiserId, token, startDate, endDate, 1, 1);
+                adqReportService.getAdqCreativeDaily(advertiserId, token, startDate, endDate, 1, 1);
+                dailyBalanceReportService.getAdqBalanceReport(advertiserId, token, startDate, endDate, 1, null);
+            }
+        });
+        json.put("code", 200);
+        json.put("message", "成功");
+        return json;
+    }
+
+
+}

+ 172 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/entity/AdqDailyBalance.java

@@ -0,0 +1,172 @@
+package cn.com.ctop.job.adq.data.entity;
+
+import java.math.BigDecimal;
+
+public class AdqDailyBalance {
+    private Long id;
+    private Long advertiserId;
+    private Long statDate;
+    private String fundType;
+    private BigDecimal deposit;
+    private BigDecimal paid;
+    private BigDecimal transIn;
+    private BigDecimal transOut;
+    private BigDecimal creditModify;
+    private BigDecimal balance;
+    private BigDecimal preauthBalance;
+    private BigDecimal preauthOutPay;
+    private BigDecimal preauthInRefund;
+    private BigDecimal acctOutPay;
+    private BigDecimal acctOutPayShare;
+    private BigDecimal shareOutPay;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getAdvertiserId() {
+        return advertiserId;
+    }
+
+    public void setAdvertiserId(Long advertiserId) {
+        this.advertiserId = advertiserId;
+    }
+
+    public Long getStatDate() {
+        return statDate;
+    }
+
+    public void setStatDate(Long statDate) {
+        this.statDate = statDate;
+    }
+
+    public String getFundType() {
+        return fundType;
+    }
+
+    public void setFundType(String fundType) {
+        this.fundType = fundType;
+    }
+
+    public BigDecimal getDeposit() {
+        return deposit;
+    }
+
+    public void setDeposit(BigDecimal deposit) {
+        this.deposit = deposit;
+    }
+
+    public BigDecimal getPaid() {
+        return paid;
+    }
+
+    public void setPaid(BigDecimal paid) {
+        this.paid = paid;
+    }
+
+    public BigDecimal getTransIn() {
+        return transIn;
+    }
+
+    public void setTransIn(BigDecimal transIn) {
+        this.transIn = transIn;
+    }
+
+    public BigDecimal getTransOut() {
+        return transOut;
+    }
+
+    public void setTransOut(BigDecimal transOut) {
+        this.transOut = transOut;
+    }
+
+    public BigDecimal getCreditModify() {
+        return creditModify;
+    }
+
+    public void setCreditModify(BigDecimal creditModify) {
+        this.creditModify = creditModify;
+    }
+
+    public BigDecimal getBalance() {
+        return balance;
+    }
+
+    public void setBalance(BigDecimal balance) {
+        this.balance = balance;
+    }
+
+    public BigDecimal getPreauthBalance() {
+        return preauthBalance;
+    }
+
+    public void setPreauthBalance(BigDecimal preauthBalance) {
+        this.preauthBalance = preauthBalance;
+    }
+
+    public BigDecimal getPreauthOutPay() {
+        return preauthOutPay;
+    }
+
+    public void setPreauthOutPay(BigDecimal preauthOutPay) {
+        this.preauthOutPay = preauthOutPay;
+    }
+
+    public BigDecimal getPreauthInRefund() {
+        return preauthInRefund;
+    }
+
+    public void setPreauthInRefund(BigDecimal preauthInRefund) {
+        this.preauthInRefund = preauthInRefund;
+    }
+
+    public BigDecimal getAcctOutPay() {
+        return acctOutPay;
+    }
+
+    public void setAcctOutPay(BigDecimal acctOutPay) {
+        this.acctOutPay = acctOutPay;
+    }
+
+    public BigDecimal getAcctOutPayShare() {
+        return acctOutPayShare;
+    }
+
+    public void setAcctOutPayShare(BigDecimal acctOutPayShare) {
+        this.acctOutPayShare = acctOutPayShare;
+    }
+
+    public BigDecimal getShareOutPay() {
+        return shareOutPay;
+    }
+
+    public void setShareOutPay(BigDecimal shareOutPay) {
+        this.shareOutPay = shareOutPay;
+    }
+
+    @Override
+    public String toString() {
+        return "adqDailyBalance{" +
+                "id=" + id +
+                ", advertiserId=" + advertiserId +
+                ", statDate=" + statDate +
+                ", fundType='" + fundType + '\'' +
+                ", deposit=" + deposit +
+                ", paid=" + paid +
+                ", transIn=" + transIn +
+                ", transOut=" + transOut +
+                ", creditModify=" + creditModify +
+                ", balance=" + balance +
+                ", preauthBalance=" + preauthBalance +
+                ", preauthOutPay=" + preauthOutPay +
+                ", preauthInRefund=" + preauthInRefund +
+                ", acctOutPay=" + acctOutPay +
+                ", acctOutPayShare=" + acctOutPayShare +
+                ", shareOutPay=" + shareOutPay +
+                '}';
+    }
+}

+ 2 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/AdqAccountReportMapper.java

@@ -19,4 +19,6 @@ public interface AdqAccountReportMapper {
     void updateAdqAccountStatus();
 
     void updateClAccountStatus();
+
+    String getTokenByAdvertiserId(@Param("advertiserId") Long advertiserId);
 }

+ 10 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/DailyBalanceReportMapper.java

@@ -0,0 +1,10 @@
+package cn.com.ctop.job.adq.data.mapper;
+
+import cn.com.ctop.job.adq.data.entity.AdqDailyBalance;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DailyBalanceReportMapper {
+    void addAdqDailyBalances(@Param("adds") List<AdqDailyBalance> adqDailyBalances);
+}

+ 7 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/AdqAccountReportMapper.xml

@@ -256,4 +256,11 @@
                                   and advertiser_status = 2)
           and media_type = 3
     </update>
+    <select id="getTokenByAdvertiserId" resultType="java.lang.String">
+        select t2.access_token
+        from deepthink.adq_advertiser_list t1
+                 left join deepthink.adq_auth_list t2
+                           on t1.admin_advertiser_id = t2.admin_advertiser_id
+        where t1.advertiser_id = #{advertiserId} limit 1
+    </select>
 </mapper>

+ 45 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/DailyBalanceReportMapper.xml

@@ -0,0 +1,45 @@
+<?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.adq.data.mapper.DailyBalanceReportMapper">
+
+
+    <insert id="addAdqDailyBalances">
+        replace into adq_daily_balance (
+        advertiser_id,
+        stat_date,
+        fund_type,
+        deposit,
+        paid,
+        trans_in,
+        trans_out,
+        credit_modify,
+        balance,
+        preauth_balance,
+        preauth_out_pay,
+        preauth_in_refund,
+        acct_out_pay,
+        acct_out_pay_share,
+        share_out_pay
+        )
+        values
+        <foreach collection="adds" item="item" separator=",">
+            (
+            #{item.advertiserId},
+            #{item.statDate},
+            #{item.fundType},
+            #{item.deposit},
+            #{item.paid},
+            #{item.transIn},
+            #{item.transOut},
+            #{item.creditModify},
+            #{item.balance},
+            #{item.preauthBalance},
+            #{item.preauthOutPay},
+            #{item.preauthInRefund},
+            #{item.acctOutPay},
+            #{item.acctOutPayShare},
+            #{item.shareOutPay}
+            )
+        </foreach>
+    </insert>
+</mapper>

+ 2 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IAdqAccountReportService.java

@@ -4,4 +4,6 @@ public interface IAdqAccountReportService {
     void getAdqAccountHour(Long advertiserId, String accessToken, String startDate, String endDate,Integer page,Integer isLog);
 
     void getAdqAccountDaily(Long advertiserId, String accessToken, String startDate, String endDate, Integer page, Integer isLog);
+
+    String getTokenByAdvertiserId(Long advertiserId);
 }

+ 6 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IDailyBalanceReportService.java

@@ -0,0 +1,6 @@
+package cn.com.ctop.job.adq.data.service;
+
+public interface IDailyBalanceReportService {
+    void getAdqBalanceReport(Long advertiserId, String accessToken, String startDate, String endDate, Integer page, Long errorId);
+
+}

+ 5 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/AdqAccountReportServiceImpl.java

@@ -189,4 +189,9 @@ public class AdqAccountReportServiceImpl implements IAdqAccountReportService {
         }
     }
 
+    @Override
+    public String getTokenByAdvertiserId(Long advertiserId) {
+        return accountReportMapper.getTokenByAdvertiserId(advertiserId);
+    }
+
 }

+ 98 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/DailyBalanceReportServiceImpl.java

@@ -0,0 +1,98 @@
+package cn.com.ctop.job.adq.data.service.impl;
+
+import cn.com.ctop.job.adq.data.entity.AdqDailyBalance;
+import cn.com.ctop.job.adq.data.entity.AdqErrorLog;
+import cn.com.ctop.job.adq.data.mapper.AdqErrorLogMapper;
+import cn.com.ctop.job.adq.data.mapper.DailyBalanceReportMapper;
+import cn.com.ctop.job.adq.data.service.IDailyBalanceReportService;
+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.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class DailyBalanceReportServiceImpl implements IDailyBalanceReportService {
+
+
+    @Autowired
+    private DailyBalanceReportMapper dailyBalanceReportMapper;
+
+    @Autowired
+    private AdqErrorLogMapper adqErrorLogMapper;
+
+    @Override
+    public void getAdqBalanceReport(Long advertiserId, String accessToken, String startDate, String endDate, Integer page, Long errorId) {
+        try {
+            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", 100);
+            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);
+            List<AdqDailyBalance> adqDailyBalances = new ArrayList<>();
+            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)) {
+                Integer code = jsonObject.getInteger("code");
+                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++) {
+                                JSONObject json = list.getJSONObject(i);
+                                AdqDailyBalance dailyBalance = JSONObject.parseObject(json.toJSONString(), AdqDailyBalance.class);
+                                dailyBalance.setAdvertiserId(json.getLong("account_id"));
+                                Long time = json.getLong("time");
+                                Long statDate = DateUtils.timeToDate(time);
+                                dailyBalance.setStatDate(statDate);
+                                adqDailyBalances.add(dailyBalance);
+                            }
+                        }
+                    }
+                } else {
+                    log.error("请求流水报表失败,account_id:{},返回信息:{}", advertiserId, jsonObject);
+                    AdqErrorLog errorInfo = new AdqErrorLog();
+                    errorInfo.setAdvertiserId(advertiserId);
+                    errorInfo.setStartDate(startDate);
+                    errorInfo.setEndDate(endDate);
+                    errorInfo.setDataDimension("daily_balance_report");
+                    errorInfo.setDataType("daily");
+                    adqErrorLogMapper.replaceErrorInfo(errorInfo);
+                    return;
+                }
+            }
+            if (!Check.isNull(adqDailyBalances)) {
+                dailyBalanceReportMapper.addAdqDailyBalances(adqDailyBalances);
+            }
+            if (adqDailyBalances.size() >= 100) {
+                getAdqBalanceReport(advertiserId, accessToken, startDate, endDate, page + 1, errorId);
+            } else {
+                log.info("请求流水报表完成,account_id:{},开始日期:{},结束日期:{}", advertiserId, startDate, endDate);
+                if (!Check.isNull(errorId)) {
+                    adqErrorLogMapper.deleteInfoByErrorId(errorId);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 12 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/utils/DateUtils.java

@@ -5,6 +5,11 @@ import lombok.extern.slf4j.Slf4j;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -40,6 +45,7 @@ public class DateUtils {
 
         return days;
     }
+
     public static Integer getDateInteger(String date) {
         if (!Check.isNull(date)) {
             String replace = date.replace("-", "");
@@ -151,4 +157,10 @@ public class DateUtils {
         String formattedDate = sdf.format(date);
         return formattedDate;
     }
+
+    public static Long timeToDate(Long timestamp) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        String dateStr = sdf.format(new Date(timestamp * 1000)); // 乘以1000转换为毫秒
+        return Long.valueOf(dateStr);
+    }
 }

+ 12 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/handler/AdqRetryReportJob.java

@@ -32,6 +32,7 @@ public class AdqRetryReportJob {
     private static ExecutorService hourrAccountExecutorService = Executors.newFixedThreadPool(2);
     private static ExecutorService dailyAccountExecutorService = Executors.newFixedThreadPool(2);
     private static ExecutorService assetExecutorService = Executors.newFixedThreadPool(2);
+    private static ExecutorService blanceExecutorService = Executors.newFixedThreadPool(2);
 
     private static ExecutorService flowExecutorService = Executors.newFixedThreadPool(2);
 
@@ -52,6 +53,8 @@ public class AdqRetryReportJob {
     private IAdqAccountReportService accountReportService;
     @Autowired
     private IAdqMaterialReportService adqMaterialReportService;
+    @Autowired
+    private IDailyBalanceReportService dailyBalanceReportService;
 
     @XxlJob("adqRetryReport")
     public void promoterReport() throws Exception {
@@ -163,6 +166,15 @@ public class AdqRetryReportJob {
                             }
                         }
                     });
+                }else if("daily_balance_report".equals(dataDimension)){
+                    blanceExecutorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            if (!Check.isNull(accessToken)) {
+                                dailyBalanceReportService.getAdqBalanceReport(advertiserId, accessToken, startDate, endDate, 1, null);
+                            }
+                        }
+                    });
                 }