diff --git a/YD_Event.Application/Event/UnifiedRegistrationService.cs b/YD_Event.Application/Event/UnifiedRegistrationService.cs index 302cfc9..f6015d2 100644 --- a/YD_Event.Application/Event/UnifiedRegistrationService.cs +++ b/YD_Event.Application/Event/UnifiedRegistrationService.cs @@ -717,31 +717,55 @@ public class UnifiedRegistrationService : ITransient /// private static RegistrationValidationResult? ValidatePersonAges(List persons, EventProjectGroup group, bool isTeamProject, RegistrationValidationResult result) { - // 检查是否有超过最大年龄限制的队员 - var aboveAgePerson = persons.FirstOrDefault(p => p.BirthDate > group.BirthDateEnd); - if (aboveAgePerson != null) + // 组别未配置年龄限制时,跳过年龄检查(避免 DateTime.MinValue 造成的误判) + bool hasEndLimit = group.BirthDateEnd != DateTime.MinValue; + bool hasStartLimit = group.BirthDateStart != DateTime.MinValue; + + // ① 检查是否有超过最大年龄限制的队员(出生日期晚于 BirthDateEnd → 太小) + if (hasEndLimit) { - result.IsValid = false; - result.ErrorMessage = $"队员{aboveAgePerson.Name}的年龄超过组别最大限制。要求出生日期不晚于:{group.BirthDateEnd:yyyy-MM-dd},实际:{aboveAgePerson.BirthDate:yyyy-MM-dd}"; - result.Details.Add(CreateValidationDetail("年龄验证", false, result.ErrorMessage)); - return result; + var aboveAgePerson = persons.FirstOrDefault(p => p.BirthDate > group.BirthDateEnd); + if (aboveAgePerson != null) + { + result.IsValid = false; + result.ErrorMessage = $"队员{aboveAgePerson.Name}的年龄低于组别最小年龄要求。要求出生日期不晚于:{group.BirthDateEnd:yyyy-MM-dd},实际:{aboveAgePerson.BirthDate:yyyy-MM-dd}"; + result.Details.Add(CreateValidationDetail("年龄验证", false, result.ErrorMessage)); + return result; + } } - // 统计年龄状态 - var inTargetCount = persons.Count(p => p.BirthDate >= group.BirthDateStart && p.BirthDate <= group.BirthDateEnd); - var belowTargetCount = persons.Count(p => p.BirthDate < group.BirthDateStart); - bool hasBelow = belowTargetCount > 0; - bool allBelow = belowTargetCount == persons.Count; - - // 团队项目跨组验证 - if (isTeamProject && hasBelow && inTargetCount == 0) + // ② 检查是否有年龄超过最小年龄限制的队员(出生日期早于 BirthDateStart → 超龄 / 年龄太大) + if (hasStartLimit) { - string errorMessage = allBelow + var belowAgePerson = persons.FirstOrDefault(p => p.BirthDate < group.BirthDateStart); + if (belowAgePerson != null) + { + result.IsValid = false; + result.ErrorMessage = $"队员{belowAgePerson.Name}的年龄超过组别最大年龄限制。要求出生日期不早于:{group.BirthDateStart:yyyy-MM-dd},实际:{belowAgePerson.BirthDate:yyyy-MM-dd}"; + result.Details.Add(CreateValidationDetail("年龄验证", false, result.ErrorMessage)); + return result; + } + } + + // ③ 统计年龄状态(仅用于详情展示) + int inTargetCount = 0; + int belowTargetCount = 0; + if (hasStartLimit && hasEndLimit) + { + inTargetCount = persons.Count(p => p.BirthDate >= group.BirthDateStart && p.BirthDate <= group.BirthDateEnd); + belowTargetCount = persons.Count(p => p.BirthDate < group.BirthDateStart); + } + + // 团队项目跨组验证(仅当配置了年龄区间时才需要):保留原有业务规则——团队中至少需要有一名成员属于目标年龄段 + if (hasStartLimit && hasEndLimit && isTeamProject && belowTargetCount > 0 && inTargetCount == 0) + { + bool allBelow = belowTargetCount == persons.Count; + string errorMessage = allBelow ? "跨组报名时,团队中所有成员年龄均小于目标年龄段,团队中至少需要有一名成员属于目标年龄段" : "跨组报名时,团队中至少需要有一名成员属于目标年龄段"; - - string itemName = allBelow - ? "年龄跨组验证(全部小于目标年龄)" + + string itemName = allBelow + ? "年龄跨组验证(全部小于目标年龄)" : "年龄跨组验证"; result.IsValid = false; @@ -751,9 +775,12 @@ public class UnifiedRegistrationService : ITransient } // 添加验证通过的详情 - result.Details.Add(hasBelow - ? CreateValidationDetail("年龄跨组", true, "符合年龄跨组报名要求") - : CreateValidationDetail("年龄验证", true, "所有队员均在目标年龄段内")); + if (hasStartLimit || hasEndLimit) + { + result.Details.Add(belowTargetCount > 0 + ? CreateValidationDetail("年龄跨组", true, "符合年龄跨组报名要求") + : CreateValidationDetail("年龄验证", true, "所有队员均在目标年龄段内")); + } return null; }