YD_Event.Admin/YD_Event.Application/Event/Dtos/UnifiedRegistrationDtos.cs
2026-04-13 06:58:21 +08:00

353 lines
8.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.ComponentModel.DataAnnotations;
using YD_Event.Core.Enum;
namespace YD_Event.Application.Event.Dtos;
/// <summary>
/// 统一报名输入DTO
/// </summary>
public class UnifiedRegistrationInput
{
/// <summary>
/// 赛事ID
/// </summary>
[Required(ErrorMessage = "赛事ID不能为空")]
public long EventId { get; set; }
/// <summary>
/// 报名模式 (1-个人 2-团队)
/// </summary>
[Required(ErrorMessage = "报名模式不能为空")]
[Range(1, 2, ErrorMessage = "报名模式只能是1(个人)或2(团队)")]
public int RegistrationMode { get; set; }
/// <summary>
/// 团队名称 (团队报名必填)
/// </summary>
[MaxLength(100, ErrorMessage = "团队名称不能超过100个字符")]
public string? TeamName { get; set; }
/// <summary>
/// 联系人姓名
/// </summary>
[Required(ErrorMessage = "联系人姓名不能为空")]
[MaxLength(50, ErrorMessage = "联系人姓名不能超过50个字符")]
public string ContactName { get; set; } = string.Empty;
/// <summary>
/// 联系人电话
/// </summary>
[Required(ErrorMessage = "联系人电话不能为空")]
[RegularExpression(@"^1[3-9]\d{9}$", ErrorMessage = "请输入正确的手机号格式")]
public string ContactPhone { get; set; } = string.Empty;
/// <summary>
/// 报名项目列表
/// </summary>
[Required(ErrorMessage = "报名项目列表不能为空")]
[MinLength(1, ErrorMessage = "请至少选择一个项目")]
public List<UnifiedRegistrationItemInput> Items { get; set; } = new();
/// <summary>
/// 创建用户ID
/// </summary>
public long CreatedUserId { get; set; }
/// <summary>
/// 是否为草稿
/// </summary>
public bool IsDraft { get; set; }
}
/// <summary>
/// 统一报名项目输入DTO
/// </summary>
public class UnifiedRegistrationItemInput
{
/// <summary>
/// 项目ID
/// </summary>
[Required(ErrorMessage = "项目ID不能为空")]
public long ProjectId { get; set; }
/// <summary>
/// 组别ID
/// </summary>
public long? GroupId { get; set; }
/// <summary>
/// 组别名称
/// </summary>
public string? GroupName { get; set; }
/// <summary>
/// 团队列表(支持多个团队报名同一项目组别)
/// </summary>
public List<UnifiedTeamInput> Teams { get; set; } = new();
/// <summary>
/// 参赛人员列表(单个团队报名时使用,向后兼容)
/// </summary>
public List<UnifiedPersonInput> Persons { get; set; } = new();
}
/// <summary>
/// 统一团队输入DTO
/// </summary>
public class UnifiedTeamInput
{
/// <summary>
/// 团队ID(可选,已有团队时使用)
/// </summary>
public long? TeamId { get; set; }
/// <summary>
/// 团队名称
/// </summary>
[MaxLength(100, ErrorMessage = "团队名称不能超过100个字符")]
public string? TeamName { get; set; }
/// <summary>
/// 团队序号(用于显示,如"团队一"、"团队二")
/// </summary>
public int TeamIndex { get; set; }
/// <summary>
/// 该团队的参赛人员列表
/// </summary>
[Required(ErrorMessage = "参赛人员列表不能为空")]
[MinLength(1, ErrorMessage = "请至少填写一个参赛人员")]
public List<UnifiedPersonInput> Persons { get; set; } = new();
}
/// <summary>
/// 统一参赛人员输入DTO
/// </summary>
public class UnifiedPersonInput
{
/// <summary>
/// 用户ID (可选,已有用户时使用)
/// </summary>
public long? UserId { get; set; }
/// <summary>
/// 姓名
/// </summary>
[Required(ErrorMessage = "姓名不能为空")]
[MaxLength(50, ErrorMessage = "姓名不能超过50个字符")]
public string Name { get; set; } = string.Empty;
/// <summary>
/// 身份证号
/// </summary>
[Required(ErrorMessage = "身份证号不能为空")]
[RegularExpression(@"^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$", ErrorMessage = "请输入正确的身份证号格式")]
public string IdCardNumber { get; set; } = string.Empty;
/// <summary>
/// 性别
/// </summary>
[Required(ErrorMessage = "性别不能为空")]
public Gender Gender { get; set; }
/// <summary>
/// 电话
/// </summary>
[RegularExpression(@"^1[3-9]\d{9}$", ErrorMessage = "请输入正确的手机号格式")]
public string? Mobile { get; set; }
/// <summary>
/// 出生日期
/// </summary>
[Required(ErrorMessage = "出生日期不能为空")]
public DateTime BirthDate { get; set; }
}
/// <summary>
/// 统一报名结果输出DTO
/// </summary>
public class UnifiedRegistrationOutput
{
/// <summary>
/// 报名ID
/// </summary>
public long RegistrationId { get; set; }
/// <summary>
/// 订单号
/// </summary>
public string OrderNo { get; set; } = string.Empty;
/// <summary>
/// 总金额(优惠前)
/// </summary>
public decimal OriginalAmount { get; set; }
/// <summary>
/// 优惠金额
/// </summary>
public decimal DiscountAmount { get; set; }
/// <summary>
/// 实际支付金额
/// </summary>
public decimal ActualAmount { get; set; }
/// <summary>
/// 支付状态
/// </summary>
public int PaymentStatus { get; set; }
/// <summary>
/// 是否免费
/// </summary>
public bool IsFree => ActualAmount <= 0;
}
/// <summary>
/// 统一支付处理输入DTO
/// </summary>
public class UnifiedPaymentInput
{
/// <summary>
/// 报名ID
/// </summary>
[Required(ErrorMessage = "报名ID不能为空")]
public long RegistrationId { get; set; }
/// <summary>
/// 支付方式 (1-线下 2-线上)
/// </summary>
[Required(ErrorMessage = "支付方式不能为空")]
[Range(1, 2, ErrorMessage = "支付方式只能是1(线下)或2(线上)")]
public int PaymentMethod { get; set; }
/// <summary>
/// 优惠券ID (可选)
/// </summary>
public long? CouponId { get; set; }
/// <summary>
/// 微信OpenId (微信支付时必填)
/// </summary>
public string? OpenId { get; set; }
/// <summary>
/// 支付凭证URL (线下支付时必填)
/// </summary>
public string? PaymentProofUrl { get; set; }
/// <summary>
/// 具体支付方式
/// </summary>
public PaymentMethodType PaymentMethodType { get; set; }
/// <summary>
/// 操作用户ID
/// </summary>
public long OperatorUserId { get; set; }
}
/// <summary>
/// 统一支付处理输出DTO
/// </summary>
public class UnifiedPaymentOutput
{
/// <summary>
/// 报名ID
/// </summary>
public long RegistrationId { get; set; }
/// <summary>
/// 订单号
/// </summary>
public string OrderNo { get; set; } = string.Empty;
/// <summary>
/// 支付状态
/// </summary>
public int PaymentStatus { get; set; }
/// <summary>
/// 是否免费
/// </summary>
public bool IsFree { get; set; }
/// <summary>
/// 优惠前金额
/// </summary>
public decimal OriginalAmount { get; set; }
/// <summary>
/// 优惠金额
/// </summary>
public decimal DiscountAmount { get; set; }
/// <summary>
/// 实际支付金额
/// </summary>
public decimal ActualAmount { get; set; }
/// <summary>
/// 优惠券使用规则说明
/// </summary>
public string? CouponRuleNote { get; set; }
/// <summary>
/// 微信支付参数 (微信支付时返回)
/// </summary>
public object? WechatPayParams { get; set; }
/// <summary>
/// 支付二维码URL (微信Native支付时返回)
/// </summary>
public string? QrcodeUrl { get; set; }
/// <summary>
/// 交易类型
/// </summary>
public string? TradeType { get; set; }
}
/// <summary>
/// 报名验证结果DTO
/// </summary>
public class RegistrationValidationResult
{
/// <summary>
/// 是否通过验证
/// </summary>
public bool IsValid { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string? ErrorMessage { get; set; }
/// <summary>
/// 验证详情
/// </summary>
public List<ValidationDetail>? Details { get; set; }
}
/// <summary>
/// 验证详情DTO
/// </summary>
public class ValidationDetail
{
/// <summary>
/// 验证项名称
/// </summary>
public string ItemName { get; set; } = string.Empty;
/// <summary>
/// 是否通过
/// </summary>
public bool IsPassed { get; set; }
/// <summary>
/// 消息
/// </summary>
public string Message { get; set; } = string.Empty;
}