using DS.Module.Core.Data;
using DS.Module.UserModule;
using Microsoft.Extensions.DependencyInjection;
using SqlSugar;
using NLog;
using DS.Module.Core.Log;
using Newtonsoft.Json;
using DS.Module.Core.Extensions;
namespace DS.Module.SqlSugar;
///
/// saas数据库服务
///
public class SaasDbService : ISaasDbService
{
private readonly IServiceProvider _serviceProvider;
private readonly SqlSugarScope db;
private readonly IUser user;
private readonly ISaasDbService saasService;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
///
/// 构造函数
///
///
public SaasDbService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
db = (SqlSugarScope)_serviceProvider.GetRequiredService();
user = _serviceProvider.GetRequiredService();
}
///
/// 根据用户租户Id获取业务库
///
///
public ISqlSugarClient GetBizDb()
{
var tenantId = user.GetTenantId().ToString();
if (!db.IsAnyConnection(tenantId))
{
var connInfo = GetMasterDb().Queryable().First(x => x.TenantId == long.Parse(tenantId));
//用非默认ConfigId进行测试
//添加业务库只在当前上下文有效(原理:SqlSugarScope模式入门文档去看)
db.AddConnection(new ConnectionConfig()
{
ConfigId = tenantId,
ConnectionString = connInfo.Connection,
DbType = connInfo.DbType,
IsAutoCloseConnection = true
});
}
return db.GetConnection(tenantId);
}
///
/// 获取主库信息
///
///
public ISqlSugarClient GetMasterDb()
{
return db.GetConnection("1288018625843826688");
}
///
/// 获取日志库信息
///
///
public SqlSugarScopeProvider GetLogDb()
{
return db.GetConnectionScope("1288018625843826680");
}
///
/// 主库根据Id获取业务库Scope
///
///
///
public SqlSugarScopeProvider GetBizDbScopeById(object configId)
{
if (!db.IsAnyConnection(configId))
{
var connInfo = GetMasterDb().Queryable().First(x => x.TenantId == Convert.ToInt64(configId));
//用非默认ConfigId进行测试
//添加业务库只在当前上下文有效(原理:SqlSugarScope模式入门文档去看)
db.AddConnection(new ConnectionConfig()
{
ConfigId = configId,
ConnectionString = connInfo.Connection,
DbType = connInfo.DbType,
IsAutoCloseConnection = true
});
var dbProvider = db.GetConnectionScope(configId);
dbProvider.Ado.CommandTimeOut = 30;
dbProvider.Aop.OnLogExecuting = (sql, pars) =>
{
//执行前事件
//Logger.Log(LogLevel.Info,
// DateTime.Now.ToString() + "\r\n" +
// UtilMethods.GetSqlString(c.DbType, sql, pars));
string sqlStr = sql;
foreach (var item in pars)
{
if (item.Value != null && item.Value != DBNull.Value)
{
string? strValue = string.Empty;
if (item.DbType == System.Data.DbType.String)
{
strValue = "'" + (string)item.Value + "'";
}
else if (item.DbType == System.Data.DbType.Boolean)
{
strValue = (bool)item.Value ? "1" : "0";
}
else
{
strValue = item.Value.ToString();
}
sqlStr = sqlStr.Replace(item.ParameterName, strValue);
}
}
Console.WriteLine("执行的SQL:" + Environment.NewLine + sqlStr);
};
//数据处理事件
dbProvider.Aop.DataExecuting = (oldValue, entityInfo) =>
{
// 新增操作
SqlsugarHelper.InsertByObjectForSqlsugar(entityInfo, user);
// 更新操作
SqlsugarHelper.UpdateByObjectForSqlsugar(entityInfo, user);
};
dbProvider.Aop.OnDiffLogEvent = it =>
{
//排除日志库操作
if (Convert.ToInt64(configId) != 1288018625843826680)
{
#region 插入日志审计表
//操作前记录 包含: 字段描述 列名 值 表名 表描述
var editBeforeData = it.BeforeData; //插入Before为null,之前还没进库
//操作后记录 包含: 字段描述 列名 值 表名 表描述
var editAfterData = it.AfterData;
var sql = it.Sql;
var parameter = it.Parameters;
var data = it.BusinessData; //这边会显示你传进来的对象
var time = it.Time;
var diffType = it.DiffType; //enum insert 、update and delete
var diffData = SqlSugarDiffUtil.GetDiff(editBeforeData, editAfterData);
if (diffData.IsNotNull())
{
var auditData = new SysLogAudit()
{
KeyId = Convert.ToInt64(diffData.Id),
Sql = it.Sql,
Param = JsonConvert.SerializeObject(it.Parameters),
OperateType = diffType.ToString(),
OldValue = JsonConvert.SerializeObject(editBeforeData),
NewValue = JsonConvert.SerializeObject(editAfterData),
DiffData = diffData.DiffData,
AopData = JsonConvert.SerializeObject(it.BusinessData),
};
db.GetConnection(1288018625843826680).Insertable(auditData).ExecuteCommand();
}
#endregion
}
};
//全局过滤租户Id
dbProvider.QueryFilter.AddTableFilter(m => m.TenantId ==long.Parse(user.TenantId));
//全局过滤机构Id
dbProvider.QueryFilter.AddTableFilter(m => m.OrgId == user.GetOrgId());
//全局软删除过滤
dbProvider.QueryFilter.AddTableFilter(m => m.Deleted == false);
}
return db.GetConnectionScope(configId);
}
public SqlSugarScopeProvider GetMasterDbScope()
{
return db.GetConnectionScope("1288018625843826688");
}
}