diff --git a/YD_Event.Application/Event/EventService.cs b/YD_Event.Application/Event/EventService.cs index 8ae6d5d..24a35b5 100644 --- a/YD_Event.Application/Event/EventService.cs +++ b/YD_Event.Application/Event/EventService.cs @@ -3,6 +3,7 @@ using YD_Event.Application.Project.Dtos; using YD_Event.Core.Entities; using YD_Event.Core.Enum; using Easy.Core; +using EasyCaching.Core; using SqlSugar; using Mapster; @@ -31,6 +32,7 @@ public class EventService : BaseService, ITransient private readonly YD_Event.Application.Menu.SysMenuService _sysMenuService; private readonly YD_Event.Application.Auth.AuthManager _authManager; private readonly EventRuleSnapshotService _ruleSnapshotService; + private readonly IEasyCachingProvider _easyCachingProvider; public EventService( ISqlSugarRepository repository, @@ -50,7 +52,8 @@ public class EventService : BaseService, ITransient IIdGenerator idGenerator, YD_Event.Application.Menu.SysMenuService sysMenuService, YD_Event.Application.Auth.AuthManager authManager, - EventRuleSnapshotService ruleSnapshotService) : base(repository) + EventRuleSnapshotService ruleSnapshotService, + IEasyCachingProvider easyCachingProvider) : base(repository) { _repository = repository; _unitRepository = unitRepository; @@ -70,6 +73,20 @@ public class EventService : BaseService, ITransient _sysMenuService = sysMenuService; _authManager = authManager; _ruleSnapshotService = ruleSnapshotService; + _easyCachingProvider = easyCachingProvider; + } + + /// + /// 清除赛事限报与项目相关缓存,确保后台修改后前台立即生效 + /// + private async Task ClearEventRegistrationCacheAsync(long eventId) + { + await _easyCachingProvider.RemoveAsync($"EventLimit:{eventId}"); + await _easyCachingProvider.RemoveAsync($"EventProjectLimit:{eventId}"); + await _easyCachingProvider.RemoveAsync($"EventProjects:{eventId}"); + await _easyCachingProvider.RemoveAsync($"EventProjectGroups:{eventId}"); + await _easyCachingProvider.RemoveAsync($"BaseProjects:{eventId}"); + await _easyCachingProvider.RemoveAsync($"EventConfig:{eventId}"); } /// @@ -835,6 +852,9 @@ public class EventService : BaseService, ITransient await _registrationLimitRepository.InsertAsync(limit); } + // 清除赛事限报与项目相关缓存 + await ClearEventRegistrationCacheAsync(eventInfo.Id); + // 5. 更新费用配置 if (input.FeeConfig != null) { @@ -1478,6 +1498,9 @@ public class EventService : BaseService, ITransient eventInfo.ProcessStatus = ProcessStatus.ProjectConfigCompleted; await _repository.UpdateAsync(eventInfo); } + + // 清除赛事限报与项目相关缓存 + await ClearEventRegistrationCacheAsync(input.EventId); } /// diff --git a/YD_Event.Application/Event/UnifiedRegistrationService.cs b/YD_Event.Application/Event/UnifiedRegistrationService.cs index f37cae7..6bbd908 100644 --- a/YD_Event.Application/Event/UnifiedRegistrationService.cs +++ b/YD_Event.Application/Event/UnifiedRegistrationService.cs @@ -181,8 +181,11 @@ public class UnifiedRegistrationService : ITransient /// private async Task GetOrCreateRegistrationAsync(UnifiedRegistrationInput input) { - var existingRegistration = await _registrationRepository.GetFirstAsync( - r => r.EventId == input.EventId && r.CreatedUserId == input.CreatedUserId && r.PaymentStatus != 4 && !r.DeleteMark); + var existingRegistration = await _registrationRepository.GetFirstAsync(r => + r.EventId == input.EventId && + r.CreatedUserId == input.CreatedUserId && + r.PaymentStatus != 4 && + !r.DeleteMark); if (existingRegistration != null) { diff --git a/YD_Event.Application/Event/UserEventRegistrationService.cs b/YD_Event.Application/Event/UserEventRegistrationService.cs index 7405e92..c71d719 100644 --- a/YD_Event.Application/Event/UserEventRegistrationService.cs +++ b/YD_Event.Application/Event/UserEventRegistrationService.cs @@ -1479,11 +1479,15 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient // 获取所有赛事项目,用于关联 ProjectId var eventProjects = await _eventProjectRepository.GetListAsync(x => x.EventId == eventId); - // 优化:一次查询统计所有组别的已报名队伍数,替代循环查询 - // 注意:与原逻辑保持一致,统计的是 registrationItem 的数量(不去重 RegistrationId) + // 统计已报名队伍数 var registrationItems = await _registrationItemRepository.AsQueryable() .Where(x => x.EventProjectGroupId.HasValue && !x.DeleteMark) - .InnerJoin((i, r) => i.RegistrationId == r.Id && !r.DeleteMark && r.EventId == eventId) + .InnerJoin((i, r) => + i.RegistrationId == r.Id && + !r.DeleteMark && + r.EventId == eventId && + ((r.PaymentMethod == 2 && r.PaymentStatus == 1) || + (r.PaymentMethod == 1 && (r.PaymentStatus == 1 || r.PaymentStatus == 0)))) .Select((i, r) => new { GroupId = i.EventProjectGroupId @@ -1504,7 +1508,7 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient // 查找该组别的项目限报配置 var eventProject = eventProjects.FirstOrDefault(ep => ep.Id == eventProjectGroup.EventProjectId); var projectLimit = projectLimits.FirstOrDefault(pl => pl.ProjectId == eventProject?.Id); - var maxTeams = projectLimit?.LimitCount ?? 2; // 默认2队 + var maxTeams = projectLimit?.LimitCount ?? 2; result.Add(new GroupTeamLimitOutput { @@ -1801,8 +1805,7 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient CanSelect = true }; - // 获取组别信息 - var group = await _eventProjectGroupRepository.GetByIdAsync(input.GroupId); + var group = await _eventProjectGroupRepository.GetFirstAsync(x => x.Id == input.GroupId && !x.DeleteMark); if (group == null) { result.CanSelect = false; @@ -1810,8 +1813,7 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient return result; } - // 获取项目信息 - var eventProject = await _eventProjectRepository.GetByIdAsync(group.EventProjectId); + var eventProject = await _eventProjectRepository.GetFirstAsync(x => x.Id == group.EventProjectId && !x.DeleteMark); if (eventProject == null) { result.CanSelect = false; @@ -1819,110 +1821,6 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient return result; } - // 获取基础项目信息 - var baseProject = await _projectRepository.GetByIdAsync(eventProject.ProjectId); - - // 获取赛事信息获取报名限制 - var eventInfo = await _eventRepository.GetByIdAsync(input.EventId); - var registrationLimit = eventInfo != null - ? await _limitRepository.GetFirstAsync(x => x.EventId == input.EventId && !x.DeleteMark) - : null; - - // 1. 检查组别自身限制(这里暂不实现,因为 EventProjectGroup 实体没有 GroupLimitCount 字段) - // 后续可以根据实际需求添加相关的限制配置表 - - // 2. 检查项目限制 - var selectedGroupIds = input.SelectedGroupIds ?? new List(); - var otherSelectedGroups = await _eventProjectGroupRepository.GetListAsync(x => selectedGroupIds.Contains(x.Id)); - var projectGroups = otherSelectedGroups.Where(g => g.EventProjectId == eventProject.Id).ToList(); - - // 计算该项目已选的组别数量(排除当前组别) - var selectedCountForProject = projectGroups.Count; - - // 获取该项目的限报配置 - var projectLimit = await _projectLimitRepository.GetFirstAsync(x => - x.EventId == input.EventId && x.ProjectId == eventProject.ProjectId && !x.DeleteMark); - - if (projectLimit != null) - { - result.ProjectLimit = new ProjectLimitDetail - { - ProjectLimitCount = projectLimit.LimitCount, - CurrentSelectedCount = selectedCountForProject, - IsLimitReached = selectedCountForProject >= projectLimit.LimitCount - }; - - if (result.ProjectLimit.IsLimitReached && !selectedGroupIds.Contains(input.GroupId)) - { - result.CanSelect = false; - result.LimitMessage = $"该项目最多可报名{projectLimit.LimitCount}个组别"; - return result; - } - } - - // 3. 检查团队/个人项目限制 - if (registrationLimit != null && baseProject != null) - { - var isTeamProject = baseProject.IsTeamProject(); - var isIndividualProject = baseProject.IsIndividualProject(); - - // 计算已选的团队项目和个人项目数量 - var allSelectedEventProjectIds = otherSelectedGroups - .Where(g => g.Id != input.GroupId) - .Select(g => g.EventProjectId) - .Distinct() - .ToList(); - - var allSelectedEventProjects = await _eventProjectRepository.GetListAsync(x => allSelectedEventProjectIds.Contains(x.Id)); - var allSelectedProjectIds = allSelectedEventProjects.Select(ep => ep.ProjectId).Distinct().ToList(); - var allSelectedProjects = await _projectRepository.GetListAsync(x => allSelectedProjectIds.Contains(x.Id)); - - var selectedTeamCount = 0; - var selectedIndividualCount = 0; - - foreach (var selectedProject in allSelectedProjects) - { - if (selectedProject.IsTeamProject()) selectedTeamCount++; - if (selectedProject.IsIndividualProject()) selectedIndividualCount++; - } - - // 团队项目限制 - if (isTeamProject) - { - result.TeamProjectLimit = new EventLimitDetail - { - LimitCount = registrationLimit.TeamProjectLimit, - CurrentSelectedCount = selectedTeamCount, - IsLimitReached = selectedTeamCount >= registrationLimit.TeamProjectLimit - }; - - if (result.TeamProjectLimit.IsLimitReached && !selectedGroupIds.Contains(input.GroupId)) - { - result.CanSelect = false; - result.LimitMessage = $"团队项目最多可报名{registrationLimit.TeamProjectLimit}个"; - return result; - } - } - - // 个人项目限制 - if (isIndividualProject) - { - result.IndividualProjectLimit = new EventLimitDetail - { - LimitCount = registrationLimit.IndividualProjectLimit, - CurrentSelectedCount = selectedIndividualCount, - IsLimitReached = selectedIndividualCount >= registrationLimit.IndividualProjectLimit - }; - - if (result.IndividualProjectLimit.IsLimitReached && !selectedGroupIds.Contains(input.GroupId)) - { - result.CanSelect = false; - result.LimitMessage = $"个人项目最多可报名{registrationLimit.IndividualProjectLimit}个"; - return result; - } - } - } - return result; }