using Microsoft.AspNetCore.DataProtection.KeyManagement; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_DTO.System; using WIDESEA_ISystemRepository; using WIDESEA_Model.Models; using WIDESEA_Model.Models.System; namespace WIDESEA_SystemRepository { public class Sys_DictionaryRepository : RepositoryBase, ISys_DictionaryRepository { public Sys_DictionaryRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage) { } #region 查询数据库select方法 public class SourceKeyVaule { public int id { get; set; } public int parentId { get; set; } public string DicName { get; set; } public int DicValue { get; set; } } public IEnumerable GetDictionaries(IEnumerable dicNos, List roleNodes, bool executeSql = true) { List Dictionaries = GetAllDictionary(); List DictionaryDTO = new List(); foreach (var item in Dictionaries.Where(x => dicNos.Contains(x.DicNo))) { VueDictionaryDTO dictionaryDTO = new VueDictionaryDTO(); dictionaryDTO.DicNo = item.DicNo; dictionaryDTO.Config = item.Config; dictionaryDTO.Data = item.DicList.OrderByDescending(o => o.OrderNo).Select(list => new { key = list.DicValue, value = list.DicName }); if (executeSql) { // 2020.05.01增加根据用户信息加载字典数据源sql string sql = item.Sql; if (!string.IsNullOrEmpty(sql)) { dictionaryDTO.Data = item.DicNo == "tree_roles" ? QueryRole(GetCustomDBSql(item.DicNo, sql, roleNodes)).OrderBy(x => x.id).Select(list => new { id = list.id, parentId = list.parentId, key = list.DicValue, value = list.DicName }) : Query(GetCustomDBSql(item.DicNo, sql, roleNodes)).OrderByDescending(o => o.OrderNo).Select(list => new { key = list.DicValue, value = list.DicName }); } } DictionaryDTO.Add(dictionaryDTO); } return DictionaryDTO; } List QueryRole(string sql) { try { return base.QueryDynamicDataBySql(sql, null).Select(s => new SourceKeyVaule() { id = s.id, parentId = s.parentId, DicName = s.value, DicValue = s.key }).ToList(); } catch (Exception ex) { return new List(); } } /// /// 获取自定义数据源sql /// /// /// /// public static string GetCustomDBSql(string dicNo, string originalSql, List roleNodes) { switch (dicNo) { case "roles": //2020.05.24增加绑定table表时,获取所有的角色列表 //注意,如果是2020.05.24之前获取的数据库脚本 //请在菜单【下拉框绑定设置】添加一个字典编号【t_roles】,除了字典编号,其他内容随便填写 case "t_roles": case "tree_roles": originalSql = GetRolesSql(originalSql, roleNodes); break; default: break; } return originalSql; } /// /// 获取解决的数据源,只能看到自己与下级所有角色 /// /// /// /// public static string GetRolesSql(string originalSql, List roleNodes) { if (App.User.IsSuperAdmin) { return originalSql; } var RoleNodes = roleNodes.Where(x => x.Id == App.User.RoleId) .Select(s => new RoleNodes() { Id = s.Id, ParentId = 0,//将自己的角色作为root节点 RoleName = s.RoleName }).ToList(); List roleIds = roleNodes.Select(x => x.Id).ToList(); //roleIds.Add(App.User.RoleId); return originalSql = $@"SELECT RoleId as 'key',RoleId AS id,ParentId AS parentId,RoleName as 'value' FROM Sys_Role WHERE Enable=1 and RoleId in ({string.Join(',', roleIds)})"; } #endregion /// /// /// /// /// 是否执行自定义sql /// public IEnumerable GetDictionaries(IEnumerable dicNos, bool executeSql = true) { List Dictionaries = GetDictionaries(dicNos.ToList()); foreach (var item in Dictionaries) { if (executeSql) { // 2020.05.01增加根据用户信息加载字典数据源sql string sql = item.Sql; if (!string.IsNullOrEmpty(sql)) { item.DicList = Query(sql); } } } return Dictionaries; } List Query(string sql) { try { return base.QueryDynamicDataBySql(sql, null).Select(s => new Sys_DictionaryList() { DicName = s.value, DicValue = s.key.ToString() }).ToList(); } catch (Exception ex) { return new List(); } } private List GetDictionaries(List dicNos) { //base.QueryData().ToList(); List _dictionaries = Db.Queryable().Where(x => x.Enable == 1 && dicNos.Contains(x.DicNo)).Includes(x => x.DicList).ToList(); return _dictionaries; } private List GetAllDictionary() { //base.QueryData().ToList(); List _dictionaries = Db.Queryable().Includes(x => x.DicList).Where(x => x.Enable == 1).ToList(); return _dictionaries; } } public class SourceKeyVaule { public object Key { get; set; } public string Value { get; set; } } }