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
});
}
}
}