Przeglądaj źródła

update: 升级用户版本、修复统计范围

lwh 3 tygodni temu
rodzic
commit
a1b49ff18b

+ 7 - 0
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/controller/UserAnalyseController.java

@@ -53,6 +53,13 @@ public class UserAnalyseController {
 		return R.ok(result);
 	}
 
+	@PostMapping("/upgrade/trend")
+	@Operation(summary = "查询升级用户趋势")
+	public R<GetNewUserTrendVO> getUpgradeUserTrend(@Valid @RequestBody UserAnalyseQueryBaseDTO reqDto) {
+		GetNewUserTrendVO result = userAnalyseService.getUpgradeUserTrend(reqDto);
+		return R.ok(result);
+	}
+
 	@PostMapping("/new/detail")
 	@Operation(summary = "分页查询新增趋势详情")
 	public R<Page<PageNewUserTrendDetailVO>> pageNewUserTrendDetail(@Valid @RequestBody PageUserAnalyseDTO reqDto) {

+ 7 - 0
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/service/UserAnalyseService.java

@@ -23,6 +23,13 @@ public interface UserAnalyseService {
 	 */
 	GetNewUserTrendVO getNewUserTrend(@Valid UserAnalyseQueryBaseDTO reqDto);
 
+	/**
+	 * 获取升级用户趋势
+	 * @param reqDto 请求参数
+	 * @return GetNewUserTrendVO
+	 */
+	GetNewUserTrendVO getUpgradeUserTrend(@Valid UserAnalyseQueryBaseDTO reqDto);
+
 	/**
 	 * 分页查询新增趋势详情
 	 * @param reqDto 请求参数

+ 44 - 106
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/service/impl/UserAnalyseServiceImpl.java

@@ -14,7 +14,6 @@ import com.pig4cloud.pig.statistics.api.vo.user.*;
 import com.pig4cloud.pig.statistics.mapper.MktStatActiveUserMapper;
 import com.pig4cloud.pig.statistics.mapper.MktStatNewUserMapper;
 import com.pig4cloud.pig.statistics.mapper.MktStatUserAnalysisMapper;
-import com.pig4cloud.pig.statistics.mapper.MktStatUserRetentionMapper;
 import com.pig4cloud.pig.statistics.service.UserAnalyseService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -60,8 +59,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		// 1. 生成时间轴
 		List<String> dates = generateTimeAxis(reqDto.getFromDate(), reqDto.getToDate(), reqDto.getTimeUnit());
 		result.setDates(dates);
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
 
 		// 2. 处理版本列表(为空时按null处理)
 		List<String> versions = reqDto.getVersion();
@@ -77,20 +74,12 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 					trend.setVersion(version == null ? "All" : version);
 					trend.setKey("newUser");
 
-					// 计算每个时间点的活跃用户数
+					// 计算每个时间点的新增用户数
 					List<Long> counts = dates.stream()
 							.map(date -> {
 								LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
 								LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
-								// 如果startTime早于fromDate
-								if (startTime.isBefore(fromDate)) {
-									startTime = fromDate;
-								}
-
-								// 如果endTime晚于toDate
-								if (endTime.isAfter(toDate)) {
-									endTime = toDate;
-								}
+
 								return statNewUserCount(startTime, endTime, reqDto.getAppId(), version, reqDto.getChannel());
 							})
 							.collect(Collectors.toList());
@@ -102,6 +91,44 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		return result;
 	}
 
+	@Override
+	public GetNewUserTrendVO getUpgradeUserTrend(UserAnalyseQueryBaseDTO reqDto) {
+		GetNewUserTrendVO result = new GetNewUserTrendVO();
+		// 1. 生成时间轴
+		List<String> dates = generateTimeAxis(reqDto.getFromDate(), reqDto.getToDate(), reqDto.getTimeUnit());
+		result.setDates(dates);
+
+		// 2. 处理版本列表(为空时按null处理)
+		List<String> versions = reqDto.getVersion();
+		List<String> processVersions = (versions == null || versions.isEmpty())
+				? Collections.singletonList(null)
+				: versions.stream().filter(v -> v != null && !v.isEmpty()).toList();
+
+		// 3. 处理每个版本的数据
+		List<TrendBaseVO> voList = processVersions.stream()
+				.map(version -> {
+					TrendBaseVO trend = new TrendBaseVO();
+					trend.setName("升级用户");
+					trend.setVersion(version == null ? "All" : version);
+					trend.setKey("upgradeUser");
+
+					// 计算每个时间点的升级用户数
+					List<Long> counts = dates.stream()
+							.map(date -> {
+								LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
+								LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
+
+								return statUpgradeUserCount(startTime, endTime, reqDto.getAppId(), version, null, reqDto.getChannel());
+							})
+							.collect(Collectors.toList());
+					trend.setData(counts);
+					return trend;
+				})
+				.toList();
+		result.setItems(voList);
+		return result;
+	}
+
 	/**
 	 * 分页查询新增趋势详情
 	 * @param reqDto 请求参数
@@ -118,8 +145,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		if (dates.isEmpty()) {
 			return page; // 无数据直接返回
 		}
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
 
 		// 获取渠道和版本
 		List<String> channel = reqDto.getChannel();
@@ -134,15 +159,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 			// 获取时间范围
 			LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
 			LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
-			// 如果startTime早于fromDate
-			if (startTime.isBefore(fromDate)) {
-				startTime = fromDate;
-			}
-
-			// 如果endTime晚于toDate
-			if (endTime.isAfter(toDate)) {
-				endTime = toDate;
-			}
 			// 查询新增用户数
 			BigDecimal newUser = BigDecimal.valueOf(statNewUserCount(startTime, endTime, reqDto.getAppId(), version, channel));
 			// 查询活跃用户数
@@ -297,10 +313,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		List<String> dates = generateTimeAxis(reqDto.getFromDate(), reqDto.getToDate(), reqDto.getTimeUnit());
 		result.setDates(dates);
 
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
-
-
 		// 2. 处理版本列表(为空时按null处理)
 		List<String> versions = reqDto.getVersion();
 		List<String> processVersions = (versions == null || versions.isEmpty())
@@ -320,15 +332,7 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 							.map(date -> {
 								LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
 								LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
-								// 如果startTime早于fromDate
-								if (startTime.isBefore(fromDate)) {
-									startTime = fromDate;
-								}
-
-								// 如果endTime晚于toDate
-								if (endTime.isAfter(toDate)) {
-									endTime = toDate;
-								}
+
 								return statActiveUserCount(startTime, endTime, reqDto.getAppId(), version, reqDto.getChannel());
 							})
 							.collect(Collectors.toList());
@@ -349,8 +353,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 	public GetActiveUserBaseVO getActiveCompose(UserAnalyseQueryBaseDTO reqDto) {
 		// 1. 获取时间坐标轴
 		List<String> dates = generateTimeAxis(reqDto.getFromDate(), reqDto.getToDate(), reqDto.getTimeUnit());
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
 
 		// 获取版本信息
 		String version = null;
@@ -364,16 +366,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		for (String date : dates) {
 			LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
 			LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
-
-			// 如果startTime早于fromDate
-			if (startTime.isBefore(fromDate)) {
-				startTime = fromDate;
-			}
-
-			// 如果endTime晚于toDate
-			if (endTime.isAfter(toDate)) {
-				endTime = toDate;
-			}
 			// 活跃用户数
 			BigDecimal activeCount = BigDecimal.valueOf(statActiveUserCount(startTime, endTime, reqDto.getAppId(), version, reqDto.getChannel()));
 			activeCounts.add( activeCount);
@@ -523,8 +515,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		}
 		// 1. 生成时间轴
 		List<String> dates = generateTimeAxis(reqDto.getFromDate(), reqDto.getToDate(), reqDto.getTimeUnit());
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
 
 		// 2. 定义存储列表
 		List<BigDecimal> activeList = new ArrayList<>();
@@ -534,15 +524,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		for (String date : dates) {
 			LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
 			LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
-			// 如果startTime早于fromDate
-			if (startTime.isBefore(fromDate)) {
-				startTime = fromDate;
-			}
-
-			// 如果endTime晚于toDate
-			if (endTime.isAfter(toDate)) {
-				endTime = toDate;
-			}
 			// 4. 查询、计算累计用户数
 			BigDecimal totalUser = BigDecimal.valueOf(statNewUserCount(null, endTime, reqDto.getAppId(), null, null));
 			userList.add(totalUser);
@@ -593,8 +574,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 
 		// 1. 生成时间轴
 		List<String> dates = generateTimeAxis(reqDto.getFromDate(), reqDto.getToDate(), reqDto.getTimeUnit());
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
 
 		// 2. 定义存储列表
 		List<BigDecimal> activeList = new ArrayList<>();
@@ -604,15 +583,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		for (String date : dates) {
 			LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
 			LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
-			// 如果startTime早于fromDate
-			if (startTime.isBefore(fromDate)) {
-				startTime = fromDate;
-			}
-
-			// 如果endTime晚于toDate
-			if (endTime.isAfter(toDate)) {
-				endTime = toDate;
-			}
 			// 4. 查询、计算累计用户数
 			BigDecimal totalUser = BigDecimal.valueOf(statNewUserCount(null, endTime, reqDto.getAppId(), null, null));
 			userList.add(totalUser);
@@ -667,8 +637,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		if (dates.isEmpty()) {
 			return page; // 无数据直接返回
 		}
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
 
 		// 获取渠道和版本
 		List<String> channel = reqDto.getChannel();
@@ -682,15 +650,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 			// 获取时间范围
 			LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
 			LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
-			// 如果startTime早于fromDate
-			if (startTime.isBefore(fromDate)) {
-				startTime = fromDate;
-			}
-
-			// 如果endTime晚于toDate
-			if (endTime.isAfter(toDate)) {
-				endTime = toDate;
-			}
 			// 查询活跃用户数量
 			BigDecimal activeCount = BigDecimal.valueOf(statActiveUserCount(startTime, endTime, reqDto.getAppId(), version, channel));
 			// 查询活跃用户中的新增用户数
@@ -764,8 +723,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		// 1. 生成时间轴
 		List<String> dates = generateTimeAxis(reqDto.getFromDate(), reqDto.getToDate(), reqDto.getTimeUnit());
 		result.setDates(dates);
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
 
 		// 2. 处理版本列表(为空时按null处理)
 		List<String> versions = reqDto.getVersion();
@@ -786,15 +743,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 							.map(date -> {
 								LocalDateTime startTime = getStartTime(date, reqDto.getTimeUnit());
 								LocalDateTime endTime = getEndTime(date, reqDto.getTimeUnit());
-								// 如果startTime早于fromDate
-								if (startTime.isBefore(fromDate)) {
-									startTime = fromDate;
-								}
-
-								// 如果endTime晚于toDate
-								if (endTime.isAfter(toDate)) {
-									endTime = toDate;
-								}
 								return statLaunchCount(startTime, endTime, reqDto.getAppId(), version, reqDto.getChannel());
 							})
 							.collect(Collectors.toList());
@@ -835,9 +783,9 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 		boolean isRangeType = "week".equals(timeUnit) || "month".equals(timeUnit);
 		DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
 		// 查询时间范围内总启动次数
-		LocalDateTime fromDate = getStartTime(reqDto.getFromDate().toString(), "day");
-		LocalDateTime toDate = getEndTime(reqDto.getToDate().toString(), "day");
-		BigDecimal totalLaunch = BigDecimal.valueOf(statLaunchCount(fromDate, toDate, reqDto.getAppId(), version, channel));
+		LocalDateTime fromTime = getStartTime(dates.get(0), reqDto.getTimeUnit());
+		LocalDateTime toTime = getEndTime(dates.get(dates.size() - 1), reqDto.getTimeUnit());
+		BigDecimal totalLaunch = BigDecimal.valueOf(statLaunchCount(fromTime, toTime, reqDto.getAppId(), version, channel));
 		// 查询结果
 		List<PageLaunchDetailVO> result = new ArrayList<>(dates.size());
 		for (String date : dates) {
@@ -849,16 +797,6 @@ public class UserAnalyseServiceImpl implements UserAnalyseService {
 			if(startTime == null || endTime == null){
 				throw new BusinessException("时间范围错误");
 			}
-
-			// 如果startTime早于fromDate
-			if (startTime.isBefore(fromDate)) {
-				startTime = fromDate;
-			}
-
-			// 如果endTime晚于toDate
-			if (endTime.isAfter(toDate)) {
-				endTime = toDate;
-			}
 			// 查询启动次数
 			BigDecimal launch = BigDecimal.valueOf(statLaunchCount(startTime, endTime, reqDto.getAppId(), version, channel));
 			// 计算启动占比