Files
tiku-backend.net/Tiku.Domain/Platform/SaasBillingEntities.cs
xiong c497a3ca8d
Some checks failed
ci / release-gate (push) Has been cancelled
清理代码
2026-08-03 12:31:39 +08:00

366 lines
12 KiB
C#

using System.Text.Json;
using Tiku.Domain.Common;
using Tiku.Domain.Operations;
namespace Tiku.Domain.Platform;
public sealed class SaasFeature : AuditableEntity
{
public string Code { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string Category { get; set; } = string.Empty;
public string? Description { get; set; }
public int ReferencePriceCents { get; set; }
public string Currency { get; set; } = "CNY";
public SaasFeatureStatus Status { get; set; } = SaasFeatureStatus.Draft;
public bool IsCore { get; set; }
public int SortOrder { get; set; } = 100;
}
public sealed class PermissionModule : AuditableEntity
{
public string Code { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public BackendPermissionArea Area { get; set; } = BackendPermissionArea.Tenant;
public string? RequiredFeatureCode { get; set; }
public string? Description { get; set; }
public int SortOrder { get; set; } = 100;
}
public sealed class SaasOffering : AuditableEntity
{
public string Code { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public SaasOfferingType Type { get; set; } = SaasOfferingType.BasePlan;
public SaasOfferingStatus Status { get; set; } = SaasOfferingStatus.Draft;
public string? Description { get; set; }
public int SortOrder { get; set; } = 100;
}
public sealed class SaasOfferingVersion : AuditableEntity
{
public Guid OfferingId { get; set; }
public int Version { get; set; } = 1;
public SaasOfferingVersionStatus Status { get; set; } = SaasOfferingVersionStatus.Draft;
public PlatformBillingCycle BillingCycle { get; set; } = PlatformBillingCycle.Yearly;
public int OriginalAmountCents { get; set; }
public int AmountCents { get; set; }
public string Currency { get; set; } = "CNY";
public DateTimeOffset? EffectiveAt { get; set; }
public DateTimeOffset? PublishedAt { get; set; }
public DateTimeOffset? RetiredAt { get; set; }
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class SaasOfferingVersionFeature : Entity
{
public Guid OfferingVersionId { get; set; }
public string FeatureCode { get; set; } = string.Empty;
}
public sealed class SaasFeatureLimitDefinition : AuditableEntity
{
public string MetricCode { get; set; } = string.Empty;
public string FeatureCode { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string Unit { get; set; } = "count";
public SaasFeatureLimitKind Kind { get; set; } = SaasFeatureLimitKind.Current;
public int WarningPercent { get; set; } = 80;
public bool IsHardLimit { get; set; } = true;
}
public sealed class SaasOfferingVersionLimit : Entity
{
public Guid OfferingVersionId { get; set; }
public string MetricCode { get; set; } = string.Empty;
public long LimitValue { get; set; }
}
public sealed class TenantSaasSubscription : AuditableTenantEntity
{
public Guid BaseOfferingVersionId { get; set; }
public Guid? ScheduledBaseOfferingVersionId { get; set; }
public TenantSaasSubscriptionStatus Status { get; set; } = TenantSaasSubscriptionStatus.Trial;
public DateTimeOffset StartsAt { get; set; }
public DateTimeOffset CurrentPeriodStart { get; set; }
public DateTimeOffset CurrentPeriodEnd { get; set; }
public bool CancelAtPeriodEnd { get; set; }
public DateTimeOffset? CancelledAt { get; set; }
public long LifecycleVersion { get; set; }
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class TenantSaasSubscriptionItem : AuditableTenantEntity
{
public Guid SubscriptionId { get; set; }
public Guid OfferingVersionId { get; set; }
public Guid? SourceOrderItemId { get; set; }
public TenantSaasSubscriptionItemType ItemType { get; set; } = TenantSaasSubscriptionItemType.BasePlan;
public TenantSaasSubscriptionItemStatus Status { get; set; } = TenantSaasSubscriptionItemStatus.Active;
public DateTimeOffset StartsAt { get; set; }
public DateTimeOffset EndsAt { get; set; }
}
public sealed class TenantFeatureOverride : AuditableTenantEntity
{
public string FeatureCode { get; set; } = string.Empty;
public TenantFeatureOverrideMode Mode { get; set; } = TenantFeatureOverrideMode.Disabled;
public DateTimeOffset? ExpiresAt { get; set; }
public string Reason { get; set; } = string.Empty;
}
public sealed class TenantFeatureUsage : AuditableTenantEntity
{
public string MetricCode { get; set; } = string.Empty;
public DateTimeOffset PeriodStart { get; set; }
public DateTimeOffset PeriodEnd { get; set; }
public long UsedValue { get; set; }
public long LimitValueSnapshot { get; set; }
public bool WarningIssued { get; set; }
public long Version { get; set; }
}
public sealed class PlatformBillingQuote : AuditableTenantEntity
{
public string QuoteNo { get; set; } = string.Empty;
public string IdempotencyKey { get; set; } = string.Empty;
public PlatformBillingQuoteStatus Status { get; set; } = PlatformBillingQuoteStatus.Active;
public PlatformBillingOrderPurpose Purpose { get; set; } = PlatformBillingOrderPurpose.NewSubscription;
public int OriginalAmountCents { get; set; }
public int DiscountAmountCents { get; set; }
public int TotalAmountCents { get; set; }
public string Currency { get; set; } = "CNY";
public DateTimeOffset ExpiresAt { get; set; }
public JsonElement FeatureSnapshot { get; set; } = JsonDefaults.Array();
public JsonElement LimitSnapshot { get; set; } = JsonDefaults.Object();
}
public sealed class PlatformBillingQuoteItem : Entity, ITenantOwned
{
public Guid QuoteId { get; set; }
public Guid OfferingVersionId { get; set; }
public PlatformBillingItemType ItemType { get; set; } = PlatformBillingItemType.BasePlan;
public int Quantity { get; set; } = 1;
public int UnitAmountCents { get; set; }
public int AmountCents { get; set; }
public JsonElement Snapshot { get; set; } = JsonDefaults.Object();
public Guid TenantId { get; set; }
}
public sealed class PlatformBillingOrder : AuditableTenantEntity
{
public Guid QuoteId { get; set; }
public string OrderNo { get; set; } = string.Empty;
public string IdempotencyKey { get; set; } = string.Empty;
public PlatformBillingOrderPurpose Purpose { get; set; } = PlatformBillingOrderPurpose.NewSubscription;
public PlatformBillingOrderStatus Status { get; set; } = PlatformBillingOrderStatus.PendingPayment;
public int OriginalAmountCents { get; set; }
public int DiscountAmountCents { get; set; }
public int TotalAmountCents { get; set; }
public string Currency { get; set; } = "CNY";
public DateTimeOffset ExpiresAt { get; set; }
public DateTimeOffset? PaidAt { get; set; }
public DateTimeOffset? CancelledAt { get; set; }
public JsonElement Snapshot { get; set; } = JsonDefaults.Object();
}
public sealed class PlatformBillingOrderItem : Entity, ITenantOwned
{
public Guid OrderId { get; set; }
public Guid OfferingVersionId { get; set; }
public PlatformBillingItemType ItemType { get; set; } = PlatformBillingItemType.BasePlan;
public int Quantity { get; set; } = 1;
public int UnitAmountCents { get; set; }
public int AmountCents { get; set; }
public JsonElement Snapshot { get; set; } = JsonDefaults.Object();
public Guid TenantId { get; set; }
}
public sealed class PlatformBillingPayment : AuditableTenantEntity
{
public Guid OrderId { get; set; }
public string PaymentNo { get; set; } = string.Empty;
public string IdempotencyKey { get; set; } = string.Empty;
public string Provider { get; set; } = string.Empty;
public string Method { get; set; } = string.Empty;
public PlatformBillingPaymentStatus Status { get; set; } = PlatformBillingPaymentStatus.Pending;
public int AmountCents { get; set; }
public string? ProviderTradeNo { get; set; }
public DateTimeOffset? PaidAt { get; set; }
public JsonElement ClientPayload { get; set; } = JsonDefaults.Object();
}
public sealed class PlatformBillingPaymentEvent : Entity, ITenantOwned
{
public Guid PaymentId { get; set; }
public string Provider { get; set; } = string.Empty;
public string ProviderEventId { get; set; } = string.Empty;
public string EventType { get; set; } = string.Empty;
public JsonElement Payload { get; set; } = JsonDefaults.Object();
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
public Guid TenantId { get; set; }
}
public sealed class PlatformBillingRefund : AuditableTenantEntity
{
public Guid OrderId { get; set; }
public Guid? PaymentId { get; set; }
public string RefundNo { get; set; } = string.Empty;
public PlatformBillingRefundStatus Status { get; set; } = PlatformBillingRefundStatus.Requested;
public int AmountCents { get; set; }
public string Reason { get; set; } = string.Empty;
public string? ProviderRefundNo { get; set; }
public DateTimeOffset? CompletedAt { get; set; }
public string IdempotencyKey { get; set; } = string.Empty;
public PlatformBillingRefundSubscriptionEffect SubscriptionEffect { get; set; } =
PlatformBillingRefundSubscriptionEffect.KeepService;
public Guid? RequestedBy { get; set; }
public Guid? ReviewedBy { get; set; }
public DateTimeOffset? ReviewedAt { get; set; }
public string? ReviewReason { get; set; }
public string? LastError { get; set; }
}
public sealed class PlatformBillingInvoice : AuditableTenantEntity
{
public Guid? OrderId { get; set; }
public string InvoiceNo { get; set; } = string.Empty;
public PlatformBillingInvoiceStatus Status { get; set; } = PlatformBillingInvoiceStatus.Draft;
public int TotalAmountCents { get; set; }
public string Currency { get; set; } = "CNY";
public DateOnly? DueDate { get; set; }
public DateTimeOffset? IssuedAt { get; set; }
public DateTimeOffset? PaidAt { get; set; }
public JsonElement BillingProfileSnapshot { get; set; } = JsonDefaults.Object();
}
public enum SaasFeatureStatus
{
Draft,
Active,
Archived
}
public enum SaasOfferingType
{
BasePlan,
AddOn
}
public enum SaasOfferingStatus
{
Draft,
Active,
Archived
}
public enum SaasOfferingVersionStatus
{
Draft,
Published,
Retired
}
public enum SaasFeatureLimitKind
{
Current,
Period
}
public enum TenantSaasSubscriptionStatus
{
Trial,
Active,
PastDue,
Cancelled,
Expired,
Suspended
}
public enum TenantSaasSubscriptionItemType
{
BasePlan,
AddOn
}
public enum TenantSaasSubscriptionItemStatus
{
Pending,
Active,
Scheduled,
Cancelled,
Expired
}
public enum TenantFeatureOverrideMode
{
Enabled,
Disabled
}
public enum PlatformBillingQuoteStatus
{
Active,
Converted,
Expired,
Cancelled
}
public enum PlatformBillingOrderPurpose
{
NewSubscription,
Renewal,
Upgrade,
Downgrade,
AddOn
}
public enum PlatformBillingOrderStatus
{
PendingPayment,
Paid,
Cancelled,
Expired,
Refunded
}
public enum PlatformBillingItemType
{
BasePlan,
AddOn
}
public enum PlatformBillingPaymentStatus
{
Pending,
Succeeded,
Failed,
Refunded
}
public enum PlatformBillingRefundStatus
{
Requested,
Processing,
Succeeded,
Failed,
Cancelled
}
public enum PlatformBillingInvoiceStatus
{
Draft,
Issued,
Paid,
Void,
Overdue
}
public enum PlatformBillingRefundSubscriptionEffect
{
KeepService,
CancelAtPeriodEnd,
TerminateImmediately
}