fix 权限数据优化

This commit is contained in:
2024-12-10 19:04:42 +08:00
parent aa49e131a9
commit 04eb2dab31
6 changed files with 100 additions and 73 deletions

View File

@@ -56,14 +56,18 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
if (deviceGroupCodes.Any())
{
var data = db.Queryable<DeviceGroupEntity>().ToList();
//开始递归处理
var tops = data.Where(x => !x.PCode.HasValue).ToList();
tops.ForEach(x => { DeviceGroupRecursionGetNext(x, data, deviceGroupCodes, deviceGroupCodes.Contains(x.Code)); });
deviceGroupCodes = deviceGroupCodes.Distinct().ToList();
var myDeviceGroupCodes = new List<Guid>();
foreach (Guid deviceGroupCode in deviceGroupCodes)
{
myDeviceGroupCodes.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(deviceGroupCode, data));
}
myDeviceGroupCodes = myDeviceGroupCodes.Distinct().ToList();
if (deviceCodeProperty != null)
{
deviceCodes = db.Queryable<DeviceGroupRelationshipEntity>().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList();
deviceCodes = db.Queryable<DeviceGroupRelationshipEntity>().Where(x => myDeviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList();
}
if (deviceGroupCodeProperty != null)
@@ -82,39 +86,50 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc
return dict;
}
static void DeviceGroupRecursionGetNext(DeviceGroupEntity current, List<DeviceGroupEntity> data, List<Guid> result, bool add)
{
var next = data.Where(x => x.PCode == current.Code).ToList();
foreach (var item in next)
{
if (add)
{
result.Add(item.Code);
}
DeviceGroupRecursionGetNext(item, data, result, result.Contains(item.Code));
}
}
}
public interface IMyDataPermissionService : IScopeDependency
{
List<Guid> GetMyDeviceCodes();
(bool, List<Guid>) GetMyDeviceCodes();
(bool, List<Guid>) GetMyDeviceGroupCodes();
}
public class MyDataPermissionService : IMyDataPermissionService
{
private readonly IGetDataPermissions _getDataPermissions;
private readonly ICurrentUser _currentUser;
public MyDataPermissionService(IGetDataPermissions getDataPermissions)
public MyDataPermissionService(IGetDataPermissions getDataPermissions, ICurrentUser currentUser)
{
_getDataPermissions = getDataPermissions;
_currentUser = currentUser;
}
/// <inheritdoc />
public List<Guid> GetMyDeviceCodes()
public (bool, List<Guid>) GetMyDeviceCodes()
{
return _getDataPermissions.GetData<DeviceEntity>().FirstOrDefault().Value ?? new List<Guid>();
var codes = new List<Guid>();
var disableFilter = _currentUser.GetRole() is "admin" or "tenant-admin";
if (!disableFilter)
{
codes = _getDataPermissions.GetData<DeviceEntity>().FirstOrDefault().Value ?? new List<Guid>();
}
return (!disableFilter, codes);
}
/// <inheritdoc />
public (bool, List<Guid>) GetMyDeviceGroupCodes()
{
var codes = new List<Guid>();
var disableFilter = _currentUser.GetRole() is "admin" or "tenant-admin";
if (!disableFilter)
{
codes = _getDataPermissions.GetData<DeviceGroupEntity>().FirstOrDefault().Value ?? new List<Guid>();
}
return (!disableFilter, codes);
}
}

View File

