using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Device.Entities; using Dlhis.Middle.Entities; 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(); 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()) { if ((int)model.EntityColumnInfo.PropertyInfo.GetValue(model.EntityValue) == 0) { model.SetValue(currentUser.GetStringSubjectId()); } } break; } } }; return db; })); } public override void Configure(IApplicationBuilder app, IWebHostEnvironment env) { using var scope = app.ApplicationServices.CreateScope(); var db = scope.ServiceProvider.GetService(); db.Client.DbMaintenance.CreateDatabase(); db.Client.CodeFirst.InitTables(); db.Client.CodeFirst.InitTables(); db.Client.CodeFirst.InitTables(); } }