From c1a029399318453bcaa40921651eb93b9fa2e077 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 15:54:02 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E8=AE=BE=E5=A4=87=E7=BB=84=E5=B7=AE?= =?UTF-8?q?=E5=BC=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Filters/AssignPermissionLimitAttribute.cs | 14 ++-- .../IDevicePermissionAnalyzeService.cs | 4 +- .../BasePermissionAnalyzeService.cs | 5 +- .../DevicePermissionAnalyzeService.cs | 83 ++++++++++++------- Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs | 8 +- .../Services/Implements/GainfoGroupService.cs | 2 +- .../Sys/Enums/AssignTypeEnumType.cs | 2 +- 7 files changed, 73 insertions(+), 45 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs b/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs index 9f4d637b..2c621773 100644 --- a/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs +++ b/Src/Dlhis.Basic/Device/Filters/AssignPermissionLimitAttribute.cs @@ -10,13 +10,13 @@ public class AssignPermissionLimitAttribute : Attribute, IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { - var currentUser = context.HttpContext.RequestServices.GetRequiredService(); - var redisCache = context.HttpContext.RequestServices.GetRequiredService(); - - var currentTenantId = currentUser.GetStringTenantId(); - - await using var handler = await redisCache.LockAsync($"permission:generate:{currentTenantId}", expiry: TimeSpan.FromMinutes(3)); - handler.Acquired.ThrowIfFalse("请勿频繁分配"); + // var currentUser = context.HttpContext.RequestServices.GetRequiredService(); + // var redisCache = context.HttpContext.RequestServices.GetRequiredService(); + // + // var currentTenantId = currentUser.GetStringTenantId(); + // + // await using var handler = await redisCache.LockAsync($"permission:generate:{currentTenantId}", expiry: TimeSpan.FromMinutes(3)); + // handler.Acquired.ThrowIfFalse("请勿频繁分配"); await next(); } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs index 58ddecd8..b28664d4 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs @@ -18,8 +18,8 @@ public interface IDevicePermissionAnalyzeService : IScopeDependency Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync( List userNos, - string ignoreAssignValue = null, - params AssignTypeEnumType[] ignoreAssignTypes + DeviceAssignmentTypeEnumType? ignoreUniqueType = null, + string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null ); Task> GetAssignmentsAsync(DeviceGetAssignmentsRequest request); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs index d4c72dd7..1f4df7ee 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -52,7 +52,7 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService var gainfoNos = await GetGainfoNosAsync(request.GetActualAssignValue()); var userTenantDeviceCodes = devicesToDelete.IsPresent() && request.AssignType != AssignTypeEnumType.Tenant - ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos, request.GetActualAssignValue(), request.AssignType) + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos, request.UniqueType, request.GetActualAssignValue(), request.AssignType) : new Dictionary>(); var tasksToAdd = new List(); @@ -63,7 +63,8 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService if (userTenantDeviceCodes.Any()) { var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); - currentDevicesToDelete = devicesToDelete.Where(p => codesToDelete.Except(myDeviceCodes).Contains(p.Code)); + var actToDeleteCodes = codesToDelete.Except(myDeviceCodes); + currentDevicesToDelete = devicesToDelete.Where(p => actToDeleteCodes.Contains(p.Code)); } tasksToAdd.AddRange(devicesToAdd.Select(x => new DeviceTaskEntity diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index a9b845bb..138bf32d 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -134,8 +134,8 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService public async Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync( List userNos, - string ignoreAssignValue = null, - params AssignTypeEnumType[] ignoreAssignTypes) + DeviceAssignmentTypeEnumType? ignoreUniqueType = null, + string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null) { var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync(); if (!gainfos.Any()) return new Dictionary>(); @@ -148,9 +148,9 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService var gainfoGroups = await _dbContext.Queryable().ToListAsync(); var devicePermissions = await _dbContext.Queryable() - .WhereIF(ignoreAssignTypes.IsPresent(), x => !ignoreAssignTypes.Contains(x.AssignType) && x.AssignValue != ignoreAssignValue) .Select() .ToListAsync(); + var deviceGroups = await _dbContext.Queryable().ToListAsync(); var deviceRelationships = await _dbContext.Queryable().ToListAsync(); var departments = await _dbContext.Queryable().ToListAsync(); @@ -160,7 +160,10 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService gainfos.ParallelForEach(gainfo => { var internalIgnoreAssignTypes = new List(); - internalIgnoreAssignTypes.AddRange(ignoreAssignTypes); + + if (ignoreAssignType.HasValue) + internalIgnoreAssignTypes.Add(ignoreAssignType.Value); + if (gainfo.Type == GainfoUserTypeEnumType.Outsource && (enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true) == false) { internalIgnoreAssignTypes.Add(AssignTypeEnumType.Tenant); @@ -174,7 +177,8 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService UserGainfoGroupCodes = gainfoGroupRelationships.Where(x => x.UserNo == gainfo.No).Select(x => x.GroupCode), DeviceCodes = devices.WhereIf(gainfo.Type == GainfoUserTypeEnumType.Outsource, x => x.Type != DeviceTypeEnumType.Meal).Select(x => x.Code), //外包人员不允许餐饮 IgnoreAssignValue = ignoreAssignValue, - IgnoreAssignTypeTypes = internalIgnoreAssignTypes + IgnoreAssignTypes = internalIgnoreAssignTypes, + IgnoreUniqueType = ignoreUniqueType }; var codes = GetAssignDeviceCodesInternal(analyzePack, @@ -201,8 +205,14 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService { var deviceDtos = new List(); + var uniqueTypes = new[] { DeviceAssignmentTypeEnumType.Device, DeviceAssignmentTypeEnumType.Group }; foreach (var assignType in new[] { AssignTypeEnumType.User, AssignTypeEnumType.Group, AssignTypeEnumType.Department, AssignTypeEnumType.Tenant }) { + if (analyzePack.IgnoreAssignTypes.Contains(assignType) && analyzePack.IgnoreAssignValue.IsEmpty()) + { + continue; + } + var assignValues = assignType switch { AssignTypeEnumType.User => new[] { analyzePack.UserNo }, @@ -213,30 +223,16 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService _ => throw new ArgumentOutOfRangeException() }; - foreach (var assignValue in assignValues.WhereIf(analyzePack.IgnoreAssignTypeTypes.Contains(assignType), x => x != analyzePack.IgnoreAssignValue)) + + var data = assignValues.SelectMany(x => uniqueTypes.Select(p => new { assignValue = x, uniqueType = p })).ToList(); + var needRemove = data.Where(x => x.assignValue == analyzePack.IgnoreAssignValue && x.uniqueType == analyzePack.IgnoreUniqueType); + data = data.ExceptBy(needRemove, x => new { x.assignValue, x.uniqueType }).ToList(); + + foreach (var item in data) { deviceDtos.AddRange(GetCurrentAssignTypePermissions(devicePermissions, gainfoGroups, departments, - DeviceAssignmentTypeEnumType.Device, assignType, assignValue)); - - var groupItems = GetCurrentAssignTypePermissions(devicePermissions, gainfoGroups, departments, - DeviceAssignmentTypeEnumType.Group, assignType, assignValue); - - foreach (var groupItem in groupItems) - { - foreach (var assignTypeDeviceCodeItem in groupItem.AssignTypes) - { - var r = new List(); - foreach (var code in assignTypeDeviceCodeItem.Codes) - { - r.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(code, deviceGroups)); - } - - assignTypeDeviceCodeItem.OriginalCodes = r; - assignTypeDeviceCodeItem.Codes = deviceGroupRelationships.Where(x => r.Contains(x.GroupCode)).Select(x => x.DeviceCode); - } - } - - deviceDtos.AddRange(groupItems); + deviceGroups, deviceGroupRelationships, + item.uniqueType, assignType, item.assignValue)); } } @@ -265,6 +261,8 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService List devicePermissions, List gainfoGroups, List departments, + List deviceGroups, + List deviceGroupRelationships, DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) @@ -287,7 +285,8 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService assignValues = RecursionHelper.HandlerGainfoGroupPreviousCodes(Guid.Parse(assignValue), gainfoGroups).Select(x => x.ToString()).ToList(); } - return devicePermissions + + var r = devicePermissions .Where(x => x.UniqueType == uniqueType) .Where(x => x.AssignType == assignType) .Where(x => assignValues.Contains(x.AssignValue)) @@ -304,6 +303,27 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService }) }) .ToList(); + + if (uniqueType == DeviceAssignmentTypeEnumType.Group) + { + foreach (var groupItem in r) + { + foreach (var assignTypeDeviceCodeItem in groupItem.AssignTypes) + { + var nextItems = new List(); + foreach (var code in assignTypeDeviceCodeItem.Codes) + { + nextItems.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(code, deviceGroups)); + } + + nextItems = nextItems.Distinct().ToList(); + assignTypeDeviceCodeItem.OriginalCodes = nextItems; + assignTypeDeviceCodeItem.Codes = deviceGroupRelationships.Where(x => nextItems.Contains(x.GroupCode)).Select(x => x.DeviceCode); + } + } + } + + return r; } private async Task ChunkInsertAsync(List batch) where T : class, new() @@ -315,9 +335,12 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService } - public async Task>> GetUserAssignDeviceCodesInTenantAsync(List userNos, string ignoreAssignValue = null, params AssignTypeEnumType[] ignoreAssignTypes) + public async Task>> GetUserAssignDeviceCodesInTenantAsync( + List userNos, + DeviceAssignmentTypeEnumType? ignoreUniqueType = null, + string ignoreAssignValue = null, AssignTypeEnumType? ignoreAssignType = null) { - var result = await GetUserAssignDeviceCodesWithTypeInTenantAsync(userNos, ignoreAssignValue, ignoreAssignTypes); + var result = await GetUserAssignDeviceCodesWithTypeInTenantAsync(userNos, ignoreUniqueType, ignoreAssignValue, ignoreAssignType); return result.ToDictionary(x => x.Key, x => x.Value.GroupBy(p => p.Tenant).Select(item => { diff --git a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs index ebe890d4..7ea91257 100644 --- a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs +++ b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs @@ -21,7 +21,7 @@ public class GainfoDto public class AnalyzePackDto { - public string IgnoreAssignValue { get; set; } + public string UserNo { get; set; } @@ -33,5 +33,9 @@ public class AnalyzePackDto public IEnumerable DeviceCodes { get; set; } - public IEnumerable IgnoreAssignTypeTypes { get; set; } + + public DeviceAssignmentTypeEnumType? IgnoreUniqueType { get; set; } + + public string IgnoreAssignValue { get; set; } + public IEnumerable IgnoreAssignTypes { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs index a81487da..99df36c5 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -158,7 +158,7 @@ public class GainfoGroupService : IGainfoGroupService var devices = await _dbContext.Queryable().Where(x => deviceCodes.Contains(x.Code)).ToListAsync(); var userTenantDeviceCodes = usersToDelete.IsPresent() && dps.Exists(x => x.AssignType != AssignTypeEnumType.Tenant) - ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(beforeUserNos.Union(presentUserNos).ToList(), groupCode.ToString(), AssignTypeEnumType.Group) + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(beforeUserNos.Union(presentUserNos).ToList(), null, groupCode.ToString(), AssignTypeEnumType.Group) : new Dictionary>(); var addTasks = new List(); diff --git a/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs b/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs index 5a1c4ffd..7b96e746 100644 --- a/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs +++ b/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs @@ -3,7 +3,7 @@ namespace Dlhis.Entity.Sys.Enums; /// -/// 权限类型 +/// 权限类型: 用户,角色,用户组别,部门,厂区 /// [Description("分配类型")] public enum AssignTypeEnumType