Explorar o código

coding:投流代码提交

zhangqin hai 3 semanas
pai
achega
efa4fe18b7
Modificáronse 24 ficheiros con 281 adicións e 219 borrados
  1. 11 1
      fs-ad-new-api/src/main/java/com/fs/app/controller/TestController.java
  2. 1 1
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/AbstractApiClient.java
  3. 0 1
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/IAccessTokenClient.java
  4. 5 0
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/IApiClient.java
  5. 57 6
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/BaiduApiClient.java
  6. 8 0
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/IQIYIApiClient.java
  7. 8 0
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/OPPOApiClient.java
  8. 8 0
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/OceanEngineApiClient.java
  9. 9 1
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/TencentApiClient.java
  10. 8 0
      fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/VIVOApiClient.java
  11. 48 56
      fs-ad-new-api/src/main/java/com/fs/app/task/DataSyncTask.java
  12. 5 3
      fs-company/src/main/java/com/fs/company/controller/newAdv/CallbackAccountController.java
  13. 3 3
      fs-company/src/main/java/com/fs/company/controller/newAdv/PromotionAccountController.java
  14. 51 0
      fs-company/src/main/java/com/fs/company/controller/newAdv/StatisticsController.java
  15. 0 92
      fs-service/src/main/java/com/fs/newAdv/domain/ScheduleTaskLog.java
  16. 6 0
      fs-service/src/main/java/com/fs/newAdv/domain/Site.java
  17. 4 0
      fs-service/src/main/java/com/fs/newAdv/domain/SiteStatistics.java
  18. 0 26
      fs-service/src/main/java/com/fs/newAdv/mapper/ScheduleTaskLogMapper.java
  19. 0 17
      fs-service/src/main/java/com/fs/newAdv/mapper/SiteStatisticsDailyMapper.java
  20. 0 12
      fs-service/src/main/java/com/fs/newAdv/mapper/SiteStatisticsMapper.java
  21. 8 0
      fs-service/src/main/java/com/fs/newAdv/service/ISiteService.java
  22. 10 0
      fs-service/src/main/java/com/fs/newAdv/service/ISiteStatisticsService.java
  23. 10 0
      fs-service/src/main/java/com/fs/newAdv/service/impl/SiteServiceImpl.java
  24. 21 0
      fs-service/src/main/java/com/fs/newAdv/service/impl/SiteStatisticsServiceImpl.java

+ 11 - 1
fs-ad-new-api/src/main/java/com/fs/app/controller/TestController.java

@@ -1,7 +1,9 @@
 package com.fs.app.controller;
 
+import com.fs.app.integration.client.advertiser.BaiduApiClient;
 import com.fs.newAdv.enums.SystemEventTypeEnum;
 import com.fs.newAdv.event.ConversionEventPublisher;
