参与赛事记录筛选

This commit is contained in:
马梓彭 2026-04-20 14:01:30 +08:00
parent b4e408d56f
commit ef8f268179
3 changed files with 261 additions and 5 deletions

View File

@ -13,6 +13,11 @@ public class RegistrationPersonDto
/// </summary>
public long Id { get; set; }
/// <summary>
/// 用户ID(AppUser表的ID,用于验证)
/// </summary>
public long UserId { get; set; }
/// <summary>
/// 姓名
/// </summary>

View File

@ -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;
}
/// <summary>
/// 验证队员是否符合报名条件
/// </summary>
[DisplayName("验证队员")]
[HttpPost("member/validate")]
public async Task<MemberValidateOutput> 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<YD_Event.Core.Entities.AppUser>()
.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<UnifiedPersonInput>
{
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;
}
/// <summary>
/// 检查报名限制
/// </summary>
[DisplayName("检查报名限制")]
[HttpPost("registration-limit/check")]
public async Task<RegistrationLimitCheckOutput> 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<YD_Event.Core.Entities.Team>().FirstAsync(t => t.Id == input.TeamId.Value && !t.DeleteMark);
if (team != null)
{
teamName = team.Name;
}
}
// 获取所有成员信息
var allMemberIds = new List<long>();
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<long>());
}
}
else
{
// 向后兼容单团队模式
allMemberIds.AddRange(gm.MemberIds ?? new List<long>());
}
}
}
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<long>();
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<UnifiedRegistrationItemInput>()
};
// 为每个组别添加项目项
foreach (var groupMember in input.GroupMembers ?? new List<GroupMemberAssignment>())
{
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<UnifiedTeamInput>(),
Persons = new List<UnifiedPersonInput>()
};
// 检查是多团队模式还是单团队模式
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);
}
}

View File

@ -5510,6 +5510,11 @@
ID
</summary>
</member>
<member name="P:YD_Event.Application.Event.Dtos.RegistrationPersonDto.UserId">
<summary>
用户ID(AppUser表的ID,用于验证)
</summary>
</member>
<member name="P:YD_Event.Application.Event.Dtos.RegistrationPersonDto.Name">
<summary>
姓名
@ -8208,11 +8213,6 @@
检查报名限制
</summary>
</member>
<member name="M:YD_Event.Application.Event.UnifiedRegistrationService.CheckRegistrationLimitAsync(YD_Event.Application.Event.Dtos.UnifiedRegistrationInput,System.Int64)">
<summary>
检查报名限制(支持排除特定报名记录)
</summary>
</member>
<member name="M:YD_Event.Application.Event.UnifiedRegistrationService.CreateLimitDetail(System.Int64,System.String,System.String,System.String)">
<summary>
创建报名限制详情
@ -8458,6 +8458,16 @@
计算年龄
</summary>
</member>
<member name="M:YD_Event.Application.Event.UserEventRecordService.ValidateMember(YD_Event.Application.Event.Dtos.MemberValidateInput)">
<summary>
验证队员是否符合报名条件
</summary>
</member>
<member name="M:YD_Event.Application.Event.UserEventRecordService.CheckRegistrationLimit(YD_Event.Application.Event.Dtos.RegistrationLimitCheckInput)">
<summary>
检查报名限制
</summary>
</member>
<member name="T:YD_Event.Application.Event.UserEventRegistrationService">
<summary>
用户端报名管理服务