using NetCorePal.Extensions.Domain; namespace Fengling.RiskControl.Domain.Aggregates.LotteryActivities; public class LotteryActivity : Entity, IAggregateRoot { public long MemberId { get; private set; } public string ActivityType { get; private set; } = string.Empty; public int StakePoints { get; private set; } public int? WinAmount { get; private set; } public LotteryStatus Status { get; private set; } = LotteryStatus.Pending; public string? IpAddress { get; private set; } public string? DeviceId { get; private set; } public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; public DateTime? CompletedAt { get; private set; } private LotteryActivity() { } public static LotteryActivity Create(long memberId, string activityType, int stakePoints, string? ipAddress = null, string? deviceId = null) { return new LotteryActivity { MemberId = memberId, ActivityType = activityType, StakePoints = stakePoints, Status = LotteryStatus.Pending, IpAddress = ipAddress, DeviceId = deviceId }; } public void MarkProcessing() { Status = LotteryStatus.Processing; } public void Complete(int winAmount, bool isWin) { Status = isWin ? LotteryStatus.Won : LotteryStatus.Lost; WinAmount = isWin ? winAmount : null; CompletedAt = DateTime.UtcNow; } public void Fail(string reason) { Status = LotteryStatus.Failed; CompletedAt = DateTime.UtcNow; } }