From e06422ab064735555a55e7204af9e29ca09599d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E6=A2=93=E5=BD=AD?= Date: Wed, 3 Jun 2026 23:34:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E7=BB=84=E5=88=AB=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Event/UnifiedRegistrationService.cs | 63 +++++++++++++------ 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/YD_Event.Application/Event/UnifiedRegistrationService.cs b/YD_Event.Application/Event/UnifiedRegistrationService.cs index 789e116..302cfc9 100644 --- a/YD_Event.Application/Event/UnifiedRegistrationService.cs +++ b/YD_Event.Application/Event/UnifiedRegistrationService.cs @@ -472,7 +472,7 @@ public class UnifiedRegistrationService : ITransient } /// - /// 验证项目选择(一阶段:单选机制) + /// 验证项目选择(一阶段:支持同一项目选择多个组别) /// private async Task ValidateProjectSelectionAsync(UnifiedRegistrationInput input) { @@ -482,25 +482,47 @@ public class UnifiedRegistrationService : ITransient Details = new List() }; - // 1. 检查是否有重复选择的项目(每个项目只能选择一个组别) - var duplicateProjects = input.Items - .GroupBy(i => i.ProjectId) + // 1. 检查是否存在重复选择的同一项目下的同一组别(同一项目下的不同组别是允许的) + var duplicateGroupIds = input.Items + .Where(i => i.GroupId.HasValue) + .GroupBy(i => i.GroupId!.Value) .Where(g => g.Count() > 1) .Select(g => g.Key) .ToList(); - if (duplicateProjects.Any()) + if (duplicateGroupIds.Any()) { - var eventProjects = await _eventProjectRepository.GetListAsync(x => duplicateProjects.Contains(x.Id)); - var projectNames = eventProjects.Select(ep => $"{ep.ProjectId}").ToList(); - + var duplicateGroups = await _eventProjectGroupRepository.GetListAsync(x => duplicateGroupIds.Contains(x.Id)); + var groupNames = duplicateGroups.Select(g => $"{g.GroupName ?? g.Id.ToString()}").ToList(); + result.IsValid = false; - result.ErrorMessage = $"以下项目被重复选择,请确保每个项目只选择一个组别:{string.Join(", ", projectNames)}"; - result.Details.Add(CreateValidationDetail("项目选择", false, result.ErrorMessage)); + result.ErrorMessage = $"同一组别被重复选择:{string.Join(", ", groupNames)},同一项目下的不同组别可以重复选择,但同一组别不能选择两次"; + result.Details.Add(CreateValidationDetail("组别选择", false, result.ErrorMessage)); return result; } - result.Details.Add(CreateValidationDetail("项目单选机制", true, "每个项目仅选择一个组别,符合要求")); + // 2. 验证每个 item 的 ProjectId 与 GroupId 的对应关系 + var groupIds = input.Items.Where(i => i.GroupId.HasValue).Select(i => i.GroupId!.Value).Distinct().ToList(); + if (groupIds.Any()) + { + var eventProjectGroups = await _eventProjectGroupRepository.GetListAsync(x => groupIds.Contains(x.Id)); + foreach (var item in input.Items) + { + if (!item.GroupId.HasValue) continue; + var epg = eventProjectGroups.FirstOrDefault(g => g.Id == item.GroupId.Value); + if (epg == null) continue; + + if (item.ProjectId != epg.EventProjectId) + { + result.IsValid = false; + result.ErrorMessage = $"组别 {item.GroupId.Value} 不属于项目 {item.ProjectId},请检查选择"; + result.Details.Add(CreateValidationDetail("组别-项目匹配", false, result.ErrorMessage)); + return result; + } + } + } + + result.Details.Add(CreateValidationDetail("项目组别选择", true, "同一项目可以选择多个组别,符合要求")); return result; } @@ -1614,9 +1636,17 @@ public class UnifiedRegistrationService : ITransient int individualProjectCount = 0; int teamProjectCount = 0; - // 统计已存在的报名项目 + // 已统计过的项目ID(同一项目下的多个组别不会重复统计) + var countedProjectIds = new HashSet(); + + // 统计已存在的报名项目(去重:同一项目下的多个组别仅统计一次) foreach (var item in personRegistrationItems) { + if (!countedProjectIds.Add(item.ProjectId)) + { + continue; + } + var eventProject = eventProjects.FirstOrDefault(ep => ep.Id == item.ProjectId); if (eventProject == null) continue; @@ -1634,8 +1664,6 @@ public class UnifiedRegistrationService : ITransient } // 统计本次提交的项目,确保不重复统计 - var existingProjectIds = new HashSet(personRegistrationItems.Select(x => x.ProjectId)); - foreach (var item in input.Items) { // 检查该成员是否在本次提交的项目中 @@ -1645,8 +1673,8 @@ public class UnifiedRegistrationService : ITransient continue; } - // 检查是否已经统计过该项目 - if (existingProjectIds.Contains(item.ProjectId)) + // 检查是否已经统计过该项目(包含已有报名或本次提交中已统计过的项目) + if (!countedProjectIds.Add(item.ProjectId)) { continue; } @@ -1665,9 +1693,6 @@ public class UnifiedRegistrationService : ITransient { teamProjectCount++; } - - // 标记该项目已统计 - existingProjectIds.Add(item.ProjectId); } return (individualProjectCount, teamProjectCount);