using SqlSugar; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Threading.Tasks; using HT.Cloud.Code; using HT.Cloud.DataBase; using HT.Cloud.Domain.SystemManage; using HT.Cloud.Domain.SystemOrganize; using HT.Cloud.Service.SystemManage; namespace HT.Cloud.Service.SystemOrganize { /// /// 创 建:超级管理员 /// 日 期:2020-06-12 13:50 /// 描 述:系统设置服务类 /// public class SystemSetService : BaseService, IDenpendency { private string cacheKeyOperator = GlobalContext.SystemConfig.ProjectPrefix + "_operator_";// +登录者token private static string cacheKey = GlobalContext.SystemConfig.ProjectPrefix + "_dblist";// 数据库键 public ModuleService moduleApp { get; set; } public ModuleButtonService moduleButtonApp { get; set; } public ModuleFieldsService moduleFieldsApp { get; set; } public SystemSetService(ISqlSugarClient context) : base(context) { } #region 获取数据 public async Task> GetList(string keyword = "") { var query = repository.IQueryable(); if (!string.IsNullOrEmpty(keyword)) { query = query.Where(a => a.F_CompanyName.Contains(keyword) || a.F_ProjectName.Contains(keyword)); } return await query.Where(a => a.F_DeleteMark == false).OrderBy(a => a.F_Id, OrderByType.Desc).ToListAsync(); } public async Task> GetLookList(string keyword = "") { var query = repository.IQueryable().Where(a => a.F_DeleteMark == false); if (!string.IsNullOrEmpty(keyword)) { query = query.Where(a => a.F_CompanyName.Contains(keyword) || a.F_ProjectName.Contains(keyword)); } query = GetDataPrivilege("a", "", query); return await query.OrderBy(a => a.F_Id, OrderByType.Desc).ToListAsync(); } public async Task GetFormByHost(string host) { repository.ChangeEntityDb(GlobalContext.SystemConfig.MainDbNumber); var query = repository.IQueryable(); if (!string.IsNullOrEmpty(host)) { //此处需修改 query = query.Where(a => a.F_HostUrl.Contains(host)); } else { query = query.Where(a => a.F_DbNumber == "0"); } if (!await query.Clone().AnyAsync()) { query = repository.IQueryable(); query = query.Where(a => a.F_DbNumber == "0"); } var data = await query.Where(a => a.F_DeleteMark == false).FirstAsync(); return data; } public async Task> GetLookList(Pagination pagination, string keyword = "") { var query = repository.IQueryable().Where(a => a.F_DeleteMark == false && a.F_DbNumber != "0"); if (!string.IsNullOrEmpty(keyword)) { //此处需修改 query = query.Where(a => a.F_CompanyName.Contains(keyword) || a.F_ProjectName.Contains(keyword)); } query = GetDataPrivilege("a", "", query); return await query.ToPageListAsync(pagination); } public async Task GetForm(string keyValue) { var data = await repository.FindEntity(keyValue); return data; } #endregion 获取数据 public async Task GetLookForm(string keyValue) { var data = await repository.FindEntity(keyValue); return GetFieldsFilterData(data); } #region 提交数据 public async Task SubmitForm(SystemSetEntity entity, string keyValue, string[] permissionIds = null, string[] permissionfieldsIds = null) { repository.ChangeEntityDb(GlobalContext.SystemConfig.MainDbNumber); List roleAuthorizeEntitys = new List(); List modules = new List(); List modulebtns = new List(); List modulefileds = new List(); //字典数据 var itemsTypes = await repository.Db.Queryable().ToListAsync(); var itemsDetails = await repository.Db.Queryable().ToListAsync(); repository.Tenant.BeginTran(); if (string.IsNullOrEmpty(keyValue)) { entity.F_DeleteMark = false; entity.Create(); await repository.Insert(entity); if (permissionIds != null) { var moduledata = await moduleApp.GetList(); var buttondata = await moduleButtonApp.GetList(); foreach (var itemId in permissionIds.Distinct()) { RoleAuthorizeEntity roleAuthorizeEntity = new RoleAuthorizeEntity(); roleAuthorizeEntity.F_Id = Utils.GuId(); roleAuthorizeEntity.F_ObjectType = 2; roleAuthorizeEntity.F_ObjectId = entity.F_Id; roleAuthorizeEntity.F_ItemId = itemId; if (moduledata.Find(a => a.F_Id == itemId) != null) { roleAuthorizeEntity.F_ItemType = 1; roleAuthorizeEntitys.Add(roleAuthorizeEntity); modules.Add(moduledata.Find(a => a.F_Id == itemId)); } if (buttondata.Find(a => a.F_Id == itemId) != null) { roleAuthorizeEntity.F_ItemType = 2; roleAuthorizeEntitys.Add(roleAuthorizeEntity); modulebtns.Add(buttondata.Find(a => a.F_Id == itemId)); } } //排除租户 modules.AddRange(moduledata.Where(a => a.F_IsPublic == true && a.F_EnabledMark == true && a.F_DeleteMark == false && a.F_EnCode != "SystemSet")); modulebtns.AddRange(buttondata.Where(a => a.F_IsPublic == true && a.F_EnabledMark == true && a.F_DeleteMark == false)); } if (permissionfieldsIds != null) { var fieldsdata = await moduleFieldsApp.GetList(); foreach (var itemId in permissionfieldsIds.Distinct()) { RoleAuthorizeEntity roleAuthorizeEntity = new RoleAuthorizeEntity(); roleAuthorizeEntity.F_Id = Utils.GuId(); roleAuthorizeEntity.F_ObjectType = 2; roleAuthorizeEntity.F_ObjectId = entity.F_Id; roleAuthorizeEntity.F_ItemId = itemId; if (fieldsdata.Find(a => a.F_Id == itemId) != null) { roleAuthorizeEntity.F_ItemType = 3; roleAuthorizeEntitys.Add(roleAuthorizeEntity); modulefileds.Add(fieldsdata.Find(a => a.F_Id == itemId)); } } modulefileds.AddRange(fieldsdata.Where(a => a.F_IsPublic == true && a.F_EnabledMark == true && a.F_DeleteMark == false)); } //新建租户权限 if (roleAuthorizeEntitys.Count > 0) { await repository.Db.Insertable(roleAuthorizeEntitys).ExecuteCommandAsync(); } //新建数据库和表 using (var db = new SqlSugarClient(DBContexHelper.Contex(entity.F_DbString, entity.F_DBProvider))) { //判断数据库有没有被使用 db.DbMaintenance.CreateDatabase(); if (db.DbMaintenance.GetTableInfoList(false).Where(a => a.Name.ToLower() == "sys_module").Any()) throw new Exception("数据库已存在,请重新设置数据库"); var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; //反射取指定前后缀的dll var referencedAssemblies = Directory.GetFiles(path, "HT.Cloud.Domain.dll").Select(Assembly.LoadFrom).ToArray(); var types = referencedAssemblies.SelectMany(a => a.GetTypes().ToArray()); var implementType = types.Where(x => x.IsClass); //忽视类列表 var ignoreTables = new List { "RoleExtend", "UserExtend" }; foreach (var item in implementType) { try { if (item.GetCustomAttributes(typeof(SugarTable), true).FirstOrDefault((x => x.GetType() == typeof(SugarTable))) is SugarTable sugarTable && !ignoreTables.Any(a => a == item.Name)) { db.CodeFirst.SetStringDefaultLength(50).InitTables(item); } } catch (Exception ex) { Console.WriteLine(ex.Message); continue; } } //新建账户,密码 UserEntity user = new UserEntity(); user.Create(); user.F_Account = entity.F_AdminAccount; user.F_RealName = entity.F_CompanyName; user.F_Gender = true; user.F_CompanyId = entity.F_Id; user.F_IsAdmin = true; user.F_DeleteMark = false; user.F_EnabledMark = true; user.F_IsBoss = false; user.F_IsLeaderInDepts = false; user.F_SortCode = 0; user.F_IsSenior = false; UserLogOnEntity logon = new UserLogOnEntity(); logon.F_Id = user.F_Id; logon.F_UserId = user.F_Id; logon.F_UserSecretkey = Md5.md5(Utils.CreateNo(), 16).ToLower(); logon.F_UserPassword = Md5.md5(DESEncrypt.Encrypt(Md5.md5(entity.F_AdminPassword, 32).ToLower(), logon.F_UserSecretkey).ToLower(), 32).ToLower(); db.Insertable(user).ExecuteCommand(); db.Insertable(logon).ExecuteCommand(); await db.Insertable(roleAuthorizeEntitys).ExecuteCommandAsync(); await db.Insertable(entity).ExecuteCommandAsync(); //新建菜单 await db.Insertable(modules).ExecuteCommandAsync(); await db.Insertable(modulebtns).ExecuteCommandAsync(); await db.Insertable(modulefileds).ExecuteCommandAsync(); //同步字典 await db.Deleteable().ExecuteCommandAsync(); await db.Deleteable().ExecuteCommandAsync(); await db.Insertable(itemsTypes).ExecuteCommandAsync(); await db.Insertable(itemsDetails).ExecuteCommandAsync(); } } else { entity.Modify(keyValue); if (permissionIds != null) { var moduledata = await moduleApp.GetList(); var buttondata = await moduleButtonApp.GetList(); foreach (var itemId in permissionIds.Distinct()) { RoleAuthorizeEntity roleAuthorizeEntity = new RoleAuthorizeEntity(); roleAuthorizeEntity.F_Id = Utils.GuId(); roleAuthorizeEntity.F_ObjectType = 2; roleAuthorizeEntity.F_ObjectId = entity.F_Id; roleAuthorizeEntity.F_ItemId = itemId; if (moduledata.Find(a => a.F_Id == itemId) != null) { roleAuthorizeEntity.F_ItemType = 1; roleAuthorizeEntitys.Add(roleAuthorizeEntity); modules.Add(moduledata.Find(a => a.F_Id == itemId)); } if (buttondata.Find(a => a.F_Id == itemId) != null) { roleAuthorizeEntity.F_ItemType = 2; roleAuthorizeEntitys.Add(roleAuthorizeEntity); modulebtns.Add(buttondata.Find(a => a.F_Id == itemId)); } } } if (permissionfieldsIds != null) { var fieldsdata = await moduleFieldsApp.GetList(); foreach (var itemId in permissionfieldsIds.Distinct()) { RoleAuthorizeEntity roleAuthorizeEntity = new RoleAuthorizeEntity(); roleAuthorizeEntity.F_Id = Utils.GuId(); roleAuthorizeEntity.F_ObjectType = 2; roleAuthorizeEntity.F_ObjectId = entity.F_Id; roleAuthorizeEntity.F_ItemId = itemId; if (fieldsdata.Find(a => a.F_Id == itemId) != null) { roleAuthorizeEntity.F_ItemType = 3; roleAuthorizeEntitys.Add(roleAuthorizeEntity); modulefileds.Add(fieldsdata.Find(a => a.F_Id == itemId)); } } } if (roleAuthorizeEntitys.Count > 0) { await repository.Db.Deleteable(a => a.F_ObjectId == entity.F_Id).ExecuteCommandAsync(); await repository.Db.Insertable(roleAuthorizeEntitys).ExecuteCommandAsync(); } //更新主库 if (currentuser.IsSuperAdmin == true) { await repository.Db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } else { entity.F_AdminAccount = null; entity.F_AdminPassword = null; await repository.Db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } //更新租户库 if (GlobalContext.SystemConfig.SqlMode == Define.SQL_TENANT) { var tenant = await repository.Db.Queryable().InSingleAsync(entity.F_Id); repository.ChangeEntityDb(tenant.F_DbNumber); var user = repository.Db.Queryable().First(a => a.F_CompanyId == entity.F_Id && a.F_IsAdmin == true); var userinfo = repository.Db.Queryable().First(a => a.F_UserId == user.F_Id); userinfo.F_UserSecretkey = Md5.md5(Utils.CreateNo(), 16).ToLower(); userinfo.F_UserPassword = Md5.md5(DESEncrypt.Encrypt(Md5.md5(entity.F_AdminPassword, 32).ToLower(), userinfo.F_UserSecretkey).ToLower(), 32).ToLower(); await repository.Db.Updateable(a => new UserEntity { F_Account = entity.F_AdminAccount }).Where(a => a.F_Id == user.F_Id).ExecuteCommandAsync(); await repository.Db.Updateable(a => new UserLogOnEntity { F_UserPassword = userinfo.F_UserPassword, F_UserSecretkey = userinfo.F_UserSecretkey }).Where(a => a.F_Id == userinfo.F_Id).ExecuteCommandAsync(); await repository.Db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); //更新菜单 if (roleAuthorizeEntitys.Count > 0) { await repository.Db.Deleteable().ExecuteCommandAsync(); await repository.Db.Deleteable().ExecuteCommandAsync(); await repository.Db.Deleteable().ExecuteCommandAsync(); await repository.Db.Insertable(modules).ExecuteCommandAsync(); await repository.Db.Insertable(modulebtns).ExecuteCommandAsync(); await repository.Db.Insertable(modulefileds).ExecuteCommandAsync(); } //同步字典 await repository.Db.Deleteable().ExecuteCommandAsync(); await repository.Db.Deleteable().ExecuteCommandAsync(); await repository.Db.Insertable(itemsTypes).ExecuteCommandAsync(); await repository.Db.Insertable(itemsDetails).ExecuteCommandAsync(); } else { var user = repository.Db.Queryable().First(a => a.F_CompanyId == entity.F_Id && a.F_IsAdmin == true); var userinfo = repository.Db.Queryable().First(a => a.F_UserId == user.F_Id); userinfo.F_UserSecretkey = Md5.md5(Utils.CreateNo(), 16).ToLower(); userinfo.F_UserPassword = Md5.md5(DESEncrypt.Encrypt(Md5.md5(entity.F_AdminPassword, 32).ToLower(), userinfo.F_UserSecretkey).ToLower(), 32).ToLower(); await repository.Db.Updateable(a => new UserEntity { F_Account = entity.F_AdminAccount }).Where(a => a.F_Id == user.F_Id).ExecuteCommandAsync(); await repository.Db.Updateable(a => new UserLogOnEntity { F_UserPassword = userinfo.F_UserPassword, F_UserSecretkey = userinfo.F_UserSecretkey }).Where(a => a.F_Id == userinfo.F_Id).ExecuteCommandAsync(); } var set = await repository.Db.Queryable().InSingleAsync(entity.F_Id); var tempkey = repository.ChangeEntityDb(GlobalContext.SystemConfig.MainDbNumber).Queryable().First(a => a.F_IsAdmin == true).F_Id; await CacheHelper.RemoveAsync(cacheKeyOperator + "info_" + tempkey); } repository.Tenant.CommitTran(); //清空缓存,重新拉数据 DBInitialize.GetConnectionConfigs(true); } public async Task DeleteForm(string keyValue) { await repository.Update(a => a.F_Id == keyValue, a => new SystemSetEntity { F_DeleteMark = true, F_EnabledMark = false, F_DeleteUserId = currentuser.UserId }); } #endregion 提交数据 } }