feat: 增加基于本周填写邀请码数量的邀请翻牌校验

- 注入 ISqlSugarRepository<InvitationRecordAggregateRoot> 到 CardFlipManager 并更新构造函数。
- 在邀请类型(FlipType.Invite)翻牌时,改为校验用户本周已填写的邀请码数量是否满足本次翻牌所需(根据 InviteFlipsUsed 计算所需数量),不足则抛出友好异常提示。
- 保持原有错误处理与日志逻辑不变。
This commit is contained in:
chenchun
2025-10-30 20:13:49 +08:00
parent f02fb91175
commit e9099bbe04

View File

@@ -11,6 +11,7 @@ namespace Yi.Framework.AiHub.Domain.Managers;
public class CardFlipManager : DomainService
{
private readonly ISqlSugarRepository<CardFlipTaskAggregateRoot> _cardFlipTaskRepository;
private readonly ISqlSugarRepository<InvitationRecordAggregateRoot> _invitationRecordRepository;
private readonly InviteCodeManager _inviteCodeManager;
private readonly ILogger<CardFlipManager> _logger;
@@ -32,10 +33,12 @@ public class CardFlipManager : DomainService
public CardFlipManager(
ISqlSugarRepository<CardFlipTaskAggregateRoot> cardFlipTaskRepository,
ISqlSugarRepository<InvitationRecordAggregateRoot> invitationRecordRepository,
InviteCodeManager inviteCodeManager,
ILogger<CardFlipManager> logger)
{
_cardFlipTaskRepository = cardFlipTaskRepository;
_invitationRecordRepository = invitationRecordRepository;
_inviteCodeManager = inviteCodeManager;
_logger = logger;
}
@@ -109,13 +112,23 @@ public class CardFlipManager : DomainService
throw new UserFriendlyException(GetFlipTypeErrorMessage(flipType));
}
// 如果是邀请类型翻牌,必须验证用户已使用过邀请码
// 如果是邀请类型翻牌,必须验证用户本周填写的邀请码数量足够
if (flipType == FlipType.Invite)
{
var isInvited = await _inviteCodeManager.IsUserInvitedAsync(userId);
if (!isInvited)
// 查询本周已使用的邀请码数量
var weeklyInviteCodeUsedCount = await _invitationRecordRepository._DbQueryable
.Where(x => x.InvitedUserId == userId)
.Where(x => x.InvitationTime >= weekStart)
.CountAsync();
// 本周填写的邀请码数量必须 >= 即将使用的邀请翻牌次数
// 例如: 要翻第8次(InviteFlipsUsed=0->1), 需要至少填写了1个邀请码
// 要翻第9次(InviteFlipsUsed=1->2), 需要至少填写了2个邀请码
// 要翻第10次(InviteFlipsUsed=2->3), 需要至少填写了3个邀请码
var requiredInviteCodeCount = task.InviteFlipsUsed + 1;
if (weeklyInviteCodeUsedCount < requiredInviteCodeCount)
{
throw new UserFriendlyException("需要使用他人邀请码才能解锁更多翻牌次数");
throw new UserFriendlyException($"需要使用{requiredInviteCodeCount}个他人邀请码才能解锁第{task.TotalFlips + 1}次翻牌");
}
}