147 lines
5.9 KiB
C#
147 lines
5.9 KiB
C#
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<IOptions<SqlSugarOptions>>().Value;
|
|
var logger = sp.GetService<ILogger<SqlSugarClient>>();
|
|
var currentUser = sp.GetService<ICurrentUser>();
|
|
var sugarOptions = sp.GetService<ISqlSugarOptionsService>();
|
|
|
|
var configs = new List<ConnectionConfig>
|
|
{
|
|
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<ISoftDeleted>(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<InsertDateTimeGenerationAttribute>())
|
|
{
|
|
model.SetValue(DateTime.Now);
|
|
}
|
|
|
|
if (currentUser != null && model.IsAnyAttribute<InsertUserGenerationAttribute>())
|
|
{
|
|
if ((int)model.EntityColumnInfo.PropertyInfo.GetValue(model.EntityValue) == 0)
|
|
{
|
|
model.SetValue(currentUser.GetStringSubjectId());
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case DataFilterType.UpdateByObject:
|
|
{
|
|
if (model.IsAnyAttribute<UpdateDateTimeGenerationAttribute>())
|
|
{
|
|
model.SetValue(DateTime.Now);
|
|
}
|
|
|
|
if (currentUser != null && model.IsAnyAttribute<UpdateUserGenerationAttribute>())
|
|
{
|
|
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<IDbContext>();
|
|
|
|
db.Client.DbMaintenance.CreateDatabase();
|
|
db.Client.CodeFirst.InitTables<LocalBalanceRecordEntity, LocalGainfoEntity, LocalGainfoMealEntity, LocalBusinessPlaceEntity>();
|
|
db.Client.CodeFirst.InitTables<LocalBusinessShiftEntity, LocalDeviceRegistryEntity, LocalDeviceEntity, LocalBusinessPlaceShiftRelationshipEntity, LocalBusinessShiftMealRelationshipEntity>();
|
|
db.Client.CodeFirst.InitTables<LocalCanteenSettingEntity, LocalDepartmentEntity>();
|
|
}
|
|
} |