Pārlūkot izejas kodu

用户参与度时长接口定义

wangcl 3 nedēļas atpakaļ
vecāks
revīzija
ea113ac980

+ 49 - 0
pig-statistics/pig-statistics-api/src/main/java/com/pig4cloud/pig/statistics/api/dto/distribution/UserDistributionDTO.java

@@ -0,0 +1,49 @@
+package com.pig4cloud.pig.statistics.api.dto.distribution;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * @author wcl
+ * @date 2025/8/22 14:37
+ * @description: 用户使用时长分布查询请求
+ */
+@Data
+@Schema(description = "用户使用时长分布查询请求")
+public class UserDistributionDTO {
+
+	@Schema(description = "开始日期", example = "2025-08-21")
+	@NotBlank(message = "开始日期不能为空")
+	private String beginDate;
+
+	@Schema(description = "渠道")
+	private String channel;
+
+	@Schema(description = "数据源ID")
+	private String dataSourceId;
+
+	@Schema(description = "时长类型:daily-单日,once-单次", example = "daily")
+	private String durationType;
+
+	@Schema(description = "是否返回图例", example = "true")
+	private Boolean legend;
+
+	@Schema(description = "关联ID(应用ID)", example = "5f6960d2b473963242a3b459")
+	private String relatedId;
+
+	@Schema(description = "时间单位:day-天", example = "day")
+	private String timeUnit;
+
+	@Schema(description = "类型:durationRange-时长范围、launchRange-使用频率、pageViewRange-访问页面、intervalRange-使用间隔")
+	@NotBlank(message = "类型不能为空")
+	private String type;
+
+	@Schema(description = "应用版本", example = "1.0.0")
+	private String version;
+
+	@Schema(description = "视图类型")
+	private String view;
+
+}

+ 3 - 0
pig-statistics/pig-statistics-api/src/main/java/com/pig4cloud/pig/statistics/api/dto/uninstall/GetUninstallInsightDTO.java

@@ -1,6 +1,7 @@
 package com.pig4cloud.pig.statistics.api.dto.uninstall;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
 /**
@@ -13,9 +14,11 @@ import lombok.Data;
 public class GetUninstallInsightDTO {
 
 	@Schema(description = "周期(周/月)")
+	@NotBlank(message = "周期不能为空")
 	private String cycle;
 
 	@Schema(description = "类型")
+	@NotBlank(message = "类型不能为空")
 	private String type;
 
 	@Schema(description = "appId")

+ 2 - 0
pig-statistics/pig-statistics-api/src/main/java/com/pig4cloud/pig/statistics/api/dto/uninstall/GetUninstallTrendDTO.java

@@ -1,6 +1,7 @@
 package com.pig4cloud.pig.statistics.api.dto.uninstall;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
 /**
@@ -19,6 +20,7 @@ public class GetUninstallTrendDTO {
 	private String endDate;
 
 	@Schema(description = "时间单位(day/week/month),不传则默认为day")
+	@NotBlank(message = "时间单位不能为空")
 	private String timeUnit;
 
 	@Schema(description = "appId")

+ 2 - 0
pig-statistics/pig-statistics-api/src/main/java/com/pig4cloud/pig/statistics/api/dto/uninstall/GetUninstallTrendDetailDTO.java

@@ -1,6 +1,7 @@
 package com.pig4cloud.pig.statistics.api.dto.uninstall;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
 /**
@@ -19,6 +20,7 @@ public class GetUninstallTrendDetailDTO {
 	private String endDate;
 
 	@Schema(description = "时间单位(week/month)")
+	@NotBlank(message = "时间单位不能为空")
 	private String timeUnit;
 
 	@Schema(description = "appId")

+ 27 - 0
pig-statistics/pig-statistics-api/src/main/java/com/pig4cloud/pig/statistics/api/vo/distribution/DurationItemVO.java

@@ -0,0 +1,27 @@
+package com.pig4cloud.pig.statistics.api.vo.distribution;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author wcl
+ * @date 2025/8/22 14:57
+ * @description: 时长分布项
+ */
+@Data
+@Schema(description = "时长分布项")
+public class DurationItemVO {
+
+	@Schema(description = "时长范围", example = "1-10")
+	private String name;
+
+	@Schema(description = "启动次数", example = "10")
+	private Integer value;
+
+	@Schema(description = "占比", example = "10.0")
+	private Double rate;
+
+	@Schema(description = "总启动次数", example = "100")
+	private Integer totalStarts;
+}

+ 23 - 0
pig-statistics/pig-statistics-api/src/main/java/com/pig4cloud/pig/statistics/api/vo/distribution/UserDistributionVO.java

