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 @@ 计算年龄 + + + 验证队员是否符合报名条件 + + + + + 检查报名限制 + + 用户端报名管理服务