版本260406

This commit is contained in:
2026-04-06 22:04:05 +08:00
parent 7dc5e73af7
commit 0b150470be
216 changed files with 98993 additions and 33 deletions

View 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;
}
}

View 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}";
}
}

View 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);
}
}
}

View 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);
}
}
}