Browse Source

GA device report

wfansh 3 months ago
parent
commit
920ba6361d
16 changed files with 134 additions and 107 deletions
  1. 25 7
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/controller/DMPDataController.java
  2. 0 13
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/CountryChartData.java
  3. 0 28
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/DateViewData.java
  4. 0 18
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/PagePathViewData.java
  5. 0 24
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/SourceMediaViewData.java
  6. 8 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/mapper/GADeviceReportMapper.java
  7. 23 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/mapper/xml/GADeviceReportMapper.xml
  8. 8 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/IGADeviceReportService.java
  9. 4 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/google/GAReportService.java
  10. 29 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/impl/GADeviceReportServiceImpl.java
  11. 1 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/impl/GASourceMediumReportServiceImpl.java
  12. 1 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/CountryStatsVO.java
  13. 22 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/DeviceStatsVO.java
  14. 1 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/PagePathStatsVO.java
  15. 1 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/SourceMediumStatsVO.java
  16. 11 4
      jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/adweb/dmp/service/google/GoogleServiceTest.java

+ 25 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/controller/DMPDataController.java

@@ -36,9 +36,10 @@ import java.util.stream.Collectors;
 public class DMPDataController {
 
     @Autowired private IGADailyReportService gaDailyReportService;
-    @Autowired private IGASourceMediumReportService gaSourceMediumReportService;
     @Autowired private IGACountryReportService gaCountryReportService;
+    @Autowired private IGASourceMediumReportService gaSourceMediumReportService;
     @Autowired private IGAPagePathReportService gaPagePathReportService;
+    @Autowired private IGADeviceReportService gaDeviceReportService;
     @Autowired private IEnquiryReportService enquiryReportService;
 
     /** 首页:网站流量按时间段分析统计 - 今天,昨天,本周,上周等 */
@@ -76,8 +77,8 @@ public class DMPDataController {
         return Result.ok(SiteOverviewStatsVO.fromDailyStats(dailyStatsVOs));
     }
 
-    @GetMapping("/source-medium/stats")
-    public Result<List<SourceMediumStatsVO>> getSourceMediumStats(
+    @GetMapping("/country/stats")
+    public Result<List<CountryStatsVO>> getCountryStats(
             String siteCode,
             String dateType,
             @DateTimeFormat(pattern = "yyyy-MM-dd") Date start,
@@ -90,11 +91,11 @@ public class DMPDataController {
         }
 
         // 2. 查询并返回
-        return Result.ok(gaSourceMediumReportService.getSourceMediumStats(siteCode, start, end));
+        return Result.ok(gaCountryReportService.getCountryStats(siteCode, start, end));
     }
 
-    @GetMapping("/country/stats")
-    public Result<List<CountryStatsVO>> getCountryStats(
+    @GetMapping("/source-medium/stats")
+    public Result<List<SourceMediumStatsVO>> getSourceMediumStats(
             String siteCode,
             String dateType,
             @DateTimeFormat(pattern = "yyyy-MM-dd") Date start,
@@ -107,7 +108,7 @@ public class DMPDataController {
         }
 
         // 2. 查询并返回
-        return Result.ok(gaCountryReportService.getCountryStats(siteCode, start, end));
+        return Result.ok(gaSourceMediumReportService.getSourceMediumStats(siteCode, start, end));
     }
 
     @GetMapping("/page-path/stats")
@@ -130,6 +131,23 @@ public class DMPDataController {
                         siteCode, start, end, limit >= 0 ? limit : 10));
     }
 
+    @GetMapping("/device/stats")
+    public Result<List<DeviceStatsVO>> getDeviceStats(
+            String siteCode,
+            String dateType,
+            @DateTimeFormat(pattern = "yyyy-MM-dd") Date start,
+            @DateTimeFormat(pattern = "yyyy-MM-dd") Date end) {
+        // 1. 计算时间区间
+        if (StringUtils.isNotBlank(dateType)) {
+            Pair<Date, Date> dateRange = DateUtil.getDateRangeByType(dateType);
+            start = dateRange.getLeft();
+            end = dateRange.getRight();
+        }
+
+        // 2. 查询并返回
+        return Result.ok(gaDeviceReportService.getDeviceStats(siteCode, start, end));
+    }
+
     @GetMapping("/enquiry-country/stats")
     public Result<List<EnquiryCountryStatsVO>> getEnquiryCountryStats(
             String siteCode,

+ 0 - 13
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/CountryChartData.java

@@ -1,13 +0,0 @@
-package org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data;
-
-import lombok.Data;
-
-/**
- * @author wfansh
- */
-@Data
-public class CountryChartData implements GAReportDataDTO {
-
-    private String country;
-    private int totalUsers;
-}

+ 0 - 28
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/DateViewData.java

@@ -1,28 +0,0 @@
-package org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data;
-
-import lombok.Data;
-
-import java.time.format.DateTimeFormatter;
-
-/**
- * @author wfansh
- */
-@Data
-public class DateViewData implements GAReportDataDTO {
-
-    /**
-     * Formatted as {@link DateTimeFormatter#ISO_LOCAL_DATE}, originated from {@link
-     * DateTimeFormatter#BASIC_ISO_DATE}
-     */
-    private String date;
-
-    private int totalUsers;
-
-    private int activeUsers;
-
-    private int pageViews;
-
-    private double bounceRate;
-
-    private double avgSessionDuration;
-}

+ 0 - 18
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/PagePathViewData.java

@@ -1,18 +0,0 @@
-package org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data;
-
-import lombok.Data;
-
-/**
- * @author wfansh
- */
-@Data
-public class PagePathViewData implements GAReportDataDTO {
-
-    private String pagePath;
-
-    private double engagementRate;
-
-    private int pageViews;
-
-    private double avgTimeOnPage;
-}

+ 0 - 24
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/SourceMediaViewData.java

@@ -1,24 +0,0 @@
-package org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data;
-
-import lombok.Data;
-
-/**
- * @author wfansh
- */
-@Data
-public class SourceMediaViewData implements GAReportDataDTO {
-
-    private String type;
-
-    private int totalUsers;
-
-    private int newUsers;
-
-    private int sessions;
-
-    private double bounceRate;
-
-    private double avgSessionDuration;
-
-    private double pageViewsPerSession;
-}

+ 8 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/mapper/GADeviceReportMapper.java

@@ -3,8 +3,15 @@ package org.jeecg.modules.adweb.dmp.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 import org.jeecg.modules.adweb.dmp.entity.GADeviceReport;
+import org.jeecg.modules.adweb.dmp.vo.report.DeviceStatsVO;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * @Description: dmp_ga_device_report @Author: jeecg-boot @Date: 2024-12-16 @Version: V1.0
  */
-public interface GADeviceReportMapper extends BaseMapper<GADeviceReport> {}
+public interface GADeviceReportMapper extends BaseMapper<GADeviceReport> {
+
+    List<DeviceStatsVO> getDeviceStats(String siteCode, Date start, Date end);
+}

+ 23 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/mapper/xml/GADeviceReportMapper.xml

@@ -2,4 +2,27 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.adweb.dmp.mapper.GADeviceReportMapper">
 
+    <select id="getDeviceStats" resultType="org.jeecg.modules.adweb.dmp.vo.report.DeviceStatsVO">
+        SELECT
+        device,
+        SUM(total_users) total_users,
+        SUM(sessions) sessions,
+        SUM(page_views) page_views
+        FROM
+        dmp_ga_device_report
+        WHERE
+        site_code = #{siteCode}
+        <if test="start != null">
+            AND date >= #{start}
+        </if>
+        <if test="end != null">
+            AND date &lt; DATE_ADD(#{end}, INTERVAL 1 DAY)
+        </if>
+        GROUP BY
+        device
+        ORDER BY
+        total_users DESC,
+        page_views DESC
+    </select>
+
 </mapper>

+ 8 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/IGADeviceReportService.java

@@ -3,8 +3,15 @@ package org.jeecg.modules.adweb.dmp.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import org.jeecg.modules.adweb.dmp.entity.GADeviceReport;
+import org.jeecg.modules.adweb.dmp.vo.report.DeviceStatsVO;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * @Description: dmp_ga_device_report @Author: jeecg-boot @Date: 2024-12-16 @Version: V1.0
  */
-public interface IGADeviceReportService extends IService<GADeviceReport> {}
+public interface IGADeviceReportService extends IService<GADeviceReport> {
+
+    List<DeviceStatsVO> getDeviceStats(String siteCode, Date start, Date end);
+}

+ 4 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/google/GAReportService.java

@@ -125,7 +125,7 @@ public class GAReportService {
         Date endDate = new Date();
 
         // 2. 构建GA报表请求参数
-        // 使用ADWEB_CUSTOM_REPORT,不是ADWEB_DATE_VIEW - 需要更多metrics字段
+        // 使用ReportType.ADWEB_CUSTOM_REPORT,不是ADWEB_DATE_VIEW - 需要更多metrics字段
         GAReportRequestDTO gaReportRequest = new GAReportRequestDTO();
         gaReportRequest.setPropertyResourceName(
                 GAPropertyDTO.toResourceName(googleGTM.getGaPropertyId()));
@@ -193,7 +193,7 @@ public class GAReportService {
         Date endDate = new Date();
 
         // 2. 构建GA报表请求参数
-        // 使用ADWEB_CUSTOM_REPORT,不是ADWEB_COUNTRY_CHART - 需要date作为dimension
+        // 使用ReportType.ADWEB_CUSTOM_REPORT,不是ADWEB_COUNTRY_CHART - 需要date作为dimension
         GAReportRequestDTO gaReportRequest = new GAReportRequestDTO();
         gaReportRequest.setPropertyResourceName(
                 GAPropertyDTO.toResourceName(googleGTM.getGaPropertyId()));
@@ -244,7 +244,7 @@ public class GAReportService {
         Date endDate = new Date();
 
         // 2. 构建GA报表请求参数
-        // 使用ADWEB_CUSTOM_REPORT,不是ADWEB_SESSION_SOURCE_MEDIUM_VIEW - 需要date作为dimension
+        // 使用ReportType.ADWEB_CUSTOM_REPORT,不是ADWEB_SESSION_SOURCE_MEDIUM_VIEW - 需要date作为dimension
         GAReportRequestDTO gaReportRequest = new GAReportRequestDTO();
         gaReportRequest.setPropertyResourceName(
                 GAPropertyDTO.toResourceName(googleGTM.getGaPropertyId()));
@@ -314,7 +314,7 @@ public class GAReportService {
         Date endDate = new Date();
 
         // 2. 构建GA报表请求参数
-        // 使用ADWEB_CUSTOM_REPORT,不是ADWEB_PAGE_PATH_VIEW - 需要date作为dimension
+        // 使用ReportType.ADWEB_CUSTOM_REPORT,不是ADWEB_PAGE_PATH_VIEW - 需要date作为dimension
         GAReportRequestDTO gaReportRequest = new GAReportRequestDTO();
         gaReportRequest.setPropertyResourceName(
                 GAPropertyDTO.toResourceName(googleGTM.getGaPropertyId()));

+ 29 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/impl/GADeviceReportServiceImpl.java

@@ -4,15 +4,43 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import lombok.extern.slf4j.Slf4j;
 
+import org.apache.commons.collections4.CollectionUtils;
 import org.jeecg.modules.adweb.dmp.entity.GADeviceReport;
 import org.jeecg.modules.adweb.dmp.mapper.GADeviceReportMapper;
 import org.jeecg.modules.adweb.dmp.service.IGADeviceReportService;
+import org.jeecg.modules.adweb.dmp.vo.report.DeviceStatsVO;
+import org.jeecg.modules.redis.CacheConfig;
+import org.jeecg.modules.redis.TTLCacheManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
 /**
  * @Description: dmp_ga_device_report @Author: jeecg-boot @Date: 2024-12-16 @Version: V1.0
  */
 @Service
 @Slf4j
 public class GADeviceReportServiceImpl extends ServiceImpl<GADeviceReportMapper, GADeviceReport>
-        implements IGADeviceReportService {}
+        implements IGADeviceReportService {
+
+    @Autowired private GADeviceReportMapper gaDeviceReportMapper;
+
+    @Override
+    @Cacheable(
+            cacheManager = CacheConfig.TTL_CACHE_MANAGER,
+            cacheNames =
+                    "dmp:getDeviceStats" + TTLCacheManager.TTL_SPLITTER + 60 * 10) // Redis TTL为10分钟
+    public List<DeviceStatsVO> getDeviceStats(String siteCode, Date start, Date end) {
+        List<DeviceStatsVO> deviceStatsVOs =
+                gaDeviceReportMapper.getDeviceStats(siteCode, start, end);
+        if (CollectionUtils.isEmpty(deviceStatsVOs)) {
+            return Collections.EMPTY_LIST;
+        }
+
+        return deviceStatsVOs;
+    }
+}

+ 1 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/impl/GASourceMediumReportServiceImpl.java

@@ -25,6 +25,7 @@ import java.util.List;
 public class GASourceMediumReportServiceImpl
         extends ServiceImpl<GASourceMediumReportMapper, GASourceMediumReport>
         implements IGASourceMediumReportService {
+
     @Autowired private GASourceMediumReportMapper gaSourceMediumReportMapper;
 
     @Override

+ 1 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/CountryStatsVO.java

@@ -2,11 +2,10 @@ package org.jeecg.modules.adweb.dmp.vo.report;
 
 import lombok.Data;
 
-import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data.CountryChartData;
 import org.jeecg.modules.adweb.dmp.entity.GACountryReport;
 
 /**
- * GA国家分布统计数据VO,see {@link CountryChartData} and {@link GACountryReport}
+ * GA国家分布统计数据VO,see {@link GACountryReport}
  *
  * @author wfansh
  */

+ 22 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/DeviceStatsVO.java

@@ -0,0 +1,22 @@
+package org.jeecg.modules.adweb.dmp.vo.report;
+
+import lombok.Data;
+
+import org.jeecg.modules.adweb.dmp.entity.GADeviceReport;
+
+/**
+ * GA设备分布统计数据VO,see {@link GADeviceReport}
+ *
+ * @author wfansh
+ */
+@Data
+public class DeviceStatsVO {
+
+    private String device;
+
+    private int totalUsers;
+
+    private int sessions;
+
+    private int pageViews;
+}

+ 1 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/PagePathStatsVO.java

@@ -2,11 +2,10 @@ package org.jeecg.modules.adweb.dmp.vo.report;
 
 import lombok.Data;
 
-import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data.PagePathViewData;
 import org.jeecg.modules.adweb.dmp.entity.GAPagePathReport;
 
 /**
- * GA页面访问统计数据VO,see {@link PagePathViewData} and {@link GAPagePathReport}
+ * GA页面访问统计数据VO,see {@link GAPagePathReport}
  *
  * @author wfansh
  */

+ 1 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/SourceMediumStatsVO.java

@@ -2,11 +2,10 @@ package org.jeecg.modules.adweb.dmp.vo.report;
 
 import lombok.Data;
 
-import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data.SourceMediaViewData;
 import org.jeecg.modules.adweb.dmp.entity.GASourceMediumReport;
 
 /**
- * GA流量来源媒介统计数据VO,see {@link SourceMediaViewData} and {@link GASourceMediumReport}
+ * GA流量来源媒介统计数据VO,see  {@link GASourceMediumReport}
  *
  * @author wfansh
  */

+ 11 - 4
jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/adweb/dmp/service/google/GoogleServiceTest.java

@@ -3,8 +3,10 @@ package org.jeecg.modules.adweb.dmp.service.google;
 import org.apache.commons.lang3.tuple.Pair;
 import org.jeecg.common.util.FastJsonUtil;
 import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.GAReportRequestDTO;
+import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.OrderByType;
+import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.ReportConstant;
 import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.ReportType;
-import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data.CountryChartData;
+import org.jeecg.modules.adweb.dmp.dto.google.analytics.report.data.CustomReportData;
 import org.jeecg.modules.adweb.dmp.entity.GoogleGTM;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -29,12 +31,17 @@ public class GoogleServiceTest {
     public void testGAReport() {
         GAReportRequestDTO gaReportRequest = new GAReportRequestDTO();
         gaReportRequest.setPropertyResourceName("properties/457183952");
-        gaReportRequest.setReportType(ReportType.ADWEB_COUNTRY_CHART);
+        gaReportRequest.setReportType(ReportType.ADWEB_CUSTOM_REPORT);
         gaReportRequest.setStartDate("2023-10-01");
         gaReportRequest.setEndDate("2024-10-01");
+        gaReportRequest.setMetrics(List.of(ReportConstant.METRIC_TOTAL_USERS));
+        gaReportRequest.setDimensions(
+                List.of(ReportConstant.DIMENSION_DATE, ReportConstant.DIMENSION_COUNTRY));
+        gaReportRequest.setOrderByType(OrderByType.DIMENSIONS);
+        gaReportRequest.setOrderBy(ReportConstant.DIMENSION_DATE);
 
-        List<CountryChartData> countryReport =
-                gaReportService.runGAReport(gaReportRequest, CountryChartData.class);
+        List<CustomReportData> countryReport =
+                gaReportService.runGAReport(gaReportRequest, CustomReportData.class);
 
         System.out.println(FastJsonUtil.toJSONString(countryReport));
     }