using System.Collections.Concurrent;
using JNPF;
using JNPF.Common.Core.Manager;
using JNPF.Common.Extension;
using JNPF.DependencyInjection;
using SqlSugar;
using Tnb.Core;
using Tnb.Vengine.Domain;
namespace Tnb.Vengine.DataAccess;
///
///
///
public class DataAccess : IDataAccess, ITransient, IDisposable
{
private const int MAX_PAGE_SIZE = 1000;
private static ISqlSugarClient? _db;
protected ISqlSugarClient Db
{
get
{
if (_db == null)
{
ConnectionStringsOptions conn = App.GetConfig("ConnectionStrings", true);
//var dbType = App.Configuration.GetConnectionString("DbType");
//var dbConn = App.Configuration.GetConnectionString("DbConn");
_db = SugarHelper.CreateSugarClient(conn.ConfigId, conn.DBType, conn.ConnectString);
}
return _db;
}
}
private readonly IUserManager _user;
///
/// 全局缓存
///
private static ConcurrentDictionary DbCache = new ConcurrentDictionary();
///
/// 构造
///
public DataAccess(IUserManager currentUser)
{
_user = currentUser;
}
///
/// 释放
///
public void Dispose()
{
foreach (var item in DbCache)
{
item.Value.Dispose();
}
DbCache.Clear();
}
///
/// 获取 ISqlSugarClient
///
public ISqlSugarClient GetSqlSugar(string? dbCode = null)
{
if (string.IsNullOrEmpty(dbCode) || dbCode == DbConsts.DefaultDbCode)
{
return Db;
}
if (DbCache.ContainsKey(dbCode))
{
return DbCache[dbCode];
}
var dblink = GetVmodelLink(dbCode);
ThrowIf.IsNull(dblink, $"没有此数据库{dbCode}连接信息");
var sugar = SugarHelper.CreateSugarClient(dblink.dbCode, dblink.dbType, dblink.dbConnection);
if (sugar.Ado.IsValidConnection())
{
DbCache[dbCode] = sugar;
}
else
{
sugar.Dispose();
throw new Exception($"无法连接到数据库{dbCode}");
}
return DbCache[dbCode];
}
///
/// 获取 DbLink
///
public VmodelLink GetVmodelLink(string dbCode)
{
var model = Db.Queryable().First(a => a.dbCode == dbCode);
return model;
}
///
/// 获取 Vmodel, 为空时不抛异常
///
public async Task TryGetVmodelAsync(string id, bool loadNavigate = false)
{
Vmodel vm = await Db.Queryable().FirstAsync(a => a.id == id && a.deleted == 0);
if (vm != null && loadNavigate)
{
await LoadVmodelNavigateAsync(vm);
}
return vm;
}
///
/// 获取 Vmodel, 为空时抛异常
///
public async Task GetVmodelAsync(string id, bool loadNavigate = false)
{
Vmodel vm = await Db.Queryable().FirstAsync(a => a.id == id && a.deleted == 0);
ThrowIf.IsNull(vm, $"找不到id={id}的模型");
if (loadNavigate)
{
await LoadVmodelNavigateAsync(vm);
}
return vm;
}
///
/// 获取 Vmodel, 为空时不抛异常
///
public async Task TryGetVmodelAsync(string areaCode, string vmCode, bool loadNavigate = false)
{
Vmodel vm = await Db.Queryable().FirstAsync(a => a.areaCode == areaCode && a.vmCode == vmCode && a.deleted == 0);
if (vm != null && loadNavigate)
{
await LoadVmodelNavigateAsync(vm);
}
return vm;
}
///
/// 获取 Vmodel, 为空时抛异常
///
public async Task GetVmodelAsync(string areaCode, string vmCode, bool loadNavigate = false)
{
Vmodel vm = await Db.Queryable().FirstAsync(a => a.areaCode == areaCode && a.vmCode == vmCode && a.deleted == 0);
ThrowIf.IsNull(vm, $"找不到areaCode={areaCode}, vmCode={vmCode}的模型");
if (loadNavigate)
{
await LoadVmodelNavigateAsync(vm);
}
return vm;
}
/////
///// 获取 Vmodel
/////
//public async Task GetVmodelAsync(string tableName, string? dbCode)
//{
// Vmodel vm = await _db.Queryable().FirstAsync(a => a.tableName == tableName && a.dbCode == dbCode && a.deleted == 0);
// return vm;
//}
///
/// 加载模型的导航属性
///
///
///
private async Task LoadVmodelNavigateAsync(Vmodel vm)
{
Dictionary dictVm = new();
var vmids = vm.navProps.Select(a => a.vmid).Distinct().ToList();
var ls = await Db.Queryable().Where(a => vmids.Contains(a.id)).ToListAsync();
var navs = ls.ToDictionary(a => a.id);
foreach (var navProp in vm.navProps)
{
navProp.naviModel = (Vmodel)navs.GetOrDefault(navProp.vmid);
//if (!dictVm.ContainsKey(navProp.vmid))
//{
// var navModel = await GetVmodelAsync(navProp.vmid);
// dictVm.Add(navProp.vmid, navModel);
//}
//navProp.naviModel = dictVm[navProp.vmid];
}
}
///
/// 查询数据 默认方法
///
public async Task QueryDataAsync(Vmodel vm, VmListInput input)
{
ISqlSugarClient db = GetSqlSugar(vm.dbCode);
var query = db.Queryable