using System.ComponentModel.DataAnnotations; using System.Text.Json; using Tiku.Application.PlatformAdmin; using Tiku.Application.Tenancy; using Tiku.Domain.Common; using Tiku.Domain.Platform; using Tiku.Domain.Tenancy; namespace Tiku.Api.Contracts; /// /// 平台租户能力通用查询参数。 /// public class PlatformCapabilityQueryDto { /// /// 租户 ID。 /// public Guid? TenantId { get; set; } /// /// 状态。 /// [StringLength(50)] public string? Status { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int Limit { get; set; } = 100; public PlatformCapabilityQuery ToQuery() => new(TenantId, Status, Limit); } /// /// 新增或更新租户 CRM 配置请求。 /// public sealed class UpsertPlatformCrmConfigDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 租户 ID。 /// [Required] public Guid TenantId { get; set; } /// /// 是否启用。 /// public bool Enabled { get; set; } /// /// 回调地址。 /// [StringLength(2048)] public string? Url { get; set; } /// /// 密钥引用。 /// [StringLength(300)] public string? SecretRef { get; set; } /// /// 表单名称。 /// [StringLength(200)] public string? FormName { get; set; } /// /// 考试类型。 /// [StringLength(100)] public string? ExamType { get; set; } /// /// 超时时长,单位为秒。 /// [Range(1, 120)] public int? TimeoutSeconds { get; set; } /// /// 延迟秒数。 /// [Range(0, 86400)] public int? DelaySeconds { get; set; } /// /// 分配模式。 /// [StringLength(50)] public string? AssignmentMode { get; set; } /// /// 分配池。 /// public JsonElement? AssignmentPool { get; set; } /// /// 分配配置。 /// public JsonElement? AssignmentConfig { get; set; } public UpsertPlatformCrmConfigCommand ToCommand() => new(Id, TenantId, Enabled, Url, SecretRef, FormName, ExamType, TimeoutSeconds, DelaySeconds, AssignmentMode, AssignmentPool, AssignmentConfig); } /// /// 重试租户 CRM 线索推送请求。 /// public sealed class RetryPlatformCrmLeadDto { /// /// 队列任务 ID。 /// [Required] public Guid QueueId { get; set; } /// /// 备注。 /// [StringLength(500)] public string? Note { get; set; } public PlatformCrmLeadRetryCommand ToCommand() => new(QueueId, Note); } /// /// 平台租户 CRM 日志查询参数。 /// public sealed class PlatformCrmLogQueryDto : PlatformCapabilityQueryDto { /// /// 队列任务 ID。 /// public Guid? QueueId { get; set; } } /// /// 新增或更新租户短信渠道请求。 /// public sealed class UpsertPlatformSmsChannelDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 租户 ID。 /// [Required] public Guid TenantId { get; set; } /// /// 服务提供方。 /// [Required, StringLength(80)] public string Provider { get; set; } = "generic"; /// /// 名称。 /// [Required, StringLength(200)] public string Name { get; set; } = string.Empty; /// /// 短信签名。 /// [Required, StringLength(100)] public string Signature { get; set; } = string.Empty; /// /// 使用场景。 /// [Required, StringLength(100)] public string Scene { get; set; } = "login"; /// /// 状态。 /// public TenantExternalProviderStatus Status { get; set; } = TenantExternalProviderStatus.Disabled; /// /// 密钥引用。 /// [StringLength(300)] public string? SecretRef { get; set; } /// /// 优先级。 /// public int? Priority { get; set; } /// /// 月度配额。 /// [Range(0, int.MaxValue)] public int? MonthlyQuota { get; set; } /// /// 公开配置内容。 /// public JsonElement ConfigPublic { get; set; } = JsonDefaults.Object(); /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertPlatformSmsChannelCommand ToCommand() => new(Id, TenantId, Provider, Name, Signature, Scene, Status, SecretRef, Priority, MonthlyQuota, ConfigPublic, Metadata); } /// /// 新增或更新租户短信模板请求。 /// public sealed class UpsertPlatformSmsTemplateDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 租户 ID。 /// [Required] public Guid TenantId { get; set; } /// /// 短信渠道 ID。 /// [Required] public Guid ChannelId { get; set; } /// /// 编码。 /// [Required, StringLength(120)] public string Code { get; set; } = string.Empty; /// /// 名称。 /// [Required, StringLength(200)] public string Name { get; set; } = string.Empty; /// /// 类型。 /// public SmsTemplateType Type { get; set; } = SmsTemplateType.Notification; /// /// 审核状态。 /// public SmsTemplateAuditStatus AuditStatus { get; set; } = SmsTemplateAuditStatus.Draft; /// /// 状态。 /// public SmsTemplateStatus Status { get; set; } = SmsTemplateStatus.Active; /// /// 渠道模板编码。 /// [StringLength(120)] public string? ProviderTemplateCode { get; set; } /// /// 模板内容。 /// [Required, StringLength(1000)] public string Content { get; set; } = string.Empty; /// /// Remark。 /// [StringLength(500)] public string? Remark { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertPlatformSmsTemplateCommand ToCommand() => new(Id, TenantId, ChannelId, Code, Name, Type, AuditStatus, Status, ProviderTemplateCode, Content, Remark, Metadata); } /// /// 新增或更新平台支付应用请求。 /// public sealed class UpsertPlatformPaymentAppDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 支付应用编码。 /// [Required, StringLength(100)] public string AppCode { get; set; } = string.Empty; /// /// 支付应用名称。 /// [Required, StringLength(200)] public string AppName { get; set; } = string.Empty; /// /// 状态。 /// public PlatformPaymentAppStatus Status { get; set; } = PlatformPaymentAppStatus.Disabled; /// /// 结算模式。 /// [StringLength(100)] public string SettlementMode { get; set; } = "PlatformCollect"; /// /// 说明。 /// [StringLength(500)] public string? Description { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertPlatformPaymentAppCommand ToCommand() => new(Id, AppCode, AppName, Status, SettlementMode, Description, Metadata); } /// /// 新增或更新平台支付渠道请求。 /// public sealed class UpsertPlatformPaymentChannelDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 支付应用 ID。 /// [Required] public Guid AppId { get; set; } /// /// 服务提供方。 /// [Required, StringLength(80)] public string Provider { get; set; } = "manual"; /// /// 模式。 /// [StringLength(100)] public string Mode { get; set; } = "PlatformCollect"; /// /// 状态。 /// public PlatformPaymentChannelStatus Status { get; set; } = PlatformPaymentChannelStatus.Disabled; /// /// 显示名称。 /// [Required, StringLength(200)] public string DisplayName { get; set; } = string.Empty; /// /// 密钥引用。 /// [StringLength(300)] public string? SecretRef { get; set; } /// /// 回调路径。 /// [StringLength(500)] public string? CallbackPath { get; set; } /// /// 优先级。 /// public int? Priority { get; set; } /// /// 公开配置内容。 /// public JsonElement ConfigPublic { get; set; } = JsonDefaults.Object(); /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertPlatformPaymentChannelCommand ToCommand() => new(Id, AppId, Provider, Mode, Status, DisplayName, SecretRef, CallbackPath, Priority, ConfigPublic, Metadata); } /// /// 新增或更新租户支付应用请求。 /// public sealed class UpsertPlatformTenantPaymentAppDto { /// /// 租户 ID。 /// [Required] public Guid TenantId { get; set; } /// /// 服务提供方。 /// [Required, StringLength(80)] public string Provider { get; set; } = "manual"; /// /// 状态。 /// public TenantExternalProviderStatus Status { get; set; } = TenantExternalProviderStatus.Disabled; /// /// 显示名称。 /// [StringLength(200)] public string? DisplayName { get; set; } /// /// 密钥引用。 /// [StringLength(300)] public string? SecretRef { get; set; } /// /// 优先级。 /// public int? Priority { get; set; } /// /// 公开配置内容。 /// public JsonElement ConfigPublic { get; set; } = JsonDefaults.Object(); /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantExternalProviderCommand ToCommand() => new(TenantExternalProviderCapability.Payment, Provider, Status, DisplayName, SecretRef, Priority, ConfigPublic, Metadata); }