+import com.fs.newAdv.service.IPromotionAccountService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -21,6 +23,10 @@ public class TestController {
 
     @Autowired
     private ConversionEventPublisher conversionEventPublisher;
+    @Autowired
+    private BaiduApiClient baiduApiClient;
+    @Autowired
+    private IPromotionAccountService promotionAccountService;
 
     @GetMapping("/test1/{traceId}")
     public void test1(@PathVariable("traceId") String traceId) {
@@ -58,5 +64,9 @@ public class TestController {
         conversionEventPublisher.publishConversionEvent(traceId, SystemEventTypeEnum.AUTH_TODAY_CREATE);
     }
 
-
+    @GetMapping("/test7/{id}")
+    public void test7(@PathVariable("id") String traceId) {
+        log.info("模拟微信搜权且当日创建事件完成");
+        baiduApiClient.getDataReport(promotionAccountService.getById(traceId));
+    }
 }

+ 1 - 1
fs-ad-new-api/src/main/java/com/fs/app/integration/client/AbstractApiClient.java

@@ -19,7 +19,7 @@ public abstract class AbstractApiClient implements IApiClient {
 
 
     /**
-     * 构建上下文信息 (traceId, userId等)
+     * 构建回传接口上下文信息 (traceId, userId等)
      */
     protected abstract Map<String, Object> buildConversionParams(Map<String, Object> conversionData);
 

+ 0 - 1
fs-ad-new-api/src/main/java/com/fs/app/integration/client/IAccessTokenClient.java

@@ -4,7 +4,6 @@ import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 public interface IAccessTokenClient extends IApiClient {
-    Map<String, String> getAccessToken(Integer code, String appId, String appSecret, String callbackUrl);
     Map<String, String> refreshAccessToken(String appId, String appSecret, String refreshToken);
 
     String getAccessTokenByAuthCode(HttpServletRequest request);

+ 5 - 0
fs-ad-new-api/src/main/java/com/fs/app/integration/client/IApiClient.java

@@ -1,5 +1,8 @@
 package com.fs.app.integration.client;
 
+import com.fs.newAdv.domain.PromotionAccount;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
 
 import java.util.Map;
@@ -16,5 +19,7 @@ public interface IApiClient {
     boolean reportConversion(Map<String, Object> conversionData);
 
     AdvertiserTypeEnum getAdvertiserType();
+
+    SiteStatistics getDataReport(PromotionAccount account, Site site);
 }
 

+ 57 - 6
fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/BaiduApiClient.java

@@ -3,6 +3,8 @@ package com.fs.app.integration.client.advertiser;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.fs.ad.yk.utils.Md5Util;
 import com.fs.app.integration.client.AbstractApiClient;
@@ -11,17 +13,21 @@ import com.fs.baidu.utils.AESUtils;
 import com.fs.common.constant.SystemConstant;
 import com.fs.common.exception.ThirdPartyException;
 import com.fs.newAdv.domain.PromotionAccount;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
 import com.fs.newAdv.service.IPromotionAccountService;
 import com.google.gson.Gson;
 import lombok.extern.slf4j.Slf4j;
-import org.json.JSONObject;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.crypto.SecretKey;
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -40,6 +46,7 @@ public class BaiduApiClient extends AbstractApiClient implements IAccessTokenCli
      * 百度OCPC转化回传API地址
      */
     private static final String CONVERSION_API_URL = "https://ocpc.baidu.com/ocpcapi/api/uploadConvertData";
+    private static final String REPORT_DATA_API_URL = "https://api.baidu.com/json/sms/service/OpenApiReportService/getReportData";
 
 
     private static final String APPID = "appId";
@@ -129,10 +136,54 @@ public class BaiduApiClient extends AbstractApiClient implements IAccessTokenCli
     }
 
     @Override
-    public Map<String, String> getAccessToken(Integer code, String appId, String appSecret, String callbackUrl) {
-        return Collections.emptyMap();
+    public SiteStatistics getDataReport(PromotionAccount account, Site site) {
+        // 构建请求参数
+        Map<String,Object> map = new HashMap<>();
+        Map<String,Object> header = new HashMap<>();
+        header.put("accessToken", account.getAccessToken());
+        header.put("userName", site.getPromotionAccountName());
+        map.put("header",header);
+        Map<String,Object> body = new HashMap<>();
+        // 基础信息
+        //报告名称: 信息流整体账户报告
+        //reportType: 2172649
+        //支持的时间单位: HOUR DAY WEEK MONTH SUMMARY
+        //支持的最大时间区间: 824天
+        body.put("reportType", 2172649);
+        // 查询当天的数据
+        LocalDateTime yesterday = LocalDateTime.now().minusDays(1);
+        body.put("startDate", cn.hutool.core.date.DateUtil.format(yesterday, "yyyy-MM-dd"));
+        body.put("endDate", cn.hutool.core.date.DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd"));
+        body.put("timeUnit", "DAY");
+        body.put("userIds", Collections.singletonList(account.getAdAccountId()));
+        // 基础指标
+        body.put("columns", Arrays.asList("impression", "click", "cost", "ctr", "cpc","cpm","phoneButtonClicks"));
+        body.put("startRow", 0);
+        body.put("rowCount", 1000);
+        map.put("body",body);
+
+        HttpResponse execute = HttpRequest.post(REPORT_DATA_API_URL)
+                .header("Content-Type", "application/json")
+                .body(JSONUtil.toJsonStr(map))
+                .timeout(SystemConstant.API_TIMEOUT)
+                .execute();
+        JSONObject jsonObject = JSONUtil.parseObj(execute.body());
+        JSONObject data = jsonObject.getJSONObject("body").getJSONObject("data");
+        JSONArray rows = data.getJSONArray("rows");
+        JSONObject jsonObject1 = rows.getJSONObject(0);
+        SiteStatistics siteStatistics = new SiteStatistics();
+        siteStatistics.setSiteId(site.getId());
+        siteStatistics.setImpressionCount(Long.valueOf(jsonObject1.getStr("impression")));
+        siteStatistics.setClickCount(Long.valueOf(jsonObject1.getStr("click")));
+        siteStatistics.setActualCost(new BigDecimal(jsonObject1.getStr("cost")));
+        siteStatistics.setAccountCost(new BigDecimal(jsonObject1.getStr("cost")));
+        siteStatistics.setClickRate(new BigDecimal(jsonObject1.getStr("ctr")));
+        siteStatistics.setAvgClickPrice(new BigDecimal(jsonObject1.getStr("cpc")));
+        return siteStatistics;
     }
 
+
+
     @Override
     public Map<String, String> refreshAccessToken(String appId, String appSecret, String refreshToken) {
         return Collections.emptyMap();
@@ -144,7 +195,7 @@ public class BaiduApiClient extends AbstractApiClient implements IAccessTokenCli
         // 获取请求参数
         Map<String, String> params = new HashMap<>();
         this.fillParams(params, request);
-        log.info("callback: params = {}", JSONObject.valueToString(params));
+        log.info("callback: params = {}", org.json.JSONObject.valueToString(params));
         int userIdInt = 0;
         try {
             userIdInt = Integer.parseInt(params.get(USERID));
@@ -240,7 +291,7 @@ public class BaiduApiClient extends AbstractApiClient implements IAccessTokenCli
         responseMap.put("code", code);
         responseMap.put("message", message);
         responseMap.put("data", data);
-        return JSONObject.valueToString(responseMap);
+        return org.json.JSONObject.valueToString(responseMap);
     }
 
     /**
@@ -298,7 +349,7 @@ public class BaiduApiClient extends AbstractApiClient implements IAccessTokenCli
         requestMap.put(AUTH_CODE, params.get(AUTH_CODE));
         requestMap.put("grantType", "access_token");
         requestMap.put("userId", userIdInt);
-        String paramsJson = JSONObject.valueToString(requestMap);
+        String paramsJson = org.json.JSONObject.valueToString(requestMap);
 
         HttpResponse execute = HttpRequest.post(ACCESSTOKEN_URL)
                 .header("Content-Type", "application/json")

+ 8 - 0
fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/IQIYIApiClient.java

@@ -3,6 +3,9 @@ package com.fs.app.integration.client.advertiser;
 import cn.hutool.http.HttpRequest;
 import com.fs.app.integration.client.AbstractApiClient;
 import com.fs.common.constant.SystemConstant;
+import com.fs.newAdv.domain.PromotionAccount;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -66,5 +69,10 @@ public class IQIYIApiClient extends AbstractApiClient {
     public AdvertiserTypeEnum getAdvertiserType() {
         return AdvertiserTypeEnum.IQIYI;
     }
+
+    @Override
+    public SiteStatistics getDataReport(PromotionAccount account, Site site) {
+        return null;
+    }
 }
 

+ 8 - 0
fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/OPPOApiClient.java

@@ -3,6 +3,9 @@ package com.fs.app.integration.client.advertiser;
 import cn.hutool.core.codec.Base64;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSONUtil;
+import com.fs.newAdv.domain.PromotionAccount;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
 import com.fs.app.integration.client.AbstractApiClient;
 import com.fs.common.constant.SystemConstant;
@@ -88,5 +91,10 @@ public class OPPOApiClient extends AbstractApiClient {
     public AdvertiserTypeEnum getAdvertiserType() {
         return AdvertiserTypeEnum.OPPO;
     }
+
+    @Override
+    public SiteStatistics getDataReport(PromotionAccount account, Site site) {
+        return null;
+    }
 }
 

+ 8 - 0
fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/OceanEngineApiClient.java

@@ -6,6 +6,9 @@ import cn.hutool.json.JSONUtil;
 import com.fs.app.integration.client.AbstractApiClient;
 import com.fs.common.constant.SystemConstant;
 import com.fs.common.exception.ThirdPartyException;
+import com.fs.newAdv.domain.PromotionAccount;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -110,5 +113,10 @@ public class OceanEngineApiClient extends AbstractApiClient {
     public AdvertiserTypeEnum getAdvertiserType() {
         return AdvertiserTypeEnum.OCEANENGINE;
     }
+
+    @Override
+    public SiteStatistics getDataReport(PromotionAccount account, Site site) {
+        return null;
+    }
 }
 

+ 9 - 1
fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/TencentApiClient.java

@@ -4,6 +4,9 @@ import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.fs.newAdv.domain.PromotionAccount;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
 import com.fs.app.integration.client.AbstractApiClient;
 import com.fs.app.integration.client.IAccessTokenClient;
@@ -78,8 +81,13 @@ public class TencentApiClient extends AbstractApiClient implements IAccessTokenC
         return AdvertiserTypeEnum.TENCENT;
     }
 
-
     @Override
+    public SiteStatistics getDataReport(PromotionAccount account, Site site) {
+        return null;
+    }
+
+
+    // @Override
     public Map<String, String> getAccessToken(Integer code, String appId, String appSecret, String callbackUrl) {
         // 发送HTTP请求
         HttpResponse response = HttpRequest.post("CONVERSION_API_URL")

+ 8 - 0
fs-ad-new-api/src/main/java/com/fs/app/integration/client/advertiser/VIVOApiClient.java

@@ -5,6 +5,9 @@ import cn.hutool.json.JSONUtil;
 import com.fs.app.integration.client.AbstractApiClient;
 import com.fs.common.constant.SystemConstant;
 import com.fs.common.utils.SnowflakeUtil;
+import com.fs.newAdv.domain.PromotionAccount;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.domain.SiteStatistics;
 import com.fs.newAdv.enums.AdvertiserTypeEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -82,5 +85,10 @@ public class VIVOApiClient extends AbstractApiClient {
     public AdvertiserTypeEnum getAdvertiserType() {
         return AdvertiserTypeEnum.OPPO;
     }
+
+    @Override
+    public SiteStatistics getDataReport(PromotionAccount account, Site site) {
+        return null;
+    }
 }
 

+ 48 - 56
fs-ad-new-api/src/main/java/com/fs/app/task/DataSyncTask.java

@@ -1,20 +1,25 @@
 package com.fs.app.task;
 
 import cn.hutool.core.date.DateUtil;
-import com.fs.newAdv.enums.TaskStatusEnum;
-import com.fs.newAdv.enums.TaskTypeEnum;
-import com.fs.common.utils.SnowflakeUtil;
+import com.fs.app.integration.client.IApiClient;
+import com.fs.app.integration.factory.AdvertiserHandlerFactory;
 import com.fs.newAdv.domain.PromotionAccount;
-import com.fs.newAdv.domain.ScheduleTaskLog;
-import com.fs.newAdv.mapper.PromotionAccountMapper;
-import com.fs.newAdv.mapper.ScheduleTaskLogMapper;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.domain.SiteStatistics;
+import com.fs.newAdv.enums.AdvertiserTypeEnum;
+import com.fs.newAdv.service.IPromotionAccountService;
+import com.fs.newAdv.service.ISiteService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * 数据同步定时任务
@@ -28,85 +33,72 @@ import java.util.List;
 public class DataSyncTask {
 
     @Autowired
-    private PromotionAccountMapper promotionAccountMapper;
-
+    private ISiteService siteService;
+    @Autowired
+    private IPromotionAccountService promotionAccountService;
     @Autowired
-    private ScheduleTaskLogMapper scheduleTaskLogMapper;
+    private AdvertiserHandlerFactory advertiserHandlerFactory;
+
 
     /**
      * 数据同步任务
-     * cron: 每2小时执行一次
+     * cron: 每1小时执行一次
      */
-    @Scheduled(cron = "0 0 */2 * * ?")
+    @Scheduled(cron = "0 0 */1 * * ?")
     public void execute() {
         String batchNo = DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd-HH");
         log.info("========== 数据同步任务开始,批次号:{} ==========", batchNo);
 
-        ScheduleTaskLog taskLog = createTaskLog(batchNo);
-
         try {
             // 查询开启API读取的推广账号
-            List<PromotionAccount> accounts = promotionAccountMapper.selectApiEnabledAccounts();
-            log.info("查询到 {} 个需要同步的账户", accounts.size());
-
-            int count = 0;
-            for (PromotionAccount account : accounts) {
-                try {
-                    syncAccountData(account);
-                    count++;
-                } catch (Exception e) {
-                    log.error("同步账户 {} 数据失败", account.getAccountName(), e);
-                }
+            List<Site> sites = siteService.selectEnabledSite();
+            if (sites == null || sites.isEmpty()) {
+                return;
             }
 
-            // 更新任务日志
-            updateTaskLog(taskLog, TaskStatusEnum.SUCCESS, count, null);
+            List<Long> accountIds = sites.stream()
+                    .map(Site::getPromotionAccountId)
+                    .collect(Collectors.toList());
+            Collection<PromotionAccount> accounts = promotionAccountService.listByIds(accountIds);
+            List<PromotionAccount> enabledAccounts = accounts.stream()
+                    .filter(account -> account.getApiSwitch() == 1)
+                    .collect(Collectors.toList());
+            log.info("查询到 {} 个需要同步的账户", enabledAccounts.size());
+
+            Map<Long, Site> siteMap = sites.stream()
+                    .collect(Collectors.toMap(Site::getPromotionAccountId, site -> site));
+
+            long count = enabledAccounts.stream()
+                    .mapToInt(account -> {
+                        try {
+                            Site site = siteMap.get(account.getId());
+                            syncAccountData(account, site);
+                            return 1;
+                        } catch (Exception e) {
+                            log.error("同步账户 {} 数据失败", account.getAccountName(), e);
+                            return 0;
+                        }
+                    })
+                    .sum();
             log.info("========== 数据同步任务完成,成功同步 {} 个账户 ==========", count);
-
         } catch (Exception e) {
             log.error("数据同步任务执行失败", e);
-            updateTaskLog(taskLog, TaskStatusEnum.FAILED, 0, e.getMessage());
         }
     }
 
     /**
      * 同步账户数据
      */
-    private void syncAccountData(PromotionAccount account) {
+    private void syncAccountData(PromotionAccount account, Site site) {
         log.info("开始同步账户:{}", account.getAccountName());
 
         // 根据广告商类型调用对应的API
-        // 使用工厂模式获取对应的API客户端
+        IApiClient apiClient = advertiserHandlerFactory.getApiClient(AdvertiserTypeEnum.getByCode(account.getAdvertiserId()));
+        SiteStatistics siteStatistics = apiClient.getDataReport(account,site);
         // 实际业务逻辑在Service层实现
 
         log.info("账户 {} 同步完成", account.getAccountName());
     }
 
-    /**
-     * 创建任务日志
-     */
-    private ScheduleTaskLog createTaskLog(String batchNo) {
-        ScheduleTaskLog log = new ScheduleTaskLog();
-        log.setId(SnowflakeUtil.nextId());
-        log.setTaskType(TaskTypeEnum.DATA_SYNC.getCode());
-        log.setBatchNo(batchNo);
-        log.setExecuteStatus(TaskStatusEnum.RUNNING.getCode());
-        log.setStartTime(LocalDateTime.now());
-        log.setCreateTime(LocalDateTime.now());
-        scheduleTaskLogMapper.insert(log);
-        return log;
-    }
-
-    /**
-     * 更新任务日志
-     */
-    private void updateTaskLog(ScheduleTaskLog log, TaskStatusEnum status, Integer count, String errorMsg) {
-        log.setExecuteStatus(status.getCode());
-        log.setProcessDataCount(count.longValue());
-        log.setEndTime(LocalDateTime.now());
-        log.setErrorMsg(errorMsg);
-        log.setUpdateTime(LocalDateTime.now());
-        scheduleTaskLogMapper.updateById(log);
-    }
 }
 

+ 5 - 3
fs-company/src/main/java/com/fs/company/controller/newAdv/CallbackAccountController.java

@@ -37,13 +37,15 @@ public class CallbackAccountController {
      */
     @GetMapping("/page")
     public Result<IPage<CallbackAccount>> page(
-            @RequestParam(defaultValue = "1") Long current,
-            @RequestParam(defaultValue = "10") Long size,
+            @RequestParam(defaultValue = "1") Long pageNum,
+            @RequestParam(defaultValue = "10") Long pageSize,
+            @RequestParam(required = false) String advertiserId,
             @RequestParam(required = false) String accountName) {
 
-        Page<CallbackAccount> page = new Page<>(current, size);
+        Page<CallbackAccount> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<CallbackAccount> wrapper = new LambdaQueryWrapper<>();
         wrapper.like(StrUtil.isNotBlank(accountName), CallbackAccount::getAccountName, accountName);
+        wrapper.eq(StrUtil.isNotBlank(advertiserId), CallbackAccount::getAdvertiserId, advertiserId);
         wrapper.orderByDesc(CallbackAccount::getCreateTime);
         IPage<CallbackAccount> result = callbackAccountService.page(page, wrapper);
 

+ 3 - 3
fs-company/src/main/java/com/fs/company/controller/newAdv/PromotionAccountController.java

@@ -71,7 +71,7 @@ public class PromotionAccountController {
      */
     @PostMapping
     public Result<Void> create(@RequestBody @Validated PromotionAccount account) {
-        boolean success = promotionAccountService.create(account);
+        boolean success = promotionAccountService.save(account);
         return success ? Result.success() : Result.error("创建失败");
     }
 
@@ -87,7 +87,7 @@ public class PromotionAccountController {
             @RequestBody @Validated PromotionAccount account) {
 
         account.setId(id);
-        boolean success = promotionAccountService.update(account);
+        boolean success = promotionAccountService.updateById(account);
         return success ? Result.success() : Result.error("更新失败");
     }
 
@@ -98,7 +98,7 @@ public class PromotionAccountController {
      */
     @DeleteMapping("/{id}")
     public Result<Void> delete(@PathVariable @NotNull(message = "账号ID不能为空") Long id) {
-        boolean success = promotionAccountService.delete(id);
+        boolean success = promotionAccountService.removeById(id);
         return success ? Result.success() : Result.error("删除失败");
     }
 

+ 51 - 0
fs-company/src/main/java/com/fs/company/controller/newAdv/StatisticsController.java

@@ -0,0 +1,51 @@
+package com.fs.company.controller.newAdv;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fs.common.result.Result;
+import com.fs.newAdv.domain.SiteStatistics;
+import com.fs.newAdv.service.ISiteStatisticsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+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;
+
+/**
+ * 站点统计控制器
+ * 提供查询接口
+ *
+ * @author zhangqin
+ * @date 2025-11-03
+ */
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/site-statistics")
+public class StatisticsController {
+
+    @Autowired
+    private ISiteStatisticsService statisticsService;
+
+    /**
+     * 分页查询所有站点统计数据
+     */
+    @GetMapping("/page")
+    public Result<IPage<SiteStatistics>> pageSiteStatistics(
+            @RequestParam(defaultValue = "1") Long pageNum,
+            @RequestParam(defaultValue = "10") Long pageSize,
+            @RequestParam(required = false) Long siteId
+            ) {
+        Page<SiteStatistics> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<SiteStatistics> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(siteId != null, SiteStatistics::getSiteId, siteId);
+        IPage<SiteStatistics> result = statisticsService.page(page, wrapper);
+        return Result.success(result);
+    }
+
+
+}
+

+ 0 - 92
fs-service/src/main/java/com/fs/newAdv/domain/ScheduleTaskLog.java

@@ -1,92 +0,0 @@
-package com.fs.newAdv.domain;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.time.LocalDateTime;
-
-/**
- * 定时任务执行记录表
- *
- * @author zhangqin
- * @date 2025-11-03
- */
-@Data
-@TableName("adv_schedule_task_log")
-public class ScheduleTaskLog implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 任务执行ID
-     */
-    @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
-
-    /**
-     * 任务类型(DATA_SYNC/DAILY_ARCHIVE/WEEKLY_ARCHIVE等)
-     */
-    private String taskType;
-
-    /**
-     * 执行批次号(如:2025-11-03-daily)
-     */
-    private String batchNo;
-
-    /**
-     * 执行状态(0待执行 1执行中 2执行成功 3执行失败)
-     */
-    private Integer executeStatus;
-
-    /**
-     * 执行开始时间
-     */
-    private LocalDateTime startTime;
-
-    /**
-     * 执行结束时间
-     */
-    private LocalDateTime endTime;
-
-    /**
-     * 执行实例IP
-     */
-    private String executeInstanceIp;
-
-    /**
-     * 处理数据量
-     */
-    private Long processDataCount;
-
-    /**
-     * 失败原因
-     */
-    private String errorMsg;
-
-    /**
-     * 重试次数
-     */
-    private Integer retryCount;
-
-    /**
-     * 执行进度(JSON格式)
-     */
-    private String executeProgress;
-
-    /**
-     * 创建时间
-     */
-    @TableField(value = "create_time", strategy = FieldStrategy.NOT_NULL)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private LocalDateTime createTime;
-
-    /**
-     * 更新时间
-     */
-    @TableField(value = "update_time", strategy = FieldStrategy.NOT_NULL)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private LocalDateTime updateTime;
-}
-

+ 6 - 0
fs-service/src/main/java/com/fs/newAdv/domain/Site.java

@@ -135,6 +135,12 @@ public class Site implements Serializable {
      */
     private String siteUrl;
 
+
+    /**
+     * 站点状态 1启用 0停用
+     */
+    private Integer status;
+
     /**
      * 创建时间
      */

+ 4 - 0
fs-service/src/main/java/com/fs/newAdv/domain/SiteStatistics.java

@@ -55,6 +55,10 @@ public class SiteStatistics implements Serializable {
      * 展示数
      */
     private Long impressionCount;
+    /**
+     * 平台监测有效点击数
+     */
+    private Long sysClickCount;
 
     /**
      * 点击数

+ 0 - 26
fs-service/src/main/java/com/fs/newAdv/mapper/ScheduleTaskLogMapper.java

@@ -1,26 +0,0 @@
-package com.fs.newAdv.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.fs.newAdv.domain.ScheduleTaskLog;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Select;
-
-import java.util.List;
-
-/**
- * 定时任务执行记录表 Mapper接口
- *
- * @author zhangqin
- * @date 2025-11-03
- */
-@Mapper
-public interface ScheduleTaskLogMapper extends BaseMapper<ScheduleTaskLog> {
-
-    /**
-     * 查询需要补偿的任务(执行失败或超时)
-     */
-    @Select("SELECT * FROM adv_schedule_task_log WHERE (execute_status = 3 AND retry_count < 3) " +
-            "OR (execute_status = 1 AND TIMESTAMPDIFF(HOUR, start_time, NOW()) > 2)")
-    List<ScheduleTaskLog> selectTasksNeedCompensation();
-}
-

+ 0 - 17
fs-service/src/main/java/com/fs/newAdv/mapper/SiteStatisticsDailyMapper.java

@@ -1,17 +0,0 @@
-package com.fs.newAdv.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.fs.newAdv.domain.SiteStatisticsDaily;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * 站点日统计归档表 Mapper接口
- *
- * @author zhangqin
- * @date 2025-11-03
- */
-@Mapper
-public interface SiteStatisticsDailyMapper extends BaseMapper<SiteStatisticsDaily> {
-
-}
-

+ 0 - 12
fs-service/src/main/java/com/fs/newAdv/mapper/SiteStatisticsMapper.java

@@ -14,17 +14,5 @@ import org.apache.ibatis.annotations.Update;
  */
 @Mapper
 public interface SiteStatisticsMapper extends BaseMapper<SiteStatistics> {
-
-    /**
-     * 增加展示数
-     */
-    @Update("UPDATE adv_site_statistics SET impression_count = impression_count + #{count} WHERE site_id = #{siteId}")
-    int incrementImpressionCount(@Param("siteId") Long siteId, @Param("count") Long count);
-
-    /**
-     * 增加点击数
-     */
-    @Update("UPDATE adv_site_statistics SET click_count = click_count + #{count} WHERE site_id = #{siteId}")
-    int incrementClickCount(@Param("siteId") Long siteId, @Param("count") Long count);
 }
 

+ 8 - 0
fs-service/src/main/java/com/fs/newAdv/service/ISiteService.java

@@ -3,6 +3,8 @@ package com.fs.newAdv.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.newAdv.domain.Site;
 
+import java.util.List;
+
 /**
  * 站点管理服务
  *
@@ -11,8 +13,14 @@ import com.fs.newAdv.domain.Site;
 public interface ISiteService extends IService<Site> {
     /**
      * 创建站点
+     *
      * @param site
      */
     void createSite(Site site);
+
+    /**
+     * 查询启用的站点
+     */
+    List<Site> selectEnabledSite();
 }
 

+ 10 - 0
fs-service/src/main/java/com/fs/newAdv/service/ISiteStatisticsService.java

@@ -0,0 +1,10 @@
+package com.fs.newAdv.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.newAdv.domain.SiteStatistics;
+
+
+public interface ISiteStatisticsService extends IService<SiteStatistics> {
+
+}
+

+ 10 - 0
fs-service/src/main/java/com/fs/newAdv/service/impl/SiteServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.newAdv.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.newAdv.domain.Site;
 import com.fs.newAdv.mapper.SiteMapper;
@@ -8,6 +9,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * 域名管理Service实现类
  *
@@ -24,5 +28,11 @@ public class SiteServiceImpl extends ServiceImpl<SiteMapper, Site> implements IS
         site.setSiteUrl("http://" + site.getLaunchDomain() + "site/home.html/?tid=" + site.getId());
         this.updateById(site);
     }
+
+    @Override
+    public List<Site> selectEnabledSite() {
+        return this.list(new LambdaQueryWrapper<Site>()
+                .eq(Site::getStatus, 0));
+    }
 }
 

+ 21 - 0
fs-service/src/main/java/com/fs/newAdv/service/impl/SiteStatisticsServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fs.newAdv.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.newAdv.domain.SiteStatistics;
+import com.fs.newAdv.mapper.SiteStatisticsMapper;
+import com.fs.newAdv.service.ISiteStatisticsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 域名管理Service实现类
+ *
+ * @author zhangqin
+ * @date 2025-11-06
+ */
+@Slf4j
+@Service
+public class SiteStatisticsServiceImpl extends ServiceImpl<SiteStatisticsMapper, SiteStatistics> implements ISiteStatisticsService {
+
+}
+