feat: add points rule domain entities

This commit is contained in:
Sam 2026-02-08 21:23:46 +08:00
parent 90c6912fd5
commit 176120d51f
4 changed files with 108 additions and 0 deletions

View File

@ -0,0 +1,65 @@
using Fengling.Member.Domain.Aggregates.PointsRuleModel.Enums;
namespace Fengling.Member.Domain.Aggregates.PointsRuleModel;
public class PointsRule : Entity<PointsRuleId>, IAggregateRoot
{
public string Name { get; private set; } = string.Empty;
public string Code { get; private set; } = string.Empty;
public RuleType RuleType { get; private set; }
public int BasePoints { get; private set; }
public decimal? WeightFactor { get; private set; }
public int ValidityDays { get; private set; }
public int Priority { get; private set; }
public CalculationMode CalculationMode { get; private set; }
public bool IsActive { get; private set; }
public DateTime EffectiveFrom { get; private set; }
public DateTime? EffectiveTo { get; private set; }
public DateTime CreatedAt { get; private set; }
public DateTime UpdatedAt { get; private set; }
private readonly List<PointsRuleCondition> _conditions = new();
public IReadOnlyCollection<PointsRuleCondition> Conditions => _conditions.AsReadOnly();
private PointsRule() { }
public static PointsRule Create(
string name,
string code,
RuleType ruleType,
int basePoints,
int validityDays,
int priority = 0,
CalculationMode calculationMode = CalculationMode.Synchronous,
decimal? weightFactor = null)
{
return new PointsRule
{
Id = PointsRuleId.New(),
Name = name,
Code = code,
RuleType = ruleType,
BasePoints = basePoints,
ValidityDays = validityDays,
Priority = priority,
CalculationMode = calculationMode,
WeightFactor = weightFactor,
IsActive = true,
EffectiveFrom = DateTime.UtcNow,
CreatedAt = DateTime.UtcNow,
UpdatedAt = DateTime.UtcNow
};
}
public void AddCondition(PointsRuleCondition condition)
{
_conditions.Add(condition);
UpdatedAt = DateTime.UtcNow;
}
public void Deactivate()
{
IsActive = false;
UpdatedAt = DateTime.UtcNow;
}
}

View File

@ -0,0 +1,31 @@
using Fengling.Member.Domain.Aggregates.PointsRuleModel.Enums;
namespace Fengling.Member.Domain.Aggregates.PointsRuleModel;
public class PointsRuleCondition : Entity<PointsRuleConditionId>
{
public PointsRuleId RuleId { get; private set; } = default!;
public DimensionType DimensionType { get; private set; }
public string DimensionValue { get; private set; } = string.Empty;
public string? Operator { get; private set; }
public DateTime CreatedAt { get; private set; }
private PointsRuleCondition() { }
public static PointsRuleCondition Create(
PointsRuleId ruleId,
DimensionType dimensionType,
string dimensionValue,
string? op = null)
{
return new PointsRuleCondition
{
Id = PointsRuleConditionId.New(),
RuleId = ruleId,
DimensionType = dimensionType,
DimensionValue = dimensionValue,
Operator = op,
CreatedAt = DateTime.UtcNow
};
}
}

View File

@ -0,0 +1,6 @@
namespace Fengling.Member.Domain.Aggregates.PointsRuleModel;
public partial record PointsRuleConditionId : IGuidStronglyTypedId
{
public static PointsRuleConditionId New() => new(Guid.NewGuid());
}

View File

@ -0,0 +1,6 @@
namespace Fengling.Member.Domain.Aggregates.PointsRuleModel;
public partial record PointsRuleId : IGuidStronglyTypedId
{
public static PointsRuleId New() => new(Guid.NewGuid());
}