171 lines
7.2 KiB
C#
171 lines
7.2 KiB
C#
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}");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|