diff --git a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs index 10ee320c..f296392e 100644 --- a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs +++ b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs @@ -56,14 +56,18 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc if (deviceGroupCodes.Any()) { var data = db.Queryable().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(); + foreach (Guid deviceGroupCode in deviceGroupCodes) + { + myDeviceGroupCodes.AddRange(RecursionHelper.HandlerDeviceGroupNextCodes(deviceGroupCode, data)); + } + + myDeviceGroupCodes = myDeviceGroupCodes.Distinct().ToList(); if (deviceCodeProperty != null) { - deviceCodes = db.Queryable().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToList(); + deviceCodes = db.Queryable().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 data, List 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 GetMyDeviceCodes(); + (bool, List) GetMyDeviceCodes(); + (bool, List) 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; } /// - public List GetMyDeviceCodes() + public (bool, List) GetMyDeviceCodes() { - return _getDataPermissions.GetData().FirstOrDefault().Value ?? new List(); + var codes = new List(); + + var disableFilter = _currentUser.GetRole() is "admin" or "tenant-admin"; + if (!disableFilter) + { + codes = _getDataPermissions.GetData().FirstOrDefault().Value ?? new List(); + } + + return (!disableFilter, codes); + } + + /// + public (bool, List) GetMyDeviceGroupCodes() + { + var codes = new List(); + + var disableFilter = _currentUser.GetRole() is "admin" or "tenant-admin"; + if (!disableFilter) + { + codes = _getDataPermissions.GetData().FirstOrDefault().Value ?? new List(); + } + + return (!disableFilter, codes); } } \ 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 0c8e3a67..f0cba471 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionAnalyzeService.cs @@ -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; /// public interface IDevicePermissionAnalyzeService : IScopeDependency { + Task> GetDevicePermissions(DevicePermissionSaveRequest request); + Task GenerateDeviceTasksAsync(Func func, List userNos); Task>> GetUserAssignDeviceCodesWithTypeInTenantAsync(List userNos, params AssignTypeEnumType[] ignoreAssignTypes); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs index a2aabf0c..1d3a6a53 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -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; /// 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(); - _myDataPermissionService = serviceProvider.GetService(); + ICurrentUser currentUser = serviceProvider.GetService(); DbContext = serviceProvider.GetService(); - CurrentTenantId = _currentUser.GetStringTenantId(); + CurrentTenantId = currentUser.GetStringTenantId(); _devicePermissionAnalyzeService = serviceProvider.GetService(); } private string CurrentTenantId { get; } - protected ISugarQueryable DevicePermission => DbContext.Queryable(); - public async Task AnalyzeAsync(DevicePermissionSaveRequest request) { await CheckWhetherAssignToTopDeviceGroupAsync(request); await CheckAssignedToTenantAsync(request); - var dps = await GetAssignedDevicePermissionsAsync(request); + var dps = await _devicePermissionAnalyzeService.GetDevicePermissions(request); (List codesToAdd, List codesToDelete) = await GetDiffAsync(request.UniqueType, dps, request.Codes); if (codesToAdd.IsEmpty() && codesToDelete.IsEmpty()) @@ -225,35 +218,6 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService } } - private List GetMyUniqueValues(DeviceAssignmentTypeEnumType uniqueType) - { - var searchAll = _currentUser.GetRole() is "admin" or "tenant-admin"; - if (!searchAll && uniqueType == DeviceAssignmentTypeEnumType.Device) - { - return _myDataPermissionService.GetMyDeviceCodes(); - } - - return new List(); - } - - /// - /// 获取当前分配对应的现有权限 - /// - /// - /// - private async Task> 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(); - } - /// /// 获取现在权限与当前的分配之间的deviceCode差异 /// diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index ec2f47d8..143aa0ed 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -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 PermissionResetAsync(Guid groupCode) { - var deviceGroups = RecursionHelper.HandlerDeviceGroupPreviousCodes(groupCode, await _dbContext.Queryable().ToListAsync()); + var deviceGroups = await _dbContext.Queryable().ToListAsync(); + var deviceGroupCodes = RecursionHelper.HandlerDeviceGroupPreviousCodes(groupCode, deviceGroups); var dps = await _dbContext.Queryable() .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) - .Where(x => deviceGroups.Contains(x.UniqueValue)) + .Where(x => deviceGroupCodes.Contains(x.UniqueValue)) .ToListAsync(); var result = new List(); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index d82e09a7..3f20d231 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -32,6 +32,25 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService _myDataPermissionService = myDataPermissionService; } + + public async Task> GetDevicePermissions(DevicePermissionSaveRequest request) + { + var currentTenantId = _currentUser.GetStringTenantId(); + + (bool enableDeviceFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); + (bool enableDeviceGroupFilter, List deviceGroupCodes) = _myDataPermissionService.GetMyDeviceGroupCodes(); + + return await _dbContext.Queryable().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 GenerateDeviceTasksAsync(Func func, List 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() : _myDataPermissionService.GetMyDeviceCodes(); + (bool enableFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); return await _dbContext.Queryable() .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(); diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs index 2f3e7465..b9bfc754 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -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().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().Where(x => x.PCode == request.GroupCode).AnyAsync(); @@ -113,13 +119,28 @@ public class GainfoGroupService : IGainfoGroupService private async Task PermissionResetAsync(Guid groupCode) { - var gainfoGroups = RecursionHelper.HandlerGainfoGroupPreviousCodes(groupCode, await _dbContext.Queryable().ToListAsync()).Select(x => x.ToString()); + var gainfoGroups = await _dbContext.Queryable().ToListAsync(); + var gainfoGroupCodes = RecursionHelper.HandlerGainfoGroupPreviousCodes(groupCode, gainfoGroups).Select(x => x.ToString()); + + (bool enableDeviceFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); + (bool enableDeviceGroupFilter, List deviceGroupCodes) = _myDataPermissionService.GetMyDeviceGroupCodes(); var dps = await _dbContext.Queryable() .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() + .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(PermissionAnalyzeConstants.GetTypeName(AssignTypeEnumType.Group)); var result = new List();