From eb7c4bd7c03dc1b63ead9377baac11fa5453092f Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 11 Dec 2024 00:30:25 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DeviceGroupsController.cs | 3 +- .../Device/Dtos/DevicePermissionDto.cs | 35 ++++ .../Device/Dtos/TenantAssignTypeDeviceCode.cs | 14 +- .../IDevicePermissionAnalyzeService.cs | 8 +- .../BasePermissionAnalyzeService.cs | 19 +- .../Services/Implements/DeviceGroupService.cs | 194 ++++++++++++++---- .../DevicePermissionAnalyzeService.cs | 162 +++++---------- Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs | 4 + .../Dlhis.DataPermission.Model.csproj | 2 +- 9 files changed, 281 insertions(+), 160 deletions(-) create mode 100644 Src/Dlhis.Basic/Device/Dtos/DevicePermissionDto.cs diff --git a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs index e2fb75cd..92897f20 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs @@ -34,8 +34,7 @@ public class DeviceGroupsController : ControllerBase [DataPermission] public async Task> GetTreeAsync( [EnumDataType(typeof(DeviceTypeEnumType), ErrorMessage = "请选择正确的类型")] - DeviceTypeEnumType type - ) + DeviceTypeEnumType type) { return await _deviceGroupService.GetTreeAsync(type); } diff --git a/Src/Dlhis.Basic/Device/Dtos/DevicePermissionDto.cs b/Src/Dlhis.Basic/Device/Dtos/DevicePermissionDto.cs new file mode 100644 index 00000000..7a70f10f --- /dev/null +++ b/Src/Dlhis.Basic/Device/Dtos/DevicePermissionDto.cs @@ -0,0 +1,35 @@ +using Dlhis.Entity.Device.Enums; +using Dlhis.Entity.Sys.Enums; + +namespace Dlhis.Basic.Device.Dtos; + +public class DevicePermissionDto +{ + /// + /// 分配权限类型(User,Role,Group...) + /// + public AssignTypeEnumType AssignType { get; set; } + + /// + /// 分配值 + /// + public string AssignValue { get; set; } + + /// + /// 设备权限类型(Device/DeviceGroup) + /// + public DeviceAssignmentTypeEnumType UniqueType { get; set; } + + /// + /// 类型值 + /// + public Guid UniqueValue { get; set; } + + /// + /// 设备数据类型 + /// + public DeviceTypeEnumType Type { get; set; } + + + public string TenantId { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs index 19760256..6e6632dc 100644 --- a/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs +++ b/Src/Dlhis.Basic/Device/Dtos/TenantAssignTypeDeviceCode.cs @@ -26,9 +26,19 @@ public class AssignTypeDeviceCode public AssignTypeEnumType AssignType { get; init; } /// - /// 设备权限 + /// 分配值 /// - public IEnumerable Codes { get; init; } + public string AssignValue { get; init; } + + public DeviceAssignmentTypeEnumType UniqueType { get; set; } + + /// + /// 权限 + /// + public IEnumerable Codes { get; set; } + + + public IEnumerable OriginalCodes { get; set; } } public class UserTenantDeviceCodeDto diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs index f0cba471..58ddecd8 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs @@ -13,10 +13,14 @@ namespace Dlhis.Basic.Device.Services; public interface IDevicePermissionAnalyzeService : IScopeDependency { Task> GetDevicePermissions(DevicePermissionSaveRequest request); - + Task GenerateDeviceTasksAsync(Func func, List userNos); - Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes); + Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync( + List userNos, + string ignoreAssignValue = null, + params AssignTypeEnumType[] ignoreAssignTypes + ); 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 1d3a6a53..d90d7e64 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -51,14 +51,19 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService var gainfoNos = await GetGainfoNosAsync(request.GetActualAssignValue()); - var userTenantDeviceCodes = - devicesToDelete.IsPresent() && request.AssignType != AssignTypeEnumType.Tenant - ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos, request.AssignType) - : new Dictionary>(); + var userTenantDeviceCodes = devicesToDelete.IsPresent() && request.AssignType != AssignTypeEnumType.Tenant + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos, request.GetActualAssignValue(), request.AssignType) + : new Dictionary>(); var tasks = new List(); foreach (var gainfoNo in gainfoNos) { + if (userTenantDeviceCodes.Any()) + { + var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); + devicesToDelete = devicesToDelete.Where(p => devicesToDelete.Select(x => x.Code).Except(myDeviceCodes).Contains(p.Code)).ToList(); + } + tasks.AddRange(devicesToAdd.Select(x => new DeviceTaskEntity { Type = DeviceTaskEnumType.Add, @@ -75,12 +80,6 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService TenantId = x.TenantId, }).ToList()); - if (userTenantDeviceCodes.Any()) - { - var myDeviceCodes = userTenantDeviceCodes[gainfoNo].SelectMany(x => x.AssignTypes).SelectMany(x => x.Codes); - devicesToDelete = devicesToDelete.Where(p => devicesToDelete.Select(x => x.Code).Except(myDeviceCodes).Contains(p.Code)).ToList(); - } - tasks.AddRange(devicesToDelete.Select(x => new DeviceTaskEntity { Type = DeviceTaskEnumType.Delete, diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index 143aa0ed..bdb23519 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -1,7 +1,8 @@ -using Dlhis.Basic.DataPermissions; +using Dlhis.Basic.Device.Dtos; using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Basic.Enums; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Dlhis.Entity.Sys.Entities; @@ -18,20 +19,17 @@ public class DeviceGroupService : IDeviceGroupService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; - private readonly INamedResolver _namedResolver; - private readonly IMyDataPermissionService _myDataPermissionService; + private readonly IDevicePermissionAnalyzeService _devicePermissionAnalyzeService; private readonly ITenantApi _tenantApi; public DeviceGroupService(IDbContext dbContext, ICurrentUser currentUser, - INamedResolver namedResolver, - IMyDataPermissionService myDataPermissionService, + IDevicePermissionAnalyzeService devicePermissionAnalyzeService, ITenantApi tenantApi) { _dbContext = dbContext; _currentUser = currentUser; - _namedResolver = namedResolver; - _myDataPermissionService = myDataPermissionService; + _devicePermissionAnalyzeService = devicePermissionAnalyzeService; _tenantApi = tenantApi; } @@ -110,8 +108,10 @@ public class DeviceGroupService : IDeviceGroupService await CheckGroupTypeMatchAsync(request, group); var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); - await _dbContext.DeleteAsync(relationships); + var r = await PermissionResetAsync(request.GroupCode, relationships.Select(x => x.DeviceCode).Distinct().ToList(), request.DeviceCodes); + + await _dbContext.DeleteAsync(relationships); var entities = request.DeviceCodes.Select(x => new DeviceGroupRelationshipEntity { GroupCode = request.GroupCode, @@ -122,11 +122,18 @@ public class DeviceGroupService : IDeviceGroupService await _dbContext.InsertAsync(entities); - return await PermissionResetAsync(request.GroupCode); + return r; } - private async Task PermissionResetAsync(Guid groupCode) + private async Task PermissionResetAsync(Guid groupCode, List beforeDeviceCodes, List presentDeviceCodes) { + var codesToAdd = presentDeviceCodes.Except(beforeDeviceCodes).ToList(); + var codesToDelete = beforeDeviceCodes.Except(presentDeviceCodes).ToList(); + if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty()) + { + return new DevicePermissionAssignResponse(0, 0); + } + var deviceGroups = await _dbContext.Queryable().ToListAsync(); var deviceGroupCodes = RecursionHelper.HandlerDeviceGroupPreviousCodes(groupCode, deviceGroups); @@ -135,38 +142,151 @@ public class DeviceGroupService : IDeviceGroupService .Where(x => deviceGroupCodes.Contains(x.UniqueValue)) .ToListAsync(); - var result = new List(); - - if (dps.Any()) + if (!dps.Any()) { - var type = dps.First().Type; - - foreach (var devicePermissionGroup in dps.GroupBy(x => new { x.AssignType, x.AssignValue, x.TenantId })) - { - var assignType = devicePermissionGroup.Key.AssignType; - var assignValue = devicePermissionGroup.Key.AssignValue; - var tenantId = devicePermissionGroup.Key.TenantId; - var analyzeService = _namedResolver.GetService(PermissionAnalyzeConstants.GetTypeName(assignType)); - - var codes = devicePermissionGroup.Select(x => x.UniqueValue).Distinct().ToList(); - - var r = await analyzeService.AnalyzeAsync(new DevicePermissionSaveRequest - { - AssignType = assignType, - AssignValue = assignValue, - UniqueType = DeviceAssignmentTypeEnumType.Group, - Codes = codes, - TenantId = tenantId, - Type = type - }); - - result.Add(r); - } + return new DevicePermissionAssignResponse(0, 0); } - return new DevicePermissionAssignResponse(result.Sum(x => x.AddCount), result.Sum(x => x.DeleteCount)); + var gainfoNos = await GetPermissionUserNosAsync(dps); + + + var userTenantDeviceCodes = codesToDelete.IsPresent() && dps.Exists(x => x.AssignType != AssignTypeEnumType.Tenant) + ? await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(gainfoNos) + : new Dictionary>(); + + + var devicesToAdd = await _dbContext.Queryable().Where(x => codesToAdd.Contains(x.Code)).ToListAsync(); + var devicesToDelete = await _dbContext.Queryable().Where(x => codesToDelete.Contains(x.Code)).ToListAsync(); + + var tasks = new List(); + foreach (var gainfoNo in gainfoNos) + { + if (userTenantDeviceCodes.Any()) + { + var myDeviceCodes = userTenantDeviceCodes[gainfoNo] + .SelectMany(x => x.AssignTypes + .Where(p => + { + if (p.UniqueType == DeviceAssignmentTypeEnumType.Device) + { + return true; + } + + return p.OriginalCodes.IsPresent() && p.OriginalCodes.First() != groupCode; + }) + ) + .SelectMany(x => x.Codes); + + devicesToDelete = devicesToDelete.Where(p => devicesToDelete.Select(x => x.Code).Except(myDeviceCodes).Contains(p.Code)).ToList(); + } + + tasks.AddRange(devicesToAdd.Select(x => new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Add, + DeviceType = x.Type, + UserId = null, + UserNo = gainfoNo, + DeviceUniqueNo = x.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 0, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = x.TenantId, + }).ToList()); + + tasks.AddRange(devicesToDelete.Select(x => new DeviceTaskEntity + { + Type = DeviceTaskEnumType.Delete, + DeviceType = x.Type, + UserId = null, + UserNo = gainfoNo, + DeviceUniqueNo = x.UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Version = 0, + ResultMessage = null, + CancellationId = 0, + Source = DeviceTaskSourceEnumType.Manually, + Priority = 0, + TenantId = x.TenantId, + }).ToList()); + } + + await _dbContext.InsertAsync(tasks); + + return new DevicePermissionAssignResponse(gainfoNos.Count * devicesToAdd.Count, gainfoNos.Count * devicesToDelete.Count); } + /// + /// 获取当前基地有权限的用户 + /// + /// + private async Task> GetPermissionUserNosAsync(List permissions) + { + //User + var userNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.User) + .Select(x => x.AssignValue) + .Distinct() + .ToList(); + + //Group + var groupCodes = permissions.Where(x => x.AssignType == AssignTypeEnumType.Group) + .Select(x => Guid.Parse(x.AssignValue)) + .Distinct() + .ToList(); + var userNosByGroup = await _dbContext.Queryable() + .Where(x => groupCodes.Contains(x.GroupCode)) + .Select(x => x.UserNo) + .ToListAsync(); + + //Department + var tenantDepartmentNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.Department) + .Where(x => x.AssignValue.Contains(':')) + .Select(x => + { + var arr = x.AssignValue.Split(':'); + return new + { + Factory = arr[0], DepartmentNo = arr[1] + }; + }) + .GroupBy(x => x.Factory) + .ToDictionary(x => x.Key, x => x.Select(p => p.DepartmentNo).Distinct().ToList()); + + var departments = await _dbContext.Queryable().ToListAsync(); + + var gainfoByDeptWhere = LinqExpressionExtensions.False(); + foreach ((string factory, List departmentNos) in tenantDepartmentNos) + { + var departmentNosToSearch = new List(); + foreach (var d in departmentNos) + { + departmentNosToSearch.AddRange(RecursionHelper.HandlerDepartmentNextCodes(d, departments)); + } + + departmentNosToSearch = departmentNosToSearch.Distinct().ToList(); + + gainfoByDeptWhere = gainfoByDeptWhere.Or(x => x.Factory == factory && departmentNosToSearch.Contains(x.DepartmentNo)); + } + + var userNosByDepartment = await _dbContext.Queryable() + .Where(gainfoByDeptWhere) + .Select(x => x.No) + .ToListAsync(); + + + //Tenant + var tenants = permissions.Where(x => x.AssignType == AssignTypeEnumType.Tenant).Select(x => x.AssignValue).Distinct().ToList(); + var userNosByWerk = await _dbContext.Queryable() + .Where(x => x.Type != GainfoUserTypeEnumType.External) + .Where(x => tenants.Contains(x.Factory)) + .Select(x => x.No).ToListAsync(); + + return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).Distinct().ToList(); + } + + public async Task> GetDevicesByGroupCodeAsync(Guid code) { var relationships = await _dbContext.Queryable() diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index 3f20d231..a9b845bb 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -132,7 +132,10 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService } - public async Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes) + public async Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync( + List userNos, + string ignoreAssignValue = null, + params AssignTypeEnumType[] ignoreAssignTypes) { var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync(); if (!gainfos.Any()) return new Dictionary>(); @@ -144,7 +147,10 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService var gainfoGroupRelationships = await _dbContext.Queryable().Where(x => userNos.Contains(x.UserNo)).ToListAsync(); var gainfoGroups = await _dbContext.Queryable().ToListAsync(); - var devicePermissions = await _dbContext.Queryable().WhereIF(ignoreAssignTypes.IsPresent(), x => !ignoreAssignTypes.Contains(x.AssignType)).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(); @@ -167,6 +173,7 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService UserFactory = gainfo.Factory, 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 }; @@ -187,13 +194,12 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService private static IEnumerable GetAssignDeviceCodesInternal( AnalyzePackDto analyzePack, List gainfoGroups, - List devicePermissions, + List devicePermissions, List deviceGroups, List deviceGroupRelationships, List departments) { var deviceDtos = new List(); - var deviceGroupDtos = new List(); foreach (var assignType in new[] { AssignTypeEnumType.User, AssignTypeEnumType.Group, AssignTypeEnumType.Department, AssignTypeEnumType.Tenant }) { @@ -207,40 +213,32 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService _ => throw new ArgumentOutOfRangeException() }; - if (analyzePack.IgnoreAssignTypeTypes.Contains(assignType)) + foreach (var assignValue in assignValues.WhereIf(analyzePack.IgnoreAssignTypeTypes.Contains(assignType), x => x != analyzePack.IgnoreAssignValue)) { - continue; - } - - foreach (var assignValue in assignValues) - { - deviceDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, + deviceDtos.AddRange(GetCurrentAssignTypePermissions(devicePermissions, gainfoGroups, departments, DeviceAssignmentTypeEnumType.Device, assignType, assignValue)); - deviceGroupDtos.AddRange(GetMyTypeDevicePermissionAsync(devicePermissions, gainfoGroups, deviceGroups, departments, - DeviceAssignmentTypeEnumType.Group, assignType, assignValue)); - } - } - //设备组转设备 - deviceDtos.AddRange(deviceGroupDtos.Select(x => - { - var tenant = x.Tenant; + var groupItems = GetCurrentAssignTypePermissions(devicePermissions, gainfoGroups, departments, + DeviceAssignmentTypeEnumType.Group, assignType, assignValue); - var deviceGroupCodes = x.AssignTypes.SelectMany(item => item.Codes); - var type = x.AssignTypes.ElementAt(0).AssignType; - return new TenantAssignTypeDeviceCode - { - Tenant = tenant, - AssignTypes = new[] + foreach (var groupItem in groupItems) { - new AssignTypeDeviceCode + foreach (var assignTypeDeviceCodeItem in groupItem.AssignTypes) { - AssignType = type, - Codes = deviceGroupRelationships.Where(item => deviceGroupCodes.Contains(item.GroupCode)).Select(item => item.DeviceCode) + 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); + } + } return deviceDtos.GroupBy(x => x.Tenant).Select(x => { @@ -248,11 +246,14 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService { Tenant = x.Key, AssignTypes = x.SelectMany(p => p.AssignTypes) - .GroupBy(p => p.AssignType) + .GroupBy(p => new { p.AssignType, p.AssignValue, p.UniqueType }) .Select(p => new AssignTypeDeviceCode { - AssignType = p.Key, - Codes = p.SelectMany(item => analyzePack.DeviceCodes.Where(it => item.Codes.Contains(it))) + AssignType = p.Key.AssignType, + AssignValue = p.Key.AssignValue, + UniqueType = p.Key.UniqueType, + Codes = p.SelectMany(xx => xx.Codes), + OriginalCodes = p.Where(xx => xx.OriginalCodes.IsPresent()).SelectMany(xx => xx.OriginalCodes) }) }; @@ -260,14 +261,16 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService }); } - private static List GetCurrentAssignTypePermissions( - List devicePermissions, + private static List GetCurrentAssignTypePermissions( + List devicePermissions, List gainfoGroups, List departments, DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) { + var assignValues = new List { assignValue }; + if (assignType == AssignTypeEnumType.Department) { // 2401:00001 @@ -276,86 +279,33 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService var tenantId = arr[0]; var currentDepartmentNo = arr[1]; - var departmentNos = RecursionHelper.HandlerDepartmentPreviousCodes(currentDepartmentNo, departments).Select(x => tenantId + ":" + x).ToList(); - - return devicePermissions - .Where(x => x.UniqueType == uniqueType) - .Where(x => x.AssignType == assignType) - .Where(x => departmentNos.Contains(x.AssignValue)) - .GroupBy(x => x.TenantId) - .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(p => p.UniqueValue) }) - .ToList(); + assignValues = RecursionHelper.HandlerDepartmentPreviousCodes(currentDepartmentNo, departments).Select(x => tenantId + ":" + x).ToList(); } if (assignType == AssignTypeEnumType.Group) { - var gainfoGroupCodes = RecursionHelper.HandlerGainfoGroupPreviousCodes(Guid.Parse(assignValue), gainfoGroups).Select(x => x.ToString()); - return devicePermissions - .Where(x => x.UniqueType == uniqueType) - .Where(x => x.AssignType == assignType) - .Where(x => gainfoGroupCodes.Contains(x.AssignValue)) - .GroupBy(x => x.TenantId) - .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(p => p.UniqueValue) }) - .ToList(); + assignValues = RecursionHelper.HandlerGainfoGroupPreviousCodes(Guid.Parse(assignValue), gainfoGroups).Select(x => x.ToString()).ToList(); } - //user / tenant return devicePermissions - .Where(x => x.UniqueType == uniqueType - && x.AssignType == assignType - && x.AssignValue == assignValue) + .Where(x => x.UniqueType == uniqueType) + .Where(x => x.AssignType == assignType) + .Where(x => assignValues.Contains(x.AssignValue)) .GroupBy(x => x.TenantId) - .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(p => p.UniqueValue) }) + .Select(x => new TenantAssignTypeDeviceCode + { + Tenant = x.Key, + AssignTypes = x.GroupBy(xx => new { xx.AssignType, xx.AssignValue }).Select(xx => new AssignTypeDeviceCode + { + AssignType = xx.Key.AssignType, + AssignValue = xx.Key.AssignValue, + UniqueType = uniqueType, + Codes = xx.Select(xxx => xxx.UniqueValue) + }) + }) .ToList(); } - - private static IEnumerable GetMyTypeDevicePermissionAsync( - List devicePermissions, - List gainfoGroups, - List deviceGroups, - List departments, - DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) - { - var tenantDevicePermissions = GetCurrentAssignTypePermissions(devicePermissions, gainfoGroups, departments, uniqueType, assignType, assignValue); - - //处理获取设备分组的情况,递归向下查询子分组 - if (uniqueType == DeviceAssignmentTypeEnumType.Group) - { - foreach (var tenantDevicePermission in tenantDevicePermissions) - { - var deviceGroupCodes = tenantDevicePermission.Codes; - var r = tenantDevicePermission.Codes.ToList(); - - foreach (var deviceGroupCode in deviceGroupCodes) - { - r.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(deviceGroupCode, deviceGroups)); - } - - tenantDevicePermission.Codes = r.Distinct().ToList(); - } - } - - return tenantDevicePermissions.GroupBy(x => x.Tenant).Select(x => - { - var tenant = x.Key; - - return new TenantAssignTypeDeviceCode - { - Tenant = tenant, - AssignTypes = new[] - { - new AssignTypeDeviceCode - { - AssignType = assignType, - Codes = x.SelectMany(item => item.Codes) - } - } - }; - }); - } - - private async Task ChunkInsertAsync(List batch) where T : class, new() { foreach (var tasks in batch.Chunk(500)) @@ -365,9 +315,9 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService } - public async Task>> GetUserAssignDeviceCodesInTenantAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes) + public async Task>> GetUserAssignDeviceCodesInTenantAsync(List userNos, string ignoreAssignValue = null, params AssignTypeEnumType[] ignoreAssignTypes) { - var result = await GetUserAssignDeviceCodesWithTypeInTenantAsync(userNos, ignoreAssignTypes); + var result = await GetUserAssignDeviceCodesWithTypeInTenantAsync(userNos, ignoreAssignValue, ignoreAssignTypes); 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 2e9b5f23..ebe890d4 100644 --- a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs +++ b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs @@ -21,8 +21,12 @@ public class GainfoDto public class AnalyzePackDto { + public string IgnoreAssignValue { get; set; } + public string UserNo { get; set; } + public string UserDepartment { get; set; } + public string UserFactory { get; set; } public IEnumerable UserGainfoGroupCodes { get; set; } diff --git a/Src/Dlhis.DataPermission.Model/Dlhis.DataPermission.Model.csproj b/Src/Dlhis.DataPermission.Model/Dlhis.DataPermission.Model.csproj index ddf857f3..df16a23e 100644 --- a/Src/Dlhis.DataPermission.Model/Dlhis.DataPermission.Model.csproj +++ b/Src/Dlhis.DataPermission.Model/Dlhis.DataPermission.Model.csproj @@ -7,7 +7,7 @@ - +