版本260406
This commit is contained in:
52
OrpaonVision.Core/Domain/AuditableEntityBase.cs
Normal file
52
OrpaonVision.Core/Domain/AuditableEntityBase.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
namespace OrpaonVision.Core.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// 可审计实体基类。
|
||||
/// </summary>
|
||||
public abstract class AuditableEntityBase : EntityBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||
|
||||
/// <summary>
|
||||
/// 创建者。
|
||||
/// </summary>
|
||||
public string? CreatedBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 更新时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? UpdatedAt { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 更新者。
|
||||
/// </summary>
|
||||
public string? UpdatedBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注。
|
||||
/// </summary>
|
||||
public string? Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 标记为已更新。
|
||||
/// </summary>
|
||||
/// <param name="updatedBy">更新者。</param>
|
||||
public virtual void MarkAsUpdated(string? updatedBy = null)
|
||||
{
|
||||
UpdatedAt = DateTime.UtcNow;
|
||||
UpdatedBy = updatedBy;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 标记为已创建。
|
||||
/// </summary>
|
||||
/// <param name="createdBy">创建者。</param>
|
||||
public virtual void MarkAsCreated(string? createdBy = null)
|
||||
{
|
||||
CreatedAt = DateTime.UtcNow;
|
||||
CreatedBy = createdBy;
|
||||
}
|
||||
}
|
||||
51
OrpaonVision.Core/Domain/EntityBase.cs
Normal file
51
OrpaonVision.Core/Domain/EntityBase.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
namespace OrpaonVision.Core.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// 实体基类。
|
||||
/// </summary>
|
||||
public abstract class EntityBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 主键ID。
|
||||
/// </summary>
|
||||
public long Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 判断实体是否为临时实体(未持久化)。
|
||||
/// </summary>
|
||||
public bool IsTransient => Id <= 0;
|
||||
|
||||
/// <summary>
|
||||
/// 重写Equals方法。
|
||||
/// </summary>
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
if (obj is null || obj.GetType() != GetType())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (obj is EntityBase other)
|
||||
{
|
||||
return other.Id == Id;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写GetHashCode方法。
|
||||
/// </summary>
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return Id.GetHashCode();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写ToString方法。
|
||||
/// </summary>
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{GetType().Name}#{Id}";
|
||||
}
|
||||
}
|
||||
76
OrpaonVision.Core/Domain/SoftDeleteEntityBase.cs
Normal file
76
OrpaonVision.Core/Domain/SoftDeleteEntityBase.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
namespace OrpaonVision.Core.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// 支持软删除的实体基类。
|
||||
/// </summary>
|
||||
public abstract class SoftDeleteEntityBase : AuditableEntityBase
|
||||
{
|
||||
private bool _isDeleted;
|
||||
|
||||
/// <summary>
|
||||
/// 是否已删除。
|
||||
/// </summary>
|
||||
public bool IsDeleted
|
||||
{
|
||||
get => _isDeleted;
|
||||
set
|
||||
{
|
||||
if (_isDeleted != value)
|
||||
{
|
||||
_isDeleted = value;
|
||||
if (value)
|
||||
{
|
||||
MarkAsUpdated("System-SoftDelete");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? DeletedAt { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 删除者。
|
||||
/// </summary>
|
||||
public string? DeletedBy { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 删除原因。
|
||||
/// </summary>
|
||||
public string? DeleteReason { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 标记为已删除。
|
||||
/// </summary>
|
||||
/// <param name="deletedBy">删除者。</param>
|
||||
/// <param name="deleteReason">删除原因。</param>
|
||||
public virtual void MarkAsDeleted(string? deletedBy = null, string? deleteReason = null)
|
||||
{
|
||||
if (!IsDeleted)
|
||||
{
|
||||
IsDeleted = true;
|
||||
DeletedAt = DateTime.UtcNow;
|
||||
DeletedBy = deletedBy;
|
||||
DeleteReason = deleteReason;
|
||||
MarkAsUpdated(deletedBy);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 恢复删除状态。
|
||||
/// </summary>
|
||||
/// <param name="restoredBy">恢复者。</param>
|
||||
public virtual void Restore(string? restoredBy = null)
|
||||
{
|
||||
if (IsDeleted)
|
||||
{
|
||||
IsDeleted = false;
|
||||
DeletedAt = null;
|
||||
DeletedBy = null;
|
||||
DeleteReason = null;
|
||||
MarkAsUpdated(restoredBy);
|
||||
}
|
||||
}
|
||||
}
|
||||
106
OrpaonVision.Core/Domain/VersionedEntityBase.cs
Normal file
106
OrpaonVision.Core/Domain/VersionedEntityBase.cs
Normal file
@@ -0,0 +1,106 @@
|
||||
namespace OrpaonVision.Core.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// 版本化实体基类。
|
||||
/// </summary>
|
||||
public abstract class VersionedEntityBase : AuditableEntityBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 版本号。
|
||||
/// </summary>
|
||||
public string VersionNo { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 状态。
|
||||
/// </summary>
|
||||
public int Status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发布时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? PublishedAt { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发布者。
|
||||
/// </summary>
|
||||
public string? PublishedBy { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否为当前版本。
|
||||
/// </summary>
|
||||
public bool IsCurrent { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否已发布。
|
||||
/// </summary>
|
||||
public bool IsPublished => PublishedAt.HasValue;
|
||||
|
||||
/// <summary>
|
||||
/// 标记为已发布。
|
||||
/// </summary>
|
||||
/// <param name="publishedBy">发布者。</param>
|
||||
public virtual void MarkAsPublished(string? publishedBy = null)
|
||||
{
|
||||
if (!IsPublished)
|
||||
{
|
||||
PublishedAt = DateTime.UtcNow;
|
||||
PublishedBy = publishedBy;
|
||||
Status = 1; // 已发布状态
|
||||
MarkAsUpdated(publishedBy);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 标记为当前版本。
|
||||
/// </summary>
|
||||
/// <param name="updatedBy">更新者。</param>
|
||||
public virtual void MarkAsCurrent(string? updatedBy = null)
|
||||
{
|
||||
if (!IsCurrent)
|
||||
{
|
||||
IsCurrent = true;
|
||||
MarkAsUpdated(updatedBy);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取消当前版本状态。
|
||||
/// </summary>
|
||||
/// <param name="updatedBy">更新者。</param>
|
||||
public virtual void UnmarkCurrent(string? updatedBy = null)
|
||||
{
|
||||
if (IsCurrent)
|
||||
{
|
||||
IsCurrent = false;
|
||||
MarkAsUpdated(updatedBy);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置版本号。
|
||||
/// </summary>
|
||||
/// <param name="versionNo">版本号。</param>
|
||||
/// <param name="updatedBy">更新者。</param>
|
||||
public virtual void SetVersionNo(string versionNo, string? updatedBy = null)
|
||||
{
|
||||
if (VersionNo != versionNo)
|
||||
{
|
||||
VersionNo = versionNo;
|
||||
MarkAsUpdated(updatedBy);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置状态。
|
||||
/// </summary>
|
||||
/// <param name="status">状态。</param>
|
||||
/// <param name="updatedBy">更新者。</param>
|
||||
public virtual void SetStatus(int status, string? updatedBy = null)
|
||||
{
|
||||
if (Status != status)
|
||||
{
|
||||
Status = status;
|
||||
MarkAsUpdated(updatedBy);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user