From 176120d51f60f72a0955d6117072d86e008872f4 Mon Sep 17 00:00:00 2001 From: Sam <315859133@qq.com> Date: Sun, 8 Feb 2026 21:23:46 +0800 Subject: [PATCH] feat: add points rule domain entities --- .../Aggregates/PointsRuleModel/PointsRule.cs | 65 +++++++++++++++++++ .../PointsRuleModel/PointsRuleCondition.cs | 31 +++++++++ .../PointsRuleModel/PointsRuleConditionId.cs | 6 ++ .../PointsRuleModel/PointsRuleId.cs | 6 ++ 4 files changed, 108 insertions(+) create mode 100644 src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRule.cs create mode 100644 src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleCondition.cs create mode 100644 src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleConditionId.cs create mode 100644 src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleId.cs diff --git a/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRule.cs b/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRule.cs new file mode 100644 index 0000000..6401693 --- /dev/null +++ b/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRule.cs @@ -0,0 +1,65 @@ +using Fengling.Member.Domain.Aggregates.PointsRuleModel.Enums; + +namespace Fengling.Member.Domain.Aggregates.PointsRuleModel; + +public class PointsRule : Entity, 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 _conditions = new(); + public IReadOnlyCollection 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; + } +} diff --git a/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleCondition.cs b/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleCondition.cs new file mode 100644 index 0000000..a17e36b --- /dev/null +++ b/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleCondition.cs @@ -0,0 +1,31 @@ +using Fengling.Member.Domain.Aggregates.PointsRuleModel.Enums; + +namespace Fengling.Member.Domain.Aggregates.PointsRuleModel; + +public class PointsRuleCondition : Entity +{ + 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 + }; + } +} diff --git a/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleConditionId.cs b/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleConditionId.cs new file mode 100644 index 0000000..12f80ec --- /dev/null +++ b/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleConditionId.cs @@ -0,0 +1,6 @@ +namespace Fengling.Member.Domain.Aggregates.PointsRuleModel; + +public partial record PointsRuleConditionId : IGuidStronglyTypedId +{ + public static PointsRuleConditionId New() => new(Guid.NewGuid()); +} diff --git a/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleId.cs b/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleId.cs new file mode 100644 index 0000000..228971a --- /dev/null +++ b/src/Fengling.Member.Domain/Aggregates/PointsRuleModel/PointsRuleId.cs @@ -0,0 +1,6 @@ +namespace Fengling.Member.Domain.Aggregates.PointsRuleModel; + +public partial record PointsRuleId : IGuidStronglyTypedId +{ + public static PointsRuleId New() => new(Guid.NewGuid()); +}