using System.Collections;
using System.Reflection;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using SqlSugar;
using Volo.Abp.Auditing;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Uow;
using Volo.Abp.Users;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.SqlSugarCore;
///
/// 默认SqlSugar数据库上下文实现
///
public class DefaultSqlSugarDbContext : SqlSugarDbContext
{
#region Protected Properties
///
/// 数据库连接配置选项
///
protected DbConnOptions DbOptions => LazyServiceProvider.LazyGetRequiredService>().Value;
///
/// 当前用户服务
///
protected ICurrentUser CurrentUserService => LazyServiceProvider.GetRequiredService();
///
/// GUID生成器
///
protected IGuidGenerator GuidGeneratorService => LazyServiceProvider.LazyGetRequiredService();
///
/// 日志工厂
///
protected ILoggerFactory LoggerFactory => LazyServiceProvider.LazyGetRequiredService();
///
/// 当前租户服务
///
protected ICurrentTenant CurrentTenantService => LazyServiceProvider.LazyGetRequiredService();
///
/// 数据过滤服务
///
protected IDataFilter DataFilterService => LazyServiceProvider.LazyGetRequiredService();
///
/// 工作单元管理器
///
protected IUnitOfWorkManager UnitOfWorkManagerService => LazyServiceProvider.LazyGetRequiredService();
///
/// 实体变更事件帮助类
///
protected IEntityChangeEventHelper EntityChangeEventHelperService =>
LazyServiceProvider.LazyGetService(NullEntityChangeEventHelper.Instance);
///
/// 是否启用多租户过滤
///
protected virtual bool IsMultiTenantFilterEnabled => DataFilterService?.IsEnabled() ?? false;
///
/// 是否启用软删除过滤
///
protected virtual bool IsSoftDeleteFilterEnabled => DataFilterService?.IsEnabled() ?? false;
#endregion
///
/// 构造函数
///
public DefaultSqlSugarDbContext(IAbpLazyServiceProvider lazyServiceProvider)
: base(lazyServiceProvider)
{
}
///
/// 自定义数据过滤器
///
protected override void CustomDataFilter(ISqlSugarClient sqlSugarClient)
{
// 配置软删除过滤器
if (IsSoftDeleteFilterEnabled)
{
sqlSugarClient.QueryFilter.AddTableFilter(entity => !entity.IsDeleted);
}
// 配置多租户过滤器
if (IsMultiTenantFilterEnabled)
{
var currentTenantId = CurrentTenantService.Id;
sqlSugarClient.QueryFilter.AddTableFilter(entity => entity.TenantId == currentTenantId);
}
}
///
/// 数据执行前的处理
///
public override void DataExecuting(object oldValue, DataFilterModel entityInfo)
{
HandleAuditFields(oldValue, entityInfo);
HandleEntityEvents(entityInfo);
HandleDomainEvents(entityInfo);
}
#region Private Methods
///
/// 处理审计字段
///
private void HandleAuditFields(object oldValue, DataFilterModel entityInfo)
{
switch (entityInfo.OperationType)
{
case DataFilterType.UpdateByObject:
HandleUpdateAuditFields(oldValue, entityInfo);
break;
case DataFilterType.InsertByObject:
HandleInsertAuditFields(oldValue, entityInfo);
break;
}
}
///
/// 处理更新时的审计字段
///
private void HandleUpdateAuditFields(object oldValue, DataFilterModel entityInfo)
{
if (entityInfo.PropertyName.Equals(nameof(IAuditedObject.LastModificationTime)))
{
entityInfo.SetValue(DateTime.MinValue.Equals(oldValue) ? null : DateTime.Now);
}
else if (entityInfo.PropertyName.Equals(nameof(IAuditedObject.LastModifierId))
&& entityInfo.EntityColumnInfo.PropertyInfo.PropertyType == typeof(Guid?))
{
entityInfo.SetValue(Guid.Empty.Equals(oldValue) ? null : CurrentUserService.Id);
}
}
///
/// 处理插入时的审计字段
///
private void HandleInsertAuditFields(object oldValue, DataFilterModel entityInfo)
{
if (entityInfo.PropertyName.Equals(nameof(IEntity.Id)))
{
if (typeof(Guid) == entityInfo.EntityColumnInfo.PropertyInfo.PropertyType)
{
if (Guid.Empty.Equals(oldValue))
{
entityInfo.SetValue(GuidGeneratorService.Create());
}
}
}
else if (entityInfo.PropertyName.Equals(nameof(IAuditedObject.CreationTime)))
{
if (DateTime.MinValue.Equals(oldValue))
{
entityInfo.SetValue(DateTime.Now);
}
}
else if (entityInfo.PropertyName.Equals(nameof(IAuditedObject.CreatorId)))
{
if (typeof(Guid?) == entityInfo.EntityColumnInfo.PropertyInfo.PropertyType)
{
if (CurrentUserService.Id is not null)
{
entityInfo.SetValue(CurrentUserService.Id);
}
}
}
else if (entityInfo.PropertyName.Equals(nameof(IMultiTenant.TenantId)))
{
if (CurrentTenantService.Id is not null)
{
entityInfo.SetValue(CurrentTenantService.Id);
}
}
}
///
/// 处理实体变更事件
///
private void HandleEntityEvents(DataFilterModel entityInfo)
{
// 实体变更领域事件
switch (entityInfo.OperationType)
{
case DataFilterType.InsertByObject:
if (entityInfo.PropertyName == nameof(IEntity