1
0
wfansh 2 сар өмнө
parent
commit
9fd62e2e7c

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

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

@@ -86,6 +86,11 @@ public class GoogleGTM implements Serializable {
     @Schema(description = "gaTagId")
     private String gaTagId;
 
+    /** gaTagId */
+    @Excel(name = "matomoSiteId", width = 15)
+    @Schema(description = "matomoSiteId")
+    private String matomoSiteId;
+
     /** ctime */
     @Excel(name = "ctime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")

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

@@ -20,6 +20,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 +36,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 +49,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,35 +109,47 @@ 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());
-        GAPropertyDTO gaProperty =
+        OpenAPIRequest<CreatePropertyRequestDTO> createGAPropertyRequest =
+                this.buildOpenAPIRequest(
+                        CreatePropertyRequestDTO.builder()
+                                .accountResourceName(GAAccountDTO.toResourceName(gaAccountId))
+                                .displayName(siteName)
+                                .url(siteUrl)
+                                .build());
+        OpenAPIResponse<GAPropertyDTO> createGAPropertyResponse =
+
                 RestTemplateUtil.postForObject(
                                 restTemplate,
                                 dataBridgeApiHost + GA_PROPERTY_CREATE_API_PATH,
                                 createGAPropertyRequest,
                                 new ParameterizedTypeReference<OpenAPIResponse<GAPropertyDTO>>() {})
-                        .getData();
+                        ;
+        GAPropertyDTO gaProperty
         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,7 +160,7 @@ public class GTMAdminService {
                         .getData();
         log.info("为站点 {} 创建GTM container: {}", siteCode, FastJsonUtil.toJSONString(gtmContainer));
 
-        // 3. 更新数据库
+        // 4. 更新数据库
         googleGTM = new GoogleGTM();
         googleGTM.setSiteCode(siteCode);
         googleGTM.setUid(null); // TODO
@@ -156,6 +172,7 @@ public class GTMAdminService {
         googleGTM.setGaVersion("V4"); // GA4 https://support.google.com/analytics/answer/10089681
         googleGTM.setGaSiteUrl(siteUrl);
         googleGTM.setGaTagId(gaProperty.getDataStreams().get(0).getStreamMeasurementId());
+        googleGTM.setMatomoSiteId(matomoSite.getSiteId());
         googleGTMService.save(googleGTM);
 
         return googleGTM;
@@ -164,10 +181,7 @@ 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,
@@ -212,10 +226,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 +237,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(GAPropertyDTO.toResourceName(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 +268,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;
     }
 }