using MediatR; using TakeoutSaaS.Application.App.Tenants.Contracts; using TakeoutSaaS.Domain.Billings.Enums; using TakeoutSaaS.Domain.Tenants.Enums; namespace TakeoutSaaS.Application.App.Tenants.Commands; /// /// 后台手动新增租户命令(直接入驻:创建租户 + 认证 + 订阅 + 管理员账号)。 /// public sealed record CreateTenantManuallyCommand : IRequest { // 1. 租户基本信息(public.tenants) /// /// 租户编码(唯一)。 /// public required string Code { get; init; } /// /// 租户名称。 /// public required string Name { get; init; } /// /// 租户简称。 /// public string? ShortName { get; init; } /// /// 法人/公司主体名称。 /// public string? LegalEntityName { get; init; } /// /// 所属行业。 /// public string? Industry { get; init; } /// /// LOGO 图片地址。 /// public string? LogoUrl { get; init; } /// /// 封面图地址。 /// public string? CoverImageUrl { get; init; } /// /// 官网地址。 /// public string? Website { get; init; } /// /// 国家/地区。 /// public string? Country { get; init; } /// /// 省份。 /// public string? Province { get; init; } /// /// 城市。 /// public string? City { get; init; } /// /// 详细地址。 /// public string? Address { get; init; } /// /// 联系人姓名。 /// public string? ContactName { get; init; } /// /// 联系人电话。 /// public string? ContactPhone { get; init; } /// /// 联系人邮箱。 /// public string? ContactEmail { get; init; } /// /// 标签(逗号分隔)。 /// public string? Tags { get; init; } /// /// 备注。 /// public string? Remarks { get; init; } /// /// 暂停时间。 /// public DateTime? SuspendedAt { get; init; } /// /// 暂停原因。 /// public string? SuspensionReason { get; init; } /// /// 租户状态。 /// public TenantStatus TenantStatus { get; init; } = TenantStatus.Active; /// /// 是否跳过审核(直接激活)。 /// /// /// true:租户状态设为 Active,认证状态设为 Approved(默认)。 /// false:租户状态设为 PendingReview,认证状态设为 Pending,需后续审核。 /// public bool IsSkipApproval { get; init; } = true; // 2. 订阅信息(public.tenant_subscriptions) /// /// 套餐 ID(雪花算法,字符串传输)。 /// public required string TenantPackageId { get; init; } /// /// 订阅时长(月)。 /// public int DurationMonths { get; init; } = 12; /// /// 是否自动续费。 /// public bool AutoRenew { get; init; } /// /// 订阅生效时间。 /// public DateTime? SubscriptionEffectiveFrom { get; init; } /// /// 下次计费日期。 /// public DateTime? NextBillingDate { get; init; } /// /// 订阅状态(0=待激活, 1=生效中, 2=宽限期, 3=已取消, 4=已暂停)。 /// public SubscriptionStatus SubscriptionStatus { get; init; } = SubscriptionStatus.Active; /// /// 预约变更的套餐 ID。 /// public string? ScheduledPackageId { get; init; } /// /// 订阅备注。 /// public string? SubscriptionNotes { get; init; } // 3. 认证信息(public.tenant_verification_profiles) /// /// 认证状态。 /// public TenantVerificationStatus VerificationStatus { get; init; } = TenantVerificationStatus.Approved; /// /// 营业执照号。 /// public string? BusinessLicenseNumber { get; init; } /// /// 营业执照图片 URL。 /// public string? BusinessLicenseUrl { get; init; } /// /// 法人姓名。 /// public string? LegalPersonName { get; init; } /// /// 法人身份证号。 /// public string? LegalPersonIdNumber { get; init; } /// /// 法人身份证正面 URL。 /// public string? LegalPersonIdFrontUrl { get; init; } /// /// 法人身份证背面 URL。 /// public string? LegalPersonIdBackUrl { get; init; } /// /// 银行账户名。 /// public string? BankAccountName { get; init; } /// /// 银行账号。 /// public string? BankAccountNumber { get; init; } /// /// 开户银行。 /// public string? BankName { get; init; } /// /// 附加数据 JSON。 /// public string? AdditionalDataJson { get; init; } /// /// 审核人姓名。 /// public string? ReviewedByName { get; init; } /// /// 审核备注。 /// public string? ReviewRemarks { get; init; } // 4. 管理员账号(identity.identity_users) /// /// 管理员登录账号。 /// public required string AdminAccount { get; init; } /// /// 管理员显示名称。 /// public required string AdminDisplayName { get; init; } /// /// 管理员密码(明文,后端哈希)。 /// public required string AdminPassword { get; init; } /// /// 管理员头像。 /// public string? AdminAvatar { get; init; } /// /// 管理员所属商户 ID。 /// public string? AdminMerchantId { get; init; } // 5. 账单信息(public.tenant_billing_statements) /// /// 是否创建账单。 /// public bool CreateBilling { get; init; } = true; /// /// 账单金额(不填则根据套餐价格×月数计算)。 /// public decimal? BillingAmount { get; init; } /// /// 折扣金额。 /// public decimal? BillingDiscountAmount { get; init; } /// /// 账单状态(默认已支付)。 /// public TenantBillingStatus BillingStatus { get; init; } = TenantBillingStatus.Paid; /// /// 账单备注。 /// public string? BillingNotes { get; init; } }