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