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);