@@ -2,6 +2,7 @@ using Dlhis.Basic.Device.Dtos;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Organization.Dto;
using Dlhis.Entity.Sys.Entities;
using Dlhis.Entity.Sys.Enums;
namespace Dlhis.Basic.Device.Services;
@@ -11,6 +12,8 @@ namespace Dlhis.Basic.Device.Services;
/// </summary>
public interface IDevicePermissionAnalyzeService : IScopeDependency
{
Task<List<DevicePermissionEntity>> GetDevicePermissions(DevicePermissionSaveRequest request);
Task<DevicePermissionAssignResponse> GenerateDeviceTasksAsync(Func<Task> func, List<string> userNos);
Task<Dictionary<string, IEnumerable<TenantAssignTypeDeviceCode>>> GetUserAssignDeviceCodesWithTypeInTenantAsync(List<string> userNos, params AssignTypeEnumType[] ignoreAssignTypes);

View File

@@ -1,4 +1,3 @@
using Dlhis.Basic.DataPermissions;
using Dlhis.Basic.Device.Dtos;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
@@ -12,7 +11,6 @@ using Kurisu.AspNetCore.DataAccess.Entity;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.Scope;
using Kurisu.AspNetCore.Utils.Extensions;
using SqlSugar;
namespace Dlhis.Basic.Device.Services.Implements;
@@ -21,31 +19,26 @@ namespace Dlhis.Basic.Device.Services.Implements;
/// </summary>
public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService
{
private readonly ICurrentUser _currentUser;
private readonly IMyDataPermissionService _myDataPermissionService;
private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService;
protected IDbContext DbContext { get; }
protected BasePermissionAnalyzeService(IServiceProvider serviceProvider)
{
_currentUser = serviceProvider.GetService<ICurrentUser>();
_myDataPermissionService = serviceProvider.GetService<IMyDataPermissionService>();
ICurrentUser currentUser = serviceProvider.GetService<ICurrentUser>();
DbContext = serviceProvider.GetService<IDbContext>();
CurrentTenantId = _currentUser.GetStringTenantId();
CurrentTenantId = currentUser.GetStringTenantId();
_devicePermissionAnalyzeService = serviceProvider.GetService<IDevicePermissionAnalyzeService>();
}
private string CurrentTenantId { get; }
protected ISugarQueryable<DevicePermissionEntity> DevicePermission => DbContext.Queryable<DevicePermissionEntity>();
public async Task<DevicePermissionAssignResponse> AnalyzeAsync(DevicePermissionSaveRequest request)
{
await CheckWhetherAssignToTopDeviceGroupAsync(request);
await CheckAssignedToTenantAsync(request);
var dps = await GetAssignedDevicePermissionsAsync(request);
var dps = await _devicePermissionAnalyzeService.GetDevicePermissions(request);
(List<Guid> codesToAdd, List<Guid> codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes);
if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty())
@@ -225,35 +218,6 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService
}
}
private List<Guid> GetMyUniqueValues(DeviceAssignmentTypeEnumType uniqueType)
{
var searchAll = _currentUser.GetRole() is "admin" or "tenant-admin";
if (!searchAll && uniqueType == DeviceAssignmentTypeEnumType.Device)
{
return _myDataPermissionService.GetMyDeviceCodes();
}
return new List<Guid>();
}
/// <summary>
/// 获取当前分配对应的现有权限
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
private async Task<List<DevicePermissionEntity>> GetAssignedDevicePermissionsAsync(DevicePermissionSaveRequest request)
{
var myData = GetMyUniqueValues(request.UniqueType);
return await DevicePermission.Where(x => x.AssignType == request.AssignType
&& x.AssignValue == request.GetActualAssignValue()
&& x.UniqueType == request.UniqueType
&& x.Type == request.Type
&& x.TenantId == CurrentTenantId)
.WhereIF(myData.Any(), x => myData.Contains(x.UniqueValue))
.ToListAsync();
}
/// <summary>
/// 获取现在权限与当前的分配之间的deviceCode差异
/// </summary>

View File

@@ -1,4 +1,5 @@
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.DataPermissions;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
@@ -18,16 +19,19 @@ public class DeviceGroupService : IDeviceGroupService
private readonly IDbContext _dbContext;
private readonly ICurrentUser _currentUser;
private readonly INamedResolver _namedResolver;
private readonly IMyDataPermissionService _myDataPermissionService;
private readonly ITenantApi _tenantApi;
public DeviceGroupService(IDbContext dbContext,
ICurrentUser currentUser,
INamedResolver namedResolver,
IMyDataPermissionService myDataPermissionService,
ITenantApi tenantApi)
{
_dbContext = dbContext;
_currentUser = currentUser;
_namedResolver = namedResolver;
_myDataPermissionService = myDataPermissionService;
_tenantApi = tenantApi;
}
@@ -118,16 +122,17 @@ public class DeviceGroupService : IDeviceGroupService
await _dbContext.InsertAsync(entities);
return await PermissionResetAsync(request.GroupCode);
return await PermissionResetAsync(request.GroupCode);
}
private async Task<DevicePermissionAssignResponse> PermissionResetAsync(Guid groupCode)
{
var deviceGroups = RecursionHelper.HandlerDeviceGroupPreviousCodes(groupCode, await _dbContext.Queryable<DeviceGroupEntity>().ToListAsync());
var deviceGroups = await _dbContext.Queryable<DeviceGroupEntity>().ToListAsync();
var deviceGroupCodes = RecursionHelper.HandlerDeviceGroupPreviousCodes(groupCode, deviceGroups);
var dps = await _dbContext.Queryable<DevicePermissionEntity>()
.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group)
.Where(x => deviceGroups.Contains(x.UniqueValue))
.Where(x => deviceGroupCodes.Contains(x.UniqueValue))
.ToListAsync();
var result = new List<DevicePermissionAssignResponse>();

View File

