using FreeSql; using LiveForum.Code.Base; using LiveForum.IService.Flowers; using LiveForum.IService.Home; using LiveForum.Model; using LiveForum.Model.Dto.Home; using Mapster; using Microsoft.AspNetCore.Mvc.ViewFeatures; namespace LiveForum.Service.Home { /// /// 首页服务实现 /// public class HomeService : IHomeService { private readonly IBaseRepository _streamersRepository; private readonly IBaseRepository _streamerCategory; private readonly IFlowerService _flowerService; /// /// 构造函数 /// /// 主播仓储 /// 主播分类仓储 /// 送花服务 public HomeService( IBaseRepository streamersRepository, IBaseRepository streamerCategory, IFlowerService flowerService) { _streamersRepository = streamersRepository; _streamerCategory = streamerCategory; _flowerService = flowerService; } /// /// 获取首页主播榜单 /// /// 请求参数 /// public async Task> GetRankings(GetRankingsReq request) { try { // 1. 查询指定分类的主播,按送花数降序排序 var list = await _streamersRepository.Select .Where(s => s.IsEnabled && s.Category == request.Category) .ToListAsync(); // 2. 查询该分类的主播总数 var total = await _streamersRepository.Select .Where(s => s.IsEnabled && s.Category == request.Category) .CountAsync(); // 3. 批量从缓存获取最新花数 var streamerIds = list.Select(s => (long)s.Id).ToList(); var flowerCounts = await _flowerService.BatchGetFlowerCountAsync("Streamer", streamerIds); // 4. 添加排名序号并转换为DTO,使用缓存中的花数 var rankingList = list.OrderByDescending(s => s.FlowerCount).ThenBy(it=>it.Nickname).ThenByDescending(it=>it.FollowerCount).Take(request.Limit).Select((s, index) => new StreamerRankingDto { Id = s.Id, Rank = s.Rank ?? 0, StreamerId = s.StreamerId, Nickname = s.Nickname, Avatar = s.Avatar, OnlineCount = s.OnlineCount, IsLive = s.IsLive, FlowerCount = flowerCounts.ContainsKey(s.Id) ? flowerCounts[s.Id] : s.FlowerCount, FollowerCount = s.FollowerCount }).ToList(); return new BaseResponse(new GetRankingsRespDto { Total = (int)total, List = rankingList }); } catch (Exception ex) { return new BaseResponse(ResponseCode.Error, $"获取榜单失败:{ex.Message}"); } } /// /// 获取更多排行榜(分页) /// /// 请求参数 /// public async Task> GetRankingsMore(GetRankingsMoreReq request) { try { // 1. 查询该分类的主播总数 var total = await _streamersRepository.Select .Where(s => s.IsEnabled && s.Category == request.Category) .CountAsync(); // 2. 分页查询指定分类的主播,按送花数降序排序 var list = await _streamersRepository.Select .Where(s => s.IsEnabled && s.Category == request.Category) .ToListAsync(); // 3. 批量从缓存获取最新花数 var streamerIds = list.Select(s => (long)s.Id).ToList(); var flowerCounts = await _flowerService.BatchGetFlowerCountAsync("Streamer", streamerIds); // 4. 添加全局排名序号并转换为DTO,使用缓存中的花数 var rankingList = list.Select((s, index) => new StreamerRankingDto { Id = s.Id, Rank = (request.Page - 1) * request.PageSize + index + 1, StreamerId = s.StreamerId, Nickname = s.Nickname, Avatar = s.Avatar, OnlineCount = s.OnlineCount, IsLive = s.IsLive, FlowerCount = flowerCounts.ContainsKey(s.Id) ? flowerCounts[s.Id] : s.FlowerCount, FollowerCount = s.FollowerCount }) .OrderByDescending(s => s.FlowerCount).ThenBy(it => it.Nickname).ThenByDescending(it => it.FollowerCount) .Skip((request.Page - 1) * request.PageSize) .Take(request.PageSize) .Select((it, index) => { it.Rank = (request.Page - 1) * request.PageSize + index + 1; return it; }) .ToList(); return new BaseResponse(new GetRankingsMoreRespDto { Page = request.Page, PageSize = request.PageSize, Total = (int)total, List = rankingList }); } catch (Exception ex) { return new BaseResponse(ResponseCode.Error, $"获取更多排行失败:{ex.Message}"); } } /// /// 获取直播中主播列表(分页) /// /// 请求参数 /// public async Task> GetLiveStreamers(GetLiveStreamersReq request) { try { // 1. 查询直播中主播的总数 var total = await _streamersRepository.Select .Where(s => s.IsLive == true && s.IsEnabled) .CountAsync(); // 2. 分页查询正在直播的主播,按在线人数降序排序 var list = await _streamersRepository.Select .Where(s => s.IsLive == true && s.IsEnabled) .OrderByDescending(s => s.FlowerCount) .Page(request.Page, request.PageSize) .ToListAsync(); // 3. 转换为DTO var streamerList = list.Adapt>(); var streamerIds = streamerList.Select(s => (long)s.Id).ToList(); var flowerCounts = await _flowerService.BatchGetFlowerCountAsync("Streamer", streamerIds); streamerList.ForEach(s => { s.FlowerCount = flowerCounts.ContainsKey(s.Id) ? flowerCounts[s.Id] : s.FlowerCount; }); return new BaseResponse(new GetLiveStreamersRespDto { Page = request.Page, PageSize = request.PageSize, Total = (int)total, List = streamerList }); } catch (Exception ex) { return new BaseResponse(ResponseCode.Error, $"获取直播中主播列表失败:{ex.Message}"); } } /// /// 获取主播榜单分类列表 /// /// public async Task> GetStreamerCategories() { var categories = await _streamerCategory.Select.NoTracking().Where(it => it.IsEnabled).ToListAsync(); return await Task.FromResult(new BaseResponseList { Code = ResponseCode.Success, Data = categories }); } } }