Pārlūkot izejas kodu

流失卸载优化

wangcl 2 nedēļas atpakaļ
vecāks
revīzija
a6ced8126b

+ 36 - 0
pig-statistics/pig-statistics-api/src/main/java/com/pig4cloud/pig/statistics/api/entity/uninstall/MktSysDistribute.java

@@ -0,0 +1,36 @@
+package com.pig4cloud.pig.statistics.api.entity.uninstall;
+
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author wcl
+ * @date 2025/8/25 09:58
+ * @description: 设备系统分布维度
+ */
+@Data
+@TableName("stat_sys_distribute")
+public class MktSysDistribute {
+
+	@TableId
+	private Long id; // 主键
+	private Date statDate; // 统计日期
+	private String statCycle; // 统计周期
+	private String appId; // 应用ID
+	private String channel; // 渠道
+	private String appVersion; // 应用版本
+	private Integer icon_name; // 分布类型(before, after, sys, insight等)
+	private String icon_key; // 时长区间
+	private Integer icon_count; // 设备数
+	private Double rate; // 占比(%)
+	private String ext1;
+	private String ext2;
+	private Date createTime;
+	private Date updateTime;
+	private String createBy;
+	private String updateBy;
+}

+ 2 - 2
pig-statistics/pig-statistics-api/src/main/java/com/pig4cloud/pig/statistics/api/vo/uninstall/HisUnInstallCountVO.java

@@ -17,8 +17,8 @@ public class HisUnInstallCountVO {
 	private String count;
 
 	@Schema(description = "数量")
-	private String num;
+	private Integer num;
 
 	@Schema(description = "占比")
-	private String rate;
+	private Double rate;
 }

+ 13 - 12
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/controller/UninstallAnalyseController.java

