多组别设置
This commit is contained in:
parent
52c3c9ecca
commit
e06422ab06
@ -472,7 +472,7 @@ public class UnifiedRegistrationService : ITransient
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 验证项目选择(一阶段:单选机制)
|
||||
/// 验证项目选择(一阶段:支持同一项目选择多个组别)
|
||||
/// </summary>
|
||||
private async Task<RegistrationValidationResult> ValidateProjectSelectionAsync(UnifiedRegistrationInput input)
|
||||
{
|
||||
@ -482,25 +482,47 @@ public class UnifiedRegistrationService : ITransient
|
||||
Details = new List<ValidationDetail>()
|
||||
};
|
||||
|
||||
// 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<long>();
|
||||
|
||||
// 统计已存在的报名项目(去重:同一项目下的多个组别仅统计一次)
|
||||
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<long>(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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user