Browse Source

Merge branch 'matomo' of wangfan/adweb3-server into master

wangfan 2 months ago
parent
commit
b6fd4f4cd9

+ 12 - 18
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/controller/GTMController.java

@@ -1,8 +1,11 @@
 package org.jeecg.modules.adweb.dmp.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
 import io.swagger.v3.oas.annotations.tags.Tag;
+
 import lombok.extern.slf4j.Slf4j;
+
 import org.apache.commons.lang3.tuple.Pair;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
@@ -31,16 +34,11 @@ import java.util.Objects;
 @RequestMapping("/gtm")
 @Slf4j
 public class GTMController {
-    @Autowired
-    private IAdwebSiteService adwebSiteService;
-    @Autowired
-    private IGoogleGTMService googleGTMService;
-    @Autowired
-    private GTMAdminService gtmAdminService;
-
-    /**
-     * 获取站点绑定的GTM snippets
-     */
+    @Autowired private IAdwebSiteService adwebSiteService;
+    @Autowired private IGoogleGTMService googleGTMService;
+    @Autowired private GTMAdminService gtmAdminService;
+
+    /** 获取站点绑定的GTM snippets */
     @RequestMapping(value = "/get", method = RequestMethod.GET)
     @ResponseBody
     public Result<AdwebSite> getGTMSnippets(String siteCode) {
@@ -52,7 +50,7 @@ public class GTMController {
             return Result.error(CommonConstant.SC_INTERNAL_NOT_FOUND_404, "GoogleGTM不存在");
         }
 
-        Pair<String, String> snippets = gtmAdminService.getSnippets(googleGTM.getGtmTagId());
+        Pair<String, String> snippets = gtmAdminService.getSnippets(googleGTM.getGtmPublicId());
 
         AdwebSite adwebSite = new AdwebSite();
         adwebSite.setGtmHead(snippets.getLeft());
@@ -61,9 +59,7 @@ public class GTMController {
         return Result.ok(adwebSite);
     }
 
-    /**
-     * 为站点添加GTM snippets
-     */
+    /** 为站点添加GTM snippets */
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     @ResponseBody
     public Result<AdwebSite> addGTMSnippets(String siteCode, String gaAccountId) {
@@ -77,16 +73,14 @@ public class GTMController {
                         adwebSite.getName(),
                         gaAccountId);
 
-        Pair<String, String> snippets = gtmAdminService.getSnippets(googleGTM.getGtmTagId());
+        Pair<String, String> snippets = gtmAdminService.getSnippets(googleGTM.getGtmPublicId());
         adwebSite.setGtmHead(snippets.getLeft());
         adwebSite.setGtmBody(snippets.getRight());
 
         return Result.ok(adwebSite);
     }
 
-    /**
-     * 获取所有可用的GA帐号
-     */
+    /** 获取所有可用的GA帐号 */
     @RequestMapping(value = "/listGAAccounts", method = RequestMethod.GET)
     @ResponseBody
     public Result<List<GAAccountDTO>> listGAAccounts() {

+ 3 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/gtm/CreateContainerRequestDTO.java

@@ -14,5 +14,7 @@ public class CreateContainerRequestDTO {
 
     private String displayName;
 
-    private String googleTagId;
+    private String gaMeasurementId;
+
+    private String matomoSiteId;
 }

+ 16 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/matomo/CreateSiteRequestDTO.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.adweb.dmp.dto.matomo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author wfansh
+ */
+@Data
+@Builder
+public class CreateSiteRequestDTO {
+
+    private String siteName;
+
+    private String url;
+}

+ 23 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/matomo/MatomoSiteDTO.java

@@ -0,0 +1,23 @@
+package org.jeecg.modules.adweb.dmp.dto.matomo;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+
+import lombok.Data;
+
+/**
+ * @author wfansh
+ */
+@Data
+public class MatomoSiteDTO {
+
+    @JsonAlias({"value", "idsite"})
+    private String siteId;
+
+    @JsonAlias("name")
+    private String siteName;
+
+    @JsonAlias("main_url")
+    private String url;
+
+    private String trackingCode;
+}

+ 12 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/entity/GoogleGTM.java

@@ -56,10 +56,10 @@ public class GoogleGTM implements Serializable {
     @Schema(description = "gtmContainerId")
     private String gtmContainerId;
 
-    /** gtmTagId */
-    @Excel(name = "gtmTagId", width = 15)
-    @Schema(description = "gtmTagId")
-    private String gtmTagId;
+    /** gtmPublicId */
+    @Excel(name = "gtmPublicId", width = 15)
+    @Schema(description = "gtmPublicId")
+    private String gtmPublicId;
 
     /** gaAccountId */
     @Excel(name = "gaAccountId", width = 15)
@@ -82,9 +82,14 @@ public class GoogleGTM implements Serializable {
     private String gaSiteUrl;
 
     /** gaTagId */
-    @Excel(name = "gaTagId", width = 15)
-    @Schema(description = "gaTagId")
-    private String gaTagId;
+    @Excel(name = "gaMeasurementId", width = 15)
+    @Schema(description = "gaMeasurementId")
+    private String gaMeasurementId;
+
+    /** matomoSiteId */
+    @Excel(name = "matomoSiteId", width = 15)
+    @Schema(description = "matomoSiteId")
+    private String matomoSiteId;
 
     /** ctime */
     @Excel(name = "ctime", width = 20, format = "yyyy-MM-dd HH:mm:ss")

+ 71 - 48
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/google/GTMAdminService.java

@@ -8,7 +8,6 @@ import jakarta.annotation.PostConstruct;
 
 import lombok.extern.slf4j.Slf4j;
 
-import org.apache.commons.lang3.reflect.TypeUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.jeecg.common.util.FastJsonUtil;
 import org.jeecg.modules.adweb.common.databridge.OpenAPIRequest;
@@ -20,6 +19,8 @@ import org.jeecg.modules.adweb.dmp.dto.google.analytics.GAPropertyDTO;
 import org.jeecg.modules.adweb.dmp.dto.google.gtm.CreateContainerRequestDTO;
 import org.jeecg.modules.adweb.dmp.dto.google.gtm.GTMAccountDTO;
 import org.jeecg.modules.adweb.dmp.dto.google.gtm.GTMContainerDTO;
+import org.jeecg.modules.adweb.dmp.dto.matomo.CreateSiteRequestDTO;
+import org.jeecg.modules.adweb.dmp.dto.matomo.MatomoSiteDTO;
 import org.jeecg.modules.adweb.dmp.entity.GoogleGTM;
 import org.jeecg.modules.adweb.dmp.service.IGoogleGTMService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,7 +35,7 @@ import java.util.List;
 import java.util.Objects;
 
 /**
- * Google Tag Manager + Google Analytics帐号及标签管理
+ * Google Tag Manager + Google Analytics + Matomo帐号及标签管理
  *
  * <p>http://data-bridge.v3.adwebcloud.com:9002/swagger-ui/index.html
  *
@@ -47,6 +48,8 @@ public class GTMAdminService {
     private static final String GA_ACCOUNT_LIST_API_PATH = "/api/google/ga/accounts/list";
     private static final String GA_PROPERTY_CREATE_API_PATH = "/api/google/ga/properties/create";
     private static final String GA_PROPERTY_DELETE_API_PATH = "/api/google/ga/properties/delete";
+    private static final String MATOMO_SITE_CREATE_API_PATH = "/api/matomo/sites/create";
+    private static final String MATOMO_SITE_DELETE_API_PATH = "/api/matomo/sites/delete";
     private static final String GTM_CONTAINER_CREATE_API_PATH = "/api/google/gtm/containers/create";
     private static final String GTM_CONTAINER_DELETE_API_PATH = "/api/google/gtm/containers/delete";
 
@@ -105,15 +108,13 @@ public class GTMAdminService {
         }
 
         // 1. 创建GA property - 通过data-bridge API
-        OpenAPIRequest<CreatePropertyRequestDTO> createGAPropertyRequest = new OpenAPIRequest<>();
-        createGAPropertyRequest.setRequestServer(this.getClass().getSimpleName());
-        createGAPropertyRequest.setRequestTime(System.currentTimeMillis());
-        createGAPropertyRequest.setData(
-                CreatePropertyRequestDTO.builder()
-                        .accountResourceName(GAAccountDTO.toResourceName(gaAccountId))
-                        .displayName(siteName)
-                        .url(siteUrl)
-                        .build());
+        OpenAPIRequest<CreatePropertyRequestDTO> createGAPropertyRequest =
+                this.buildOpenAPIRequest(
+                        CreatePropertyRequestDTO.builder()
+                                .accountResourceName(GAAccountDTO.toResourceName(gaAccountId))
+                                .displayName(siteName)
+                                .url(siteUrl)
+                                .build());
         GAPropertyDTO gaProperty =
                 RestTemplateUtil.postForObject(
                                 restTemplate,
@@ -123,17 +124,29 @@ public class GTMAdminService {
                         .getData();
         log.info("为站点 {} 创建GA property: {}", siteCode, FastJsonUtil.toJSONString(gaProperty));
 
-        // 2. 创建GTM container - 通过data-bridge API
+        // 2. 创建Matomo site - 通过data-bridge API
+        OpenAPIRequest<CreateSiteRequestDTO> createMatomoSiteRequest =
+                this.buildOpenAPIRequest(
+                        CreateSiteRequestDTO.builder().siteName(siteName).url(siteUrl).build());
+        MatomoSiteDTO matomoSite =
+                RestTemplateUtil.postForObject(
+                                restTemplate,
+                                dataBridgeApiHost + MATOMO_SITE_CREATE_API_PATH,
+                                createMatomoSiteRequest,
+                                new ParameterizedTypeReference<OpenAPIResponse<MatomoSiteDTO>>() {})
+                        .getData();
+        log.info("为站点 {} 创建Matomo site: {}", siteCode, FastJsonUtil.toJSONString(matomoSite));
+
+        // 3. 创建GTM container - 通过data-bridge API
         OpenAPIRequest<CreateContainerRequestDTO> createGTMContainerRequest =
-                new OpenAPIRequest<>();
-        createGTMContainerRequest.setRequestServer(this.getClass().getSimpleName());
-        createGTMContainerRequest.setRequestTime(System.currentTimeMillis());
-        createGTMContainerRequest.setData(
-                CreateContainerRequestDTO.builder()
-                        .accountResourceName(GTMAccountDTO.toResourceName(gtmAccountId))
-                        .displayName(siteName)
-                        .googleTagId(gaProperty.getDataStreams().get(0).getStreamMeasurementId())
-                        .build());
+                this.buildOpenAPIRequest(
+                        CreateContainerRequestDTO.builder()
+                                .accountResourceName(GTMAccountDTO.toResourceName(gtmAccountId))
+                                .displayName(siteName)
+                                .gaMeasurementId(
+                                        gaProperty.getDataStreams().get(0).getStreamMeasurementId())
+                                .matomoSiteId(matomoSite.getSiteId())
+                                .build());
         GTMContainerDTO gtmContainer =
                 RestTemplateUtil.postForObject(
                                 restTemplate,
@@ -144,18 +157,19 @@ public class GTMAdminService {
                         .getData();
         log.info("为站点 {} 创建GTM container: {}", siteCode, FastJsonUtil.toJSONString(gtmContainer));
 
-        // 3. 更新数据库
+        // 4. 更新数据库
         googleGTM = new GoogleGTM();
         googleGTM.setSiteCode(siteCode);
         googleGTM.setUid(null); // TODO
         googleGTM.setGtmAccountId(gtmAccountId);
         googleGTM.setGtmContainerId(gtmContainer.getId());
-        googleGTM.setGtmTagId(gtmContainer.getPublicId());
+        googleGTM.setGtmPublicId(gtmContainer.getPublicId());
         googleGTM.setGaAccountId(gaAccountId);
         googleGTM.setGaPropertyId(gaProperty.getId());
         googleGTM.setGaVersion("V4"); // GA4 https://support.google.com/analytics/answer/10089681
         googleGTM.setGaSiteUrl(siteUrl);
-        googleGTM.setGaTagId(gaProperty.getDataStreams().get(0).getStreamMeasurementId());
+        googleGTM.setGaMeasurementId(gaProperty.getDataStreams().get(0).getStreamMeasurementId());
+        googleGTM.setMatomoSiteId(matomoSite.getSiteId());
         googleGTMService.save(googleGTM);
 
         return googleGTM;
@@ -164,20 +178,13 @@ public class GTMAdminService {
     /** 获取GA account列表,并根据v3系统配置为可用的{@link #gaAccountIds}过滤 */
     public List<GAAccountDTO> listGAAccounts() {
         // 获取GA account列表 - 通过data-bridge API
-        OpenAPIRequest<?> listGAAccountsRequest = new OpenAPIRequest<>();
-        listGAAccountsRequest.setRequestServer(this.getClass().getSimpleName());
-        listGAAccountsRequest.setRequestTime(System.currentTimeMillis());
-        listGAAccountsRequest.setData(null);
+        OpenAPIRequest<?> listGAAccountsRequest = this.buildOpenAPIRequest(null);
         OpenAPIResponse<List<GAAccountDTO>> listGAAccountsResponse =
                 RestTemplateUtil.postForObject(
                         restTemplate,
                         dataBridgeApiHost + GA_ACCOUNT_LIST_API_PATH,
                         listGAAccountsRequest,
-                        ParameterizedTypeReference.forType(
-                                TypeUtils.parameterize(
-                                        OpenAPIResponse.class,
-                                        TypeUtils.parameterize(List.class, GAAccountDTO.class))));
-        log.info("获取GA accounts: {}", FastJsonUtil.toJSONString(listGAAccountsResponse.getData()));
+                        new ParameterizedTypeReference<>() {});
 
         return listGAAccountsResponse.getData().stream()
                 .filter(gaAccount -> gaAccountIds.contains(gaAccount.getId()))
@@ -187,13 +194,13 @@ public class GTMAdminService {
     /**
      * 返回GTM container的head + body snippet代码
      *
-     * @param gtmTagId
+     * @param gtmPublicId
      * @return
      */
-    public Pair<String, String> getSnippets(String gtmTagId) {
+    public Pair<String, String> getSnippets(String gtmPublicId) {
         return Pair.of(
-                String.format(headSnippetTemplate, gtmTagId),
-                String.format(bodySnippetTemplate, gtmTagId));
+                String.format(headSnippetTemplate, gtmPublicId),
+                String.format(bodySnippetTemplate, gtmPublicId));
     }
 
     /**
@@ -212,10 +219,8 @@ public class GTMAdminService {
         }
 
         // 1. 删除GA property - 通过data-bridge API
-        OpenAPIRequest<String> deleteGAPropertyRequest = new OpenAPIRequest<>();
-        deleteGAPropertyRequest.setRequestServer(this.getClass().getSimpleName());
-        deleteGAPropertyRequest.setRequestTime(System.currentTimeMillis());
-        deleteGAPropertyRequest.setData(GAPropertyDTO.toResourceName(googleGTM.getGaPropertyId()));
+        OpenAPIRequest<String> deleteGAPropertyRequest =
+                this.buildOpenAPIRequest(GAPropertyDTO.toResourceName(googleGTM.getGaPropertyId()));
         String gaPropertyResourceName =
                 RestTemplateUtil.postForObject(
                                 restTemplate,
@@ -225,13 +230,23 @@ public class GTMAdminService {
                         .getData();
         log.info("为站点 {} 删除GA property: {}", siteCode, gaPropertyResourceName);
 
-        // 2. 删除GTM container - 通过data-bridge API
-        OpenAPIRequest<String> deleteGTMContainerRequest = new OpenAPIRequest<>();
-        deleteGTMContainerRequest.setRequestServer(this.getClass().getSimpleName());
-        deleteGTMContainerRequest.setRequestTime(System.currentTimeMillis());
-        deleteGTMContainerRequest.setData(
-                GTMContainerDTO.toResourceName(
-                        googleGTM.getGtmAccountId(), googleGTM.getGtmContainerId()));
+        // 2. 删除Matomo site - 通过data-bridge API
+        OpenAPIRequest<String> deleteMatomoSiteRequest =
+                this.buildOpenAPIRequest(googleGTM.getMatomoSiteId());
+        String matomoSiteId =
+                RestTemplateUtil.postForObject(
+                                restTemplate,
+                                dataBridgeApiHost + MATOMO_SITE_DELETE_API_PATH,
+                                deleteMatomoSiteRequest,
+                                new ParameterizedTypeReference<OpenAPIResponse<String>>() {})
+                        .getData();
+        log.info("为站点 {} 删除Matomo site: {}", siteCode, matomoSiteId);
+
+        // 3. 删除GTM container - 通过data-bridge API
+        OpenAPIRequest<String> deleteGTMContainerRequest =
+                this.buildOpenAPIRequest(
+                        GTMContainerDTO.toResourceName(
+                                googleGTM.getGtmAccountId(), googleGTM.getGtmContainerId()));
         String gtmContainerResourceName =
                 RestTemplateUtil.postForObject(
                                 restTemplate,
@@ -246,4 +261,12 @@ public class GTMAdminService {
 
         return true;
     }
+
+    private <T> OpenAPIRequest<T> buildOpenAPIRequest(T data) {
+        OpenAPIRequest<T> openAPIRequest = new OpenAPIRequest<>();
+        openAPIRequest.setRequestServer(this.getClass().getSimpleName());
+        openAPIRequest.setRequestTime(System.currentTimeMillis());
+        openAPIRequest.setData(data);
+        return openAPIRequest;
+    }
 }

+ 18 - 41
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/marketing/googleads/service/GoogleAdsReportService.java

@@ -7,7 +7,6 @@ import jakarta.annotation.PostConstruct;
 import lombok.extern.slf4j.Slf4j;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.reflect.TypeUtils;
 import org.jeecg.modules.adweb.common.databridge.OpenAPIRequest;
 import org.jeecg.modules.adweb.common.databridge.OpenAPIResponse;
 import org.jeecg.modules.adweb.common.util.AdwebRedisUtil;
@@ -82,7 +81,7 @@ public class GoogleAdsReportService {
 
         // 1. 创建API request
         OpenAPIRequest<ReportRequestDTO> openAPIRequest =
-                this.buildAPIRequest(googleAds, null, null, 1); // limit值无效
+                this.buildOpenAPIRequest(googleAds, null, null, 1); // limit值无效
 
         // 2. 请求API接口
         OpenAPIResponse<CustomerStatsDTO> openAPIResponse =
@@ -90,9 +89,7 @@ public class GoogleAdsReportService {
                         restTemplate,
                         dataBridgeApiHost + GOOGLE_ADS_CUSTOMER_STATS_API_PATH,
                         openAPIRequest,
-                        ParameterizedTypeReference.forType(
-                                TypeUtils.parameterize(
-                                        OpenAPIResponse.class, CustomerStatsDTO.class)));
+                        new ParameterizedTypeReference<>() {});
 
         return CustomerStatsVO.fromCustomerStatsDTO(openAPIResponse.getData());
     }
@@ -123,7 +120,7 @@ public class GoogleAdsReportService {
 
         // 1. 创建API request
         OpenAPIRequest<ReportRequestDTO> openAPIRequest =
-                this.buildAPIRequest(googleAds, start, end, limit);
+                this.buildOpenAPIRequest(googleAds, start, end, limit);
 
         // 2. 请求API接口
         OpenAPIResponse<Map<String, MetricsDTO>> openAPIResponse =
@@ -131,11 +128,7 @@ public class GoogleAdsReportService {
                         restTemplate,
                         dataBridgeApiHost + GOOGLE_ADS_DAILY_STATS_API_PATH,
                         openAPIRequest,
-                        ParameterizedTypeReference.forType(
-                                TypeUtils.parameterize(
-                                        OpenAPIResponse.class,
-                                        TypeUtils.parameterize(
-                                                Map.class, String.class, MetricsDTO.class))));
+                        new ParameterizedTypeReference<>() {});
 
         return openAPIResponse.getData().entrySet().stream()
                 .map(DailyStatsVO::fromMetricsDTO)
@@ -157,7 +150,7 @@ public class GoogleAdsReportService {
 
         // 1. 创建API request
         OpenAPIRequest<ReportRequestDTO> openAPIRequest =
-                this.buildAPIRequest(googleAds, start, end, 50); // 返回top 50
+                this.buildOpenAPIRequest(googleAds, start, end, 50); // 返回top 50
 
         // 2. 请求API接口
         OpenAPIResponse<List<CampaignStatsDTO>> openAPIResponse =
@@ -165,11 +158,7 @@ public class GoogleAdsReportService {
                         restTemplate,
                         dataBridgeApiHost + GOOGLE_ADS_CAMPAIGN_STATS_API_PATH,
                         openAPIRequest,
-                        ParameterizedTypeReference.forType(
-                                TypeUtils.parameterize(
-                                        OpenAPIResponse.class,
-                                        TypeUtils.parameterize(
-                                                List.class, CampaignStatsDTO.class))));
+                        new ParameterizedTypeReference<>() {});
 
         return openAPIResponse.getData().stream()
                 .map(CampaignStatsVO::fromCampaignStatsDTO)
@@ -191,7 +180,7 @@ public class GoogleAdsReportService {
 
         // 1. 创建API request
         OpenAPIRequest<ReportRequestDTO> openAPIRequest =
-                this.buildAPIRequest(googleAds, start, end, 50); // 返回top 50
+                this.buildOpenAPIRequest(googleAds, start, end, 50); // 返回top 50
 
         // 2. 请求API接口
         OpenAPIResponse<Map<String, MetricsDTO>> openAPIResponse =
@@ -199,11 +188,7 @@ public class GoogleAdsReportService {
                         restTemplate,
                         dataBridgeApiHost + GOOGLE_ADS_KEYWORD_STATS_API_PATH,
                         openAPIRequest,
-                        ParameterizedTypeReference.forType(
-                                TypeUtils.parameterize(
-                                        OpenAPIResponse.class,
-                                        TypeUtils.parameterize(
-                                                Map.class, String.class, MetricsDTO.class))));
+                        new ParameterizedTypeReference<>() {});
 
         return openAPIResponse.getData().entrySet().stream()
                 .map(KeywordStatsVO::fromMetricsDTO)
@@ -225,7 +210,7 @@ public class GoogleAdsReportService {
 
         // 1. 创建API request
         OpenAPIRequest<ReportRequestDTO> openAPIRequest =
-                this.buildAPIRequest(googleAds, start, end, 50); // 返回top 50
+                this.buildOpenAPIRequest(googleAds, start, end, 50); // 返回top 50
 
         // 2. 请求API接口
         OpenAPIResponse<Map<String, MetricsDTO>> openAPIResponse =
@@ -233,11 +218,7 @@ public class GoogleAdsReportService {
                         restTemplate,
                         dataBridgeApiHost + GOOGLE_ADS_PLACEMENT_STATS_API_PATH,
                         openAPIRequest,
-                        ParameterizedTypeReference.forType(
-                                TypeUtils.parameterize(
-                                        OpenAPIResponse.class,
-                                        TypeUtils.parameterize(
-                                                Map.class, String.class, MetricsDTO.class))));
+                        new ParameterizedTypeReference<>() {});
 
         return openAPIResponse.getData().entrySet().stream()
                 .map(PlacementStatsVO::fromMetricsDTO)
@@ -259,7 +240,7 @@ public class GoogleAdsReportService {
 
         // 1. 创建API request
         OpenAPIRequest<ReportRequestDTO> openAPIRequest =
-                this.buildAPIRequest(googleAds, start, end, 50); // 返回top 50
+                this.buildOpenAPIRequest(googleAds, start, end, 50); // 返回top 50
 
         // 2. 请求API接口
         OpenAPIResponse<Map<String, MetricsDTO>> openAPIResponse =
@@ -267,11 +248,7 @@ public class GoogleAdsReportService {
                         restTemplate,
                         dataBridgeApiHost + GOOGLE_ADS_COUNTRY_STATS_API_PATH,
                         openAPIRequest,
-                        ParameterizedTypeReference.forType(
-                                TypeUtils.parameterize(
-                                        OpenAPIResponse.class,
-                                        TypeUtils.parameterize(
-                                                Map.class, String.class, MetricsDTO.class))));
+                        new ParameterizedTypeReference<>() {});
 
         return openAPIResponse.getData().entrySet().stream()
                 .map(CountryStatsVO::fromMetricsDTO)
@@ -302,7 +279,7 @@ public class GoogleAdsReportService {
         return googleAds;
     }
 
-    private OpenAPIRequest<ReportRequestDTO> buildAPIRequest(
+    private OpenAPIRequest<ReportRequestDTO> buildOpenAPIRequest(
             GoogleAds googleAds, Date start, Date end, int limit) {
         ReportRequestDTO reportRequest = new ReportRequestDTO();
         reportRequest.setCustomerId(googleAds.getCustomerId());
@@ -318,10 +295,10 @@ public class GoogleAdsReportService {
                         Optional.ofNullable(end).orElse(new Date()), DateUtil.DATE_FORMAT));
         reportRequest.setLimit(limit);
 
-        OpenAPIRequest<ReportRequestDTO> apiRequest = new OpenAPIRequest<>();
-        apiRequest.setRequestServer(this.getClass().getSimpleName());
-        apiRequest.setRequestTime(System.currentTimeMillis());
-        apiRequest.setData(reportRequest);
-        return apiRequest;
+        OpenAPIRequest<ReportRequestDTO> openAPIRequest = new OpenAPIRequest<>();
+        openAPIRequest.setRequestServer(this.getClass().getSimpleName());
+        openAPIRequest.setRequestTime(System.currentTimeMillis());
+        openAPIRequest.setData(reportRequest);
+        return openAPIRequest;
     }
 }