Files
tiku-backend.net/Tiku.Domain/Commerce/PointEntities.cs
2026-07-26 19:53:45 +08:00

75 lines
3.4 KiB
C#

using System.Text.Json;
using Tiku.Domain.Common;
namespace Tiku.Domain.Commerce;
public sealed class PointActivityTask : AuditableTenantEntity
{
public string TaskKey { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string? Description { get; set; }
public PointActivityTaskType TaskType { get; set; } = PointActivityTaskType.Manual;
public PointActivityTaskStatus Status { get; set; } = PointActivityTaskStatus.Active;
public int Points { get; set; }
public int MaxClaimsPerUser { get; set; } = 1;
public DateTimeOffset? StartsAt { get; set; }
public DateTimeOffset? EndsAt { get; set; }
public int SortOrder { get; set; }
public JsonElement Rules { get; set; } = JsonDefaults.Object();
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class PointActivityClaim : AuditableTenantEntity
{
public Guid TaskId { get; set; }
public Guid UserId { get; set; }
public string TaskKey { get; set; } = string.Empty;
public int Points { get; set; }
public PointActivityClaimStatus Status { get; set; } = PointActivityClaimStatus.Claimed;
public string? SourceType { get; set; }
public Guid? SourceId { get; set; }
public DateTimeOffset ClaimedAt { get; set; } = DateTimeOffset.UtcNow;
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class PointExchangeItem : AuditableTenantEntity
{
public Guid? RegionId { get; set; }
public string ItemKey { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
public PointExchangeItemType ItemType { get; set; } = PointExchangeItemType.Entitlement;
public PointExchangeItemStatus Status { get; set; } = PointExchangeItemStatus.Active;
public int PointsCost { get; set; }
public int? Stock { get; set; }
public int? Days { get; set; }
public int SortOrder { get; set; }
public DateTimeOffset? StartsAt { get; set; }
public DateTimeOffset? EndsAt { get; set; }
public JsonElement FulfillmentPayload { get; set; } = JsonDefaults.Object();
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class PointExchangeOrder : AuditableTenantEntity
{
public Guid ItemId { get; set; }
public Guid UserId { get; set; }
public string OrderNo { get; set; } = string.Empty;
public string ItemName { get; set; } = string.Empty;
public PointExchangeItemType ItemType { get; set; } = PointExchangeItemType.Entitlement;
public PointExchangeOrderStatus Status { get; set; } = PointExchangeOrderStatus.Completed;
public int PointsCost { get; set; }
public DateTimeOffset OrderedAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset? CompletedAt { get; set; }
public DateTimeOffset? CancelledAt { get; set; }
public JsonElement FulfillmentSnapshot { get; set; } = JsonDefaults.Object();
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public enum PointActivityTaskType { Manual, DailyLogin, Practice, VocabularyReview, BadgeUnlock }
public enum PointActivityTaskStatus { Active, Disabled, Expired }
public enum PointActivityClaimStatus { Claimed, Cancelled }
public enum PointExchangeItemType { Entitlement, Coupon, Virtual, Other }
public enum PointExchangeItemStatus { Active, Disabled, SoldOut }
public enum PointExchangeOrderStatus { Pending, Completed, Cancelled, Failed }