package com.xuqm.update.service; import com.xuqm.update.repository.DeviceRecordRepository; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Service public class UpdateStatisticsService { private final DeviceRecordRepository deviceRecordRepository; public UpdateStatisticsService(DeviceRecordRepository deviceRecordRepository) { this.deviceRecordRepository = deviceRecordRepository; } /** * 版本分布:各版本的设备数占比 * 返回 [{ versionCode, versionName, deviceCount }] */ public List> getVersionDistribution(String appKey, String platform, int days) { LocalDateTime since = LocalDateTime.now().minusDays(days); List rows = deviceRecordRepository.findVersionDistribution(appKey, platform, since); List> result = new ArrayList<>(); for (Object[] row : rows) { Map item = new LinkedHashMap<>(); item.put("versionCode", row[0]); item.put("versionName", row[1]); item.put("deviceCount", row[2]); result.add(item); } return result; } /** * 设备型号分布 Top N * 返回 [{ model, deviceCount }] */ public List> getDeviceDistribution(String appKey, String platform, int days) { LocalDateTime since = LocalDateTime.now().minusDays(days); List models = deviceRecordRepository.findModelDistribution(appKey, platform, since, 10); List> result = new ArrayList<>(); for (Object[] row : models) { Map item = new LinkedHashMap<>(); item.put("model", row[0]); item.put("deviceCount", row[1]); result.add(item); } return result; } /** * 系统版本分布 * 返回 [{ osVersion, deviceCount }] */ public List> getOsVersionDistribution(String appKey, String platform, int days) { LocalDateTime since = LocalDateTime.now().minusDays(days); List rows = deviceRecordRepository.findOsVersionDistribution(appKey, platform, since, 10); List> result = new ArrayList<>(); for (Object[] row : rows) { Map item = new LinkedHashMap<>(); item.put("osVersion", row[0]); item.put("deviceCount", row[1]); result.add(item); } return result; } /** * 厂商分布 * 返回 [{ vendor, deviceCount }] */ public List> getVendorDistribution(String appKey, String platform, int days) { LocalDateTime since = LocalDateTime.now().minusDays(days); List rows = deviceRecordRepository.findVendorDistribution(appKey, platform, since); List> result = new ArrayList<>(); for (Object[] row : rows) { Map item = new LinkedHashMap<>(); item.put("vendor", row[0]); item.put("deviceCount", row[1]); result.add(item); } return result; } /** * 每日检测趋势 * 返回 [{ day, deviceCount }] */ public List> getDailyTrend(String appKey, String platform, int days) { LocalDateTime since = LocalDateTime.now().minusDays(days); List rows = deviceRecordRepository.findDailyTrend(appKey, platform, since); List> result = new ArrayList<>(); for (Object[] row : rows) { Map item = new LinkedHashMap<>(); item.put("day", row[0] != null ? row[0].toString() : ""); item.put("deviceCount", row[1]); result.add(item); } return result; } }