Browse Source

Merge branch 'master' into cpq-dev

chenlei1231 3 months ago
parent
commit
a17a1d00de
35 changed files with 489 additions and 132 deletions
  1. BIN
      conf/adweb_v3.sql.zip
  2. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/common/jedis/Message.java
  3. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/common/jedis/ObjectUtil.java
  4. 25 7
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/controller/DMPDataController.java
  5. 104 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/controller/TradeSparqController.java
  6. 1 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/ReportConstant.java
  7. 0 13
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/CountryChartData.java
  8. 0 28
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/DateViewData.java
  9. 0 18
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/PagePathViewData.java
  10. 0 24
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/dto/google/analytics/report/data/SourceMediaViewData.java
  11. 92 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/entity/GADeviceReport.java
  12. 17 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/mapper/GADeviceReportMapper.java
  13. 28 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/mapper/xml/GADeviceReportMapper.xml
  14. 1 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/IGACountryReportService.java
  15. 17 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/IGADeviceReportService.java
  16. 2 7
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/IGoogleGTMService.java
  17. 81 9
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/google/GAReportService.java
  18. 46 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/impl/GADeviceReportServiceImpl.java
  19. 1 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/impl/GASourceMediumReportServiceImpl.java
  20. 3 7
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/impl/GoogleGTMServiceImpl.java
  21. 1 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/CountryStatsVO.java
  22. 22 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/DeviceStatsVO.java
  23. 1 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/PagePathStatsVO.java
  24. 6 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/PeriodicStatsVO.java
  25. 1 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/vo/report/SourceMediumStatsVO.java
  26. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/enquiry/service/impl/AdwebEnquiryServiceImpl.java
  27. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/enquiry/service/impl/EnquiryEmailMessageServiceImpl.java
  28. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/listener/EnquiryEmailSenderListener.java
  29. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/marketing/googleads/vo/CampaignStatsVO.java
  30. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/marketing/googleads/vo/DailyStatsVO.java
  31. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/system/controller/SystemAdwebController.java
  32. 7 0
      jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml
  33. 7 0
      jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml
  34. 7 0
      jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml
  35. 11 4
      jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/adweb/dmp/service/google/GoogleServiceTest.java

BIN
conf/adweb_v3.sql.zip


+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/common/Jedis/Message.java → jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/common/jedis/Message.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.adweb.common.Jedis;
+package org.jeecg.modules.adweb.common.jedis;
 
 import lombok.Getter;
 import lombok.Setter;

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/common/Jedis/ObjectUtil.java → jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/common/jedis/ObjectUtil.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.adweb.common.Jedis;
+package org.jeecg.modules.adweb.common.jedis;
 
 import java.io.*;
 

+ 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,

+ 104 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/controller/TradeSparqController.java

