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
{
///
/// 主播服务实现
///
public class StreamersService : IStreamersService
{
private readonly IFreeSql _fsql;
private readonly IBaseRepository _streamersRepository;
private readonly IBaseRepository _streamersLogRepository;
///
/// 构造函数
///
/// FreeSql实例
/// 主播仓储
/// 主播日志仓储
public StreamersService(
IFreeSql fsql,
IBaseRepository streamersRepository,
IBaseRepository streamersLogRepository)
{
_fsql = fsql;
_streamersRepository = streamersRepository;
_streamersLogRepository = streamersLogRepository;
}
///
/// 上报主播数据(粉丝、收入、直播状态等)
///
/// 上报请求参数
/// 主播分类(从URL参数获取)
/// 日志ID(从URL参数获取)
///
public async Task> ReportStreamerData(StreamerReportReq request, string category, string logId)
{
try
{
if (request == null || request.Data == null || request.Data.Count == 0)
{
return new BaseResponse(ResponseCode.Error, "请求数据不能为空");
}
// 验证必需参数
if (string.IsNullOrWhiteSpace(category))
{
return new BaseResponse(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("上报成功", new StreamerReportRespDto
{
SuccessCount = successCount,
FailCount = failCount,
NewCount = newCount,
UpdateCount = updateCount
});
}
catch (Exception ex)
{
return new BaseResponse(ResponseCode.Error, $"系统错误: {ex.Message}");
}
}
}
}