using System.ComponentModel.DataAnnotations; using System.Globalization; using System.Text.Json; using Tiku.Application.Growth; namespace Tiku.Api.Contracts; /// /// 推荐租户查询参数。 /// public sealed class ReferralTenantQueryDto { /// /// 租户编码。 /// [StringLength(100)] public string? TenantCode { get; set; } } /// /// 推荐邀请码请求 DTO。 /// public sealed class ReferralInviteDto { /// /// 渠道。 /// [StringLength(100)] public string? Channel { get; set; } /// /// 落地页路径。 /// [StringLength(2048)] public string? LandingPath { get; set; } public ReferralInviteCommand ToCommand() { return new ReferralInviteCommand(Channel, LandingPath); } } /// /// 解析推荐请求 DTO。 /// public sealed class ResolveReferralDto { /// /// 编码。 /// [StringLength(100)] public string? Code { get; set; } /// /// 租户编码。 /// [StringLength(100)] public string? TenantCode { get; set; } public ResolveReferralCommand ToCommand() { return new ResolveReferralCommand(Code); } } /// /// 记录推荐事件请求 DTO。 /// public sealed class TrackReferralEventDto { /// /// 推荐码。 /// [Required] [StringLength(100)] public string RefCode { get; set; } = string.Empty; /// /// 事件类型。 /// [StringLength(100)] public string? EventType { get; set; } /// /// 来源。 /// [StringLength(100)] public string? Source { get; set; } /// /// 目标用户 ID。 /// public Guid? TargetUserId { get; set; } /// /// 扩展元数据。 /// public JsonElement? Metadata { get; set; } /// /// 租户编码。 /// [StringLength(100)] public string? TenantCode { get; set; } public TrackReferralEventCommand ToCommand() { return new TrackReferralEventCommand(RefCode, EventType, Source, TargetUserId, Metadata); } } /// /// 绑定推荐请求 DTO。 /// public sealed class BindReferralDto { /// /// 推荐码。 /// [Required] [StringLength(100)] public string RefCode { get; set; } = string.Empty; /// /// 来源。 /// [StringLength(100)] public string? Source { get; set; } /// /// 扩展元数据。 /// public JsonElement? Metadata { get; set; } public BindReferralCommand ToCommand() { return new BindReferralCommand(RefCode, Source, Metadata); } } /// /// 推荐二维码请求 DTO。 /// public sealed class ReferralQrcodeDto { /// /// 页码。 /// [StringLength(500)] public string? Page { get; set; } /// /// 场景参数。 /// [StringLength(128)] public string? Scene { get; set; } /// /// 服务提供方。 /// [StringLength(100)] public string? Provider { get; set; } /// /// 二维码地址。 /// [StringLength(2048)] public string? QrcodeUrl { get; set; } /// /// 扩展元数据。 /// public JsonElement? Metadata { get; set; } public ReferralQrcodeCommand ToCommand() { return new ReferralQrcodeCommand(Page, Scene, Provider, QrcodeUrl, Metadata); } } /// /// 推荐统计查询参数。 /// public sealed class ReferralStatsQueryDto { /// /// 推荐人用户 ID。 /// public Guid? ReferrerUserId { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public ReferralStatsQuery ToQuery() { return new ReferralStatsQuery(ReferrerUserId, Limit); } } /// /// 推荐Conversion查询参数。 /// public sealed class ReferralConversionQueryDto { /// /// 推荐人用户 ID。 /// public Guid? ReferrerUserId { get; set; } /// /// 开始日期,格式为 yyyy-MM-dd。 /// [RegularExpression("^\\d{4}-\\d{2}-\\d{2}$")] public string? StartDate { get; set; } /// /// 结束日期,格式为 yyyy-MM-dd。 /// [RegularExpression("^\\d{4}-\\d{2}-\\d{2}$")] public string? EndDate { get; set; } /// /// 天数。 /// [Range(1, 365)] public int? Days { get; set; } /// /// 返回数量上限。 /// [Range(1, 100)] public int? Limit { get; set; } public ReferralConversionQuery ToQuery() { return new ReferralConversionQuery( ReferrerUserId, ParseDate(StartDate), ParseDate(EndDate), Days, Limit); } private static DateOnly? ParseDate(string? value) { return string.IsNullOrWhiteSpace(value) ? null : DateOnly.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); } } /// /// 人工绑定推荐请求 DTO。 /// public sealed class ManualBindReferralDto { /// /// 学生用户 ID。 /// [Required] public Guid StudentUserId { get; set; } /// /// 推荐人用户 ID。 /// [Required] public Guid ReferrerUserId { get; set; } /// /// 来源。 /// [StringLength(100)] public string? Source { get; set; } /// /// 是否强制执行。 /// public bool Force { get; set; } /// /// 扩展元数据。 /// public JsonElement? Metadata { get; set; } public ManualBindReferralCommand ToCommand() { return new ManualBindReferralCommand(StudentUserId, ReferrerUserId, Source, Force, Metadata); } } /// /// 推荐团队查询参数。 /// public sealed class ReferralTeamQueryDto { /// /// 上级成员用户 ID。 /// public Guid? LeaderUserId { get; set; } public ReferralTeamQuery ToQuery() { return new ReferralTeamQuery(LeaderUserId); } } /// /// 新增或更新推荐团队请求 DTO。 /// public sealed class UpsertReferralTeamDto { /// /// 成员用户 ID。 /// [Required] public Guid MemberUserId { get; set; } /// /// 上级成员用户 ID。 /// public Guid? LeaderUserId { get; set; } /// /// 关系类型。 /// [StringLength(50)] public string? RelationType { get; set; } /// /// 状态。 /// [StringLength(50)] public string? Status { get; set; } /// /// 扩展元数据。 /// public JsonElement? Metadata { get; set; } public UpsertReferralTeamCommand ToCommand() { return new UpsertReferralTeamCommand(MemberUserId, LeaderUserId, RelationType, Status, Metadata); } }