@@ -0,0 +1,23 @@
+package com.pig4cloud.pig.statistics.api.vo.distribution;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author wcl
+ * @date 2025/8/22 14:56
+ * @description: 用户使用时长分布返回结果
+ */
+@Data
+@Schema(description = "用户使用时长分布返回结果")
+public class UserDistributionVO {
+
+	@Schema(description = "图例(日期)", example = "2025-08-21")
+	private String legend;
+
+	@Schema(description = "当前时段时长分布项列表")
+	private List<DurationItemVO> items;
+}

+ 34 - 0
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/controller/UserDurationController.java

@@ -0,0 +1,34 @@
+package com.pig4cloud.pig.statistics.controller;
+
+
+import com.pig4cloud.pig.common.core.util.R;
+import com.pig4cloud.pig.statistics.api.dto.distribution.UserDistributionDTO;
+import com.pig4cloud.pig.statistics.api.vo.distribution.UserDistributionVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author wcl
+ * @date 2025/8/22 11:46
+ * @description: 用户参与度
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/userDuration")
+@Tag(description = "userDuration", name = "用户参与度")
+public class UserDurationController {
+
+	@PostMapping("/getDurationRange")
+	@Operation(summary = "使用时长查询")
+	public R<UserDistributionVO> getDurationRange(@RequestBody UserDistributionDTO dto) {
+		return R.ok();
+	}
+
+}
+
+

+ 34 - 4
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/service/impl/UninstallAnalyseServiceImpl.java

@@ -450,14 +450,29 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 
 	@Override
 	public List<UninstallOfterAPPOV> uninstallAfter(GetUninstallInsightDTO dto) {
-		// 这里只做演示,实际可查stat_device_time或相关表
+
+		Map<String, LocalDate> timeRangeMap = new HashMap<>();
+
+		if (!StringUtils.isEmpty(dto.getCycle())) {
+			timeRangeMap = getTimeRangeMap(dto.getCycle());
+		}
+
 		QueryWrapper<MktDeviceTime> wrapper = new QueryWrapper<>();
-		wrapper.eq("type", "after");
+		if (!StringUtils.isEmpty(dto.getType())){
+			wrapper.eq("type", dto.getType());
+		}
+		if (!timeRangeMap.isEmpty()){
+			wrapper.between("stat_date", timeRangeMap.get("startDate"), timeRangeMap.get("endDate"));
+		}
+		if (!StringUtils.isEmpty(dto.getAppId())) wrapper.eq("app_id", dto.getAppId());
+		if (!StringUtils.isEmpty(dto.getChannel())) wrapper.eq("channel", dto.getChannel());
+		if (!StringUtils.isEmpty(dto.getVersion())) wrapper.eq("app_version", dto.getVersion());
 		List<MktDeviceTime> list = statDeviceTimeMapper.selectList(wrapper);
 		List<UninstallOfterAPPOV> result = new ArrayList<>();
 		for (MktDeviceTime entity : list) {
 			UninstallOfterAPPOV vo = new UninstallOfterAPPOV();
-			vo.setAppName(entity.getTimeRange()); // 假设timeRange存appName
+			ConfigItem actionType = ConfigUtils.getConfigValue("app_type", entity.getType());
+			vo.setAppName(!StringUtils.isEmpty(actionType.getLabel()) ? actionType.getLabel() : ""); //
 			vo.setCount(entity.getDeviceCount());
 			vo.setProportion(entity.getRate() != null ? entity.getRate().toString() : null);
 			result.add(vo);
@@ -467,8 +482,23 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 
 	@Override
 	public List<UninstallSYSOV> uninstallSys(GetUninstallInsightDTO dto) {
+
+		Map<String, LocalDate> timeRangeMap = new HashMap<>();
+
+		if (!StringUtils.isEmpty(dto.getCycle())) {
+			timeRangeMap = getTimeRangeMap(dto.getCycle());
+		}
+
 		QueryWrapper<MktDeviceTime> wrapper = new QueryWrapper<>();
-		wrapper.eq("type", "sys");
+		if (!StringUtils.isEmpty(dto.getType())){
+			wrapper.eq("type", dto.getType());
+		}
+		if (!timeRangeMap.isEmpty()){
+			wrapper.between("stat_date", timeRangeMap.get("startDate"), timeRangeMap.get("endDate"));
+		}
+		if (!StringUtils.isEmpty(dto.getAppId())) wrapper.eq("app_id", dto.getAppId());
+		if (!StringUtils.isEmpty(dto.getChannel())) wrapper.eq("channel", dto.getChannel());
+		if (!StringUtils.isEmpty(dto.getVersion())) wrapper.eq("app_version", dto.getVersion());
 		List<MktDeviceTime> list = statDeviceTimeMapper.selectList(wrapper);
 		Map<String, List<Map<String, Integer>>> sysMap = new LinkedHashMap<>();
 		for (MktDeviceTime entity : list) {