@@ -0,0 +1,104 @@
+package org.jeecg.modules.adweb.dmp.controller;
+
+import com.alibaba.fastjson.JSONObject;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.FastJsonUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestClientResponseException;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.stream.Collectors;
+
+/**
+ * 外贸大数据 - TradeSparq API转发
+ *
+ * @author wfansh
+ */
+@RestController
+@RequestMapping(TradeSparqController.BASE_PATH)
+@Slf4j
+public class TradeSparqController {
+    static final String BASE_PATH = "/tradesparq";
+
+    @Value("${tradesparq.api.host}")
+    private String apiHost;
+
+    @Value("${tradesparq.api.id}")
+    private String apiId;
+
+    @Value("${tradesparq.api.secret}")
+    private String apiSecret;
+
+    private RestTemplate restTemplate = new RestTemplate();
+
+    @PostMapping("/**")
+    @ResponseBody
+    public Result<JSONObject> forwardPost(
+            @RequestBody JSONObject requestBody, HttpServletRequest httpRequest) {
+        // 1. 生成签名
+        String sortedValues =
+                requestBody.keySet().stream()
+                        .sorted()
+                        .map(key -> FastJsonUtil.toJSONString(requestBody.get(key)))
+                        .collect(Collectors.joining());
+        String sign = DigestUtils.md5DigestAsHex((apiSecret + sortedValues).getBytes());
+
+        // 2. 构建并发送POST请求
+        String apiPath = httpRequest.getServletPath().split(BASE_PATH)[1]; // 获取TradeSparq API路径
+        RequestEntity<String> requestEntity =
+                RequestEntity.post(apiHost + apiPath)
+                        .headers(this.getHttpHeaders(sign))
+                        .body(requestBody.toJSONString());
+        try {
+            ResponseEntity<JSONObject> responseEntity =
+                    restTemplate.exchange(requestEntity, JSONObject.class);
+            return Result.ok(responseEntity.getBody());
+        } catch (RestClientResponseException e) {
+            return Result.error(e.getStatusCode().value(), e.getMessage());
+        }
+    }
+
+    @GetMapping("/**")
+    @ResponseBody
+    public Result<JSONObject> forwardGet(HttpServletRequest httpRequest) {
+        // 1. 生成签名
+        String apiPath = httpRequest.getServletPath().split(BASE_PATH)[1]; // 获取TradeSparq API路径
+        String queryString = httpRequest.getQueryString();
+        String apiUrl =
+                String.format(
+                        "%s%s%s",
+                        apiHost,
+                        apiPath,
+                        StringUtils.isNotBlank(queryString) ? "?" + queryString : "");
+        String sign = DigestUtils.md5DigestAsHex((apiSecret + apiUrl).getBytes());
+
+        // 2. 构建并发送GET请求
+        RequestEntity<?> requestEntity =
+                RequestEntity.get(apiUrl).headers(this.getHttpHeaders(sign)).build();
+        try {
+            ResponseEntity<JSONObject> responseEntity =
+                    restTemplate.exchange(requestEntity, JSONObject.class);
+            return Result.ok(responseEntity.getBody());
+        } catch (RestClientResponseException e) {
+            return Result.error(e.getStatusCode().value(), e.getMessage());
+        }
+    }
+
+    private HttpHeaders getHttpHeaders(String sign) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+        httpHeaders.set("X-API-UID", apiId);
+        httpHeaders.set("X-API-REQUEST-SIGN", sign);
+
+        return httpHeaders;
+    }
+}

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

@@ -20,4 +20,5 @@ public class ReportConstant {
     public static final String DIMENSION_SESSION_SOURCE_MEDIUM = "sessionSourceMedium";
     public static final String DIMENSION_PAGE_PATH = "pagePath";
     public static final String DIMENSION_DATE = "date";
+    public static final String DIMENSION_PLATFORM_DEVICE_CATEGORY = "platformDeviceCategory";
 }

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

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