@@ -7,6 +7,7 @@ import com.pig4cloud.pig.statistics.api.vo.uninstall.*;
 import com.pig4cloud.pig.statistics.service.UninstallAnalyseService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -30,74 +31,74 @@ public class UninstallAnalyseController {
 
 	@PostMapping("/trend")
 	@Operation(summary = "流失概况")
-	public R<UninstallTrendVO> getUninstallTrend(@RequestBody GetUninstallTrendDTO dto) {
+	public R<UninstallTrendVO> getUninstallTrend(@Valid @RequestBody GetUninstallTrendDTO dto) {
 		return R.ok(uninstallAnalyseService.getUninstallTrend(dto));
 	}
 
 	@PostMapping("/trend/detail")
 	@Operation(summary = "获取卸载趋势明细数据")
-	public R<Page<UninstallTrendDtlVO>> getUninstallTrendDetail(@RequestBody GetUninstallTrendDetailDTO dto) {
+	public R<Page<UninstallTrendDtlVO>> getUninstallTrendDetail(@Valid @RequestBody GetUninstallTrendDetailDTO dto) {
 		return R.ok(uninstallAnalyseService.getUninstallTrendDetail(dto));
 	}
 
 	@PostMapping("/active")
 	@Operation(summary = "卸载洞察-卸载设备活跃情况")
-	public R<UninstallInsightVO> getActive(@RequestBody GetUninstallInsightDTO dto)  {
+	public R<UninstallInsightVO> getActive(@Valid @RequestBody GetUninstallInsightDTO dto)  {
 		return R.ok(uninstallAnalyseService.getUninstallDeviceActive(dto));
 	}
 
 	@PostMapping("/uninstallBefore")
 	@Operation(summary = "卸载洞察-卸载前状态")
-	public R<UninstallBeforeVO> uninstallBefore(@RequestBody GetUninstallInsightDTO dto) {
+	public R<UninstallBeforeVO> uninstallBefore(@Valid @RequestBody GetUninstallInsightDTO dto) {
 		return R.ok(uninstallAnalyseService.uninstallBefore(dto));
 	}
 
 	@PostMapping("/uninstallInterfere")
 	@Operation(summary = "卸载洞察-体验干扰")
-	public R<UninstallBeforeInterfereVO> uninstallInterfere(@RequestBody GetUninstallInsightDTO dto) {
+	public R<UninstallBeforeInterfereVO> uninstallInterfere(@Valid @RequestBody GetUninstallInsightDTO dto) {
 		return R.ok(uninstallAnalyseService.uninstallInterfere(dto));
 	}
 
 	@PostMapping("/uninstallAction")
 	@Operation(summary = "卸载洞察-行为还原")
-	public R<UninstallBeforeActionVO> uninstallAction(@RequestBody GetUninstallInsightDTO dto) {
+	public R<UninstallBeforeActionVO> uninstallAction(@Valid @RequestBody GetUninstallInsightDTO dto) {
 		return R.ok(uninstallAnalyseService.uninstallAction(dto));
 	}
 
 	@PostMapping("/uninstallAfter")
 	@Operation(summary = "卸载洞察-卸载后流失")
-	public R<List<UninstallOfterAPPOV>> uninstallAfter(@RequestBody GetUninstallInsightDTO dto) {
+	public R<List<UninstallOfterAPPOV>> uninstallAfter(@Valid @RequestBody GetUninstallInsightDTO dto) {
 		return R.ok(uninstallAnalyseService.uninstallAfter(dto));
 	}
 
 	@PostMapping("/uninstallSys")
 	@Operation(summary = "卸载洞察-设备系统分布")
-	public R<List<UninstallSYSOV>> uninstallSys(@RequestBody GetUninstallInsightDTO dto) {
+	public R<List<UninstallSYSOV>> uninstallSys(@Valid @RequestBody GetUninstallInsightDTO dto) {
 		return R.ok(uninstallAnalyseService.uninstallSys(dto));
 	}
 
 
 	@PostMapping("/portrait")
 	@Operation(summary = "卸载画像")
-	public R<UninstallPortraitOV> getUninstallPortrait(@RequestBody UninstallPortraitDTO dto) {
+	public R<UninstallPortraitOV> getUninstallPortrait(@Valid @RequestBody UninstallPortraitDTO dto) {
 		return R.ok(uninstallAnalyseService.getUninstallPortrait(dto));
 	}
 
 	@PostMapping("/predict")
 	@Operation(summary = "卸载归因-卸载预测")
-	public R<List<UninstallPredictVO>> getUninstallPredict(@RequestBody UninstallPredictDTO dto) {
+	public R<List<UninstallPredictVO>> getUninstallPredict(@Valid @RequestBody UninstallPredictDTO dto) {
 		return R.ok(uninstallAnalyseService.getUninstallPredict(dto));
 	}
 
 	@PostMapping("/predict/detail")
 	@Operation(summary = "卸载归因-安装卸载比")
-	public R<List<InstallUninstallRatioVO>> getInstallUninstallRatio(@RequestBody InstallUninstallRatioDTO dto) {
+	public R<List<InstallUninstallRatioVO>> getInstallUninstallRatio(@Valid @RequestBody InstallUninstallRatioDTO dto) {
 		return R.ok(uninstallAnalyseService.getInstallUninstallRatio(dto));
 	}
 
 	@PostMapping("/predict/detailList")
 	@Operation(summary = "卸载归因-安装卸载比明细")
-	public R<Page<InstallUninstallRatioVO>> getInstallUninstallRatioDetail(@RequestBody InstallUninstallRatioDTO dto) {
+	public R<Page<InstallUninstallRatioVO>> getInstallUninstallRatioDetail(@Valid @RequestBody InstallUninstallRatioDTO dto) {
 		return R.ok(uninstallAnalyseService.getInstallUninstallRatioDetail(dto));
 	}
 

+ 8 - 1
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/controller/UserDurationController.java

@@ -6,6 +6,7 @@ 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 jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -25,7 +26,13 @@ public class UserDurationController {
 
 	@PostMapping("/getDurationRange")
 	@Operation(summary = "使用时长查询")
-	public R<UserDistributionVO> getDurationRange(@RequestBody UserDistributionDTO dto) {
+	public R<UserDistributionVO> getDurationRange(@Valid @RequestBody UserDistributionDTO dto) {
+		return R.ok();
+	}
+
+	@PostMapping("/getDetail")
+	@Operation(summary = "使用时长-明细查询")
+	public R<UserDistributionVO> getDetail(@Valid @RequestBody UserDistributionDTO dto) {
 		return R.ok();
 	}
 

+ 13 - 0
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/mapper/StatSysDistributeMapper.java

@@ -0,0 +1,13 @@
+package com.pig4cloud.pig.statistics.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pig4cloud.pig.statistics.api.entity.uninstall.MktSysDistribute;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author wcl
+ * @date 2025/8/20 17:00
+ * @description: 设备系统分布维度Mapper
+ */
+@Mapper
+public interface StatSysDistributeMapper extends BaseMapper<MktSysDistribute> {}

+ 51 - 26
pig-statistics/pig-statistics-biz/src/main/java/com/pig4cloud/pig/statistics/service/impl/UninstallAnalyseServiceImpl.java

@@ -8,14 +8,7 @@ import com.pig4cloud.pig.statistics.api.dto.uninstall.*;
 import com.pig4cloud.pig.statistics.api.entity.ConfigItem;
 import com.pig4cloud.pig.statistics.api.entity.uninstall.*;
 import com.pig4cloud.pig.statistics.api.vo.uninstall.*;
-import com.pig4cloud.pig.statistics.mapper.StatTrendSummaryMapper;
-import com.pig4cloud.pig.statistics.mapper.StatDeviceTimeMapper;
-import com.pig4cloud.pig.statistics.mapper.StatDeviceCountMapper;
-import com.pig4cloud.pig.statistics.mapper.StatDeviceInterfereMapper;
-import com.pig4cloud.pig.statistics.mapper.StatDeviceActionMapper;
-import com.pig4cloud.pig.statistics.mapper.StatPortraitMapper;
-import com.pig4cloud.pig.statistics.mapper.StatPredictMapper;
-import com.pig4cloud.pig.statistics.mapper.StatInstallRatioMapper;
+import com.pig4cloud.pig.statistics.mapper.*;
 import com.pig4cloud.pig.statistics.service.UninstallAnalyseService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -56,6 +49,8 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 	private StatInstallRatioMapper statInstallRatioMapper;
 	@Autowired
 	private StatPredictMapper statPredictMapper;
+	@Autowired
+	private StatSysDistributeMapper statSysDistributeMapper;
 
 	@Override
 	public UninstallTrendVO getUninstallTrend(GetUninstallTrendDTO dto) {
@@ -238,11 +233,13 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 
 		Map<String, LocalDate> timeRangeMap = getTimeRangeMap(StringUtils.isEmpty(dto.getType()) ? "week" : dto.getType());
 		QueryWrapper<MktDeviceTime> wrapper = new QueryWrapper<>();
+		QueryWrapper<MktDeviceCount> countQueryWrapper = new QueryWrapper<>();
+
 		if (!StringUtils.isEmpty(dto.getType())) {
 			wrapper.eq("type", dto.getType());
+			countQueryWrapper.eq("type", dto.getType());
 		}
 
-		// 添加时间范围查询
 		wrapper.between("stat_date", timeRangeMap.get("startDate"), timeRangeMap.get("endDate"));
 		// 动态添加其他查询条件
 		if (!StringUtils.isEmpty(dto.getAppId())) wrapper.eq("app_id", dto.getAppId());
@@ -250,6 +247,18 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 		if (!StringUtils.isEmpty(dto.getVersion())) wrapper.eq("app_version", dto.getVersion());
 
 		List<MktDeviceTime> list = statDeviceTimeMapper.selectList(wrapper);
+
+
+
+		countQueryWrapper.between("stat_date", timeRangeMap.get("startDate"), timeRangeMap.get("endDate"));
+		// 动态添加其他查询条件
+		if (!StringUtils.isEmpty(dto.getAppId())) countQueryWrapper.eq("app_id", dto.getAppId());
+		if (!StringUtils.isEmpty(dto.getChannel())) countQueryWrapper.eq("channel", dto.getChannel());
+		if (!StringUtils.isEmpty(dto.getVersion())) countQueryWrapper.eq("app_version", dto.getVersion());
+
+		List<MktDeviceCount> listCount = statDeviceCountMapper.selectList(countQueryWrapper);
+
+
 		List<InstallStockVO> voList = new ArrayList<>();
 		for (MktDeviceTime entity : list) {
 			InstallStockVO vo = new InstallStockVO();
@@ -259,8 +268,19 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 			vo.setUninstallRate(entity.getRate());
 			voList.add(vo);
 		}
+
+		List<HisUnInstallCountVO> hisUnInstallCountVOS = new ArrayList<>();
+		for (MktDeviceCount entity : listCount) {
+			HisUnInstallCountVO vo = new HisUnInstallCountVO();
+			ConfigItem configValue = ConfigUtils.getConfigValue("Count_range", String.valueOf(entity.getCountRange()));
+			vo.setCount(configValue.getLabel());
+			vo.setNum(entity.getNum());
+			vo.setRate(entity.getRate());
+			hisUnInstallCountVOS.add(vo);
+		}
 		UninstallInsightVO result = new UninstallInsightVO();
 		result.setLifecycleDistribution(voList);
+		result.setUninstallDistribution(hisUnInstallCountVOS);
 		return result;
 	}
 
@@ -432,8 +452,8 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 		List<Map<String, Integer>> list = new ArrayList<>();
 		for (MktDeviceAction entity : actionList) {
 			Map<String, Integer> map = new HashMap<>();
-			ConfigItem actionType = ConfigUtils.getConfigValue("Action_type", String.valueOf(entity.getActionType()));
-			map.put(actionType.getLabel(), entity.getTriggerCount());
+			ConfigItem pageType = ConfigUtils.getConfigValue("page", String.valueOf(entity.getActionValue()));
+			map.put(pageType.getLabel(), entity.getTriggerCount());
 
 			list.add(map);
 		}
@@ -489,21 +509,21 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 			timeRangeMap = getTimeRangeMap(dto.getCycle());
 		}
 
-		QueryWrapper<MktDeviceTime> wrapper = new QueryWrapper<>();
-		if (!StringUtils.isEmpty(dto.getType())){
-			wrapper.eq("type", dto.getType());
-		}
+		ConfigItem configItem = null;
+		QueryWrapper<MktSysDistribute> wrapper = new QueryWrapper<>();
+
 		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<MktSysDistribute> list = statSysDistributeMapper.selectList( wrapper);
 		Map<String, List<Map<String, Integer>>> sysMap = new LinkedHashMap<>();
-		for (MktDeviceTime entity : list) {
-			sysMap.computeIfAbsent(entity.getTimeRange(), k -> new ArrayList<>())
-					.add(Collections.singletonMap(entity.getAppVersion(), entity.getDeviceCount()));
+		for (MktSysDistribute entity : list) {
+			configItem = ConfigUtils.getConfigValue("sys_name", String.valueOf(entity.getIcon_name()));
+			sysMap.computeIfAbsent(configItem.getLabel(), k -> new ArrayList<>())
+					.add(Collections.singletonMap(entity.getIcon_key(), entity.getIcon_count()));
 		}
 		List<UninstallSYSOV> result = new ArrayList<>();
 		for (Map.Entry<String, List<Map<String, Integer>>> entry : sysMap.entrySet()) {
@@ -543,15 +563,20 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 			LocalDate now = LocalDate.now();
 			startDate = now.with(DayOfWeek.MONDAY);
 		}
-		
-		if ("week".equalsIgnoreCase(dto.getTimeUnit())) {
-			endDate = startDate.with(DayOfWeek.SUNDAY);
-		} else if ("month".equalsIgnoreCase(dto.getTimeUnit())) {
-			endDate = startDate.with(TemporalAdjusters.lastDayOfMonth());
+		if (!StringUtils.isEmpty(dto.getEndDate())) {
+			endDate = LocalDate.parse(dto.getEndDate());
 		} else {
-			endDate = startDate.with(DayOfWeek.SUNDAY);
+			if ("week".equalsIgnoreCase(dto.getTimeUnit())) {
+				endDate = startDate.with(DayOfWeek.SUNDAY);
+			} else if ("month".equalsIgnoreCase(dto.getTimeUnit())) {
+				endDate = startDate.with(TemporalAdjusters.lastDayOfMonth());
+			} else {
+				endDate = startDate.with(DayOfWeek.SUNDAY);
+			}
 		}
 		
+
+		
 		wrapper.between("stat_date", startDate, endDate);
 		
 		List<MktPortrait> portraitList = statPortraitMapper.selectList(wrapper);
@@ -735,7 +760,7 @@ public class UninstallAnalyseServiceImpl implements UninstallAnalyseService {
 				String industryLabel = "未知类型";
 				if (entity.getIndustryType() != null) {
 					ConfigItem configValue = ConfigUtils.getConfigValue("Industry_type", String.valueOf(entity.getIndustryType()));
-					industryLabel = configValue != null ? configValue.getLabel() : "未知类型";
+					industryLabel = !StringUtils.isEmpty(configValue.getLabel()) ? configValue.getLabel() : "未知类型";
 				}
 				
 				// 设置占比