live-forum/server/webapi/LiveForum/LiveForum.Service/Home/HomeService.cs
2026-03-24 11:27:37 +08:00

210 lines
8.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 首页服务实现
/// </summary>
public class HomeService : IHomeService
{
private readonly IBaseRepository<T_Streamers> _streamersRepository;
private readonly IBaseRepository<T_StreamerCategory> _streamerCategory;
private readonly IFlowerService _flowerService;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="streamersRepository">主播仓储</param>
/// <param name="streamerCategory">主播分类仓储</param>
/// <param name="flowerService">送花服务</param>
public HomeService(
IBaseRepository<T_Streamers> streamersRepository,
IBaseRepository<T_StreamerCategory> streamerCategory,
IFlowerService flowerService)
{
_streamersRepository = streamersRepository;
_streamerCategory = streamerCategory;
_flowerService = flowerService;
}
/// <summary>
/// 获取首页主播榜单
/// </summary>
/// <param name="request">请求参数</param>
/// <returns></returns>
public async Task<BaseResponse<GetRankingsRespDto>> 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<GetRankingsRespDto>(new GetRankingsRespDto
{
Total = (int)total,
List = rankingList
});
}
catch (Exception ex)
{
return new BaseResponse<GetRankingsRespDto>(ResponseCode.Error, $"获取榜单失败:{ex.Message}");
}
}
/// <summary>
/// 获取更多排行榜(分页)
/// </summary>
/// <param name="request">请求参数</param>
/// <returns></returns>
public async Task<BaseResponse<GetRankingsMoreRespDto>> 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<GetRankingsMoreRespDto>(new GetRankingsMoreRespDto
{
Page = request.Page,
PageSize = request.PageSize,
Total = (int)total,
List = rankingList
});
}
catch (Exception ex)
{
return new BaseResponse<GetRankingsMoreRespDto>(ResponseCode.Error, $"获取更多排行失败:{ex.Message}");
}
}
/// <summary>
/// 获取直播中主播列表(分页)
/// </summary>
/// <param name="request">请求参数</param>
/// <returns></returns>
public async Task<BaseResponse<GetLiveStreamersRespDto>> 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<List<LiveStreamerDto>>();
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<GetLiveStreamersRespDto>(new GetLiveStreamersRespDto
{
Page = request.Page,
PageSize = request.PageSize,
Total = (int)total,
List = streamerList
});
}
catch (Exception ex)
{
return new BaseResponse<GetLiveStreamersRespDto>(ResponseCode.Error, $"获取直播中主播列表失败:{ex.Message}");
}
}
/// <summary>
/// 获取主播榜单分类列表
/// </summary>
/// <returns></returns>
public async Task<BaseResponseList<StreamerCategoryDto>> GetStreamerCategories()
{
var categories = await _streamerCategory.Select.NoTracking().Where(it => it.IsEnabled).ToListAsync<StreamerCategoryDto>();
return await Task.FromResult(new BaseResponseList<StreamerCategoryDto>
{
Code = ResponseCode.Success,
Data = categories
});
}
}
}