using JNPF;
using JNPF.Extras.DatabaseAccessor.SqlSugar.Models;
using JNPF.FriendlyException;
using JNPF.JsonSerialization;
using JNPF.Logging;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
namespace SqlSugar;
///
/// SqlSugar 仓储实现类
///
///
public partial class SqlSugarRepository : SimpleClient, ISqlSugarRepository
where TEntity : class, new()
{
///
/// 构造函数
///
///
public SqlSugarRepository(ISqlSugarClient context = null) : base(context)
{
// 获取数据库连接选项
ConnectionStringsOptions connectionStrings = App.GetConfig("ConnectionStrings", true);
// 获取多租户选项
TenantOptions tenant = App.GetConfig("Tenant", true);
var httpContext = App.HttpContext;
base.Context = (SqlSugarScope)context;
string tenantId = connectionStrings.ConfigId;
string tenantDbName = string.Empty;
if (httpContext?.GetEndpoint()?.Metadata?.GetMetadata() == null)
{
if (tenant.MultiTenancy && httpContext != null)
{
var connectionConfig = JSON.Deserialize(httpContext?.User.FindFirst("ConnectionConfig")?.Value);
tenantId = connectionConfig.ConfigId;
tenantDbName = connectionConfig.ConfigList.FirstOrDefault().ServiceName;
if (!base.Context.AsTenant().IsAnyConnection(connectionConfig.ConfigId))
{
base.Context.AsTenant().AddConnection(JNPFTenantExtensions.GetConfig(connectionConfig));
}
base.Context = base.Context.AsTenant().GetConnectionScope(connectionConfig.ConfigId);
if (!base.Context.Ado.IsValidConnection())
{
throw Oops.Oh("数据库连接错误");
}
}
else
{
base.Context = base.Context.AsTenant().GetConnectionScope(tenantId);
}
}
// 字段数据隔离
if (!"default".Equals(tenantId) && tenant.MultiTenancyType.Equals("COLUMN"))
{
base.Context.QueryFilter.AddTableFilter(it => it.TenantId == tenantDbName);
base.Context.Aop.DataExecuting = (oldValue, entityInfo) =>
{
if (entityInfo.PropertyName == "TenantId" && entityInfo.OperationType == DataFilterType.InsertByObject)
{
entityInfo.SetValue(tenantDbName);
}
};
}
// 设置超时时间
base.Context.Ado.CommandTimeOut = 30;
//base.Context.Aop.OnLogExecuted = (sql, pars) =>
//{
// var oldColor = Console.ForegroundColor;
// Console.ForegroundColor = ConsoleColor.Green;
// var finalSql = UtilMethods.GetSqlString(Context.CurrentConnectionConfig.DbType, sql, pars);
// Console.WriteLine($"【{DateTime.Now.ToString("HH:mm:ss.fff")}——SQL执行完成】{Context.Ado.SqlExecutionTime.TotalMilliseconds} ms");
// Console.WriteLine(finalSql);
// Console.ForegroundColor = oldColor;
// if (Context.Ado.SqlExecutionTime.TotalMilliseconds > 3000)
// {
// Log.Warning($"慢查询: {Context.Ado.SqlExecutionTime.TotalMilliseconds}ms, SQL: " + finalSql);
// }
// Console.WriteLine();
// //App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" + base.Context.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
//};
//base.Context.Aop.OnError = (ex) =>
//{
// Log.Error("SQL执行错误: " + UtilMethods.GetSqlString(base.Context.CurrentConnectionConfig.DbType, ex.Sql, (SugarParameter[])ex.Parametres));
// //App.PrintToMiniProfiler("SqlSugar", "Error", $"{ex.Message}{Environment.NewLine}{ex.Sql}{pars}{Environment.NewLine}");
//};
if (base.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
{
base.Context.Aop.OnExecutingChangeSql = (sql, pars) =>
{
if (pars != null)
{
foreach (var item in pars)
{
//如果是DbTppe=string设置成OracleDbType.Nvarchar2
item.IsNvarchar2 = true;
}
};
return new KeyValuePair(sql, pars);
};
}
}
}