Project.Fengling.QoderVersion/Backend/src/Fengling.Backend.Domain/AggregatesModel/PointsTransactionAggregate/PointsTransaction.cs
sam e24925e1ed chore(build): 添加基础构建配置和版本管理
- 新增 .dockerignore 文件,忽略多种临时及中间文件
- 新增 .gitattributes 文件,配置文本文件换行及合并行为
- 新增详细的 .gitignore 文件,排除多种开发及生成文件
- 新增 VS Code C# 代码片段,提升开发效率
- 添加 Directory.Build.props,统一 MSBuild 配置和代码分析规则
- 添加空的 Directory.Build.targets,预留构建任务扩展位置
- 添加 Directory.Packages.props,实现依赖包版本集中管理和声明
2026-02-11 12:58:54 +08:00

184 lines
4.4 KiB
C#

using Fengling.Backend.Domain.AggregatesModel.MemberAggregate;
namespace Fengling.Backend.Domain.AggregatesModel.PointsTransactionAggregate;
/// <summary>
/// 积分交易ID
/// </summary>
public partial record PointsTransactionId : IGuidStronglyTypedId;
/// <summary>
/// 积分交易聚合根
/// </summary>
public class PointsTransaction : Entity<PointsTransactionId>, IAggregateRoot
{
protected PointsTransaction() { }
/// <summary>
/// 创建积分交易记录
/// </summary>
public static PointsTransaction CreateEarnTransaction(
MemberId memberId,
int amount,
string source,
string reason,
Guid relatedId,
DateTime expiryDate)
{
if (amount <= 0)
throw new KnownException("积分数量必须大于0");
return new PointsTransaction
{
MemberId = memberId,
Type = PointsTransactionType.Earn,
Amount = amount,
Source = source,
Reason = reason,
RelatedId = relatedId,
ExpiryDate = expiryDate,
CreatedAt = DateTime.UtcNow
};
}
/// <summary>
/// 创建积分消费记录
/// </summary>
public static PointsTransaction CreateConsumeTransaction(
MemberId memberId,
int amount,
string reason,
Guid orderId)
{
if (amount <= 0)
throw new KnownException("积分数量必须大于0");
return new PointsTransaction
{
MemberId = memberId,
Type = PointsTransactionType.Consume,
Amount = amount,
Source = "兑换消费",
Reason = reason,
RelatedId = orderId,
CreatedAt = DateTime.UtcNow
};
}
/// <summary>
/// 创建积分退还记录
/// </summary>
public static PointsTransaction CreateRefundTransaction(
MemberId memberId,
int amount,
string reason,
Guid orderId)
{
if (amount <= 0)
throw new KnownException("积分数量必须大于0");
return new PointsTransaction
{
MemberId = memberId,
Type = PointsTransactionType.Refund,
Amount = amount,
Source = "订单退还",
Reason = reason,
RelatedId = orderId,
CreatedAt = DateTime.UtcNow
};
}
/// <summary>
/// 创建积分过期记录
/// </summary>
public static PointsTransaction CreateExpireTransaction(
MemberId memberId,
int amount,
Guid batchId)
{
if (amount <= 0)
throw new KnownException("积分数量必须大于0");
return new PointsTransaction
{
MemberId = memberId,
Type = PointsTransactionType.Expire,
Amount = amount,
Source = "积分过期",
Reason = "积分已过期自动失效",
RelatedId = batchId,
CreatedAt = DateTime.UtcNow
};
}
/// <summary>
/// 会员ID
/// </summary>
public MemberId MemberId { get; private set; } = default!;
/// <summary>
/// 交易类型
/// </summary>
public PointsTransactionType Type { get; private set; }
/// <summary>
/// 积分数量
/// </summary>
public int Amount { get; private set; }
/// <summary>
/// 来源
/// </summary>
public string Source { get; private set; } = string.Empty;
/// <summary>
/// 原因描述
/// </summary>
public string Reason { get; private set; } = string.Empty;
/// <summary>
/// 关联ID(营销码ID/订单ID等)
/// </summary>
public Guid RelatedId { get; private set; }
/// <summary>
/// 过期时间(仅获取类型有效)
/// </summary>
public DateTime? ExpiryDate { get; private set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreatedAt { get; private set; }
public Deleted Deleted { get; private set; } = new();
public RowVersion RowVersion { get; private set; } = new(0);
}
/// <summary>
/// 积分交易类型
/// </summary>
public enum PointsTransactionType
{
/// <summary>
/// 获得
/// </summary>
Earn = 1,
/// <summary>
/// 消费
/// </summary>
Consume = 2,
/// <summary>
/// 过期
/// </summary>
Expire = 3,
/// <summary>
/// 退还
/// </summary>
Refund = 4
}