diff --git a/Src/Dlhis.Middle/Packs/SqlSugarPack.cs b/Src/Dlhis.Middle/Packs/SqlSugarPack.cs index 06656513..347518f5 100644 --- a/Src/Dlhis.Middle/Packs/SqlSugarPack.cs +++ b/Src/Dlhis.Middle/Packs/SqlSugarPack.cs @@ -1,13 +1,132 @@ -using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; +using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Attributes; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Options; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Startup; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Options; using SqlSugar; namespace Dlhis.Middle.Packs; public class SqlSugarPack : BaseAppPack { + private const string _infoTemplate = "ExecuteCommand[{ms}] Timeout[{timeout}] \r\n {sql}"; + public override void ConfigureServices(IServiceCollection services) { services.AddSqlSugar(DbType.Sqlite); + services.Replace(ServiceDescriptor.Scoped(typeof(ISqlSugarClient), sp => + { + var options = sp.GetService>().Value; + var logger = sp.GetService>(); + var currentUser = sp.GetService(); + var sugarOptions = sp.GetService(); + + var configs = new List + { + new() + { + ConfigId = "db-main", + + ConnectionString = options.DefaultConnectionString, + DbType = DbType.Sqlite, + InitKeyType = InitKeyType.Attribute, + IsAutoCloseConnection = true, + + MoreSettings = new ConnMoreSettings + { + DisableNvarchar = true, + }, + ConfigureExternalServices = new ConfigureExternalServices + { + EntityService = (c, p) => + { + if (!p.IsPrimarykey && c.PropertyType.IsGenericType && c.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) + || (!p.IsPrimarykey && p.PropertyInfo.PropertyType == typeof(string))) + { + p.IsNullable = true; + } + } + } + } + }; + + ISqlSugarClient db = new SqlSugarClient(configs); + + db.Ado.CommandTimeOut = options.Timeout; + + db.Aop.OnLogExecuted = (sql, parameters) => + { + var ms = db.Ado.SqlExecutionTime.Milliseconds; + + //警告慢sql + if (ms >= options.SlowSqlTime * 1000) + logger.LogWarning(message: _infoTemplate, ms, options.Timeout, sql); + + if (options.EnableSqlLog) + { + sql = UtilMethods.GetSqlString(DbType.MySql, sql, parameters); + logger.LogInformation(message: _infoTemplate, ms, options.Timeout, sql); + } + }; + + //软删除 + db.QueryFilter.AddTableFilter(x => x.IsDeleted == false); + + + //增删改 + db.Aop.DataExecuting = (oldValue, model) => + { + if (sugarOptions.IgnoreTenant == false //启用租户 + && currentUser != null //用户信息存在 + && model.PropertyName == nameof(ITenantId.TenantId) //当前为租户字段 + && typeof(ITenantId).IsAssignableFrom(model.EntityValue.GetType())) //继承ITenantId + { + var tenant = currentUser.GetStringTenantId(); + model.SetValue(tenant); + } + + //处理人员和时间字段 + switch (model.OperationType) + { + case DataFilterType.InsertByObject: + { + if (model.IsAnyAttribute()) + { + model.SetValue(DateTime.Now); + } + + if (currentUser != null && model.IsAnyAttribute()) + { + if ((int)model.EntityColumnInfo.PropertyInfo.GetValue(model.EntityValue) == 0) + { + model.SetValue(currentUser.GetStringSubjectId()); + } + } + + break; + } + case DataFilterType.UpdateByObject: + { + if (model.IsAnyAttribute()) + { + model.SetValue(DateTime.Now); + } + + if (currentUser != null && model.IsAnyAttribute()) + { + model.SetValue(currentUser.GetStringSubjectId()); + } + + break; + } + } + }; + + return db; + })); } } \ No newline at end of file