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

171 lines
7.2 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.Streamers;
using LiveForum.Model;
using LiveForum.Model.Dto.Streamers;
using Newtonsoft.Json;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace LiveForum.Service.Streamers
{
/// <summary>
/// 主播服务实现
/// </summary>
public class StreamersService : IStreamersService
{
private readonly IFreeSql _fsql;
private readonly IBaseRepository<T_Streamers> _streamersRepository;
private readonly IBaseRepository<T_StreamersLog> _streamersLogRepository;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="fsql">FreeSql实例</param>
/// <param name="streamersRepository">主播仓储</param>
/// <param name="streamersLogRepository">主播日志仓储</param>
public StreamersService(
IFreeSql fsql,
IBaseRepository<T_Streamers> streamersRepository,
IBaseRepository<T_StreamersLog> streamersLogRepository)
{
_fsql = fsql;
_streamersRepository = streamersRepository;
_streamersLogRepository = streamersLogRepository;
}
/// <summary>
/// 上报主播数据(粉丝、收入、直播状态等)
/// </summary>
/// <param name="request">上报请求参数</param>
/// <param name="category">主播分类从URL参数获取</param>
/// <param name="logId">日志ID从URL参数获取</param>
/// <returns></returns>
public async Task<BaseResponse<StreamerReportRespDto>> ReportStreamerData(StreamerReportReq request, string category, string logId)
{
try
{
if (request == null || request.Data == null || request.Data.Count == 0)
{
return new BaseResponse<StreamerReportRespDto>(ResponseCode.Error, "请求数据不能为空");
}
// 验证必需参数
if (string.IsNullOrWhiteSpace(category))
{
return new BaseResponse<StreamerReportRespDto>(ResponseCode.Error, "category参数不能为空");
}
// 1. 记录日志
var logContent = JsonConvert.SerializeObject(request, Formatting.Indented);
var streamerLog = new T_StreamersLog
{
Category = category, // 从URL参数获取
ContentText = logContent,
Source = request.Metadata?.Source ?? "字节跳动直播服务平台",
SourceCreatedAt = DateTime.TryParse(request.Metadata?.CreatedAt, out var sourceTime)
? sourceTime
: DateTime.Now,
Total = request.Metadata?.Total ?? request.Data.Count,
LogId = logId ?? Guid.NewGuid().ToString().ToUpper() // 从URL参数获取如果为空则生成新的
};
await _streamersLogRepository.InsertAsync(streamerLog);
// 2. 处理主播数据
int successCount = 0;
int failCount = 0;
int newCount = 0;
int updateCount = 0;
foreach (var item in request.Data)
{
try
{
// 查找主播根据StreamerId
var streamer = await _streamersRepository.Select
.Where(s => s.StreamerId == item.AnchorID && s.Category == category)
.FirstAsync();
if (streamer == null)
{
// 新增主播
streamer = new T_Streamers
{
StreamerId = item.AnchorID,
StreamerUserId = item.UserID,
Nickname = item.AnchorName ?? "",
Avatar = item.AnchorAvatar,
Income = item.Income,
IsLive = item.LiveStatus == "2",
Rank = item.Rank > 0 ? item.Rank : null,
Category = category, // 从URL参数获取
IsEnabled = true,
FollowerCount = 0, // 新增时不设置粉丝数,等待后续更新
CreatedAt = DateTime.Now,
UpdatedAt = DateTime.Now
};
// 如果fans不为0则设置FollowerCount
if (int.TryParse(item.Fans, out var fans) && fans > 0)
{
streamer.FollowerCount = fans;
}
await _streamersRepository.InsertAsync(streamer);
newCount++;
successCount++;
}
else
{
// 更新主播信息
streamer.StreamerUserId = item.UserID;
streamer.Nickname = item.AnchorName ?? streamer.Nickname;
streamer.Avatar = item.AnchorAvatar ?? streamer.Avatar;
streamer.Income = item.Income ?? streamer.Income;
streamer.IsLive = item.LiveStatus == "2";
streamer.Rank = item.Rank > 0 ? item.Rank : null;
streamer.Category = category; // 从URL参数获取并更新
streamer.UpdatedAt = DateTime.Now;
// 如果fans不为0则更新FollowerCount
if (int.TryParse(item.Fans, out var fans) && fans > 0)
{
streamer.FollowerCount = fans;
}
// 如果fans==0则不更新FollowerCount字段保持原值
await _streamersRepository.UpdateAsync(streamer);
updateCount++;
successCount++;
}
}
catch (Exception ex)
{
// 记录单个主播处理失败,但不影响其他主播
failCount++;
Console.WriteLine($"处理主播数据失败 - AnchorID: {item.AnchorID}, Error: {ex.Message}");
}
}
// 3. 返回处理结果
return new BaseResponse<StreamerReportRespDto>("上报成功", new StreamerReportRespDto
{
SuccessCount = successCount,
FailCount = failCount,
NewCount = newCount,
UpdateCount = updateCount
});
}
catch (Exception ex)
{
return new BaseResponse<StreamerReportRespDto>(ResponseCode.Error, $"系统错误: {ex.Message}");
}
}
}
}