using FreeSql; using LiveForum.Code.Base; using LiveForum.Code.JwtInfrastructure; using LiveForum.IService.Flowers; using LiveForum.IService.Messages; using LiveForum.IService.Others; using LiveForum.Model; using LiveForum.Model.Dto.Flowers; using LiveForum.Model.Dto.Messages; using System; using System.Linq; using System.Threading.Tasks; using TencentCloud.Tbm.V20180129.Models; namespace LiveForum.Service.Flowers { /// /// 送花服务实现 /// public class FlowersService : IFlowersService { private readonly JwtUserInfoModel _userInfoModel; private readonly IFreeSql _fsql; private readonly IBaseRepository _flowerRecordsInfoRepository; private readonly IBaseRepository _flowerRecordsRepository; private readonly IBaseRepository _streamersRepository; private readonly IBaseRepository _postsRepository; private readonly IMessagePublisher _messagePublisher; private readonly IFlowerService _flowerService; private readonly IAntiAddictionService _antiAddictionService; /// /// 构造函数 /// /// JWT用户信息模型 /// FreeSql实例 /// 送花详细记录仓储 /// 送花月度汇总仓储 /// 主播仓储 /// 帖子仓储 /// 消息发布器 /// 送花服务 public FlowersService( JwtUserInfoModel userInfoModel, IFreeSql fsql, IBaseRepository flowerRecordsInfoRepository, IBaseRepository flowerRecordsRepository, IBaseRepository streamersRepository, IBaseRepository postsRepository, IMessagePublisher messagePublisher, IFlowerService flowerService, IAntiAddictionService antiAddictionService ) { _userInfoModel = userInfoModel; _fsql = fsql; _flowerRecordsInfoRepository = flowerRecordsInfoRepository; _flowerRecordsRepository = flowerRecordsRepository; _streamersRepository = streamersRepository; _postsRepository = postsRepository; _messagePublisher = messagePublisher; _flowerService = flowerService; _antiAddictionService = antiAddictionService; } /// /// 送花 /// /// 请求参数 /// public async Task> SendFlower(SendFlowerReq request) { try { var currentUserId = (long)_userInfoModel.UserId; // 防沉迷校验 if (await _antiAddictionService.IsRestrictedAsync("Flower")) { return new BaseResponse(ResponseCode.Error, "防沉迷时间内无法操作"); } // 1. 验证目标是否存在并获取接收者ID long? receiverId = null; if (request.TargetType == "Streamer") { var streamer = await _streamersRepository.Select .Where(s => s.Id == request.TargetId) .FirstAsync(); if (streamer == null) { return new BaseResponse(ResponseCode.Error, "主播不存在"); } } else if (request.TargetType == "Post") { var post = await _postsRepository.Select .Where(p => p.Id == request.TargetId && !p.IsDeleted) .FirstAsync(); if (post == null) { return new BaseResponse(ResponseCode.Error, "帖子不存在"); } receiverId = post.UserId; } else { return new BaseResponse(ResponseCode.Error, "无效的目标类型"); } // 2. 检查1小时限制 var canSend = await _flowerService.CanSendFlowerAsync(currentUserId, request.TargetType, request.TargetId); if (!canSend) { return new BaseResponse(ResponseCode.Error, "每小时只能赠送1次"); } // 3. 执行送花操作(Redis+队列) await _flowerService.SendFlowerAsync(currentUserId, request.TargetType, request.TargetId, receiverId ?? 0); // 4. 获取最新花数 var flowerCount = await _flowerService.GetFlowerCountAsync(request.TargetType, request.TargetId); // 5. 发送送花消息(如果是帖子且不是自己的帖子) if (request.TargetType == "Post" && receiverId.HasValue && receiverId.Value != currentUserId) { try { var post = await _postsRepository.Select .Where(p => p.Id == request.TargetId) .FirstAsync(); if (post != null) { await _messagePublisher.SendLikeMessageAsync( triggerId: currentUserId, receiverId: receiverId.Value, contentType: 3, // 送花类型 contentId: post.Id, postTitle: post.Title, commentContent: null ); } } catch (Exception ex) { // 记录日志但不影响送花操作 Console.WriteLine($"发送送花消息失败: {ex.Message}"); } } // 6. 返回成功响应 return new BaseResponse("送花成功!", new SendFlowerRespDto { FlowerCount = flowerCount }); } catch (Exception ex) { return new BaseResponse(ResponseCode.Error, "系统出错"); } } } }