2026-03-11 16:00:09 +08:00
|
|
|
|
using System.ComponentModel.DataAnnotations;
|
2026-03-06 12:10:09 +08:00
|
|
|
|
using YD_Event.Core.Enum;
|
|
|
|
|
|
|
|
|
|
|
|
namespace YD_Event.Application.AppUser.Dtos;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 普通用户分页查询输入
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class AppUserPageInput : Pagination
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 姓名
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? Name { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 性别
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public Gender? Gender { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 联系电话
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? Mobile { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 审核状态
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public AuditStatus? AuditStatus { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 开始时间
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public DateTime? StartTime { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 结束时间
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public DateTime? EndTime { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-11 16:00:09 +08:00
|
|
|
|
/// <summary>
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// 成员统一查询输入(合并领队、教练、运动员)
|
2026-03-11 16:00:09 +08:00
|
|
|
|
/// </summary>
|
2026-03-20 01:11:02 +08:00
|
|
|
|
public class MemberQueryInput : Pagination
|
2026-03-11 16:00:09 +08:00
|
|
|
|
{
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// <summary>
|
2026-03-20 02:00:34 +08:00
|
|
|
|
/// 人员类型:1-运动员,2-教练,3-领队
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Required(ErrorMessage = "人员类型不能为空")]
|
2026-03-20 02:00:34 +08:00
|
|
|
|
[EnumDataType(typeof(PersonType), ErrorMessage = "不支持的人员类型")]
|
|
|
|
|
|
public PersonType PersonType { get; set; }
|
2026-03-20 01:11:02 +08:00
|
|
|
|
|
2026-03-11 16:00:09 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 姓名
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? Name { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 性别
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public Gender? Gender { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 联系电话
|
|
|
|
|
|
/// </summary>
|
2026-03-25 09:09:45 +08:00
|
|
|
|
public string? Mobile { get; set; }
|
2026-03-11 16:00:09 +08:00
|
|
|
|
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 身份证号 (运动员常用)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? IdCardNumber { get; set; }
|
|
|
|
|
|
|
2026-03-11 16:00:09 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 技能等级(仅教练)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? SkillLevel { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 认证状态(仅教练)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public int? CertificationStatus { get; set; }
|
2026-03-20 01:11:02 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 开始注册时间
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public DateTime? StartTime { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 结束注册时间
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public DateTime? EndTime { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 统一成员输出
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class MemberOutput : AppUserOutput
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2026-03-20 02:00:34 +08:00
|
|
|
|
/// 人员类型:1-运动员,2-教练,3-领队
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// </summary>
|
2026-03-20 02:00:34 +08:00
|
|
|
|
public PersonType PersonType { get; set; }
|
2026-03-20 01:11:02 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-04-10 14:29:41 +08:00
|
|
|
|
/// 出生日期
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// </summary>
|
2026-04-10 14:29:41 +08:00
|
|
|
|
public DateTime? BirthDate { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-04-13 02:09:59 +08:00
|
|
|
|
/// 年龄
|
|
|
|
|
|
/// 优先使用数据库存储的Age字段,如果不存在则根据BirthDate动态计算
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public int? Age { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 根据出生日期计算年龄的辅助方法
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static int? CalculateAgeFromBirthDate(DateTime? birthDate)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!birthDate.HasValue) return null;
|
|
|
|
|
|
var today = DateTime.Today;
|
|
|
|
|
|
var age = today.Year - birthDate.Value.Year;
|
|
|
|
|
|
if (birthDate.Value.Date > today.AddYears(-age)) age--;
|
|
|
|
|
|
return age;
|
2026-04-10 14:29:41 +08:00
|
|
|
|
}
|
2026-03-20 01:11:02 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 技能等级(教练)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? SkillLevel { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 认证状态(教练)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public int? CertificationStatus { get; set; }
|
2026-03-11 16:00:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 创建/更新成员输入
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class CreateOrUpdateMemberInput
|
|
|
|
|
|
{
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// <summary>
|
2026-03-20 02:00:34 +08:00
|
|
|
|
/// 人员类型:1-运动员,2-教练,3-领队
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Required(ErrorMessage = "人员类型不能为空")]
|
2026-03-20 02:00:34 +08:00
|
|
|
|
[EnumDataType(typeof(PersonType), ErrorMessage = "不支持的人员类型")]
|
|
|
|
|
|
public PersonType PersonType { get; set; }
|
2026-03-20 01:11:02 +08:00
|
|
|
|
|
2026-03-11 16:00:09 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// ID (更新时必填)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public long? Id { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 姓名
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Required(ErrorMessage = "姓名不能为空")]
|
|
|
|
|
|
public string Name { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 性别
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Required(ErrorMessage = "性别不能为空")]
|
|
|
|
|
|
public Gender Gender { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 身份证号
|
|
|
|
|
|
/// </summary>
|
2026-03-20 02:00:34 +08:00
|
|
|
|
//[Required(ErrorMessage = "身份证号不能为空")]
|
|
|
|
|
|
//[RegularExpression(@"(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)", ErrorMessage = "身份证号格式不正确")]
|
2026-03-25 09:09:45 +08:00
|
|
|
|
public string IdCardNumber { get; set; }
|
2026-03-11 16:00:09 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 身份证图片URL
|
|
|
|
|
|
/// </summary>
|
2026-04-13 13:23:00 +08:00
|
|
|
|
public string? IdCardImageUrl { get; set; }
|
2026-03-11 16:00:09 +08:00
|
|
|
|
|
2026-04-13 15:28:25 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 身份证背面图片URL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? IdCardBackImageUrl { get; set; }
|
|
|
|
|
|
|
2026-04-03 09:42:10 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 护照图片URL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? PassportPhotoUrl { get; set; }
|
|
|
|
|
|
|
2026-03-20 01:11:02 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 出生日期 (运动员等)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public DateTime? BirthDate { get; set; }
|
|
|
|
|
|
|
2026-04-13 02:09:59 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 年龄
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public int? Age { get; set; }
|
|
|
|
|
|
|
2026-03-11 16:00:09 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 联系电话
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Required(ErrorMessage = "联系电话不能为空")]
|
|
|
|
|
|
[RegularExpression(@"^1[3456789]\d{9}$", ErrorMessage = "手机号格式不正确")]
|
2026-03-25 09:09:45 +08:00
|
|
|
|
public string Mobile { get; set; }
|
2026-03-11 16:00:09 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 技能等级(教练特有)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? SkillLevel { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 认证状态(教练特有):0-未认证,1-已认证
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public int? CertificationStatus { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 备注
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? Remark { get; set; }
|
2026-03-31 16:31:48 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 验证码(仅新增领队/教练时需要)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? VerificationCode { get; set; }
|
2026-03-11 16:00:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 成员状态变更输入
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class ChangeMemberStatusInput
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// ID
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Required]
|
|
|
|
|
|
public long Id { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 状态:1-启用,2-禁用
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[Required]
|
|
|
|
|
|
public AvailabilityStatus Status { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-06 12:10:09 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 普通用户输出
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class AppUserOutput
|
|
|
|
|
|
{
|
2026-03-18 13:47:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 主键ID
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public long Id { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 姓名
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public string Name { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 性别
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public Gender Gender { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 手机号
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public string Mobile { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 身份证号
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public string IdCardNumber { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 身份证图片URL
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public string? IdCardImageUrl { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
2026-04-13 15:28:25 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 身份证背面图片URL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? IdCardBackImageUrl { get; set; }
|
|
|
|
|
|
|
2026-04-03 09:42:10 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 护照图片URL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string? PassportPhotoUrl { get; set; }
|
|
|
|
|
|
|
2026-03-18 13:47:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 审核状态
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public AuditStatus AuditStatus { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 审核备注
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public string? AuditRemark { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 创建时间
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public DateTime CreatedTime { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 审核输入
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class AuditInput
|
|
|
|
|
|
{
|
2026-03-18 13:47:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 审核对象ID列表
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public List<long> Ids { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 审核状态
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public AuditStatus Status { get; set; }
|
2026-03-18 13:47:34 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 审核备注
|
|
|
|
|
|
/// </summary>
|
2026-03-06 12:10:09 +08:00
|
|
|
|
public string? Remark { get; set; }
|
|
|
|
|
|
}
|