401 lines
9.7 KiB
C#
401 lines
9.7 KiB
C#
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>
|
||
/// 报名渠道 (1-小程序 2-后台管理 3-其他)
|
||
/// </summary>
|
||
public int RegistrationChannel { get; set; } = 1;
|
||
}
|
||
|
||
/// <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 ConfirmBankTransferInput
|
||
{
|
||
/// <summary>
|
||
/// 报名ID
|
||
/// </summary>
|
||
[Required(ErrorMessage = "报名ID不能为空")]
|
||
public long RegistrationId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 支付凭证URL (可选)
|
||
/// </summary>
|
||
public string? PaymentProofUrl { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 确认银行转账输出DTO
|
||
/// </summary>
|
||
public class ConfirmBankTransferOutput
|
||
{
|
||
/// <summary>
|
||
/// 报名ID
|
||
/// </summary>
|
||
public long RegistrationId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 支付状态
|
||
/// </summary>
|
||
public int PaymentStatus { get; set; }
|
||
|
||
/// <summary>
|
||
/// 是否成功
|
||
/// </summary>
|
||
public bool Success { get; set; }
|
||
|
||
/// <summary>
|
||
/// 消息
|
||
/// </summary>
|
||
public string? Message { 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;
|
||
}
|