diff --git a/YD_Event.Application/Event/Dtos/RegistrationDtos.cs b/YD_Event.Application/Event/Dtos/RegistrationDtos.cs
index 2dc76ea..bbd5a70 100644
--- a/YD_Event.Application/Event/Dtos/RegistrationDtos.cs
+++ b/YD_Event.Application/Event/Dtos/RegistrationDtos.cs
@@ -13,6 +13,11 @@ public class RegistrationPersonDto
///
public long Id { get; set; }
+ ///
+ /// 用户ID(AppUser表的ID,用于验证)
+ ///
+ public long UserId { get; set; }
+
///
/// 姓名
///
diff --git a/YD_Event.Application/Event/UserEventRecordService.cs b/YD_Event.Application/Event/UserEventRecordService.cs
index a10261c..780a3fe 100644
--- a/YD_Event.Application/Event/UserEventRecordService.cs
+++ b/YD_Event.Application/Event/UserEventRecordService.cs
@@ -6,6 +6,7 @@ using YD_Event.Application.Event.Dtos;
using YD_Event.Application.Common;
using YD_Event.Core.Entities;
using YD_Event.Core.Enum;
+using YD_Event.Core.Extensions;
using Easy.Core;
using SqlSugar;
using Mapster;
@@ -537,6 +538,7 @@ public class UserEventRecordService : IDynamicApiController, ITransient
Members = itemMembers.Select(p => new RegistrationPersonDto
{
Id = p.Id,
+ UserId = p.UserId, // 这里是关键!设置正确的用户ID
Name = p.Name,
IdCardNumber = p.IdCard,
Gender = p.Gender,
@@ -668,4 +670,243 @@ public class UserEventRecordService : IDynamicApiController, ITransient
if (birthDate.Date > today.AddYears(-age)) age--;
return age;
}
+
+ ///
+ /// 验证队员是否符合报名条件
+ ///
+ [DisplayName("验证队员")]
+ [HttpPost("member/validate")]
+ public async Task ValidateMember([FromBody] MemberValidateInput input)
+ {
+ var result = new MemberValidateOutput
+ {
+ IsValid = true,
+ AgeValid = true,
+ GenderValid = true,
+ RegistrationLimitValid = true,
+ Message = "验证通过"
+ };
+
+ // 添加调试:查看接收的ID
+ var memberId = input.MemberId;
+ var member = await _userRepository.GetByIdAsync(memberId);
+
+ // 添加调试:如果找不到,尝试不删除标记查询
+ if (member == null)
+ {
+ var memberWithoutDelete = await _db.Queryable()
+ .FirstAsync(m => m.Id == memberId);
+
+ if (memberWithoutDelete != null)
+ {
+ // 队员存在但被标记删除
+ result.IsValid = false;
+ result.Message = "队员不存在(已删除)";
+ return result;
+ }
+
+ result.IsValid = false;
+ result.Message = "队员不存在";
+ return result;
+ }
+
+ if (!member.BirthDate.HasValue)
+ {
+ result.IsValid = false;
+ result.AgeValid = false;
+ result.Message = "队员缺少出生日期信息";
+ return result;
+ }
+
+ var eventProjectGroup = await _eventProjectGroupRepository.GetByIdAsync(input.GroupId);
+ if (eventProjectGroup != null)
+ {
+ // 获取项目类型信息
+ var eventProject = await _eventProjectRepository.GetByIdAsync(eventProjectGroup.EventProjectId);
+ var baseProject = eventProject != null ? await _projectRepository.GetByIdAsync(eventProject.ProjectId) : null;
+ var isTeamProject = baseProject?.IsTeamProject() ?? false;
+
+ // 创建单个队员的验证输入
+ var persons = new List
+ {
+ new UnifiedPersonInput
+ {
+ UserId = member.Id,
+ Name = member.Name ?? "",
+ IdCardNumber = member.IdCardNumber ?? "",
+ Gender = member.Gender,
+ Mobile = member.Mobile,
+ BirthDate = member.BirthDate.Value
+ }
+ };
+
+ // 使用统一的验证方法进行验证
+ var validationResult = _unifiedRegistrationService.ValidatePersonQualifications(persons, eventProjectGroup, isTeamProject);
+
+ if (!validationResult.IsValid)
+ {
+ result.IsValid = false;
+ result.Message = validationResult.ErrorMessage ?? "验证失败";
+
+ // 根据验证详情设置具体的验证状态
+ var ageDetail = validationResult.Details?.FirstOrDefault(d => d.ItemName == "年龄验证" || d.ItemName == "年龄跨组验证");
+ var genderDetail = validationResult.Details?.FirstOrDefault(d => d.ItemName == "性别验证");
+
+ if (ageDetail != null && !ageDetail.IsPassed)
+ {
+ result.AgeValid = false;
+ }
+
+ if (genderDetail != null && !genderDetail.IsPassed)
+ {
+ result.GenderValid = false;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ ///
+ /// 检查报名限制
+ ///
+ [DisplayName("检查报名限制")]
+ [HttpPost("registration-limit/check")]
+ public async Task CheckRegistrationLimit([FromBody] RegistrationLimitCheckInput input)
+ {
+ var userId = _authManager.UserId;
+
+ // 获取当前用户信息
+ var sysUser = await _sysUserRepository.GetByIdAsync(userId);
+ if (sysUser == null) throw Oops.Bah("用户不存在");
+ string userName = sysUser.Name;
+ string userMobile = sysUser.Mobile ?? "";
+
+ // 获取团队信息 - 优先使用新结构的 TeamId
+ string teamName = "临时团队";
+ if (input.TeamId.HasValue)
+ {
+ var team = await _db.Queryable().FirstAsync(t => t.Id == input.TeamId.Value && !t.DeleteMark);
+ if (team != null)
+ {
+ teamName = team.Name;
+ }
+ }
+
+ // 获取所有成员信息
+ var allMemberIds = new List();
+ if (input.GroupMembers != null)
+ {
+ foreach (var gm in input.GroupMembers)
+ {
+ // 检查是否有多团队数据
+ if (gm.Teams != null && gm.Teams.Count > 0)
+ {
+ foreach (var team in gm.Teams)
+ {
+ allMemberIds.AddRange(team.MemberIds ?? new List());
+ }
+ }
+ else
+ {
+ // 向后兼容单团队模式
+ allMemberIds.AddRange(gm.MemberIds ?? new List());
+ }
+ }
+ }
+ else if (input.MemberIds != null)
+ {
+ // 向后兼容旧结构
+ allMemberIds.AddRange(input.MemberIds);
+ }
+
+ allMemberIds = allMemberIds.Distinct().ToList();
+
+ // 获取成员信息
+ var members = await _userRepository.GetListAsync(x => allMemberIds.Contains(x.Id));
+
+ // 获取组别信息
+ var groupIds = input.GroupMembers?.Select(g => g.GroupId).ToList() ?? input.GroupIds ?? new List();
+ var eventProjectGroups = await _eventProjectGroupRepository.GetListAsync(x => groupIds.Contains(x.Id));
+
+ // 获取项目信息
+ var eventProjectIds = eventProjectGroups.Select(epg => epg.EventProjectId).Distinct().ToList();
+ var eventProjects = await _eventProjectRepository.GetListAsync(x => eventProjectIds.Contains(x.Id));
+
+ // 构建统一报名输入
+ var unifiedInput = new UnifiedRegistrationInput
+ {
+ EventId = input.EventId,
+ RegistrationMode = 2, // PC端团队报名
+ TeamName = teamName,
+ ContactName = userName,
+ ContactPhone = userMobile,
+ CreatedUserId = userId,
+ IsDraft = false,
+ Items = new List()
+ };
+
+ // 为每个组别添加项目项
+ foreach (var groupMember in input.GroupMembers ?? new List())
+ {
+ var eventProjectGroup = eventProjectGroups.FirstOrDefault(epg => epg.Id == groupMember.GroupId);
+ if (eventProjectGroup == null) continue;
+
+ var eventProject = eventProjects.FirstOrDefault(ep => ep.Id == eventProjectGroup.EventProjectId);
+ if (eventProject == null) continue;
+
+ var item = new UnifiedRegistrationItemInput
+ {
+ ProjectId = eventProject.Id,
+ GroupId = groupMember.GroupId,
+ GroupName = eventProjectGroup.GroupName,
+ Teams = new List(),
+ Persons = new List()
+ };
+
+ // 检查是多团队模式还是单团队模式
+ var hasMultipleTeams = groupMember.Teams != null && groupMember.Teams.Count > 0;
+
+ if (hasMultipleTeams)
+ {
+ // ========== 多团队模式 ==========
+ foreach (var team in groupMember.Teams)
+ {
+ var teamMembers = members.Where(m => team.MemberIds != null && team.MemberIds.Contains(m.Id)).ToList();
+ item.Teams.Add(new UnifiedTeamInput
+ {
+ TeamIndex = team.TeamIndex,
+ Persons = teamMembers.Select(m => new UnifiedPersonInput
+ {
+ UserId = m.Id,
+ Name = m.Name ?? "",
+ IdCardNumber = m.IdCardNumber ?? "",
+ Gender = m.Gender,
+ Mobile = m.Mobile,
+ BirthDate = m.BirthDate ?? DateTime.MinValue
+ }).ToList()
+ });
+ }
+ }
+ else
+ {
+ // ========== 单团队模式(向后兼容) ==========
+ var groupMembersList = members.Where(m => groupMember.MemberIds != null && groupMember.MemberIds.Contains(m.Id)).ToList();
+ item.Persons = groupMembersList.Select(m => new UnifiedPersonInput
+ {
+ UserId = m.Id,
+ Name = m.Name ?? "",
+ IdCardNumber = m.IdCardNumber ?? "",
+ Gender = m.Gender,
+ Mobile = m.Mobile,
+ BirthDate = m.BirthDate ?? DateTime.MinValue
+ }).ToList();
+ }
+
+ unifiedInput.Items.Add(item);
+ }
+
+ // 调用统一的限制检查方法
+ return await _unifiedRegistrationService.CheckRegistrationLimitAsync(unifiedInput);
+ }
}
diff --git a/YD_Event.Application/YD_Event.Application.xml b/YD_Event.Application/YD_Event.Application.xml
index bcc4579..55befc9 100644
--- a/YD_Event.Application/YD_Event.Application.xml
+++ b/YD_Event.Application/YD_Event.Application.xml
@@ -5510,6 +5510,11 @@
ID
+
+
+ 用户ID(AppUser表的ID,用于验证)
+
+
姓名
@@ -8208,11 +8213,6 @@
检查报名限制
-
-
- 检查报名限制(支持排除特定报名记录)
-
-
创建报名限制详情
@@ -8458,6 +8458,16 @@
计算年龄
+
+
+ 验证队员是否符合报名条件
+
+
+
+
+ 检查报名限制
+
+
用户端报名管理服务