You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

304 lines
11 KiB

2 years ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office2010.Excel;
2 years ago
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Application.Dtos;
2 years ago
using Volo.Abp.Identity;
using Volo.Abp.ObjectMapping;
2 years ago
using Volo.Abp.PermissionManagement;
using Volo.Abp.Uow;
using Volo.Abp.Users;
2 years ago
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Auth.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Auth.Application;
[AllowAnonymous]
2 years ago
[Route($"{AuthConsts.RootPath}user-menu")]
public class UserMenuAppService :
SfsAuthCrudAppServiceBase<UserMenu, UserMenuDto, SfsAuthRequestInputBase, UserMenuCreateInput>,
IUserMenuAppService
{
const EnumPortal PDA_PORTAL = EnumPortal.Pda;
const EnumPortal WEB_PORTAL = EnumPortal.Web;
private readonly IMenuRepository _menuRepository;
private readonly IPermissionAppService _permissionAppService;
private readonly IIdentityUserAppService _identityUserAppService;
private readonly IIdentityUserRepository _identityUserRepository;
2 years ago
public UserMenuAppService(
IUserMenuRepository repository, IMenuRepository menuRepository
, IPermissionAppService permissionAppService
, IIdentityUserAppService identityUserAppService
, IIdentityUserRepository identityUserRepository) : base(repository)
2 years ago
{
base.CreatePolicyName = UserMenuPermissions.Create;
base.UpdatePolicyName = UserMenuPermissions.Update;
base.DeletePolicyName = UserMenuPermissions.Delete;
_menuRepository = menuRepository;
_permissionAppService = permissionAppService;
_identityUserAppService = identityUserAppService;
_identityUserRepository = identityUserRepository;
2 years ago
}
/// <summary>
/// 按用户ID获取PDA菜单信息
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[HttpGet("pda-menu/{userId}")]
[AllowAnonymous]
[UnitOfWork]
2 years ago
public virtual async Task<List<MenuDto>> GetPdaMenusOfUserAsync(Guid? userId)
{
var userMenus = await _repository
.GetListAsync(p => p.UserId == userId && p.Portal == PDA_PORTAL).ConfigureAwait(false);
var menuCodes = userMenus.Select(p => p.MenuCode).Distinct().ToList();
var menus = await GetListByPortalAndCodesAsync(PDA_PORTAL, menuCodes).ConfigureAwait(false);
return menus;
}
/// <summary>
/// 按用户ID获取web菜单信息
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[HttpGet("web-menu/{userId}")]
[AllowAnonymous]
[UnitOfWork]
2 years ago
public virtual async Task<List<MenuDto>> GetWebMenusOfUserAsync(Guid? userId)
{
2 years ago
var permissions = await GetPermissionsAsync(userId.Value).ConfigureAwait(false);
2 years ago
2 years ago
var menusEntity = await _menuRepository
.GetListAsync(p => (permissions.Contains(p.Permission) || p.Permission == "skip")
&& p.Portal == WEB_PORTAL
&& p.Status == MenuStatus.Enable).ConfigureAwait(false);
var menus = ObjectMapper.Map<List<Menu>, List<MenuDto>>(menusEntity);
2 years ago
//var userMenus = await _repository
// .GetListAsync(p => p.UserId == userId);
2 years ago
2 years ago
//userMenus = userMenus.Where(p => (int)p.Portal == (int)EnumPortal.Web).ToList();
2 years ago
2 years ago
//var menuCodes = userMenus.Select(p => p.MenuCode).Distinct().ToList();
//var menus = await GetListByPortalAndCodesAsync(WEB_PORTAL, menuCodes);
2 years ago
2 years ago
var result = BuildMenuTree(menus);
2 years ago
return result;
}
[AllowAnonymous]
[UnitOfWork]
[NonAction]
2 years ago
private async Task<List<string>> GetPermissionsAsync(Guid userId)
{
//var roles = await _identityUserAppService.GetRolesAsync(userId).ConfigureAwait(false);
var roles = await _identityUserRepository.GetRolesAsync(userId);
var rolesDto=ObjectMapper.Map<List<IdentityRole>, List<IdentityRoleDto>>(roles);
2 years ago
var permissionNames = new List<string>();
foreach (var role in rolesDto)
2 years ago
{
var result = await _permissionAppService.GetAsync("R", role.Name).ConfigureAwait(false);
permissionNames.AddRange(from permissionGroup in result.Groups
from permission in permissionGroup.Permissions
where permission.IsGranted
select permission.Name);
}
return permissionNames.Distinct().ToList();
}
/// <summary>
/// 构造web菜单树
/// </summary>
/// <param name="menus"></param>
/// <returns></returns>
private List<MenuDto> BuildMenuTree(List<MenuDto> menus)
{
var rootMenus = menus.OrderBy(p => p.Sort).Where(p => string.IsNullOrEmpty(p.ParentCode)).ToList();
var menuLookup = menus.ToLookup(p => p.ParentCode);
var result = new List<MenuDto>();
foreach (var rootMenu in rootMenus)
{
SetChildren(rootMenu, menuLookup);
result.Add(rootMenu);
}
return result;
}
private void SetChildren(MenuDto rootMenu, ILookup<string, MenuDto> menus)
{
var children = menus.FirstOrDefault(p => p.Key == rootMenu.Code);
if (children != null)
{
rootMenu.Children = new List<MenuDto>();
rootMenu.Children.AddRange(children.OrderBy(p => p.Sort));
foreach (var child in children)
{
SetChildren(child, menus);
}
}
}
private async Task<List<MenuDto>> GetListByPortalAndCodesAsync(EnumPortal portal, List<string> menuCodes)
{
var entities = await _menuRepository
.GetListAsync(p => menuCodes.Contains(p.Code));
entities = entities.Where(p => p.Status == MenuStatus.Enable && p.Portal == EnumPortal.Web).ToList();
2 years ago
return ObjectMapper.Map<List<Menu>, List<MenuDto>>(entities);
}
/*
[HttpGet("get-menu-by-login-user-async")]
[Authorize(UserMenuPermissions.PdaMenu)]
public virtual async Task<List<PdaMenuGroupDto>> GetMenuByLoginUserAsync()
{
var userId = CurrentUser.Id;
List<PdaMenuGroupDto> pdaMenuGroupDtos = new List<PdaMenuGroupDto>();//返回给pda的菜单 已排序
List<MenuDto> menuDtos = new List<MenuDto>(); //当前人拥有的所有菜单
var userMenus = await _repository.GetListAsync(p => p.UserId == userId);
foreach (var item in userMenus)
{
var menuDto = await _menuAppService.GetByCodeAsync(item.MenuCode);
if (menuDto != null && menuDto.Status == Shared.Domain.Shared.MenuStatus.Enable)
{
menuDtos.Add(menuDto);
}
}
var keys = menuDtos.GroupBy(p => p.GroupName);
foreach (var key in keys)
{
List<PdaMenuDto> pdaMenuDtos = new List<PdaMenuDto>();
int groupSort = 0;
string title = "";
foreach (var menuDto in key.OrderBy(p => p.Sort))
{
PdaMenuDto pdaMenuDto = new PdaMenuDto { name = menuDto.Name, path = menuDto.Route, url = menuDto.Icon, countUrl = menuDto.CountUrl };
groupSort = menuDto.GroupSort;
title = menuDto.GroupName;
pdaMenuDtos.Add(pdaMenuDto);
}
pdaMenuGroupDtos.Add(new PdaMenuGroupDto { groupSort = groupSort, title = title, list = pdaMenuDtos });
}
return pdaMenuGroupDtos.OrderBy(p => p.groupSort).ToList();
}
[HttpGet("get-UserInfo-async")]
[Authorize(UserMenuPermissions.PdaMenu)]
public virtual async Task<PdaUserDto> GetUserAsync()
{
PdaUserDto pdaUserDto = null;
if (CurrentUser.Id != null)
{
var userWorkGroupDtos = await _userWorkGroupAppService.GetListOfCurrentUserAsync();
var list = await GetMenuByLoginUserAsync();
pdaUserDto = new PdaUserDto
{
Name = CurrentUser.GetUserName(),
UserId = CurrentUser.Id,
PdaMenuGroupDtos = list,
UserWorkGroupDto = userWorkGroupDtos
};
}
return pdaUserDto;
}
*/
/// <summary>
/// 按用户ID获取PDA用户菜单
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[HttpGet("pda/by-user/{userId}")]
public virtual async Task<List<UserMenuDto>> GetPdaListByUserAsync(Guid userId)
{
var entities = await _repository.GetListAsync(
p => p.UserId == userId && p.Portal == PDA_PORTAL).ConfigureAwait(false);
return ObjectMapper.Map<List<UserMenu>, List<UserMenuDto>>(entities);
}
/// <summary>
/// 按用户ID更新PDA用户菜单
/// </summary>
/// <param name="userId"></param>
/// <param name="inputs"></param>
/// <returns></returns>
[HttpPut("pda/by-user/{userId}")]
public virtual async Task<List<UserMenuDto>> UpdatePdaListByUserAsync(Guid userId, List<UserMenuCreateInput> inputs)
{
await _repository.DeleteAsync(p => p.UserId == userId && p.Portal == PDA_PORTAL).ConfigureAwait(false);
inputs = inputs.Where(p => p.Portal == PDA_PORTAL).ToList();
var inserts = ObjectMapper.Map<List<UserMenuCreateInput>, List<UserMenu>>(inputs);
await _repository.InsertManyAsync(inserts).ConfigureAwait(false);
var result = ObjectMapper.Map<List<UserMenu>, List<UserMenuDto>>(inserts);
return result;
}
/// <summary>
/// 按用户ID获取WEB用户菜单
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[HttpGet("web/by-user/{userId}")]
public virtual async Task<List<UserMenuDto>> GetWebListByUserAsync(Guid userId)
{
var entities = await _repository.GetListAsync(
p => p.UserId == userId && p.Portal == WEB_PORTAL).ConfigureAwait(false);
return ObjectMapper.Map<List<UserMenu>, List<UserMenuDto>>(entities);
}
/// <summary>
/// 按用户ID更新WEB用户菜单
/// </summary>
/// <param name="userId"></param>
/// <param name="inputs"></param>
/// <returns></returns>
[HttpPut("web/by-user/{userId}")]
public virtual async Task<List<UserMenuDto>> UpdateWebListByUserAsync(Guid userId, List<UserMenuCreateInput> inputs)
{
await _repository.DeleteAsync(p => p.UserId == userId && p.Portal == WEB_PORTAL).ConfigureAwait(false);
inputs = inputs.Where(p => p.Portal == WEB_PORTAL).ToList();
var inserts = ObjectMapper.Map<List<UserMenuCreateInput>, List<UserMenu>>(inputs);
await _repository.InsertManyAsync(inserts).ConfigureAwait(false);
var result = ObjectMapper.Map<List<UserMenu>, List<UserMenuDto>>(inserts);
return result;
}
}