schangxiang@126.com
2024-04-25 db3bf5ec1588e1aa5db768375580b932f0aedcc7
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
using Admin.NET.Core;
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using Admin.NET.Core.Entity.WmsBase;
using System.Text.RegularExpressions;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
 
namespace Admin.NET.Application
{
    /// <summary>
    /// 角色菜单
    /// </summary>
    public class SysRoleMenuService : ISysRoleMenuService, ITransient
    {
        private readonly IRepository<SysRoleMenu> _sysRoleMenuRep;  // 角色菜单表仓储
        private readonly IRepository<WmsRolePdaMenu> _wmsRolePdaMenu;  // 角色菜单表仓储
        private readonly IRepository<SysMenu> _sysMenuRep;  // 菜单表仓储
        private readonly ISysCacheService _sysCacheService;
 
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="sysRoleMenuRep"></param>
        /// <param name="sysMenuRep"></param>
        /// <param name="sysCacheService"></param>
        public SysRoleMenuService(
            IRepository<SysRoleMenu> sysRoleMenuRep,
            IRepository<WmsRolePdaMenu> wmsRolePdaMenu,
            IRepository<SysMenu> sysMenuRep, 
            ISysCacheService sysCacheService)
        {
            _sysRoleMenuRep = sysRoleMenuRep;
            _wmsRolePdaMenu = wmsRolePdaMenu;
            _sysMenuRep = sysMenuRep;
            _sysCacheService = sysCacheService;
        }
 
        /// <summary>
        /// 获取角色的菜单Id集合
        /// </summary>
        /// <param name="roleIdList"></param>
        /// <returns></returns>
        public async Task<List<long>> GetRoleMenuIdList(List<long> roleIdList)
        {
            return await _sysRoleMenuRep.DetachedEntities
                                        .Where(u => roleIdList.Contains(u.SysRoleId))
                                        .Select(u => u.SysMenuId).ToListAsync();
        }
 
        /// <summary>
        /// 授权角色菜单
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [UnitOfWork]
        public async Task GrantMenu(GrantRoleMenuInput input)
        {
            var roleMenus = await _sysRoleMenuRep.DetachedEntities.Where(u => u.SysRoleId == input.Id).ToListAsync();
            await _sysRoleMenuRep.DeleteAsync(roleMenus);
 
            // 确保对按钮菜单的父级菜单能正确的授权,发现前端构造的数据会丢弃了按钮菜单的父级菜单
            var roleMenuPidsList = await _sysMenuRep.DetachedEntities.Where(u => input.GrantMenuIdList.Contains(u.Id))
                .Select(u => u.Pids).ToListAsync();
            var roleMenuSplitPids = roleMenuPidsList
                .SelectMany(u => u.Split(',', StringSplitOptions.RemoveEmptyEntries)
                .Select(v => long.Parse(v[1..^1]))
                .Where(v => v != 0))
                .Union(input.GrantMenuIdList);
            var menus = roleMenuSplitPids.Select(u => new SysRoleMenu
            {
                SysRoleId = input.Id,
                SysMenuId = u
            }).ToList();
            //ly-0415 过滤表sys_menu不存在的id
            List<SysRoleMenu> menusFilters = new List<SysRoleMenu>();
            foreach (var item in menus)
            {
                var _details = _sysMenuRep.Where(x => x.Id == item.SysMenuId).ToList();
                if (_details.Count>0)
                {
                    menusFilters.Add(item);
                }
            }
            await _sysRoleMenuRep.InsertAsync(menusFilters);
            // 清除缓存
            await _sysCacheService.DelByPatternAsync(CommonConst.CACHE_KEY_MENU);
            await _sysCacheService.DelByPatternAsync(CommonConst.CACHE_KEY_PERMISSION);
        }
 
        [UnitOfWork]
        public async Task GrantPdaMenu(GrantRoleMenuInput input)
        {
            var roleMenus = await _wmsRolePdaMenu.DetachedEntities.Where(u => u.SysRoleId == input.Id).ToListAsync();
            await _wmsRolePdaMenu.DeleteAsync(roleMenus);
 
            foreach (var item in input.GrantMenuIdList)
            {
                await _wmsRolePdaMenu.InsertAsync(new WmsRolePdaMenu
                {
                    SysRoleId = input.Id,
                    PdaMenuId = item
                });
            }
        }
 
        /// <summary>
        /// 根据菜单Id集合删除对应的角色-菜单表信息
        /// </summary>
        /// <param name="menuIdList"></param>
        /// <returns></returns>
        public async Task DeleteRoleMenuListByMenuIdList(List<long> menuIdList)
        {
            var roleMenus = await _sysRoleMenuRep.DetachedEntities.Where(u => menuIdList.Contains(u.SysMenuId)).ToListAsync();
            await _sysRoleMenuRep.DeleteAsync(roleMenus);
        }
 
        /// <summary>
        /// 根据角色Id删除对应的角色-菜单表关联信息
        /// </summary>
        /// <param name="roleId"></param>
        /// <returns></returns>
        public async Task DeleteRoleMenuListByRoleId(long roleId)
        {
            var roleMenus = await _sysRoleMenuRep.DetachedEntities.Where(u => u.SysRoleId == roleId).ToListAsync();
            await _sysRoleMenuRep.DeleteAsync(roleMenus);
        }
    }
}