@@ -0,0 +1,92 @@
+package org.jeecg.modules.adweb.dmp.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: dmp_ga_device_report
+ * @Author: jeecg-boot
+ * @Date: 2024-12-16
+ * @Version: V1.0
+ */
+@Data
+@TableName("dmp_ga_device_report")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description = "dmp_ga_device_report")
+public class GADeviceReport implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    @Schema(description = "id")
+    private Long id;
+
+    /** 站点code */
+    @Excel(name = "站点code", width = 15)
+    @Schema(description = "站点code")
+    private String siteCode;
+
+    /** 统计时间 */
+    @Excel(name = "统计时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @Schema(description = "统计时间")
+    private Date date;
+
+    /** device */
+    @Excel(name = "device", width = 15)
+    @Schema(description = "device")
+    private String device;
+
+    /** 访问量 */
+    @Excel(name = "访问量", width = 15)
+    @Schema(description = "访问量")
+    private Integer totalUsers;
+
+    /** 新用户数量 */
+    @Excel(name = "新用户数量", width = 15)
+    @Schema(description = "新用户数量")
+    private Integer newUsers;
+
+    /** 会话数量 */
+    @Excel(name = "会话数量", width = 15)
+    @Schema(description = "会话数量")
+    private Integer sessions;
+
+    /** avgSessionDuration */
+    @Excel(name = "avgSessionDuration", width = 15)
+    @Schema(description = "avgSessionDuration")
+    private Double avgSessionDuration;
+
+    /** 页面访问量 */
+    @Excel(name = "页面访问量", width = 15)
+    @Schema(description = "页面访问量")
+    private Integer pageViews;
+
+    /** pageViewsPerSession */
+    @Excel(name = "pageViewsPerSession", width = 15)
+    @Schema(description = "pageViewsPerSession")
+    private Double pageViewsPerSession;
+
+    /** ctime */
+    @Excel(name = "ctime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "ctime")
+    private Date ctime;
+}

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

@@ -0,0 +1,17 @@
+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> {
+
+    List<DeviceStatsVO> getDeviceStats(String siteCode, Date start, Date end);
+}

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

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="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>

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

@@ -12,5 +12,6 @@ import java.util.List;
  * @Description: dmp_ga_country_report @Author: jeecg-boot @Date: 2024-10-11 @Version: V1.0
  */
 public interface IGACountryReportService extends IService<GACountryReport> {
+
     List<CountryStatsVO> getCountryStats(String siteCode, Date start, Date end);
 }

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

@@ -0,0 +1,17 @@
+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> {
+
+    List<DeviceStatsVO> getDeviceStats(String siteCode, Date start, Date end);
+}

+ 2 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/IGoogleGTMService.java

@@ -5,11 +5,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.adweb.dmp.entity.GoogleGTM;
 
 /**
- * @Description: dmp_google_gtm
- * @Author: jeecg-boot
- * @Date:   2024-10-10
- * @Version: V1.0
+ * @Description: dmp_google_gtm @Author: jeecg-boot @Date: 2024-10-10 @Version: V1.0
  */
-public interface IGoogleGTMService extends IService<GoogleGTM> {
-
-}
+public interface IGoogleGTMService extends IService<GoogleGTM> {}

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

@@ -1,7 +1,5 @@
 package org.jeecg.modules.adweb.dmp.service.google;
 
-import static org.jeecg.modules.adweb.dmp.dto.google.analytics.report.ReportConstant.*;
-
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -60,6 +58,8 @@ public class GAReportService {
             AnnotationUtils.findAnnotation(GASourceMediumReport.class, TableName.class).value();
     private static final String TABLE_GA_PAGE_PATH_REPORT =
             AnnotationUtils.findAnnotation(GAPagePathReport.class, TableName.class).value();
+    private static final String TABLE_GA_DEVICE_REPORT =
+            AnnotationUtils.findAnnotation(GADeviceReport.class, TableName.class).value();
 
     private static final String GA_REPORT_API_PATH = "/api/google/ga/report";
 
@@ -75,6 +75,7 @@ public class GAReportService {
     @Autowired private IGACountryReportService gaCountryReportService;
     @Autowired private IGASourceMediumReportService gaSourceMediumReportService;
     @Autowired private IGAPagePathReportService gaPagePathReportService;
+    @Autowired private IGADeviceReportService gaDeviceReportService;
 
     @Autowired private CommonMapper commonMapper;
 
@@ -100,12 +101,13 @@ public class GAReportService {
                         new LambdaQueryWrapper<GoogleGTM>().in(GoogleGTM::getSiteCode, siteCodes));
 
         for (GoogleGTM googleGTM : googleGTMs) {
-            // 每个帐号同步更新张报表
+            // 每个帐号同步更新张报表
             try {
                 this.syncGADailyReport(googleGTM);
                 this.syncGACountryReport(googleGTM);
                 this.syncGASourceMediumReport(googleGTM);
                 this.syncGAPagePathReport(googleGTM);
+                this.syncGADeviceReport(googleGTM);
             } catch (RuntimeException e) {
                 log.warn("同步GA报表异常, siteCode = {], error = {}", googleGTM.getSiteCode(), e);
             }
@@ -123,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()));
@@ -163,7 +165,8 @@ public class GAReportService {
                     Double.parseDouble(reportData.get(ReportConstant.METRIC_BOUNCE_RATE)));
             reportRow.setAvgSessionDuration(
                     Double.parseDouble(reportData.get(ReportConstant.METRIC_AVG_SESSION_DURATION)));
-            reportRow.setPageViews(Integer.parseInt(reportData.get(METRIC_SCREEN_PAGE_VIEWS)));
+            reportRow.setPageViews(
+                    Integer.parseInt(reportData.get(ReportConstant.METRIC_SCREEN_PAGE_VIEWS)));
             reportRow.setPageViewsPerSession(
                     Double.parseDouble(
                             reportData.get(ReportConstant.METRIC_SCREEN_PAGE_VIEWS_PER_SESSION)));
@@ -190,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()));
@@ -241,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()));
@@ -311,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()));
@@ -339,7 +342,7 @@ public class GAReportService {
                     DateUtils.str2Date(
                             reportData.get(ReportConstant.DIMENSION_DATE),
                             DateUtils.date_sdf.get()));
