using FoodLabeling.Application.Contracts.Dtos.RbacRole;
using FoodLabeling.Application.Helpers;
using FoodLabeling.Application.Contracts.Dtos.Common;
using FoodLabeling.Application.Contracts.IServices;
using FoodLabeling.Application.Services.DbModels;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Uow;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace FoodLabeling.Application.Services;
///
/// 角色管理(食品标签-美国版对外)
///
public class RbacRoleAppService : ApplicationService, IRbacRoleAppService
{
private readonly ISqlSugarDbContext _dbContext;
private readonly ISqlSugarRepository _roleRepository;
private readonly ISqlSugarRepository _roleMenuRepository;
private readonly ISqlSugarRepository _roleDeptRepository;
private readonly ISqlSugarRepository _userRoleRepository;
public RbacRoleAppService(
ISqlSugarDbContext dbContext,
ISqlSugarRepository roleRepository,
ISqlSugarRepository roleMenuRepository,
ISqlSugarRepository roleDeptRepository,
ISqlSugarRepository userRoleRepository)
{
_dbContext = dbContext;
_roleRepository = roleRepository;
_roleMenuRepository = roleMenuRepository;
_roleDeptRepository = roleDeptRepository;
_userRoleRepository = userRoleRepository;
}
///
public async Task> GetListAsync([FromQuery] RbacRoleGetListInputVo input)
{
RefAsync total = 0;
var query = _roleRepository._DbQueryable
.Where(x => x.IsDeleted == false)
.WhereIF(!string.IsNullOrWhiteSpace(input.RoleCode), x => x.RoleCode.Contains(input.RoleCode!.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.RoleName), x => x.RoleName.Contains(input.RoleName!.Trim()))
.WhereIF(input.State is not null, x => x.State == input.State);
if (!string.IsNullOrWhiteSpace(input.Sorting))
{
query = query.OrderBy(input.Sorting);
}
else
{
query = query.OrderBy(x => x.OrderNum, OrderByType.Desc);
}
var entities = await query.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
var items = entities.Select(x => new RbacRoleGetListOutputDto
{
Id = x.Id,
RoleName = x.RoleName ?? string.Empty,
RoleCode = x.RoleCode ?? string.Empty,
Remark = x.Remark,
DataScope = (int)x.DataScope,
State = x.State,
OrderNum = x.OrderNum
}).ToList();
var pageSize = input.MaxResultCount <= 0 ? items.Count : input.MaxResultCount;
var pageIndex = pageSize <= 0 ? 1 : PagedQueryConvention.PageIndexFromSkipCount(input.SkipCount);
var totalPages = pageSize <= 0 ? 0 : (int)Math.Ceiling(total / (double)pageSize);
return new PagedResultWithPageDto
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = total,
TotalPages = totalPages,
Items = items
};
}
///
public async Task GetAsync(Guid id)
{
var entity = await _roleRepository.GetSingleAsync(x => x.Id == id && x.IsDeleted == false);
if (entity is null)
{
throw new UserFriendlyException("角色不存在");
}
var menuIds = await _dbContext.SqlSugarClient.Queryable()
.Where(x => x.RoleId == id.ToString())
.Select(x => x.MenuId)
.ToListAsync();
return new RbacRoleGetOutputDto
{
Id = entity.Id,
RoleName = entity.RoleName ?? string.Empty,
RoleCode = entity.RoleCode ?? string.Empty,
Remark = entity.Remark,
DataScope = (int)entity.DataScope,
State = entity.State,
OrderNum = entity.OrderNum,
MenuIds = menuIds
};
}
///
public async Task CreateAsync([FromBody] RbacRoleCreateInputVo input)
{
var roleName = input.RoleName?.Trim();
var roleCode = input.RoleCode?.Trim();
if (string.IsNullOrWhiteSpace(roleName))
{
throw new UserFriendlyException("角色名称不能为空");
}
if (string.IsNullOrWhiteSpace(roleCode))
{
throw new UserFriendlyException("角色编码不能为空");
}
var isExist = await _roleRepository.IsAnyAsync(x => x.RoleCode == roleCode || x.RoleName == roleName);
if (isExist)
{
throw new UserFriendlyException("角色名称或编码已存在");
}
var entity = new RoleAggregateRoot
{
RoleName = roleName,
RoleCode = roleCode,
Remark = input.Remark?.Trim(),
DataScope = (Yi.Framework.Rbac.Domain.Shared.Enums.DataScopeEnum)input.DataScope,
State = input.State,
OrderNum = input.OrderNum
};
EntityHelper.TrySetId(entity, () => GuidGenerator.Create());
await _roleRepository.InsertAsync(entity);
return await GetAsync(entity.Id);
}
///
public async Task UpdateAsync(Guid id, [FromBody] RbacRoleUpdateInputVo input)
{
var entity = await _roleRepository.GetSingleAsync(x => x.Id == id && x.IsDeleted == false);
if (entity is null)
{
throw new UserFriendlyException("角色不存在");
}
var roleName = input.RoleName?.Trim();
var roleCode = input.RoleCode?.Trim();
if (string.IsNullOrWhiteSpace(roleName))
{
throw new UserFriendlyException("角色名称不能为空");
}
if (string.IsNullOrWhiteSpace(roleCode))
{
throw new UserFriendlyException("角色编码不能为空");
}
var isExist = await _roleRepository._DbQueryable
.Where(x => x.Id != entity.Id && x.IsDeleted == false)
.AnyAsync(x => x.RoleCode == roleCode || x.RoleName == roleName);
if (isExist)
{
throw new UserFriendlyException("角色名称或编码已存在");
}
entity.RoleName = roleName;
entity.RoleCode = roleCode;
entity.Remark = input.Remark?.Trim();
entity.DataScope = (Yi.Framework.Rbac.Domain.Shared.Enums.DataScopeEnum)input.DataScope;
entity.State = input.State;
entity.OrderNum = input.OrderNum;
await _roleRepository.UpdateAsync(entity);
return await GetAsync(entity.Id);
}
///
[UnitOfWork]
public async Task DeleteAsync([FromBody] List ids)
{
var idList = ids?.Distinct().ToList() ?? new List();
if (idList.Count == 0)
{
return;
}
await _roleMenuRepository.DeleteAsync(x => idList.Contains(x.RoleId));
await _roleDeptRepository.DeleteAsync(x => idList.Contains(x.RoleId));
await _userRoleRepository.DeleteAsync(x => idList.Contains(x.RoleId));
// 角色表为软删(ISoftDelete)
await _roleRepository.DeleteAsync(x => idList.Contains(x.Id));
}
}