using SqlSugar; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using System.Reflection; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEAWCS_Core.DB; 
 | 
  
 | 
namespace WIDESEAWCS_Core.Tenants 
 | 
{ 
 | 
    public static class TenantUtil 
 | 
    { 
 | 
        //public static SysTenant DefaultTenantConfig(this SysTenant tenant) 
 | 
        //{ 
 | 
        //    tenant.DbType ??= DbType.Sqlite; 
 | 
  
 | 
        //    //如果没有配置连接 
 | 
        //    if (tenant.Connection.IsNullOrEmpty()) 
 | 
        //    { 
 | 
        //        //此处默认配置 Sqlite 地址 
 | 
        //        //实际业务中 也会有运维、系统管理员等来维护 
 | 
        //        switch (tenant.DbType.Value) 
 | 
        //        { 
 | 
        //            case DbType.Sqlite: 
 | 
        //                tenant.Connection = $"DataSource={Path.Combine(Environment.CurrentDirectory, tenant.ConfigId)}.db"; 
 | 
        //                break; 
 | 
        //        } 
 | 
        //    } 
 | 
  
 | 
        //    return tenant; 
 | 
        //} 
 | 
  
 | 
        //public static ConnectionConfig GetConnectionConfig(this SysTenant tenant) 
 | 
        //{ 
 | 
        //    if (tenant.DbType is null) 
 | 
        //    { 
 | 
        //        throw new ArgumentException("Tenant DbType Must"); 
 | 
        //    } 
 | 
  
 | 
  
 | 
        //    return new ConnectionConfig() 
 | 
        //    { 
 | 
        //        ConfigId = tenant.ConfigId, 
 | 
        //        DbType = tenant.DbType.Value, 
 | 
        //        ConnectionString = tenant.Connection, 
 | 
        //        IsAutoCloseConnection = true, 
 | 
        //        MoreSettings = new ConnMoreSettings() 
 | 
        //        { 
 | 
        //            IsAutoRemoveDataCache = true 
 | 
        //        }, 
 | 
        //    }; 
 | 
        //} 
 | 
  
 | 
        public static List<Type> GetTenantEntityTypes(TenantTypeEnum? tenantType = null) 
 | 
        { 
 | 
            List<Type> types = RepositorySetting.Entitys.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass).ToList(); 
 | 
  
 | 
            List<Type> returnTypes = types.Where(s => IsTenantEntity(s, tenantType)).ToList(); 
 | 
            return returnTypes; 
 | 
        } 
 | 
  
 | 
        public static bool IsTenantEntity(this Type u, TenantTypeEnum? tenantType = null) 
 | 
        { 
 | 
            var mta = u.GetCustomAttribute<MultiTenantAttribute>(); 
 | 
            if (mta is null) 
 | 
            { 
 | 
                return false; 
 | 
            } 
 | 
  
 | 
            if (tenantType != null) 
 | 
            { 
 | 
                if (mta.TenantType != tenantType) 
 | 
                { 
 | 
                    return false; 
 | 
                } 
 | 
            } 
 | 
  
 | 
            return true; 
 | 
        } 
 | 
  
 | 
        public static string GetTenantTableName(this Type type, ISqlSugarClient db, string id) 
 | 
        { 
 | 
            var entityInfo = db.EntityMaintenance.GetEntityInfo(type); 
 | 
            return $@"{entityInfo.DbTableName}_{id}"; 
 | 
        } 
 | 
  
 | 
        //public static string GetTenantTableName(this Type type, ISqlSugarClient db, SysTenant tenant) 
 | 
        //{ 
 | 
        //    return GetTenantTableName(type, db, tenant.Id.ToString()); 
 | 
        //} 
 | 
  
 | 
        public static void SetTenantTable(this ISqlSugarClient db, string id) 
 | 
        { 
 | 
            var types = GetTenantEntityTypes(TenantTypeEnum.Tables); 
 | 
  
 | 
            foreach (var type in types) 
 | 
            { 
 | 
                db.MappingTables.Add(type.Name, type.GetTenantTableName(db, id)); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public static List<SelectModel> GetTenantSelectModels() 
 | 
        { 
 | 
            List<SelectModel> selectModels = new List<SelectModel>() 
 | 
            { 
 | 
                new SelectModel 
 | 
                { 
 | 
                    FieldName = MainDb.TenantId 
 | 
                }, 
 | 
                //new SelectModel 
 | 
                //{ 
 | 
                //    FieldName = MainDb.TenantName 
 | 
                //}, 
 | 
                new SelectModel 
 | 
                { 
 | 
                    FieldName = MainDb.ConnectionString, 
 | 
                }, 
 | 
                new SelectModel 
 | 
                { 
 | 
                    FieldName = MainDb.TenantDbType 
 | 
                } 
 | 
            }; 
 | 
            return selectModels; 
 | 
        } 
 | 
    } 
 | 
} 
 |