Admin
2025-12-02 9e42f0dafa019f5ecf6b0ff425ecb966b002171e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System;
using System.Collections.Generic;
using System.Linq;
using WIDESEA.Core.CacheManager;
using WIDESEA.Core.DBManager;
using WIDESEA.Core.Extensions.AutofacManager;
using WIDESEA.Core.ManageUser;
using WIDESEA.Core.Services;
using WIDESEA.Entity.DomainModels;
 
namespace WIDESEA.Core.UserManager
{
    public static class RoleContext
    {
 
        private static object _RoleObj = new object();
        private static string _RoleVersionn = "";
        public const string Key = "inernalRole";
 
        private static List<RoleNodes> _roles { get; set; }
        public static List<RoleNodes> GetAllRoleId()
        {
            ICacheService cacheService = AutofacContainerModule.GetService<ICacheService>();
            //每次比较缓存是否更新过,如果更新则重新获取数据
            if (_roles != null && _RoleVersionn == cacheService.Get(Key))
            {
                return _roles;
            }
            lock (_RoleObj)
            {
                if (_RoleVersionn != "" && _roles != null && _RoleVersionn == cacheService.Get(Key)) return _roles;
                _roles = DBServerProvider.DbContext
                  .Set<Sys_Role>()
                   .Where(x => x.Enable == 1)
                   .Select(s => new RoleNodes() { Id = s.Role_Id, ParentId = s.ParentId, RoleName = s.RoleName })
             .ToList();
 
                string cacheVersion = cacheService.Get(Key);
                if (string.IsNullOrEmpty(cacheVersion))
                {
                    cacheVersion = DateTime.Now.ToString("yyyyMMddHHMMssfff");
                    cacheService.Add(Key, cacheVersion);
                }
                else
                {
                    _RoleVersionn = cacheVersion;
                }
            }
            return _roles;
        }
 
        public static void Refresh()
        {
            AutofacContainerModule.GetService<ICacheService>().Remove(Key);
        }
        /// <summary>
        /// 
        /// 获取当前角色下的所有角色(不包括自己的角色)
        /// </summary>
        /// <param name="roleId"></param>
        /// <returns></returns>
        public static List<RoleNodes> GetAllChildren(int roleId)
        {
            if (roleId <= 0) return null;
            var roles = GetAllRoleId();
            if (UserContext.IsRoleIdSuperAdmin(roleId)) return roles;
            Dictionary<int, bool> completedRoles = new Dictionary<int, bool>();
            List<RoleNodes> rolesChildren = new List<RoleNodes>();
            var list= GetChildren(roles, rolesChildren, roleId, completedRoles);
            //2021.07.11增加无限递归异常数据移除当前节点
            if (list.Any(x=>x.Id==roleId))
            {
                return list.Where(x => x.Id != roleId).ToList();
            }
            return list;
        }
        public static List<int> GetAllChildrenIds(int roleId)
        {
            return GetAllChildren(roleId)?.Select(x => x.Id)?.ToList();
        }
        /// <summary>
        /// 递归获取所有子节点权限
        /// </summary>
        /// <param name="roleId"></param>
        private static List<RoleNodes> GetChildren(List<RoleNodes> roles, List<RoleNodes> rolesChildren, int roleId, Dictionary<int, bool> completedRoles)
        {
            //2021.07.11修复不能获取三级以下角色的问题
            roles.ForEach(x =>
            {
                if (x.ParentId == roleId)
                {
                    if (completedRoles.TryGetValue(x.Id, out bool isWrite))
                    {
                        if (!isWrite)
                        {
                            roles.Where(x => x.Id == roleId).FirstOrDefault().ParentId = 0;
                            Logger.Error($"获取子角色异常RoleContext,角色id:{x.Id}");
                            Console.WriteLine($"获取子角色异常RoleContext,角色id:{x.Id}");
                            completedRoles[x.Id] = true;
                        }
                        return;
                    }
                    if (!rolesChildren.Any(c => c.Id == x.Id))
                    {
                        rolesChildren.Add(x);
                    }
                    completedRoles.Add(x.Id, false);
                    GetChildren(roles, rolesChildren, x.Id, completedRoles);
                }
            });
            return rolesChildren;
        }
        /// <summary>
        /// 获取当前角色下的所有用户
        /// </summary>
        /// <returns></returns>
        public static IQueryable<int> GetCurrentAllChildUser()
        {
            var roles = GetAllChildrenIds(UserContext.Current.RoleId);
            if (roles == null)
            {
                throw new Exception("未获取到当前角色");
            }
            return DBServerProvider.DbContext
                  .Set<Sys_User>()
                  .Where(u => roles.Contains(u.Role_Id)).Select(s => s.User_Id);
 
        }
    }
    public class RoleNodes
    {
        public int Id { get; set; }
        public int ParentId { get; set; }
        public string RoleName { get; set; }
    }
}