@@ -32,6 +32,25 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService
_myDataPermissionService = myDataPermissionService;
}
public async Task<List<DevicePermissionEntity>> GetDevicePermissions(DevicePermissionSaveRequest request)
{
var currentTenantId = _currentUser.GetStringTenantId();
(bool enableDeviceFilter, List<Guid> deviceCodes) = _myDataPermissionService.GetMyDeviceCodes();
(bool enableDeviceGroupFilter, List<Guid> deviceGroupCodes) = _myDataPermissionService.GetMyDeviceGroupCodes();
return await _dbContext.Queryable<DevicePermissionEntity>().Where(x => x.AssignType == request.AssignType
&& x.AssignValue == request.GetActualAssignValue()
&& x.UniqueType == request.UniqueType
&& x.Type == request.Type
&& x.TenantId == currentTenantId)
.WhereIF(enableDeviceFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Device, x => deviceCodes.Contains(x.UniqueValue))
.WhereIF(enableDeviceGroupFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Group, x => deviceGroupCodes.Contains(x.UniqueValue))
.ToListAsync();
}
public async Task<DevicePermissionAssignResponse> GenerateDeviceTasksAsync(Func<Task> func, List<string> userNos)
{
var before = await GetUserAssignDeviceCodesInTenantAsync(userNos);
@@ -365,13 +384,13 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService
{
var currentAssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue;
var deviceCodes = _currentUser.GetRole() is "admin" or "tenant-admin" ? new List<Guid>() : _myDataPermissionService.GetMyDeviceCodes();
(bool enableFilter, List<Guid> deviceCodes) = _myDataPermissionService.GetMyDeviceCodes();
return await _dbContext.Queryable<DevicePermissionEntity>()
.Where(x => x.AssignType == request.AssignType)
.Where(x => x.AssignValue == currentAssignValue)
.Where(x => x.UniqueType == request.UniqueType)
.WhereIF(deviceCodes.Any() && request.UniqueType == DeviceAssignmentTypeEnumType.Device, x => deviceCodes.Contains(x.UniqueValue))
.WhereIF(enableFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Device, x => deviceCodes.Contains(x.UniqueValue))
.Where(x => x.Type == request.Type)
.Select(x => x.UniqueValue)
.ToListAsync();

View File

@@ -1,4 +1,5 @@
using Dlhis.Basic.Device;
using Dlhis.Basic.DataPermissions;
using Dlhis.Basic.Device;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Device.Services;
@@ -18,12 +19,17 @@ public class GainfoGroupService : IGainfoGroupService
{
private readonly IDbContext _dbContext;
private readonly ICurrentUser _currentUser;
private readonly IMyDataPermissionService _myDataPermissionService;
private readonly INamedResolver _namedResolver;
public GainfoGroupService(IDbContext dbContext, ICurrentUser currentUser, INamedResolver namedResolver)
public GainfoGroupService(IDbContext dbContext,
ICurrentUser currentUser,
IMyDataPermissionService myDataPermissionService,
INamedResolver namedResolver)
{
_dbContext = dbContext;
_currentUser = currentUser;
_myDataPermissionService = myDataPermissionService;
_namedResolver = namedResolver;
}
@@ -81,7 +87,7 @@ public class GainfoGroupService : IGainfoGroupService
if (request.UserNos.IsPresent())
{
var pGrp = await _dbContext.Queryable<GainfoGroupEntity>().Where(x => x.Code == request.GroupCode).FirstAsync();
(pGrp?.Editable == false && pGrp?.IsDefault == true).ThrowIfTrue("不可分配人员到当前分组");
(pGrp is { Editable: false, IsDefault: true }).ThrowIfTrue("不可分配人员到当前分组");
}
var existsNextGroup = await _dbContext.Queryable<GainfoGroupEntity>().Where(x => x.PCode == request.GroupCode).AnyAsync();
@@ -113,13 +119,28 @@ public class GainfoGroupService : IGainfoGroupService
private async Task<DevicePermissionAssignResponse> PermissionResetAsync(Guid groupCode)
{
var gainfoGroups = RecursionHelper.HandlerGainfoGroupPreviousCodes(groupCode, await _dbContext.Queryable<GainfoGroupEntity>().ToListAsync()).Select(x => x.ToString());
var gainfoGroups = await _dbContext.Queryable<GainfoGroupEntity>().ToListAsync();
var gainfoGroupCodes = RecursionHelper.HandlerGainfoGroupPreviousCodes(groupCode, gainfoGroups).Select(x => x.ToString());
(bool enableDeviceFilter, List<Guid> deviceCodes) = _myDataPermissionService.GetMyDeviceCodes();
(bool enableDeviceGroupFilter, List<Guid> deviceGroupCodes) = _myDataPermissionService.GetMyDeviceGroupCodes();
var dps = await _dbContext.Queryable<DevicePermissionEntity>()
.Where(x => x.AssignType == AssignTypeEnumType.Group)
.Where(x => gainfoGroups.Contains(x.AssignValue))
.Where(x => gainfoGroupCodes.Contains(x.AssignValue))
.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device)
.WhereIF(enableDeviceFilter, x => deviceCodes.Contains(x.UniqueValue))
.ToListAsync();
var dps2 = await _dbContext.Queryable<DevicePermissionEntity>()
.Where(x => x.AssignType == AssignTypeEnumType.Group)
.Where(x => gainfoGroupCodes.Contains(x.AssignValue))
.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group)
.WhereIF(enableDeviceGroupFilter, x => deviceGroupCodes.Contains(x.UniqueValue))
.ToListAsync();
dps.AddRange(dps2);
var analyzeService = _namedResolver.GetService<IPermissionAnalyzeService>(PermissionAnalyzeConstants.GetTypeName(AssignTypeEnumType.Group));
var result = new List<DevicePermissionAssignResponse>();