-            reportRow.setPagePath(reportData.get(DIMENSION_PAGE_PATH));
+            reportRow.setPagePath(reportData.get(ReportConstant.DIMENSION_PAGE_PATH));
             reportRow.setEngagementRate(
                     Double.parseDouble(reportData.get(ReportConstant.METRIC_ENGAGEMENT_RATE)));
             reportRow.setPageViews(
@@ -360,6 +363,75 @@ public class GAReportService {
     }
 
     /**
+     * 拉取并同步Google Analytics - Device报表
+     *
+     * @param googleGTM
+     */
+    private void syncGADeviceReport(GoogleGTM googleGTM) {
+        // 1. 报表时间区间
+        Date startDate = this.getReportStartDate(TABLE_GA_DEVICE_REPORT, googleGTM.getSiteCode());
+        Date endDate = new Date();
+
+        // 2. 构建GA报表请求参数
+        // 使用ReportType.ADWEB_CUSTOM_REPORT
+        GAReportRequestDTO gaReportRequest = new GAReportRequestDTO();
+        gaReportRequest.setPropertyResourceName(
+                GAPropertyDTO.toResourceName(googleGTM.getGaPropertyId()));
+        gaReportRequest.setReportType(ReportType.ADWEB_CUSTOM_REPORT);
+        gaReportRequest.setStartDate(DateUtils.date2Str(startDate, DateUtils.date_sdf.get()));
+        gaReportRequest.setEndDate(DateUtils.date2Str(endDate, DateUtils.date_sdf.get()));
+        gaReportRequest.setMetrics(
+                List.of(
+                        ReportConstant.METRIC_TOTAL_USERS,
+                        ReportConstant.METRIC_NEW_USERS,
+                        ReportConstant.METRIC_SESSIONS,
+                        ReportConstant.METRIC_AVG_SESSION_DURATION,
+                        ReportConstant.METRIC_SCREEN_PAGE_VIEWS,
+                        ReportConstant.METRIC_SCREEN_PAGE_VIEWS_PER_SESSION));
+        gaReportRequest.setDimensions(
+                List.of(
+                        ReportConstant.DIMENSION_DATE,
+                        ReportConstant.DIMENSION_PLATFORM_DEVICE_CATEGORY));
+        gaReportRequest.setOrderByType(OrderByType.DIMENSIONS);
+        gaReportRequest.setOrderBy(ReportConstant.DIMENSION_DATE);
+        List<CustomReportData> reportDataList =
+                runGAReport(gaReportRequest, CustomReportData.class);
+
+        // 2. 转化为DB entity
+        List<GADeviceReport> deviceReport = Lists.newArrayList();
+        for (CustomReportData reportData : reportDataList) {
+            GADeviceReport reportRow = new GADeviceReport();
+            reportRow.setSiteCode(googleGTM.getSiteCode());
+            reportRow.setDate(
+                    DateUtils.str2Date(
+                            reportData.get(ReportConstant.DIMENSION_DATE),
+                            DateUtils.date_sdf.get()));
+            reportRow.setDevice(reportData.get(ReportConstant.DIMENSION_PLATFORM_DEVICE_CATEGORY));
+            reportRow.setTotalUsers(
+                    Integer.parseInt(reportData.get(ReportConstant.METRIC_TOTAL_USERS)));
+            reportRow.setNewUsers(
+                    Integer.parseInt(reportData.get(ReportConstant.METRIC_NEW_USERS)));
+            reportRow.setSessions(Integer.parseInt(reportData.get(ReportConstant.METRIC_SESSIONS)));
+            reportRow.setAvgSessionDuration(
+                    Double.parseDouble(reportData.get(ReportConstant.METRIC_AVG_SESSION_DURATION)));
+            reportRow.setPageViews(
+                    Integer.parseInt(reportData.get(ReportConstant.METRIC_SCREEN_PAGE_VIEWS)));
+            reportRow.setPageViewsPerSession(
+                    Double.parseDouble(
+                            reportData.get(ReportConstant.METRIC_SCREEN_PAGE_VIEWS_PER_SESSION)));
+
+            deviceReport.add(reportRow);
+        }
+
+        // 3. 更新数据库 - 删除旧数据,插入新数据
+        gaDeviceReportService.remove(
+                this.getRemoveQueryWrapper(
+                        GADeviceReport.class, googleGTM.getSiteCode(), startDate, endDate));
+
+        gaDeviceReportService.saveBatch(deviceReport, deviceReport.size());
+    }
+
+    /**
      * 请求Google Analytics报表,http://data-bridge.v3.adwebcloud.com:9002/swagger-ui/index.html
      *
      * @param gaReportRequest

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

@@ -0,0 +1,46 @@
+package org.jeecg.modules.adweb.dmp.service.impl;
+
+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 {
+
+    @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

+ 3 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/service/impl/GoogleGTMServiceImpl.java

@@ -8,12 +8,8 @@ import org.jeecg.modules.adweb.dmp.service.IGoogleGTMService;
 import org.springframework.stereotype.Service;
 
 /**
- * @Description: dmp_google_gtm
- * @Author: jeecg-boot
- * @Date:   2024-10-10
- * @Version: V1.0
+ * @Description: dmp_google_gtm @Author: jeecg-boot @Date: 2024-10-10 @Version: V1.0
  */
 @Service
-public class GoogleGTMServiceImpl extends ServiceImpl<GoogleGTMMapper, GoogleGTM> implements IGoogleGTMService {
-
-}
+public class GoogleGTMServiceImpl extends ServiceImpl<GoogleGTMMapper, GoogleGTM>
+        implements IGoogleGTMService {}

+ 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
  */

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

@@ -2,10 +2,15 @@ package org.jeecg.modules.adweb.dmp.vo.report;
 
 import lombok.Data;
 
+/**
+ * 网站分时段统计数据VO, GA流量,询盘数据等
+ *
+ * @author wfansh
+ */
 @Data
 public class PeriodicStatsVO {
 
-    private String period;
+    private String period; // today, yesterday, thisWeek, lastWeek, thisMonth, lastMonth, allTime
 
     private int totalUsers;
 

+ 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
  */

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/enquiry/service/impl/AdwebEnquiryServiceImpl.java

@@ -19,7 +19,7 @@ import org.jeecg.common.constant.WebsocketConst;
 import org.jeecg.common.system.vo.DictModel;
 import org.jeecg.common.system.vo.DictPropertyModel;
 import org.jeecg.common.util.FastJsonUtil;
-import org.jeecg.modules.adweb.common.Jedis.ObjectUtil;
+import org.jeecg.modules.adweb.common.jedis.ObjectUtil;
 import org.jeecg.modules.adweb.common.constant.NumConstant;
 import org.jeecg.modules.adweb.common.dto.CountryAreaApiDto;
 import org.jeecg.modules.adweb.common.service.FeishuService;

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/enquiry/service/impl/EnquiryEmailMessageServiceImpl.java

@@ -12,7 +12,7 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.util.FastJsonUtil;
-import org.jeecg.modules.adweb.common.Jedis.ObjectUtil;
+import org.jeecg.modules.adweb.common.jedis.ObjectUtil;
 import org.jeecg.modules.adweb.common.service.FeishuService;
 import org.jeecg.modules.adweb.common.util.AdwebRedisUtil;
 import org.jeecg.modules.adweb.common.util.JedisUtil;

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/listener/EnquiryEmailSenderListener.java

@@ -2,7 +2,7 @@ package org.jeecg.modules.adweb.listener;
 
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
-import org.jeecg.modules.adweb.common.Jedis.ObjectUtil;
+import org.jeecg.modules.adweb.common.jedis.ObjectUtil;
 import org.jeecg.modules.adweb.common.util.JedisUtil;
 import org.jeecg.modules.adweb.enquiry.constant.EnquiryConstants;
 import org.jeecg.modules.adweb.enquiry.service.IEnquiryEmailMessageService;

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/marketing/googleads/vo/CampaignStatsVO.java

@@ -55,7 +55,7 @@ public class CampaignStatsVO {
         MetricsDTO metricsDTO = campaignStatsDTO.getMetrics();
         campaignStatsVO.setImpressions(metricsDTO.getImpressions());
         campaignStatsVO.setClicks(metricsDTO.getClicks());
-        campaignStatsVO.setCtr(NumberUtil.formatDecimal(metricsDTO.getCtr(), 2).doubleValue());
+        campaignStatsVO.setCtr(NumberUtil.formatDecimal(metricsDTO.getCtr(), 4).doubleValue());
         campaignStatsVO.setAverageCpc(
                 NumberUtil.formatDecimal(
                                 NumberUtil.safeDivide(

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/marketing/googleads/vo/DailyStatsVO.java

@@ -34,7 +34,7 @@ public class DailyStatsVO {
         MetricsDTO metricsDTO = metricsDTOEntry.getValue();
         dailyStatsVO.setImpressions(metricsDTO.getImpressions());
         dailyStatsVO.setClicks(metricsDTO.getClicks());
-        dailyStatsVO.setCtr(NumberUtil.formatDecimal(metricsDTO.getCtr(), 2).doubleValue());
+        dailyStatsVO.setCtr(NumberUtil.formatDecimal(metricsDTO.getCtr(), 4).doubleValue());
         dailyStatsVO.setConversions(
                 NumberUtil.formatDecimal(metricsDTO.getConversions(), 2).doubleValue());
         dailyStatsVO.setCost(

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/system/controller/SystemAdwebController.java

@@ -6,7 +6,7 @@ import jakarta.annotation.PostConstruct;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.modules.adweb.common.Jedis.ObjectUtil;
+import org.jeecg.modules.adweb.common.jedis.ObjectUtil;
 import org.jeecg.modules.adweb.common.util.JedisUtil;
 import org.jeecg.modules.adweb.enquiry.constant.EnquiryConstants;
 import org.jeecg.modules.adweb.enquiry.service.EnquiryRedisService;

+ 7 - 0
jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml

@@ -411,6 +411,13 @@ logistics:
   meiri56:
     token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICAgInVzZXJuYW1lIjogInN1aGFvIiwKICAgICJzdWIiOiAibG9naW4iLAogICAgImlhdCI6IDE3MzIyNDcwOTAsCiAgICAiZXhwIjogMTczMjMzMzQ5MAp9.rI3IsN8qsfKiBqS6YQn45dQiTvPdoY_GcMJOR1FgKDk
 
+### 外贸大数据 - 外贸公社
+tradesparq:
+  api:
+    host: https://openapi.tradesparq.com
+    id: Sw5bYYe7
+    secret: j4ThjI10jiV3L3y7
+
 ### 询盘列表配置
 enquiry:
   disable-admin-read: false #询盘的消息是否阅读后更改阅读状态

+ 7 - 0
jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml

@@ -410,6 +410,13 @@ logistics:
   meiri56:
     token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICAgInVzZXJuYW1lIjogInN1aGFvIiwKICAgICJzdWIiOiAibG9naW4iLAogICAgImlhdCI6IDE3MzIyNDcwOTAsCiAgICAiZXhwIjogMTczMjMzMzQ5MAp9.rI3IsN8qsfKiBqS6YQn45dQiTvPdoY_GcMJOR1FgKDk
 
+### 外贸大数据 - 外贸公社
+tradesparq:
+  api:
+    host: https://openapi.tradesparq.com
+    id: Sw5bYYe7
+    secret: j4ThjI10jiV3L3y7
+
 ### 询盘列表配置
 enquiry:
   disable-admin-read: true

+ 7 - 0
jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml

@@ -410,6 +410,13 @@ logistics:
   meiri56:
     token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICAgInVzZXJuYW1lIjogInN1aGFvIiwKICAgICJzdWIiOiAibG9naW4iLAogICAgImlhdCI6IDE3MzIyNDcwOTAsCiAgICAiZXhwIjogMTczMjMzMzQ5MAp9.rI3IsN8qsfKiBqS6YQn45dQiTvPdoY_GcMJOR1FgKDk
 
+### 外贸大数据 - 外贸公社
+tradesparq:
+  api:
+    host: https://openapi.tradesparq.com
+    id: Sw5bYYe7
+    secret: j4ThjI10jiV3L3y7
+
 ### 询盘列表配置
 enquiry:
   disable-admin-read: true

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